О расчете скорости двухколесной дифференциальной тележки и расчете одометра

задняя часть

Это 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; 

    //里程计解算积分后角度`