Płynny ruch serwa dla robota pełzającego

11

Niedawno zrobiłem małego robota gąsienicowego, który miał dwie nogi o dwóch stopniach swobody, czyli łącznie 4 serwa RC. Podczas programowania ruchu nóg zauważyłem, że poruszają się one raczej sztywno. Ma to sens, że wewnętrzny kontroler serwa RC miałby bardzo szybką reakcję na polecenia pozycji, ale chciałem, aby mój robot poruszał się w sposób, który wydaje się nieco bardziej płynny i podobny do życia.

Moim rozwiązaniem było stworzenie sześciennej funkcji czasu, która opisuje ścieżkę serwomechanizmów, a następnie ustalanie ich pozycji w małych odstępach czasu, co skutkuje bardziej płynnym ruchem. Zasadniczo rozwiązałem współczynniki w równaniu sześciennym, używając przedziału czasowego, pozycji początkowej i końcowej serwomechanizmu oraz prędkości początkowych i końcowych serwomechanizmu powinien się poruszać (co jest tylko pochodną pozycji):ai

Rozwiąż dla , , i :a 1 a 2 a 3a0a1a2a3

r a t e ( t ) = p o s i t i o n ( t ) = a 1 + 2 a 2 t + 3 a 3 t

position(t)=a0+a1t+a2t2+a3t3
rate(t)=position(t)=a1+2a2t+3a3t2

Biorąc pod uwagę: , , ,p o s i t i o n ( t f ) r a t e ( 0 ) r a t e ( t f )position(0)position(tf)rate(0)rate(tf)

Ustawiłem szybkość serwomechanizmu między parą ruchów na zero, jeśli ruchy były w przeciwnych kierunkach, i dodatnie lub ujemne, jeśli ruchy były odpowiednio w kierunku dodatnim lub ujemnym.

Działa to całkiem dobrze, ale to rozwiązanie jest ograniczone na kilka sposobów. Po pierwsze, trudno jest zdecydować, jakie dokładnie powinny być stawki między ruchami zmierzającymi w tym samym kierunku. Użyłem średniej nachylenia przed i za określoną pozycją między ruchami, ale nie jest dla mnie jasne, czy jest to optymalne. Po drugie, sześcienne krzywe mogą doprowadzić serwo do pozycji poza zakresem pozycji na początku i na końcu ruchu, co może być niepożądane. Na przykład, w pewnym momencie przedziału czasowego krzywa może spowodować, że serwo wyjdzie poza drugą pozycję lub poniżej pierwszej pozycji. Po trzecie, generowanie krzywej nie bierze pod uwagę maksymalnej prędkości, jaką serwo może obrócić, więc krzywa może powodować, że serwo porusza się z nierealistyczną prędkością. Z tym,

Zlekceważąc ten ostatni problem, te problemy można rozwiązać, zwiększając stopień wielomianu i dodając ograniczenia do rozwiązania dla współczynników, ale teraz zaczynam się zastanawiać ...

Czy istnieje lepszy sposób, aby ruch serwomechanizmu był płynny i wyglądał bardziej jak życie?

Robz
źródło
Kod powinien być stosunkowo prosty. Czy możesz porozmawiać o tym, dlaczego był zaangażowany?
DaemonMaker
1
Masz rację, kod był dość prosty, chociaż wynikowa metoda kontrolowania serwomechanizmów była bardziej złożona niż wcześniej. Zredagowałem swoje pytanie, aby zamiast tego opisać ograniczenia tej metody.
Robz
NURBS , niejednolite, racjonalne splajny B, mogą wykonać to zadanie
James Waldby - jwpat7
@ jwpat7 dziękuję za Twój wkład, ale nie sądzę, aby NURBS działał, ponieważ nie ma gwarancji, że te krzywe osiągną podane punkty
Robz
Czy to jest tak proste, jak obniżenie współczynnika ? Kp
Ian

Odpowiedzi:

6

Generowanie profilu ruchu

W przeszłości korzystałem z generatora profili ruchu, aby rozwiązać ten problem. Aby go użyć, potrzebujesz pożądanej pozycji docelowej (wartości zadanej), maksymalnej prędkości i wartości przyspieszenia, które są powiązane z Twoimi silnikami. Działa poprzez zintegrowanie trapezowej krzywej prędkości w celu uzyskania gładkiego profilu pozycji. Krzywą S można użyć, jeśli ruch musi być jeszcze płynniejszy. Odniesienie do artykułu wyjaśniającego profilowanie ruchu .

Filtrowanie wstępne wartości zadanej

Oprócz trasy profilowania ruchu możesz spróbować po prostu dolnoprzepustowego filtrowania polecenia do serwomechanizmów. Ten rodzaj filtrowania wartości zadanej spowolni twoją reakcję, ale również ją wygładzi i jest łatwy do wdrożenia. Częstotliwość odcięcia będzie musiała zostać wybrana, aby obsługiwała przepustowość twojego systemu (aby nie odfiltrowała pożądanego ruchu). Prosta implementacja filtra dolnoprzepustowego w C

ddevaz
źródło
+1: zdecydowanie generowanie profilu ruchu.
Guy Sirton,
2

Myślę, że pytanie dotyczy tego rodzaju urządzenia: serwo RC

Zwykle nie są one bardzo wydajne, więc nie będą w stanie bardzo dobrze śledzić wygenerowanego profilu ruchu. Większość komercyjnych systemów sterowania silnikiem wykorzystuje krzywą S do przemieszczania się z punktu do punktu (patrz odpowiedź @ ddevaza), które wykonują profil częściowy, w którym każdy segment wykorzystuje inne równanie. Twój problem polega na tym, że aby silnik mógł śledzić wygenerowany profil, prawdopodobnie będziesz mieć bardzo „wolny” profil. W przeciwnym razie profil, który próbujesz nakazać urządzeniu, aby podążał, będzie miał duży błąd pozycji w stosunku do faktycznej pozycji urządzenia.

Idealnie potrzebujesz informacji zwrotnej, na którą możesz spojrzeć podczas wykonywania ruchu, aby zobaczyć, jak dobrze urządzenie śledzi polecenie. Z praktycznego punktu widzenia, jeśli chcesz znacznie lepszego ruchu, możesz potrzebować różnych silników i różnych mechanizmów sterowania silnikiem.

Guy Sirton
źródło