Math 获取到一组坐标的角度和距离

Math 获取到一组坐标的角度和距离,math,distance,measurement,angle,Math,Distance,Measurement,Angle,我正在使用Atmel atmega644pa微控制器创建一个机器人,并用C语言编程。我正在尝试创建一个函数,其中给定一对坐标,它将确定到该坐标的距离(从机器人当前位置)以及它需要转向的角度(相对于自身) 我的角度计算有问题——不管我给它什么坐标,它总是计算出大于零的角度,然后让机器人旋转。另外,如果我显式地将我的_bearing()设置为返回0.0,那么它将正常工作。我用正确的方法处理这个角度吗 我没有包括turn()或move()方法,因为它们只将管脚设置为turn或move。我使用的函数只设

我正在使用Atmel atmega644pa微控制器创建一个机器人,并用C语言编程。我正在尝试创建一个函数,其中给定一对坐标,它将确定到该坐标的距离(从机器人当前位置)以及它需要转向的角度(相对于自身)

我的角度计算有问题——不管我给它什么坐标,它总是计算出大于零的角度,然后让机器人旋转。另外,如果我显式地将我的_bearing()设置为返回0.0,那么它将正常工作。我用正确的方法处理这个角度吗

我没有包括turn()或move()方法,因为它们只将管脚设置为turn或move。我使用的函数只设置角度和距离,其余的由一组中断服务例程完成

#define MY_START_X          7.5
#define MY_START_Y          1.5
#define MY_START_BEARING    -90

float my_x=MY_START_X, my_y=MY_START_Y;
float go_x, go_y;
volatile float bearing=MY_START_BEARING

float my_bearing(void)
{
    float goto_x = go_x - my_x;                         // Adjust x to be relative to Me. I AM ORIGIN
    float goto_y = go_y - my_y;                         // Adjust y to be relative to Me. I AM ORIGIN
    float final = atan2f(goto_y,goto_x)*(180/3.14)-bearing;
    return final;   // Calculate my bearing
}

float my_distance(void)
{
    return sqrt((go_x-my_x)*(go_x-my_x)+(go_y-my_y)*(go_y-my_y));
}
void waypoint(float x, float y)
{

    go_x = x;                                   // Set my x to goto
    go_y = y;                                   // Set my y to goto

    bearing = my_bearing();                     // Get my bearing
    if(abs(bearing) > 1.0)
    {
        turn(bearing);                              // Turn Accordingly
        leave = 0;
        while(leave == 0){};        // wait for ISR to run
    }
    move(FORWARD, my_distance());   // Go to my new x,y
    leave = 0;
    while(leave == 0){};               // wait for ISR to run
}

你没有按正确的方式获得角度。 对于初学者来说,您没有考虑角案例(关于(0,2)呢?这意味着您最终要做2/0)。 你也没有考虑象限-2,-2是与2,2不同的轴承,但在这两种情况下x/y=1

使用atan2。它解释了象限


如果没有atan2,则需要自己计算象限,然后使用象限计算偏移量。

我可以使用atan2,我编辑了上面的代码。你刚说的。。我还犯了什么明显的错误吗?没有其他的错误。重要的问题是,它现在起作用了吗?