Oblicz pozycję robota z napędem różnicowym


14

Jak obliczyć lub zaktualizować pozycję robota z napędem różnicowym za pomocą czujników inkrementalnych?

Do każdego z dwóch kół różnicowych dołączony jest jeden czujnik przyrostowy. Oba czujniki określają odległość lub. ich koło potoczyło się w znanym czasie .Δ R i g h t Δ tΔlmifatΔrjasolhtΔt

Najpierw załóżmy, że środek między dwoma kołami oznacza pozycję robota. W takim przypadku można obliczyć pozycję jako:

x=xlmifat+xrjasolht2)y=ylmifat+yrjasolht2)

„Wyprowadzając” te równania przy założeniu, że oba koła toczyły się w linii prostej (co powinno być w przybliżeniu prawidłowe dla małych odległości), otrzymuję:

ΔxΔt=12)(ΔlmifatΔt+ΔrjasolhtΔt)doos(θ)ΔyΔt=12)(ΔlmifatΔt+ΔrjasolhtΔt)sjan(θ)

Gdzie jest kątem orientacji robota. Dla zmiany tego kąta znalazłem równanieθ

ΔθΔt=1w(ΔlmifatΔt-ΔrjasolhtΔt)

Gdzie to odległość między oboma kołami.w

Ponieważ i zależą od , zastanawiam się, czy powinienem najpierw obliczyć nowy , dodając czy raczej powinienem użyć „starej” ? Czy jest jakiś powód, aby używać jednego nad drugim?Δ y θ θ Δ θ θΔxΔyθθΔθθ

Załóżmy teraz, że środek między oboma kołami nie oznacza położenia robota. Zamiast tego chcę użyć punktu, który oznacza geometryczny środek obwiedni robota. Następnie i zmiany:xy

x=xlmifat+xrjasolht2)+ldoos(θ)y=ylmifat+yrjasolht2)+lsjan(θ)

„Wyprowadzanie” pierwszego daje:

ΔxΔt=12)(ΔlmifatΔt+ΔrjasolhtΔt)doos(θ)-lsjan(θ)ΔθΔt

Teraz istnieje zależność od . Czy to jest powód, aby używać „nowego” ?Δθθ

Czy jest jakaś lepsza metoda na jednoczesną aktualizację pozycji i orientacji? Może używać liczb zespolonych (takie samo podejście jak w przypadku czwartorzędów w 3D?) Lub współrzędnych jednorodnych?

Odpowiedzi:


8

Aby odpowiedzieć na pierwsze pytanie: jeśli naprawdę chcesz znaleźć prawdziwe równania kinematyczne dla napędu różnicowego, nie zacznę przybliżać, zakładając, że każde koło porusza się w linii prostej. Zamiast tego znajdź promień skrętu, oblicz punkt środkowy łuku, a następnie oblicz następny punkt robota. Promień skrętu byłby nieskończony, gdyby robot poruszał się prosto, ale w prostym przypadku matematyka jest prosta.

Więc wyobraź sobie, że na każdym etapie lub za każdym razem, gdy obliczasz zmianę czujników przyrostowych, robot przemieszcza się od punktu A do punktu B po łuku w następujący sposób: wprowadź opis zdjęcia tutaj Oto przykładowy kod z uproszczoną matematyką:

// 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);
}

Użyłem podobnej matematyki w symulatorze, aby zademonstrować różne sposoby sterowania: http://www.cs.utexas.edu/~rjnevels/RobotSimulator4/demos/SteeringDemo/


1
Równania użyte w powyższym fragmencie kodu zostały wyprowadzone tutaj: rossum.sourceforge.net/papers/DiffSteer
kamek

Świetne wyjaśnienie! Łącze symulatora zostało zerwane
smirkingman

2

ΔθθΔx,Δy

ΔθΔx,Δyθ

Δt0


Poszukiwanie „kinematyki naprzód pojazdów z napędem różnicowym” powinno dostarczyć wielu artykułów z bardziej matematycznym podejściem do tego pytania.
Ian
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.