Это 17-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления"
Одометр является стандартом для измерения нашего положения от начального положения до конечного положения.С точки зрения непрофессионала, если мы хотим реализовать позиционирование и навигацию робота, нам нужно знать, какое расстояние прошел робот и в каком направлении он путешествует.
Расчет одометра относится к начальной точке мировой системы координат в момент включения робота (угол направления робота является положительным направлением мировой системы координат X). Обычным методом расчета одометра является вычисление интеграла скорости: датчиками левого и правого двигателей измеряются скорости VL и VR левого и правого колес робота, за короткое время △t считается, что робот двигаться с постоянной скоростью, а по предыдущему моменту скорости робота Вычисляется угол курса для получения приращений осей X и Y робота в мировой системе координат в этот момент, а затем приращения накапливаются , и используется значение рыскания IMU, используемое для угла курса θ. Затем можно получить одометр робота по приведенному выше описанию.
1 Обратное решение
Вычислите скорость левого и правого колес через множество v и угол ROBOT_RADIUS относится к радиусу робота, который составляет половину расстояния между двумя колесами робота.
` // Рассчитаем ожидаемую скорость левого и правого колес
if(RobotV == 0)
{
leftdata.d = -YawRate * ROBOT_RADIUS;
rightdata.d = YawRate * ROBOT_RADIUS;
}
else if(YawRate == 0)
{
leftdata.d = RobotV;
rightdata.d = RobotV;
}
else
{
leftdata.d = YawRate * (r - ROBOT_RADIUS);
rightdata.d = YawRate * (r + ROBOT_RADIUS);
} `
2 Правильное решение одометра
Рассчитать одометр на основе скорости и угла левого и правого колеса
`` //=========================== Расчет скорости и получение угла
// скорость в направлении x и угловая скорость
vx = (rightVelNow.d + leftVelNow.d) / 2.0 / 1000.0; //m/s
vth = (rightVelNow.d - leftVelNow.d) / ROBOT_LENGTH ; //rad/s
th = angleNow.d*0,01745;//Информация об угле в реальном времени (рад)
double dt = (curr_time - last_time_).toSec();//интервал времени
double delta_x = (vx_ * cos(th_)) * dt;//th_radians
double delta_y = (vx_ * sin(th_)) * dt;
double delta_th = vth_ * dt;`
//Печатать информацию об отладке временного интервала, можно отключить, когда он не используется
//ROS_INFO("dt:%f\n",dt); //s
// накапливаем пробег
x_ += delta_x;
y_ += delta_y;
//Информация об угле в реальном времени, если здесь не используется IMU, ее также можно рассчитать таким образом
th_ += delta_th;
//里程计解算积分后角度`