我正在使用Atmel atmega644pa微控制器创建一个机器人并在C中编程。我正在尝试创建一个函数,给定一对坐标,它将确定到该坐标的距离(从机器人当前位置)和它需要转向的角度(相对于自身)。
我的角度计算有问题 - 无论我给它的坐标是什么,它总是会计算出一个大于零的角度,然后让机器人进入旋转状态。另外,如果我明确地将my_bearing()设置为返回0.0,那么一切正常。我是否正确处理这个角度?
我没有包括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 :(得分:-1)
你没有以正确的方式获得角度。 对于初学者来说,你没有考虑角落的情况(怎么样(0,2)?意味着你最终做2/0)。 你也没有考虑象限。 -2,-2是与2,2不同的方位,但在两种情况下x / y = 1。
使用atan2。它占据了象限。
如果您没有atan2,那么您需要自己设计象限,然后使用象限计算出偏移量。