机器人车旋转特定角度的方法
本方法结和IMU和里程计底盘实现。imu采集的heading范围需要在0-360之间变化,如果是0-180,-180-0最好转换为0-360方便计算。
如下程序为仿真,flg的值决定了小车左右转弯的方向。
arg1 是初始heading,arg2是要旋转的角度建议范围取值-180----+180 ,正负号决定方向。
计算处旋转方向后停止。
gcc -o main main.c
main.c
#include <time.h>
#include <sys/time.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int* arc,int*arg[])
{
// Make sure there's only one rotate thread running at a time.
// TODO: proper thread synchronization would be better here
if(arc < 2){
printf("usage:app startdegree rotatedegree \n");
exit(1);
}
int startHeading = atoi(arg[1]);
int degrees = atoi(arg[2]);
int targetHeading = startHeading + degrees;
if (targetHeading < 0){
targetHeading += 360;
if(targetHeading<180)
degrees += 360;
}
if (targetHeading > 359){
targetHeading -=360;
}
char flg =0;
int heading = startHeading;
if (degrees < 0)
{
flg =1;
}
else if (degrees > 0)
{
flg =0;
}
char done = 0;
// double turn = 0.0;
do
{
if(flg){
heading --;
if(heading <= 0)
heading =360;
}
else {
heading ++;
if(heading >= 360)
heading = 0;
}
// Backup method - use the magnetometer to see what direction we're facing. Stop turning when we reach the target heading.
int currentHeading = (int)heading;//headingFilter.GetValue();
printf("Rotating: currentHeading = %d targetHeading = %d\n", currentHeading, targetHeading);
if ((currentHeading >= targetHeading) && (degrees > 0) && (startHeading < targetHeading))
{
done = 1;
}
if ((currentHeading <= targetHeading) && (degrees < 0) && (startHeading > targetHeading))
{
done = 1;
}
if (currentHeading < startHeading && degrees > 0)
startHeading = currentHeading;
if (currentHeading > startHeading && degrees < 0)
startHeading = currentHeading;
//#endif
usleep(100000);
}
while (!done);
return 0;
}
起初纠结 一个问题,如果车辆0度时,要想往左旋转330度,也就是往左旋转30度,是否可以选择最优的转动方向,考虑到实际环境中,如果车辆左侧恰好有障碍物阻碍转弯,这个时候继续往左转显然不明智。所以就没必要纠结了。





