Od trajektorii (q, q̇, q̈) do momentów napędowych τ — robot ES5, rekurencja w przód i w tył (forward/backward sweep), tensor bezwładności.
Do tej pory skupialiśmy się na kinematyce — na pytaniu „przy jakich kątach przegubów końcówka znajdzie się w zadanym miejscu". Jeśli mamy już trajektorię oraz jej pochodne i , to natychmiast zaczyna się drugie pytanie: jakie momenty napędowe muszą wytworzyć silniki, żeby ten ruch faktycznie zaszedł?
To zadanie odwrotne dynamiki: znając ruch, znajdź siły. Jest ono podstawą trzech praktyk inżynierskich:
W całym module pracujemy na nowym robocie — ES5 (EasyRobots, polski producent) — bo to robot z dysertacji wzorcowej dla tego materiału. ES5 ma osie q₂q₃q₄ równoległe, więc spełnia formę B warunku Piepera (dla porównania: Puma 560 spełnia formę A — wrist intersect). Algorytm dynamiki jest jednak niezależny od formy Piepera — działa dla dowolnego robota DH.
Mapa algorytmu Newton-Euler
Pełen pipeline w jednym widoku. Numery kroków odsyłają do paneli niżej.
Newton-Euler vs Lagrange
Dwa równoważne sformułowania dynamiki manipulatora:
[Gruszka, dysertacja 2024, str. 44]: „W pracy zdecydowano się na metodę Newtona–Eulera ze względu na prostszą postać równań w postaci jawnej dla wieloczłonowego łańcucha kinematycznego."
Animacja poniżej pokazuje co dokładnie znaczy „rekurencja w przód + w tył" — zanim wejdziemy w wzory, naciśnij ▶ play i zobacz przepływ informacji wzdłuż 6 ogniw:
Animacja: jak przebiega forward + backward sweep
Forward · inicjalizacja
Baza: ω₀ = 0, ε₀ = 0, a₀ = -g·ẑ (sztuczka Craig'a — grawitacja zaszyta w przyspieszeniu bazy)
Co warto zauważyć: w forward sweep przesuwamy się od bazy do końcówki i wyliczamy tylko kinematykę (ω, ε, a, a_C) — bez ani jednej siły. Dopiero gdy mamy a_C dla wszystkich ogniw, wyliczamy lokalnie F_C i N_C (Newton+Euler). Backward sweep przebiega od końcówki do bazy i przekształca te F_C, N_C w momenty napędowe τ_i, uwzględniając siły propagowane od ogniwa wyższego. To rozdzielenie jest kluczem do O(n) kosztu obliczeniowego.
Dlaczego dwa przebiegi (forward + backward)?
Kluczowa obserwacja Newton-Eulera, dzięki której cały algorytm jest zamiast :
Te dwa fakty pozwalają rozdzielić problem na dwa niezależne przebiegi:
Gdyby siły i kinematyka były wzajemnie sprzężone, musielibyśmy rozwiązywać układ równań jednocześnie — koszt . Tu rozdzielenie daje dwa kolejne, sekwencyjne przebiegi po n ogniwach, czyli . To samo sformułowanie Lagrange'a (dla porównania) produkuje gęstą macierz i wymaga inwersji — szybsze i prostsze w pisaniu jest NE.
Inverse vs forward dynamics — co właściwie liczymy
Dynamika robota dzieli się na dwa zadania:
W kroku 7 (computed-torque demo) obu używamy: inverse-dynamics jako feedforward dla kontrolera, forward-dynamics dla symulatora odpowiedzi robota.
Po lewej: model 3D robota ES5 z konwencją Z-up. Po prawej: trzy panele suwaków — konfiguracja , prędkości , przyspieszenia . Pod robotem: wyliczone momenty napędowe w każdym przegubie, z rozkładem na część grawitacyjną i dynamiczną. Wartości aktualizowane na żywo.
Zanim zmierzymy się z łańcuchem 6 ogniw, sprowadźmy problem do absolutnego minimum: jedno sztywne ciało, które zna swoją kinematykę (prędkość kątową , przyspieszenie kątowe , przyspieszenie liniowe środka masy ) i pyta: jaką siłę i jaki moment musi na nie działać, żeby ten ruch był możliwy?
Pojedyncze sztywne ciało (cylinder) z zadanym ruchem () i wynikającymi z niego siłą bezwładności oraz momentem bezwładności w środku masy. Cała dynamika Newtona-Eulera dla jednego ciała to dwa równania widoczne wyżej.
Odpowiedź to dwa równania — Newtona dla translacji (siła = masa × przyspieszenie) i Eulera dla rotacji (moment = tensor bezwładności × przyspieszenie kątowe, plus człon żyroskopowy):
To jest cała dynamika sztywnego ciała. Jeśli umiesz policzyć i dla jednego ciała, wiesz dynamikę. Cały dalszy algorytm Newton-Euler to tylko dwie operacje techniczne:
Złota zasada modułu
Każdy kolejny krok można sprowadzić do pytania: „gdzie tutaj wchodzi a gdzie ?". Jeśli to widzisz — czytasz Newton-Eulera. Jeśli nie widzisz — gubi cię notacja, nie fizyka. Wróć tu i przeczytaj jeszcze raz.
Legenda notacji — czytaj zanim wejdziesz w równania
Newton-Euler operuje wektorami wyrażonymi w różnych układach współrzędnych (jeden na ogniwo). Konwencja Craig'a zapisuje to za pomocą lewego górnego indeksu:
| Symbol | Znaczenie |
|---|---|
| wektor wyrażony w układzie ogniwa i (jego współrzędne to liczby w bazie {}) | |
| pozycja początku układu (i+1), wyrażona w układzie (i) — czyli „gdzie patrząc z ogniwa i znajduje się następny przegub" | |
| pozycja środka masy własnego ogniwa i, w jego własnym układzie (stała geometryczna) | |
| macierz rotacji z układu (i) do (i+1) — bierze wektor wyrażony w (i), zwraca jego współrzędne w (i+1) | |
| prędkość i przyspieszenie kątowe ogniwa | |
| prędkość i przyspieszenie liniowe początku układu ogniwa | |
| prędkość i przyspieszenie środka masy ogniwa (inne niż początku!) | |
| siła i moment bezwładności w środku masy (z równań Newtona i Eulera) | |
| siła i moment reakcji w przegubie i (to, co ogniwo (i-1) działa na ogniwo i) | |
| skalarny moment napędowy — to, co musi wytworzyć silnik (rzut na oś przegubu ) |
Złota zasada: zanim pomnożysz dwa wektory, sprawdź czy są wyrażone w tym samym układzie. Jeśli nie — najpierw rotacja , dopiero potem działanie.
Wszystkie wektory wprowadzone w legendzie powyżej () mają swoje miejsce geometryczne na pojedynczym ogniwie manipulatora. Poniższy schemat służy jako słownik wizualny — wracaj do niego za każdym razem gdy w kolejnych krokach pojawi się wektor, którego umiejscowienia nie pamiętasz:

Algorytm Newton-Euler dla manipulatora jako sztywnego łańcucha ciał wymaga znajomości parametrów inercji każdego ogniwa:
Tensor bezwładności jest symetryczny (3 momenty główne na diagonali + 3 momenty dewiacji poza nią), eq. (6.13) dysertacji:
Przyjęte założenia upraszczające (str. 51 dysertacji):
Skąd wartości liczbowe? W dysertacji (str. 55, Tab. 6.2) parametry inercji ES5 wyznaczono z modelu 3D w oprogramowaniu CAD. W tej aplikacji używamy oszacowania cylindrycznego — każde ogniwo aproksymujemy jednorodnym cylindrem o znanej masie i przybliżonych wymiarach. Algorytm działa identycznie; różnica jest w wartościach liczbowych (rzędu 10–30%).
Każde ogniwo zaaproksymowane jako jednorodny cylinder o długości L i masie m, z tensorem . Wartości w lokalnym układzie ogniwa (osie wg konwencji DH).
| ogniwo | m [kg] | L [m] | I_xx | I_yy | I_zz |
|---|---|---|---|---|---|
| 1 (podstawa) | 3.7 | 0.15 | 0.011 | 0.011 | 0.018 |
| 2 (bark) | 8.4 | 0.43 | 0.137 | 0.137 | 0.013 |
| 3 (łokieć) | 2.3 | 0.40 | 0.034 | 0.034 | 0.003 |
| 4 (przedramię) | 1.2 | 0.11 | 0.002 | 0.002 | 0.001 |
| 5 (nadgarstek) | 1.2 | 0.10 | 0.001 | 0.001 | 0.001 |
| 6 (kołnierz) | 0.3 | 0.08 | 0.0003 | 0.0003 | 0.0002 |
Te liczby siedzą w src/lib/robots/es5.ts jako ES5_INERTIA— wszystkie momenty napędowe i panele energii czytają je stamtąd.
Rekurencja w przód propaguje stan kinematyczny od bazy (gdzie , ) do końcówki, ogniwo po ogniwie. Wszystkie wektory geometryczne, którymi tu operujemy (), są pokazane na rysunku 6.2 powyżej — wróć do niego w razie wątpliwości.
Prędkość kątowa ogniwa (i+1) jest sumą: (a) prędkości ogniwa (i) obróconej do nowego układu, oraz (b) prędkości własnego przegubu wzdłuż jego osi z:
Kluczowa intuicja: każdy przegub dodaje swój wkład tylko wzdłuż swojej osi z (z konwencji DH). Pozostałe składowe ω dziedziczy od poprzedniego ogniwa.
Prędkość liniowa początku układu (i+1) wynika z podstawowego wzoru kinematyki sztywnego ciała: ogniwo (i) ma prędkość oraz obraca się z , więc punkt odległy o przesuwa się z prędkością :
Bez członu translacyjnego od własnego przegubu — bo dla przegubu obrotowego sam obrót nie przesuwa początku ogniwa.
pułapkaNajczęstszy bug w implementacjach NE — kierunek transformacji R
Macierz w eq. (6.6) to rotacja przeprowadzająca wektor z układu (i) do (i+1). Tymczasem typowa funkcja DH (np. linkTransform / modifiedDHTransform) zwraca — macierz, której kolumny to baza układu (i) wyrażona w (i-1). Dla rotacyjnej części:
W kodzie używamy mat3TmulVec3(R, v) (mnożenie przez transpozycję) zamiast mat3mulVec3(R, v). Drobna różnica notacyjna, ale błąd kosztuje godziny debugowania — bo dla pozy home (q=0) wszystkie macierze są tożsamością i bug się nie ujawnia. Pojawia się dopiero przy ruchu, jako „dziwne" momenty napędowe które „prawie" mają sens.
Test diagnostyczny: ustaw i . Z poprawnym R^T momenty grawitacyjne powinny skalować się proporcjonalnie do długości ramienia. Z błędnym R — dostaniesz wartości pomieszane między osiami.
Przyspieszenie kątowe wymaga uwagi na człon Coriolisa: kombinację prędkości dziedziczonej i prędkości własnego przegubu, która generuje dodatkowe przyspieszenie kątowe nawet przy zerowym :
Demo Coriolisa — obracająca się platforma z masą poruszającą się radialnie
Co zauważyć: w widoku „z tarczy" masa idzie po linii prostej (radialnie), ale działa na nią siła Coriolisa — żółta strzałka prostopadła do prędkości. Wzór: . W widoku inercjalnym (przełącz przyciskiem wyżej) ta sama trajektoria to spirala — żadnej dodatkowej siły nie potrzeba, ruch jest „prosty" w sensie newtonowskim, tylko widziany z obracającego się układu wymaga „dodatku". Dokładnie taki sam dodatek pojawia się w eq. (6.7) NE jako — i właśnie dlatego ogniwo poniżej obracającej się bazy może mieć niezerowe nawet gdy .
Przyspieszenie liniowe początku ogniwa (i+1) ma trzy wkłady: tangencjalny (od ), dośrodkowy (od ), oraz dziedziczone :
Inicjalizacja (sztuczka Craig'a) sprawia, że wszystkie pochodne automatycznie zawierają grawitację — w rekurencji w przód nie trzeba o niej pamiętać oddzielnie.
Środek masy ogniwa dziedziczy prędkość i przyspieszenie analogicznie. Prędkość C_i to prędkość początku układu plus ω razy wektor do C_i (eq. 6.11):
Przyspieszenie C_i (eq. 6.12) — analogicznie do przyspieszenia początku:
Dla typowej trajektorii pick-and-place na ES5 (q̇ ~1 rad/s, q̈ ~5 rad/s²), człon dośrodkowy ω×(ω×p) jest rzędu 0.5–2 m/s² — porównywalny z grawitacją (9.81 m/s²) i nie do pominięcia.
Notka kodowa — ε vs alpha
W tekście używamy greckiego (klasyczne oznaczenie przyspieszenia kątowego), w kodzie TypeScript jako alpha — ponieważ identyfikatory Unicode w nazwach zmiennych pogarszają czytelność i utrudniają autouzupełnianie w edytorach. To ta sama wielkość, dwie różne nazwy.
Tu wprowadzamy symbole, które będą fundamentem dla rekurencji w tył: (siła bezwładności w środku masy) i (moment bezwładności). Rysunek 6.3 poniżej pokazuje je w kontekście wszystkich pozostałych sił działających na pojedyncze ogniwo — w tym sił reakcji w przegubach (), które wyliczymy w kroku 5:

Mając przyspieszenie środka masy , siła bezwładności (d'Alemberta) to po prostu II zasada Newtona:
Ponieważ dziedziczy grawitację z forward sweep, w naszej konwencji zawiera zarówno siłę bezwładności (z dynamiki), jak i pozorną siłę grawitacji.
Moment bezwładności ogniwa składa się z dwóch części:
Pierwszy człon to po prostu „F=ma w postaci rotacyjnej" — : moment potrzebny by nadać ciału przyspieszenie kątowe . Drugi człon to moment żyroskopowy — pojawia się gdy ciało już się obraca z prędkością wokół osi, która nie pokrywa się z osią główną bezwładności tensora .
Intuicja — koło rowerowe trzymane w rękach
Klasyczna demonstracja na zajęciach z mechaniki: trzymasz oś szybko rozkręconego koła rowerowego za dwa wystające końce. Próbujesz je pochylić w prawo (chcesz nadać poziomy, w kierunku jazdy). Spodziewałbyś się, że poczujesz opór wzdłuż osi pochylania — tymczasem koło „skręca w górę" lub „w dół": twoje ręce czują moment prostopadły do kierunku, w którym próbujesz je pochylić.
To dokładnie człon . Wektor pędu kątowego leży wzdłuż osi koła. Gdy nakładasz poziomy, iloczyn wektorowy daje moment w trzeciej osi — i to właśnie ten moment czują twoje ręce. Zjawisko nazywa się precesją żyroskopową.
W manipulatorze pojawia się analogicznie: szybko obracające się ogniwo (np. nadgarstek wirujący z dużą ) gdy reszta ramienia próbuje obrócić jego oś, „odpowiada" momentem prostopadłym, który musi zostać zrównoważony przez napęd w przegubie sąsiednim. Stąd dodatkowy człon w równaniu — fizycznie istnieje, a jego pominięcie dałoby błędne przy dużych prędkościach.
Specjalny przypadek: gdy jest wektorem własnym (czyli leży wzdłuż jednej z osi głównych), wtedy i — człon żyroskopowy znika. Innymi słowy: jeśli kierunek pędu kątowego zgadza się z kierunkiem prędkości kątowej, nie ma precesji.
Po wyliczeniu sił bezwładności w środkach mas wszystkich ogniw, lecimy w drugą stronę — od końcówki (gdzie nie ma obciążenia zewnętrznego) do bazy. Wracamy do rysunku 6.3 z kroku 4 — tym razem ze szczegółowym bilansem czterech składowych w przegubie.
Każde ogniwo balansuje: (a) siły reakcji od ogniwa wyższego, (b) własne siły bezwładności, (c) siły grawitacji (już zaszyte w ):
Inicjalizacja: — brak obciążenia zewnętrznego za końcówką (jeśli robot trzyma jakiś przedmiot, dodajemy tu jego ciężar).
Moment w przegubie i to suma kilku składowych:
Cztery człony: własny moment bezwładności, propagowany moment od ogniwa wyższego, moment od własnej siły bezwładności na ramieniu od początku układu do środka masy, moment od siły reakcji ogniwa wyższego na ramieniu od początku układu do następnego przegubu.
Moment napędowy w przegubie i — czyli to, czego silnik musi wytworzyć — to składowa wzdłuż osi przegubu (czyli oś z układu i):
Pozostałe składowe momentu są równoważone przez konstrukcję mechaniczną przegubu (łożyska). Tylko wymaga aktywnej kompensacji przez silnik.
Dla zadanej trajektorii wyliczamy dla każdego z 6 napędów ES5 — w każdym kroku czasowym uruchamiamy pełny algorytm Newton-Euler. Wykres pokazuje 6 niezależnych linii (po jednej na napęd), oś pozioma to znormalizowany czas trajektorii τ ∈ [0, 1], oś pionowa to moment w Nm. Wybierz scenariusz w rozwijanej liście, dostosuj masę obciążenia w chwytaku i obserwuj jak zmienia się obciążenie napędów.
Zauważ: τ₂ (zielony) zwykle dominuje — to przegub trzymający masę całego ramienia plus przedramienia plus narzędzia. Przy ruchu tylko q₂ wszystkie pozostałe momenty są małe (utrzymują geometrię nadgarstka). Masa chwytaka liniowo skaluje moment grawitacyjny.
Co warto zauważyć: τ₂ (drugi przegub, dźwigający ramię w polu grawitacji) zwykle dominuje — zarówno w statyce, jak i dynamice. Dodanie 1 kg w chwytaku liniowo skaluje moment grawitacyjny we wszystkich napędach (efekt mnożnika ramienia: ciężar 1 kg na końcu robota o zasięgu 0.8 m daje +8 Nm).
Na początku modułu napisałem: „silnik dostaje feedforward τ wyliczony z modelu plus poprawkę PID". Czas pokazać że to działa. Symuluję 2R-planarny manipulator (forward dynamics rozwiązana analitycznie z równania Lagrange'a) wykonujący tę samą trajektorię dwoma kontrolerami: czystym PID i PID z dodanym feedforward'em .
Po co to jest?
Aplikacja kanoniczna NE — computed-torque control. Wysyłamy do silnika dwa momenty: (1) feedforward wyliczony z modelu dynamiki NE jako , plus (2) PD-poprawkę od pomiarów . Idea: jeśli model dynamiki jest dokładny, wystarczy do śledzenia idealnej trajektorii — a PD jest tylko żeby skompensować drobne błędy modelu. Porównaj poniżej: PID-only musi mieć duże Kp by „dogonić" trajektorię, PID+feedforward śledzi z minimalnym błędem nawet przy małych wzmocnieniach.
2R-planarny: PID-only vs PID + NE-feedforward
PID-only
PID + NE-feedforward (computed-torque)
Błąd śledzenia [rad]
PID-only
max |e| przez całą trajektorię:
489.6 mrad ≈ 28.05°
PID + NE-feedforward
max |e| przez całą trajektorię:
2.7 mrad ≈ 0.15°
Eksperymenty: przy domyślnych Kp=50, Kd=10 błąd PID-only jest ~10× większy niż PID+feedforward. Zwiększ Kp do 300 — PID-only zbliży się do feedforward, ale w realnym systemie tak duże Kp wzmocniłoby szum pomiarowy i ryzyko niestabilności. Feedforward NE osiąga to samo bez wysokich wzmocnień — to jest powód, dla którego ten moduł istnieje.
PID-only (faktycznie tu PD, bez I dla prostoty):
Computed-torque (PD + model-based feedforward):
Gdy model dokładnie odzwierciedla rzeczywistą dynamikę i stan początkowy jest na trajektorii, sama wystarczy — część PD pracuje tylko z zerem. W praktyce model ma niedoskonałości (tarcie, sprężystość), więc PD koryguje błędy.
Wniosek dydaktyczny: NE nie jest tylko teoretycznym algorytmem — to generator feedforward'u dla każdego sterownika trajektorii. Bez modelu dynamiki trzeba kompensować błąd agresywnymi wzmocnieniami PID (co wzmacnia szum pomiarowy i zbliża układ do granicy stabilności). Z modelem regulator pracuje przy znacznie mniejszych błędach śledzenia i można go bezpiecznie stroić blisko optimum stabilności.
Każdy eksperyment poniżej to konkretne polecenie do wykonania w sekcji „Laboratorium" wyżej. Rozwiń, ustaw odpowiednie wartości i porównaj swoje obserwacje z opisem.
Ustaw w playgroundzie: Wróć do playgroundu. Ustaw q w pozycji „ramię w bok poziomo" (q₂ ≈ 90°, reszta 0). Suwakiem skala q̇ pod wykresem słupkowym przesuwaj od 0× do 5×.
Co powinieneś zaobserwować: Przy 0× widzisz samą statykę — czerwone słupki τ_grawit dominują, τ₂ największy (ramię w polu grawitacji). Powyżej 2× niebieskie słupki (τ_dynam) rosną kwadratowo i przy 3–4× przewyższają statykę dla τ₁ i τ₃. τ₂ pozostaje dominowany przez grawitację, bo dla typowej konfiguracji ramienia siła grawitacji jest stała, a wkład dynamiki zależy od q̇².
Dlaczego to ważne:w przemysłowych sterownikach często stosuje się tzw. gravity compensation — feedforward kompensujący tylko grawitację. Działa dobrze dla ruchów wolnych (q̇ < 1 rad/s), zawodzi dla agresywnych (q̇ > 3 rad/s) gdzie potrzebny jest pełen model Newton-Eulera, jak w kroku 7 (computed-torque).
Ustaw w playgroundzie: W playgroundzie ustaw q = home, wszystkie q̈ na 0. Podnieś tylko q̇₁ do 5 rad/s. Obserwuj τ₃, τ₄, τ₅ w TorqueDisplay. Zwiększaj stopniowo q̇₂ od 0 do 3 rad/s.
Co powinieneś zaobserwować: Mimo że żaden przegub nie ma przyspieszenia, momenty napędowe τ₃, τ₄, τ₅ rosną nieproporcjonalnie do q̇₂. To człon żyroskopowy ω×(I·ω) z eq. (6.15) — górne ogniwa „czują" obrót podstawy (q̇₁) skomponowany z obrotem własnym (q̇₂) jako moment prostopadły do obu osi.
Dlaczego to ważne: przy projektowaniu nadgarstków cobotów (np. końcówek z szybkimi obrotami narzędzia) efekty żyroskopowe są dominującym źródłem nieliniowości. Pomijanie ich w sterowniku daje błąd śledzenia rosnący kwadratowo z q̇.
Ustaw w playgroundzie: Nie da się wyłączyć grawitacji w UI, ale można symulować jej brak: ustaw q tak, że robot leży poziomo na boku (q₂ = 0, q₃ = 0 — ramię „płasko"). Ustaw q̇₁ = 1 rad/s, q̈₁ = 0. Czytaj τ_dynam (niebieska kolumna w TorqueDisplay).
Co powinieneś zaobserwować: τ_dynam pokazuje czysty wkład bezwładności+Coriolisa, odseparowany od grawitacji. Powinien być rzędu kilku Nm — duża część to człony odśrodkowe ω×(ω×p), proporcjonalne do \dot q_1^2. Sprawdź: zwiększ q̇₁ do 2 rad/s i zobacz że τ_dynam wzrasta ~4× (kwadrat od skalarnego skalowania prędkości).
Dlaczego to ważne: w robotach kosmicznych (np. ramię ISS) brak grawitacji oznacza że cała dynamika to człony bezwładnościowe — projektowanie sterowników wymaga innego strojenia niż dla robotów naziemnych.
Cała powyższa maszyneria Newton-Eulera produkuje jedną kluczową dla inżyniera rzecz: przebieg czasowy momentów napędowych dla zadanej trajektorii. To jest dokładnie specyfikacja wymagań, którą wpisuje się do zapytania ofertowego u producenta silników (Maxon, Kollmorgen, Allied Motion) i przekładni (Harmonic Drive, Nabtesco). Z jednego przebiegu wyciągamy cztery niezależne liczby — i każda z nich ogranicza inną własność docelowego napędu.
Cztery metryki konstrukcyjne — co każda ogranicza
τ_peak
Moment szczytowy — chwilowy maksymalny moment, który silnik musi wytworzyć (typowo trwa milisekundy: podczas startu, hamowania, zderzenia z constraintem). Ogranicza go krzywa T-N silnika (saturacja magnetyczna) oraz wytrzymałość mechaniczna przekładni (peak torque rating).
τ_rms
Moment skuteczny (RMS) — średnia kwadratowa po całym cyklu. Dlaczego kwadratowa? Bo straty cieplne silnika to , a prąd jest proporcjonalny do momentu (). RMS dyktuje moment ciągły z karty katalogowej i temperaturę uzwojeń — to ona decyduje czy silnik przeżyje cykl pracy bez przegrzania.
q̇_peak
Prędkość kątowa maksymalna przegubu. Po przeskalowaniu przez przełożenie przekładni daje wymaganą prędkość obrotową silnika . Ogranicza ją no-load speed silnika i max input speed przekładni harmonicznej (typowo 4000–6000 rpm).
P_peak
Moc szczytowa wymagana w danym momencie. Dyktuje wybór drivera (sterownika silnika) i zasilacza (PSU). Często pojawia się w innym momencie cyklu niż τ_peak — bo tam gdzie τ jest max, q̇ często jest mała (i odwrotnie). Dla zasilania bateryjnego dodatkowo liczy się energia cyklu .
Poniższy interaktywny panel czyta tę samą trajektorię którą widzisz na wykresie τ(t) wyżej, ale agreguje ją do tych czterech liczb per napęd. Zmieniaj scenariusz i payload i obserwuj, jak rosną wymagania konstrukcyjne. Wiersz z żółtym tłem wskazuje napęd krytyczny (najwyższe wymagane τ_peak) — to on dyktuje wybór całej rodziny silników.
Następny krok: mając te cztery metryki, przechodzimy do modułu 11 (Dobór napędów), w którym budujemy pełny pipeline: krzywa T-N silnika z naniesionym punktem pracy, sprawdzenie bezwładności zredukowanej (wpływ na pasmo regulatora), cross-reference do realnych modeli z katalogów Maxon / Kollmorgen / Harmonic Drive, iteracja projektowa „za duży silnik → za drogo, za mały → niezawodność". To naturalne zwieńczenie wiedzy z modułów M9+M10 — tu liczyliśmy momenty, w M10 energię, w M11 składamy to w decyzję zakupową.
Zanim zaufamy pełnemu algorytmowi 6-DOF dla ES5, przeliczmy całość „na piechotę" dla najmniejszego nietrywialnego przypadku: dwa ogniwa, obroty w jednej płaszczyźnie, oś z prostopadła do tej płaszczyzny. To klasyczny model z każdego podręcznika robotyki (Spong, Murray–Li–Sastry, Siciliano) i daje się rozpisać ręcznie w ~15 wzorach.
2R planarny manipulator w polu grawitacji. Oś z układu globalnego jest prostopadła do płaszczyzny rysunku (z czytelnika ku obserwatorowi). Oba przeguby obrotowe — q₁ wokół osi z bazy, q₂ wokół osi z na końcu ogniwa 1. Środki mas C₁, C₂ w połowie długości każdego pręta.
Uproszczenia notacyjne: wszystkie wektory wyrażam w bazie globalnej (jedna płaszczyzna xy → 2 składowe wystarczą; trzecia, z, będzie zerowa dla translacji i pełna dla rotacji). Pomijam lewe górne indeksy — w 2D z jednym wspólnym układem nie są potrzebne.
Oznaczenia skrótowe: , , , .
Krok po kroku propaguję od bazy do końcówki. Każde równanie poniżej jest specjalizacją do 2D, w której wszystkie ω i ε są kolinearne z osią z, więc iloczyny wektorowe upraszczają się do skalarnego mnożenia z obrotem 90°.
Ogniwo 1 (od bazy)
Z bazy: . Tylko obrót q₁ wokół osi z:
Przyspieszenie środka masy C₁ (w odległości L₁/2 od osi q₁ wzdłuż ogniwa, czyli wektor ):
Po rozpisaniu (ω₁ wzdłuż ẑ, mnożenie wektorowe obraca w płaszczyźnie xy o 90°):
Pierwszy człon (z ) — przyspieszenie tangencjalne. Drugi (z ) — przyspieszenie dośrodkowe, zawsze skierowane do osi obrotu. Klasyczna dekompozycja ruchu po okręgu.
Ogniwo 2 (po propagacji przez przegub q₂)
Pozycja przegubu q₂ względem bazy: . Najpierw przyspieszenie tego pinu (z wzoru identycznego do tylko z pełnym L₁ zamiast L₁/2):
Prędkość i przyspieszenie kątowe ogniwa 2 — wszystkie wzdłuż ẑ więc po prostu się dodają (iloczyn wektorowy ):
Wektor od pinu q₂ do C₂: . Przyspieszenie C₂ = przyspieszenie pinu q₂ + tangencjalne + dośrodkowe:
Siły i momenty bezwładności (Newton + Euler)
Z równania Newtona (dla każdego ogniwa osobno):
Z równania Eulera — wszystkie ω i ε są wzdłuż ẑ, więc (równoległe wektory). Zostaje tylko człon :
To dokładnie tu znikł „moment żyroskopowy" z kroku 4 ogólnego algorytmu — dla obrotu wokół osi własnej (głównej) tensora bezwładności człon = 0. Dlatego przykład 2R nie pokazuje żyroskopu (potrzeba do tego 3D z osiami nieortogonalnymi).
Zaczynamy od końcówki (gdzie nie ma obciążenia) i bilansujemy siły ogniwo po ogniwie. Grawitację uwzględniamy jawnie jako siłę w środku masy każdego ogniwa. W głównym algorytmie jest ona zaszyta w przez sztuczkę Craig'a — tutaj rozdzielamy dla czytelności.
Ogniwo 2 (od końcówki)
Inicjalizacja za końcówką: .
Bilans sił:
Bilans momentów wokół pinu q₂ (czyli początku ogniwa 2): moment bezwładności + moment od na ramieniu + moment od grawitacji:
Moment napędowy w przegubie q₂ to składowa z wektora momentu (oś przegubu = ẑ):
Ogniwo 1
Bilans sił (dodajemy propagowane od ogniwa 2):
Bilans momentów wokół pinu q₁ — cztery składowe (zgodne z Craig 6.50):
Człon to moment, jakim ogniwo 2 „ciągnie" za pin q₂ — propaguje się na ramieniu długości .
Dla i wszystkie redukują się do zera, więc i . Zostają tylko grawitacyjne wkłady w . Można je wyliczyć drugim, niezależnym sposobem — z gradientu energii potencjalnej:
gdzie wysokości środków mas (z y w górę):
Gradient:
Dwa niezależne wyprowadzenia — wynik musi się zgadzać
Powyższe z gradientu energii muszą być identyczne z z Newton-Eulera podstawionym . Jeśli się zgadzają — masz pewność, że algorytm działa. Jeśli nie zgadzają się — szukaj błędu w mnożeniu macierzą rotacji albo w znaku iloczynu wektorowego. To najlepszy test jednostkowy dla implementacji NE.
Dla pełnej dynamiki (q̇, q̈ ≠ 0) podobny test można zrobić przez bilans mocy: gdzie T to energia kinetyczna. Implementujemy go w panelu „Sanity check" pod playgroundem (planowane w kolejnej iteracji modułu).
Mając już intuicję z 2R-planarnego (powyżej), spójrzmy na pełny 6-DOF na konkretnym scenariuszu: q = (0°, 45°, 45°, 0°, 90°, 0°), obrót pierwszego przegubu z prędkością q̇₁ = 0.5 rad/s, zerowe przyspieszenia. Wszystkie wartości pośrednie wyliczone analitycznie (algorytm src/lib/dynamics/newton-euler.ts) i tu wypisane — można je przepisać do własnego notebooka i sprawdzić implementację linijka po linijce.
ω₁ = (0, 0, q̇₁) bo pierwszy przegub obraca się wokół osi z bazy. a₁ ≈ (0, 0, +g) — grawitacja w lokalnym układzie 1 (oś z₁ pokrywa się z osią z bazy).
ω₂ ma niezerowe x i y bo q̇₁ z układu 1 zostaje obrócone przez R^2_1 (α₁ = π/2). Stąd efekty Coriolisa w propagacji a₂.
Po Rz(q₃ = 45°) bez α₃ skręcenia, kierunek propagacji się zmienia zgodnie z kątem stawu. Fᶜ₃ zdominowane przez grawitację (oś x).
τ₁ ≈ 0 — pierwszy przegub porusza się wokół osi pionowej, więc grawitacja go nie obciąża, a brak q̈₁ oznacza brak siły bezwładności. τ₂ = 31.2 Nm dominuje — to przegub utrzymujący ramię w pozie q₂ = 45° przeciw grawitacji, plus dodatkowa składowa od ω₁ (efekt odśrodkowy przy ramieniu wykonującym łuk wokół osi 1). τ₃, τ₄ niewielkie — kostka i przedramię w stosunkowo neutralnej pozie.
Wszystkie liczby są spójne z algorytmem z src/lib/dynamics/newton-euler.ts. Wartości są w jednostkach SI (rad, rad/s, rad/s², m, m/s, m/s², N, Nm, kg, kg·m²). Dla q̈ ≠ 0 widoczne byłyby też niezerowe wartości (przyspieszenia kątowe) we wszystkich ogniwach.
Wszystkie kluczowe równania algorytmu Newton-Euler dla manipulatora w jednym miejscu — przydatne jako kompaktowa referencja przy implementacji albo powtórce przed egzaminem.
Sztuczka Craig'a: a₀ to "fictitious upward base acceleration" — symuluje grawitację działającą "w dół" na ogniwa, dzięki czemu w rekurencji w przód aᶜᵢ propaguje grawitację automatycznie.
Drugi człon to efekt Coriolisa — pojawia się gdy ogniwo dziedziczy ω od poprzedniego i jednocześnie ma własną prędkość przegubu.
Pierwszy człon — tangencjalny (od ε), drugi — odśrodkowy (analog v²/r), trzeci — przyspieszenie poprzedniego ogniwa (zawiera grawitację).
F_C — siła d'Alemberta (z grawitacją). Drugi człon w N_C to moment żyroskopowy — odpowiedzialny za precesję szybko obracających się ogniw.
Składowa wzdłuż osi obrotu przegubu i (czyli z układu i). Pozostałe składowe momentu są zniwelowane przez konstrukcję mechaniczną przegubu.
Mając wektor momentów napędowych otwiera się kilka naturalnych dalszych dróg, w zależności od tego, do czego dynamika jest nam potrzebna:
Pinocchio, RBDL, OCS2. Aplikacje: chód dwunożny, mobile manipulation.