Обчисліть положення робота диференціального приводу


14

Як ви обчислюєте або оновлюєте положення робота диференціального приводу за допомогою покрокових датчиків?

До кожного з двох диференціальних коліс встановлений один поступовий датчик. Обидва датчики визначають відстань Δleft resp. Δright їх колесо котилося протягом відомого часу Δt .

Спочатку припустимо, що центр між обома колесами позначає положення робота. У цьому випадку позицію можна обчислити як:

x=xleft+xright2y=yleft+yright2

"Виведення" цих рівнянь під припущенням, що обидва колеса котяться по прямій лінії (що має бути приблизно правильним для невеликих відстаней), я отримую:

ΔxΔt=12(ΔleftΔt+ΔrightΔt)cos(θ)ΔyΔt=12(ΔleftΔt+ΔrightΔt)sin(θ)

Де - кут орієнтації робота. Для зміни цього кута я знайшов рівнянняθ

ΔθΔt=1w(ΔleftΔtΔrightΔt)

Де - відстань між обома колесами.w

Оскільки і Δ y залежать від θ , мені цікаво, чи слід спочатку обчислити нове θ , додавши Δ θ, чи я повинен скоріше використовувати "старий" θ ? Чи є підстави використовувати одне над іншим?ΔxΔyθθΔθθ

Тоді, припустимо, тепер центр між обома колесами не позначає положення робота. Натомість я хочу використовувати точку, яка позначає геометричний центр обмежувальної коробки робота. Тоді і y змінюємо на:xy

x=xleft+xright2+lcos(θ)y=yleft+yright2+lsin(θ)

"Виведення" першого дає:

ΔxΔt=12(ΔleftΔt+ΔrightΔt)cos(θ)lsin(θ)ΔθΔt

Тепер існує залежність від . Це причина для використання "нового" θ ?Δθθ

Чи є кращий метод зробити симуляційне оновлення позиції та орієнтації? Може використовуватися складні числа (той самий підхід, що і з кватерніонами в 3D?) Або однорідні координати?

Відповіді:


8

Щоб відповісти на ваше перше запитання: якщо ви дійсно хочете знайти справжні кінематичні рівняння для диференціального приводу, я б не почав наближатися, вважаючи, що кожне колесо рухається по прямій лінії. Натомість знайдіть радіус повороту, обчисліть центральну точку дуги, а потім обчисліть наступну точку робота. Радіус повороту був би нескінченним, якщо робот рухається прямо, але в прямому випадку математика проста.

Отже, просто уявіть, що протягом кожного кроку часу або кожного разу, коли ви обчислюєте зміну покрокових датчиків, робот рухається від точки А до точки В на дузі так: введіть тут опис зображення Ось приклад коду з спрощеною математикою:

// leftDelta and rightDelta = distance that the left and right wheel have moved along
//  the ground

if (fabs(leftDelta - rightDelta) < 1.0e-6) { // basically going straight
    new_x = x + leftDelta * cos(heading);
    new_y = y + rightDelta * sin(heading);
    new_heading = heading;
} else {
    float R = unitsAxisWidth * (leftDelta + rightDelta) / (2 * (rightDelta - leftDelta)),
          wd = (rightDelta - leftDelta) / unitsAxisWidth;

    new_x = x + R * sin(wd + heading) - R * sin(heading);
    new_y = y - R * cos(wd + heading) + R * cos(heading);
    new_heading = boundAngle(heading + wd);
}

Я використовував аналогічну математику в тренажері, щоб продемонструвати різні способи управління: http://www.cs.utexas.edu/~rjnevels/RobotSimulator4/demos/SteeringDemo/


1
Рівняння, використані у наведеному вище фрагменті коду, отримані тут: rossum.sourceforge.net/papers/DiffSteer
kamek

Чудове пояснення! Посилання Тренажер зламана
smirkingman

2

Для повторного розрахунку не має значення, чи знайдете ви Δθ до або після подання заяви θ до Δх,Δурозрахунок. Ви завжди будете чергувати позицію та розрахунок орієнтації.

У практичному сенсі це може бути краще обчислити Δθ після розрахунку Δх,Δу, оскільки ваша перша ітерація через цикл вимагає початкового значення θ.

Пам'ятайте, що це спосіб вимірювання, схильний до помилок, так чи інакше - це пара одновимірних вимірювань, що подають 2D-наближення тривимірного світу. Навіть якщо ви зможете отриматиΔт дуже близько 0, вона все одно не враховуватиме ковзання коліс та нерівну місцевість.


Пошук "кінематики передніх автомобілів диференціального приводу" повинен забезпечити купу статей з більш математичним підходом до цього питання.
Ян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.