Robot nie wykonuje ruchu idealnie tylko dlatego, że otrzymał polecenie „ustaw przegub na 30°” albo „jedź z prędkością 1 m/s”. Rzeczywisty mechanizm ma masę, bezwładność, tarcie, luzy, ograniczoną moc napędu i podlega zakłóceniom. Dlatego układ sterowania musi stale porównywać wartość zadaną z wartością rzeczywistą i na tej podstawie korygować sygnał sterujący.
Jednym z najbardziej rozpowszechnionych sposobów realizacji takiego sterowania jest regulator PID – proportional-integral-derivative. W robotyce może być wykorzystywany między innymi do regulacji pozycji przegubu, prędkości koła, prędkości osi czy momentu napędowego. W klasycznym ujęciu regulator oblicza sygnał sterujący na podstawie aktualnego błędu, jego historii oraz szybkości zmian błędu.
Dobrym przykładem jest pojedynczy przegub ramienia robotycznego. Enkoder mierzy jego aktualny kąt, sterownik porównuje go z kątem zadanym, a regulator PID decyduje, jak mocno napęd powinien zareagować. Proces jest wykonywany wielokrotnie w pętli sprzężenia zwrotnego aż do osiągnięcia wymaganej pozycji lub trajektorii.
PID pozostaje także częścią współczesnych architektur robotycznych. Oficjalny pid_controller w środowisku ros2_control może pracować z różnymi interfejsami stanu i sterowania, m.in. pozycją, prędkością, przyspieszeniem i effort, a także współpracować z członem feedforward.
W tym artykule przejdziemy od intuicyjnego wyjaśnienia działania członów P, I i D, przez przykład sterowania przegubem robota, aż do strojenia regulatora, układów kaskadowych i zastosowania PID w ROS 2. Jednocześnie pokażemy, gdzie kończą się możliwości prostego regulatora PID i dlaczego w bardziej zaawansowanych robotach bywa on łączony z modelem dynamiki, feedforwardem lub innymi metodami sterowania.
Czym jest regulator PID w robotyce?
Regulator PID to algorytm sterowania ze sprzężeniem zwrotnym, którego zadaniem jest zmniejszanie różnicy pomiędzy wartością zadaną a wartością rzeczywiście zmierzoną w układzie. Skrót PID pochodzi od trzech członów regulatora: P – proporcjonalnego, I – całkującego oraz D – różniczkującego.
W robotyce regulator może na przykład otrzymać informację, że przegub powinien znajdować się pod kątem 30°, podczas gdy enkoder wskazuje 27°. Powstaje wtedy uchyb regulacji, czyli różnica pomiędzy wartością zadaną a zmierzoną:
e(t) = wartość zadana − wartość zmierzona
Na podstawie tego błędu regulator oblicza sygnał sterujący kierowany do napędu. W zależności od architektury układu może to być między innymi polecenie momentu, siły, prądu, napięcia albo wartość przekazywana do kolejnej wewnętrznej pętli regulacji.
Klasyczne sterowanie PID jest jednym z najczęściej stosowanych rodzajów sterowania ze sprzężeniem zwrotnym. W materiałach Modern Robotics regulator PID jest omawiany bezpośrednio na przykładzie pojedynczego przegubu robota, dla którego sygnałem sterującym jest moment lub siła.
Najważniejsza idea jest prosta: regulator nie zakłada, że robot wykonał polecenie poprawnie. Mierzy rezultat ruchu, porównuje go z wartością zadaną i na bieżąco wprowadza korektę. To właśnie zamknięta pętla sprzężenia zwrotnego odróżnia regulację PID od prostego wysłania polecenia do silnika bez sprawdzania efektu.
Warto od razu zaznaczyć, że PID nie zawsze musi występować w pełnej postaci. W wielu układach stosuje się regulatory P, PI albo PD, a w robotyce manipulacyjnej często spotyka się sterowanie PD bez członu całkującego, jeśli jego użycie nie jest potrzebne do realizacji zadania. Materiały MIT dotyczące sterowania manipulatorami również pokazują PID jako podstawową metodę śledzenia trajektorii, ale wskazują, że w części zastosowań człon całkujący może być pomijany.
Dlaczego robot potrzebuje sprzężenia zwrotnego?
Gdyby robot sterował napędem wyłącznie na podstawie wcześniej obliczonego polecenia, bez sprawdzania rzeczywistego efektu, mielibyśmy do czynienia ze sterowaniem w pętli otwartej. Taki układ zakładałby, że zadany sygnał zawsze wywoła dokładnie taki sam ruch. W rzeczywistym robocie założenie to zwykle nie jest wystarczające, ponieważ na mechanizm wpływają tarcie, zmieniające się obciążenie, grawitacja, niedokładności modelu oraz zakłócenia zewnętrzne.
Sprzężenie zwrotne zamyka pętlę informacji. Robot mierzy aktualny stan, porównuje go ze stanem wymaganym i na podstawie powstałego błędu koryguje sterowanie. Zamiast wykonać jedno polecenie i założyć, że cel został osiągnięty, regulator wielokrotnie podejmuje niewielkie działania korygujące. Takie podejście pozwala reagować również na zakłócenia, których nie uwzględniono wcześniej w modelu.
Wyobraźmy sobie przegub ramienia, który ma osiągnąć 30°. Sterownik uruchamia silnik, ale ciężar trzymanego przedmiotu powoduje, że ramię zatrzymuje się na 28°. W pętli otwartej system może nawet nie wiedzieć, że wystąpił błąd. W układzie ze sprzężeniem zwrotnym enkoder mierzy 28°, regulator wykrywa uchyb 2° i zwiększa lub odpowiednio modyfikuje sterowanie napędem.
Sprzężenie zwrotne nie gwarantuje jednak automatycznie idealnego zachowania. Odpowiedź układu może charakteryzować się między innymi uchybem ustalonym, przeregulowaniem i określonym czasem ustalania. To właśnie dobór regulatora i jego parametrów decyduje, czy robot osiągnie cel szybko, dokładnie i bez nadmiernych oscylacji. Modern Robotics traktuje analizę odpowiedzi błędu jako jeden z podstawowych etapów projektowania układu sterowania robotem.
MIT w materiałach poświęconych robotyce opisuje tę różnicę bardzo praktycznie: zamiast wykonywać jedną wcześniej ustaloną akcję, robot ze sprzężeniem zwrotnym wykorzystuje czujniki do kolejnych korekt zależnych od aktualnej sytuacji.
W przypadku manipulatora pomiar pozycji przegubu może być bezpośrednio wykorzystany do śledzenia zadanej trajektorii. Materiały MIT Robotic Manipulation pokazują właśnie taki przykład regulatora PID, w którym różnica pomiędzy pozycją zadaną i zmierzoną staje się podstawą sterowania przegubem.
Wartość zadana, wartość zmierzona i uchyb regulacji
Każdy regulator PID potrzebuje trzech podstawowych informacji: wartości zadanej, wartości zmierzonej oraz wynikającego z nich uchybu regulacji. To właśnie uchyb jest sygnałem, na podstawie którego regulator decyduje, jak mocno powinien zareagować układ napędowy.
Wartość zadana określa stan, który robot powinien osiągnąć. Może to być na przykład kąt przegubu równy 30°, prędkość koła 2 rad/s albo prędkość liniowa platformy 0,5 m/s.
Wartość zmierzona pochodzi z czujnika albo estymatora stanu. W przypadku przegubu może być to kąt odczytany z enkodera, a w przypadku prędkości — wartość obliczona na podstawie kolejnych pomiarów położenia.
Różnica pomiędzy wartością zadaną a zmierzoną tworzy uchyb regulacji:
e(t) = r(t) − y(t)
gdzie r(t) oznacza wartość zadaną, y(t) wartość zmierzoną, a e(t) błąd regulacji. Taką konwencję stosuje się powszechnie w teorii sterowania i materiałach dotyczących PID.
Jeżeli przegub ma osiągnąć 30°, a enkoder wskazuje 27°, uchyb wynosi +3°. Jeżeli natomiast robot przekroczy punkt docelowy i osiągnie 32°, uchyb zmieni znak i wyniesie −2°. Znak błędu informuje więc regulator również o kierunku, w którym należy wprowadzić korektę.
W praktyce regulator nie analizuje jednak wyłącznie jednej chwilowej wartości błędu. Człon proporcjonalny reaguje na jego aktualną wartość, człon całkujący uwzględnia błąd nagromadzony w czasie, a człon różniczkujący ocenia szybkość jego zmian. To właśnie dzięki temu pełny regulator PID może reagować inaczej na duży błąd początkowy, niewielkie odchylenie utrzymujące się przez długi czas oraz gwałtowne zbliżanie się do wartości zadanej.
Z czego składa się regulator PID?
Regulator PID łączy trzy sposoby reagowania na uchyb regulacji. Każdy z nich analizuje błąd z innej perspektywy: człon P reaguje na jego aktualną wartość, człon I uwzględnia błąd nagromadzony w czasie, a człon D reaguje na tempo jego zmian.
Można więc potraktować PID jako połączenie informacji o teraźniejszości, przeszłości i zmianie błędu. Takie ujęcie jest zgodne z klasycznym opisem regulatora PID w teorii sterowania.
Współczynniki Kp, Ki i Kd określają, jak duży wpływ ma każdy z tych trzech członów na końcowy sygnał sterujący. Regulator nie musi przy tym zawsze wykorzystywać wszystkich składników. W praktyce spotyka się również regulatory P, PI i PD, zależnie od dynamiki układu i wymagań zadania.
Człon P – proporcjonalny
Człon P reaguje bezpośrednio na aktualny uchyb. Im większa różnica pomiędzy wartością zadaną i zmierzoną, tym większa jest jego reakcja.
Jeżeli przegub powinien znajdować się w pozycji 30°, a aktualnie znajduje się przy 10°, regulator widzi duży błąd i człon proporcjonalny może wygenerować silną reakcję. Gdy przegub zbliży się do 29°, uchyb będzie znacznie mniejszy, więc również udział członu P w sterowaniu będzie mniejszy.
Siłę tego działania określa współczynnik Kp. Zbyt mała wartość Kp może powodować powolną i mało zdecydowaną reakcję układu. Zwiększanie Kp zwykle przyspiesza reakcję na błąd, ale zbyt duże wzmocnienie może prowadzić do przeregulowania, oscylacji, a w pewnych układach nawet utraty stabilności. Dokładny efekt zależy od dynamiki sterowanego mechanizmu.
Człon I – całkujący
Człon I analizuje błąd, który utrzymywał się w czasie. Jeżeli niewielki uchyb występuje przez dłuższy okres, jego wpływ jest stopniowo akumulowany.
Załóżmy, że przegub powinien utrzymywać 30°, ale pod wpływem grawitacji i obciążenia stale zatrzymuje się na 29°. Człon P reaguje na błąd 1°, lecz jego działanie może nie wystarczyć do całkowitego usunięcia odchylenia. Człon całkujący będzie natomiast gromadził ten utrzymujący się błąd i zwiększał swoją korektę, dopóki uchyb nie zostanie zredukowany.
Za jego wpływ odpowiada współczynnik Ki. Jedną z podstawowych zalet członu całkującego jest możliwość eliminowania uchybu ustalonego wynikającego np. ze stałego zakłócenia. Jednocześnie zbyt silne działanie całki może pogarszać odpowiedź układu, dlatego jej stosowanie wymaga ostrożnego strojenia.
Człon D – różniczkujący
Człon D reaguje na szybkość zmian błędu. Nie interesuje go wyłącznie to, jak duży jest uchyb w danej chwili, lecz również jak szybko sytuacja się zmienia.
Jeżeli przegub bardzo szybko zbliża się do pozycji zadanej, człon różniczkujący może zwiększyć działanie tłumiące i ograniczyć tendencję do przekroczenia celu. Z tego powodu składnik D jest często kojarzony z poprawą tłumienia i ograniczaniem przeregulowania.
Jego wpływ określa współczynnik Kd. Człon D jest jednak bardziej wrażliwy na szybkozmienne zakłócenia i szum pomiarowy, ponieważ operacja różniczkowania może wzmacniać wysokoczęstotliwościowe zmiany sygnału. Do tego problemu wrócimy później w osobnej sekcji dotyczącej szumu i filtracji.
W robotyce nie zawsze korzysta się z pełnego PID. Przykładowo materiały MIT dotyczące sterowania manipulatorami wskazują, że w niektórych zadaniach manipulacyjnych często stosuje się PD, czyli Ki = 0. Dobór struktury regulatora zależy więc od właściwości mechanizmu oraz charakteru zadania.
Jak wygląda równanie regulatora PID?
Działanie wszystkich trzech członów można zapisać jednym równaniem. W najczęściej stosowanej, równoległej postaci regulatora PID sygnał sterujący ma postać:
u(t) = Kp · e(t) + Ki · ∫e(τ)dτ + Kd · de(t)/dt
gdzie u(t) jest sygnałem wyjściowym regulatora, e(t) oznacza uchyb regulacji, a współczynniki Kp, Ki i Kd określają udział członu proporcjonalnego, całkującego i różniczkującego. Taką postać prawa sterowania podają zarówno materiały MIT dotyczące teorii sterowania, jak i Modern Robotics w przykładzie sterowania pojedynczym przegubem robota.
Równanie można czytać jako sumę trzech niezależnie obliczanych składników. Człon P odpowiada za reakcję na błąd występujący właśnie teraz. Człon I uwzględnia sumę błędów z poprzednich chwil. Człon D wykorzystuje informację o tym, jak szybko błąd rośnie lub maleje.
W przypadku przegubu robota sygnał u(t) może reprezentować na przykład zadany moment napędowy. Modern Robotics omawia właśnie taki przypadek: regulator obserwuje błąd położenia przegubu, a jego wyjściem jest moment sterujący działający na oś.
Ważne jest również to, że wartości Kp, Ki i Kd nie są uniwersalne. Ich jednostki oraz wartości zależą od tego, jaka wielkość jest regulowana i co stanowi sygnał wyjściowy. Inne nastawy będą potrzebne przy regulacji kąta przegubu momentem, a inne przy regulacji prędkości koła.
To ostatnie rozróżnienie jest istotne. Równanie zapisane powyżej opisuje idealny regulator w czasie ciągłym, natomiast komputer sterujący robotem działa dyskretnie — wykonuje obliczenia w określonych odstępach czasu. MIT przedstawia zarówno klasyczne równanie PID, jak i jego interpretację jako regulatora reagującego proporcjonalnie na błąd, jego całkę i pochodną.
W praktycznym sterowniku robota czas pomiędzy kolejnymi iteracjami będzie więc miał duże znaczenie. Do częstotliwości pętli sterowania wrócimy później, ponieważ niewłaściwy czas próbkowania może wpływać na działanie części I i D.
Jak działa regulator PID – krok po kroku?
Działanie regulatora PID można najlepiej zrozumieć jako ciąg powtarzających się obliczeń wykonywanych w pętli sterowania. W każdej iteracji system odczytuje aktualny stan robota, porównuje go z wartością zadaną, oblicza uchyb, wyznacza składniki P, I i D, a następnie wysyła nowe polecenie do napędu.
Załóżmy, że przegub ramienia powinien osiągnąć 30°, a w danej chwili enkoder wskazuje 20°. Regulator otrzymuje więc dodatni uchyb równy 10°. Człon P reaguje na jego aktualną wartość, człon I uwzględnia błędy zgromadzone podczas wcześniejszych iteracji, a człon D analizuje, jak szybko uchyb się zmienia.
Po zsumowaniu tych trzech składników powstaje sygnał sterujący. Napęd zmienia położenie przegubu, enkoder wykonuje kolejny pomiar i cały proces rozpoczyna się ponownie. W ten sposób regulator nie wykonuje jednej dużej korekty, lecz wielokrotnie aktualizuje sterowanie na podstawie bieżącego stanu robota.
Taką ideę zamkniętej pętli sterowania wykorzystuje również współczesny pid_controller w ros2_control: kontroler otrzymuje wartość odniesienia i stan zmierzony, oblicza błąd, a następnie generuje polecenie dla odpowiedniego interfejsu sprzętowego. Aktualna dokumentacja pozwala również pracować w układach kaskadowych oraz wykorzystywać pochodną sygnału odniesienia i sprzężenia zwrotnego.
W przypadku sterowania momentem przegubu robotycznego sytuacja jest jeszcze bardziej wymagająca, ponieważ ruch zależy od dynamiki mechanizmu: masy, bezwładności, grawitacji i oddziaływań pomiędzy członami. Modern Robotics wykorzystuje właśnie taki przykład do pokazania sterowania PID pojedynczym przegubem.
Istotne jest też rozróżnienie między regulacją a planowaniem trajektorii. Regulator PID nie decyduje zwykle, gdzie robot powinien znaleźć się za kilka sekund. Otrzymuje wartość zadaną lub kolejne punkty odniesienia z warstwy nadrzędnej i stara się możliwie dokładnie je śledzić. Aktualna dokumentacja ros2_control również rozdziela te role: dedykowany PID nie służy do interpolowania trajektorii pomiędzy wieloma punktami — do tego przeznaczone są inne kontrolery, np. JointTrajectoryController.
To rozróżnienie będzie ważne później, gdy będziemy omawiać układy kaskadowe i ros2_control.
Przykład: sterowanie pozycją jednego przegubu robota
Rozważmy pojedynczy przegub ramienia robotycznego, którego pozycja jest mierzona przez enkoder. Układ nadrzędny zadaje kąt 30°, natomiast aktualny pomiar wynosi 20°. Regulator otrzymuje więc uchyb:
e = 30° − 20° = 10°
Na tej podstawie obliczane są składniki regulatora. Człon P reaguje na aktualny błąd 10°. Człon I uwzględnia błędy nagromadzone w poprzednich iteracjach, a człon D ocenia, jak szybko różnica pomiędzy pozycją zadaną i rzeczywistą maleje lub rośnie.
Jeżeli wyjściem regulatora jest moment zadany dla przegubu, otrzymany sygnał sterujący wpływa na silnik, a następnie na ruch mechanizmu. Po krótkim czasie enkoder może wskazać na przykład 24°. Uchyb zmniejsza się wtedy do 6° i regulator wykonuje kolejne obliczenie. Proces jest powtarzany podczas całego ruchu.
Warto zauważyć, że w takim przykładzie sterownik nie mówi po prostu silnikowi: „obróć się o 10°”. Regulator określa jak należy oddziaływać na napęd, aby zmniejszyć błąd wynikający z aktualnego stanu mechanizmu. Przy sterowaniu momentowym na ruch wpływają jednocześnie bezwładność, tarcie, grawitacja i obciążenie przegubu. Z tego powodu ten sam moment nie musi zawsze powodować identycznej zmianę położenia. Modern Robotics wykorzystuje właśnie pojedynczy przegub sterowany momentem jako podstawowy przykład wyjaśniający PID w robotyce.
Szczególnie ciekawy jest wpływ grawitacji. Dla regulatora PD stabilizującego przegub w określonej pozycji moment grawitacyjny może powodować niezerowy uchyb ustalony. Dodanie członu całkującego pozwala usuwać taki trwały błąd, ponieważ całka narasta tak długo, jak długo uchyb się utrzymuje.
Dlaczego przegub nie zatrzymuje się po prostu dokładnie na 30°?
To ważne pytanie. Regulator sterujący rzeczywistym robotem działa na układ dynamiczny. Człon ma określoną masę i bezwładność, a silnik wytwarza moment, który powoduje przyspieszenie. Gdy przegub zbliża się do punktu zadanego, nadal może posiadać prędkość, więc zbyt agresywne sterowanie może doprowadzić do przekroczenia celu.
Właśnie tutaj szczególne znaczenie ma człon D, który może zwiększać tłumienie poprzez reakcję na zmianę błędu. Odpowiednio dobrane P i D pozwalają kształtować szybkość oraz tłumienie odpowiedzi, natomiast I może kompensować trwałe zakłócenia. Modern Robotics pokazuje to na przykładzie odpowiedzi pojedynczego przegubu oraz porównania PD i PID w obecności grawitacji.
Jednocześnie PID nie jest jedynym możliwym rozwiązaniem. Jeżeli dostępny jest odpowiednio dokładny model dynamiki robota, można przewidywać wymagany moment wynikający z bezwładności, grawitacji i tarcia, a PID lub PD pozostawić przede wszystkim do korygowania błędów modelu i zakłóceń. To prowadzi do metod takich jak computed-torque control, które Modern Robotics omawia jako kolejny krok po klasycznym PID.
Sterowanie pozycją, prędkością i momentem – czym się różnią?
W robotyce regulator PID może pracować w różnych warstwach układu sterowania. Nie zawsze reguluje tę samą wielkość. W jednym robocie jego zadaniem może być utrzymanie pozycji przegubu, w innym – prędkości obrotowej, a w jeszcze innym – pośrednie sterowanie momentem napędowym.
Najważniejsze jest rozróżnienie pomiędzy wielkością zadaną, wielkością mierzoną oraz sygnałem wyjściowym regulatora.
Przy sterowaniu pozycją wartością zadaną może być kąt przegubu, np. 30°. Regulator porównuje go z pozycją zmierzoną przez enkoder. Jego wyjście nie musi jednak bezpośrednio oznaczać „nowej pozycji silnika”. W zależności od konstrukcji napędu może być to zadana prędkość dla kolejnego regulatora albo zadany moment.
Przy sterowaniu prędkością układ porównuje prędkość zadaną z prędkością rzeczywistą. Regulator próbuje wtedy zmniejszyć różnicę pomiędzy tymi wartościami, a jego wyjściem może być np. żądany moment lub prąd napędu.
W sterowaniu momentem poziom abstrakcji jest jeszcze niższy. Układ próbuje uzyskać określony moment działający na przegub. W Modern Robotics sterowanie PID analizowane jest właśnie dla przypadku, w którym sygnałem wejściowym dynamiki robota jest moment lub siła. Przy takim sterowaniu trzeba bezpośrednio uwzględniać dynamikę mechanizmu.
Sterowanie pozycją
W sterowaniu pozycyjnym głównym celem jest osiągnięcie i utrzymanie określonego położenia.
Przykład:
pozycja zadana: 45°
pozycja zmierzona: 42°
uchyb pozycji: +3°
Regulator reaguje tak, aby zmniejszyć tę różnicę.
Takie sterowanie jest naturalne w ramionach robotycznych, chwytakach, osiach liniowych czy mechanizmach robotów humanoidalnych, gdzie nadrzędny system często określa docelowe pozycje przegubów.
Sterowanie prędkością
Tutaj wartością regulowaną jest prędkość.
Przykład:
prędkość zadana: 5 rad/s
prędkość zmierzona: 4,6 rad/s
uchyb prędkości: +0,4 rad/s
Takie podejście jest powszechne między innymi w układach napędowych kół robotów mobilnych oraz wewnętrznych pętlach serwonapędów.
Regulator prędkości nie musi wiedzieć, do jakiego punktu końcowego zmierza robot. Jego zadaniem może być wyłącznie utrzymanie zadanej prędkości obrotowej danej osi.
Sterowanie momentem
Sterowanie momentem jest związane bezpośrednio z siłowym oddziaływaniem napędu na mechanizm.
Moment obrotowy wpływa na przyspieszenie przegubu zgodnie z dynamiką robota. Dlatego identyczny moment może wywołać różne zachowanie zależnie od pozycji ramienia, masy ładunku, grawitacji czy oddziaływania pozostałych członów.
W rzeczywistym serwonapędzie moment silnika jest często powiązany z prądem generującym moment, ale moment i prąd nie są pojęciami tożsamymi. Przeliczenie zależy m.in. od właściwości silnika i sposobu sterowania napędem.
To rozróżnienie dobrze widać również w ros2_control. Interfejs sprzętowy może udostępniać dla przegubu różne interfejsy stanu i poleceń, m.in. position, velocity oraz effort. W dokumentacji effort odpowiada wielkości siłowej: dla ruchu obrotowego jest to moment, a dla ruchu liniowego – siła.
Nie oznacza to jednak, że każdy robot udostępnia wszystkie te poziomy użytkownikowi. Często producent serwonapędu realizuje część szybkich pętli regulacji wewnątrz napędu, a aplikacja robotyczna otrzymuje jedynie interfejs pozycyjny lub prędkościowy. Z punktu widzenia programisty można więc wydawać polecenia pozycji, mimo że niżej działają kolejne, niewidoczne dla niego pętle sterowania.
Regulator PID a enkoder
W wielu układach robotycznych enkoder jest jednym z podstawowych źródeł sprzężenia zwrotnego dla regulatora. Dostarcza informacji o rzeczywistym położeniu osi, a na podstawie kolejnych pomiarów może być również wyznaczana jej prędkość.
Regulator PID sam w sobie nie „wie”, gdzie znajduje się przegub. Potrzebuje pomiaru stanu robota. Jeżeli zadana pozycja osi wynosi 45°, a enkoder wskazuje 42°, regulator otrzymuje informację o uchybie wynoszącym 3° i na tej podstawie wyznacza odpowiednią reakcję.
Schemat jest więc bardzo prosty:
pozycja zadana → regulator → napęd → przegub → enkoder → pozycja zmierzona → regulator
Enkoder i regulator pełnią jednak zupełnie różne funkcje. Enkoder jest elementem pomiarowym – informuje system o stanie mechanizmu. PID jest algorytmem sterowania – wykorzystuje ten pomiar do obliczenia korekty.
W środowisku ros2_control stan przegubów może być udostępniany poprzez interfejsy takie jak position, velocity i effort. joint_state_broadcaster publikuje dostępne informacje o ruchu przegubów w /joint_states, natomiast kontrolery mogą wykorzystywać odpowiednie interfejsy stanu jako sprzężenie zwrotne.
Czy regulator PID zawsze korzysta bezpośrednio z enkodera?
Nie. W rzeczywistym robocie pomiędzy fizycznym enkoderem a regulatorem mogą znajdować się dodatkowe warstwy przetwarzania. Pomiar może być skalowany, filtrowany, przeliczany przez przekładnię albo łączony z innymi informacjami w estymatorze stanu.
Regulator może więc otrzymywać już przygotowaną wartość pozycji lub prędkości, nie mając bezpośredniego dostępu do surowych impulsów enkodera.
W przypadku bardziej złożonych robotów jeden sygnał pomiarowy może także nie wystarczać. Robot kroczący lub humanoidalny może wykorzystywać jednocześnie enkodery przegubów, IMU, czujniki siły i inne sensory, a regulator pracuje wtedy na stanie wyznaczonym przez odpowiednią warstwę estymacji.
PID w układzie kaskadowym
W wielu rzeczywistych robotach jedna pętla regulacji nie steruje całym napędem od początku do końca. Zamiast tego stosuje się układ kaskadowy, w którym kilka regulatorów pracuje jeden za drugim na różnych poziomach sterowania.
Typowy przykład wygląda następująco:
pozycja → prędkość → moment lub prąd → napęd
Zewnętrzna pętla może kontrolować pozycję przegubu. Jej wyjściem nie jest wtedy bezpośrednio sygnał dla silnika, lecz na przykład zadana prędkość. Ta staje się wartością odniesienia dla kolejnego regulatora, który steruje prędkością i może wyznaczać wymagany moment. Jeszcze niżej serwonapęd może posiadać własną, bardzo szybką pętlę regulacji prądu silnika.
Takie rozwiązanie pozwala rozdzielić zadania sterowania. Zewnętrzna pętla odpowiada za dokładność położenia, natomiast wewnętrzne pętle reagują na szybsze zjawiska zachodzące bezpośrednio w napędzie.
Dlaczego stosuje się kilka pętli?
Poszczególne wielkości w napędzie zmieniają się z różną dynamiką. Prąd silnika może być regulowany znacznie szybciej niż pozycja całego przegubu robota. Z tego powodu wewnętrzne pętle są zazwyczaj projektowane tak, aby reagowały szybciej niż pętle znajdujące się wyżej w hierarchii.
Dzięki temu regulator pozycji nie musi samodzielnie zajmować się wszystkimi szczegółami pracy silnika. Może założyć, że niższa warstwa w rozsądnym zakresie zrealizuje zadaną prędkość lub moment.
Przykład dla przegubu robota
Załóżmy, że przegub powinien osiągnąć 60°. Aktualna pozycja wynosi 50°.
Regulator pozycji wykrywa uchyb +10° i może wyznaczyć na przykład:
zadana prędkość = +2 rad/s
Regulator prędkości porównuje następnie tę wartość z rzeczywistą prędkością osi. Jeżeli enkoder wskazuje 1,5 rad/s, powstaje kolejny uchyb:
2,0 − 1,5 = +0,5 rad/s
Na jego podstawie niższa pętla wyznacza odpowiednie sterowanie napędem.
W efekcie wyjście jednego regulatora staje się wartością zadaną dla kolejnego. To właśnie jest istota regulacji kaskadowej.
Układy kaskadowe w ROS 2
ros2_control obsługuje również łączenie kontrolerów w łańcuchy. Kontroler może udostępniać swoje interfejsy referencyjne innemu kontrolerowi, dzięki czemu wyjście jednego elementu może stać się wejściem następnego. Oficjalna dokumentacja opisuje tę funkcję jako controller chaining / cascade control.
Dobrym przykładem jest demonstracja robota różnicowego w ros2_control, gdzie diff_drive_controller wyznacza prędkości kół, a następnie dwa regulatory PID sterują poszczególnymi kołami. Dokumentacja pokazuje więc dokładnie tę samą ideę: warstwa nadrzędna określa wartość odniesienia, a regulator niższego poziomu realizuje ją na sprzęcie.
Sam pid_controller również może działać jako element takiego łańcucha, zarówno z kontrolerem poprzedzającym, jak i następującym. Co istotne, jego konfiguracja zależy od użytych interfejsów — dokumentacja podaje przykłady m.in. regulacji position → velocity, velocity → acceleration czy sterowania przy zgodnych interfejsach pozycji, prędkości lub effort.
Jak dobiera się Kp, Ki i Kd?
Dobór współczynników Kp, Ki i Kd, nazywany strojeniem regulatora PID, decyduje o tym, jak szybko i dokładnie robot będzie reagował na wartość zadaną oraz czy jego ruch pozostanie stabilny.
Nie istnieje jeden zestaw nastaw odpowiedni dla wszystkich robotów. Wartości regulatora zależą m.in. od bezwładności mechanizmu, przełożenia, tarcia, mocy napędu, obciążenia, częstotliwości pętli sterowania oraz rodzaju regulowanej wielkości. Nastawy dobre dla nieobciążonego przegubu mogą nie być optymalne po zamontowaniu ciężkiego chwytaka albo przenoszonego ładunku.
W przypadku prostego modelu pojedynczego przegubu Modern Robotics pokazuje bezpośredni związek pomiędzy Kp a szybkością odpowiedzi oraz pomiędzy Kd a tłumieniem układu. Dodanie Ki pozwala usuwać uchyb ustalony, ale jednocześnie zwiększa rząd układu i może pogorszyć jego stabilność, jeśli wzmocnienie całkujące zostanie dobrane zbyt agresywnie.
Co zmienia zwiększanie Kp?
Kp określa, jak silnie regulator reaguje na aktualny błąd.
Przy bardzo małym Kp robot może reagować powoli i „miękko”. Zwiększenie Kp zazwyczaj powoduje bardziej zdecydowaną reakcję oraz szybsze zbliżanie się do wartości zadanej.
Nie można jednak zwiększać Kp bez ograniczeń. Przy zbyt dużym wzmocnieniu mogą pojawić się przeregulowanie, oscylacje, pobudzanie niezamodelowanych rezonansów mechanicznych albo ograniczenia napędu.
W modelu pojedynczego przegubu omawianym w Modern Robotics Kp wpływa bezpośrednio na częstotliwość naturalną odpowiedzi układu. W rzeczywistym robocie sytuację komplikują jednak opóźnienia, elastyczność konstrukcji, przekładnia i ograniczona częstotliwość sterowania.
Co zmienia zwiększanie Kd?
Kd zwiększa reakcję na szybkość zmian błędu. W odpowiednio zaprojektowanym układzie może działać podobnie do tłumienia, ograniczając tendencję przegubu do przekraczania wartości zadanej.
Jeżeli Kp powoduje szybką, ale zbyt oscylacyjną odpowiedź, właściwie dobrany człon D może poprawić tłumienie i uspokoić ruch.
Zbyt duże Kd również nie jest korzystne. Człon różniczkujący jest szczególnie wrażliwy na szum i szybkie zmiany sygnału pomiarowego, dlatego w rzeczywistych sterownikach często stosuje się odpowiednią filtrację. Do tego problemu wrócimy w dalszej części artykułu.
Co zmienia zwiększanie Ki?
Ki odpowiada za działanie całkujące. Jego podstawowym zadaniem jest eliminowanie błędu, który utrzymuje się przez dłuższy czas.
Przykładem może być przegub, który pod wpływem stałego obciążenia zatrzymuje się o 0,5° poniżej wartości zadanej. Człon I będzie gromadził ten utrzymujący się uchyb i stopniowo zwiększał odpowiednią korektę.
Z Ki należy jednak postępować ostrożnie. MIT zwraca uwagę, że w przeciwieństwie do prostego regulatora PD samo ustawienie dodatnich Kp, Ki i Kd nie gwarantuje stabilności. Zbyt silne działanie całkujące może prowadzić do oscylacji lub destabilizacji pętli.
Praktyczna kolejność strojenia PID
Dla prostych, bezpiecznych do testowania układów często stosuje się podejście stopniowe. MIT przedstawia praktyczną heurystykę, w której najpierw dobiera się działanie proporcjonalne i różniczkujące tak, aby uzyskać akceptowalną odpowiedź przejściową, a dopiero później ostrożnie dodaje człon całkujący w celu usunięcia uchybu ustalonego.
W uproszczeniu proces może wyglądać następująco:
małe Kp → zwiększanie Kp → dodanie Kd → ocena odpowiedzi → dopiero później niewielkie Ki
Nie jest to jednak uniwersalny algorytm strojenia. W nowoczesnych systemach wykorzystuje się również modele matematyczne, identyfikację obiektu, symulacje oraz automatyczne algorytmy doboru parametrów.
Metody Zieglera–Nicholsa – czy nadal mają zastosowanie?
Jedną z najbardziej znanych klasycznych metod strojenia PID jest metoda Zieglera–Nicholsa. Pozwala oszacować początkowe nastawy regulatora na podstawie charakterystyki badanego układu.
MIT nadal przedstawia ją jako przykład heurystycznego strojenia, ale jednocześnie wyraźnie wskazuje ograniczenia tej metody: reguły są oparte na określonych założeniach dotyczących dynamiki obiektu i nie powinny być traktowane jako uniwersalny przepis.
W robotyce takie nastawy mogą być co najwyżej punktem startowym. Wymagania dotyczące dokładności, przeregulowania, ograniczeń momentu, rezonansów mechanicznych i bezpieczeństwa sprawiają, że końcowe parametry zwykle wymagają dalszej analizy i testów.
W szczególności nie należy celowo doprowadzać dużego, ciężkiego lub szybkiego robota do niekontrolowanych oscylacji tylko po to, aby eksperymentalnie znaleźć graniczne wzmocnienie regulatora. Metodę strojenia trzeba dopasować do możliwości bezpiecznego testowania konkretnego układu.
Co się dzieje przy źle dobranych nastawach PID?
Źle dostrojony regulator można często rozpoznać już po przebiegu ruchu robota. Przegub może zbyt wolno dochodzić do wartości zadanej, przekraczać ją, wielokrotnie oscylować wokół celu albo pozostawiać trwały uchyb.
Nie należy jednak przypisywać każdego takiego zachowania wyłącznie nastawom PID. Podobne objawy mogą powodować również opóźnienia komunikacyjne, luzy przekładni, elastyczność konstrukcji, nasycenie napędu, błędny pomiar czy nieuwzględniona dynamika mechanizmu. Regulacja musi być więc oceniana razem z właściwościami całego układu.
Zbyt wolna odpowiedź
Jeżeli regulator reaguje zbyt łagodnie, robot potrzebuje dużo czasu na osiągnięcie wartości zadanej. Przyczyną może być między innymi zbyt małe wzmocnienie proporcjonalne albo nadmierne tłumienie.
Sam wolny ruch nie oznacza oczywiście błędu — w niektórych zastosowaniach właśnie taka odpowiedź może być pożądana. Problem pojawia się wtedy, gdy układ nie spełnia wymaganej dynamiki zadania.
Przeregulowanie
Przeregulowanie występuje wtedy, gdy odpowiedź przekracza wartość zadaną.
Jeżeli przegub ma zatrzymać się przy 30°, może chwilowo osiągnąć np. 33°, a dopiero później wrócić w kierunku celu. Niewielkie przeregulowanie nie zawsze jest niedopuszczalne, ale w robotyce może mieć szczególne znaczenie przy ruchu w pobliżu przeszkód, ograniczników mechanicznych albo podczas precyzyjnej manipulacji.
Człon D może zwiększać tłumienie i ograniczać przeregulowanie. Materiały MIT opisują właśnie tę rolę działania różniczkującego: przeciwdziała ono ruchowi w kierunku zerowego błędu, co może zmniejszać tendencję do przekroczenia punktu docelowego.
Oscylacje wokół wartości zadanej
Przy niewłaściwym doborze parametrów przegub może wielokrotnie przechodzić przez wartość zadaną:
29° → 31,5° → 29,4° → 30,8° → 29,7°...
Jeżeli amplituda takich oscylacji stopniowo maleje, odpowiedź jest tłumiona i może ostatecznie osiągnąć stan ustalony. Jeżeli oscylacje utrzymują się lub narastają, oznacza to poważniejszy problem ze stabilnością układu.
W Modern Robotics pokazano, że dodanie członu całkującego może usuwać uchyb ustalony, ale jednocześnie może zwiększać przeregulowanie i oscylacje, a przy niewłaściwych nastawach prowadzić nawet do niestabilności.
Uchyb ustalony
Robot może również zatrzymać się blisko wartości zadanej, ale nigdy jej dokładnie nie osiągnąć.
Przykład:
wartość zadana: 30°
pozycja ustalona: 29,3°
uchyb ustalony: 0,7°
W przypadku regulatora PD działającego na przegub obciążony grawitacją taki niezerowy uchyb może być potrzebny do wygenerowania momentu proporcjonalnego równoważącego stałe obciążenie. Człon I pozwala wówczas wytworzyć wymagane sterowanie także przy zerowym uchybie pozycji.
MIT zwraca również uwagę na ważny kompromis: bardzo duże tłumienie może ograniczać oscylacje, ale jednocześnie powodować nadmiernie wolną odpowiedź. Z kolei człon całkujący poprawia eliminację uchybu ustalonego, lecz może zwiększać przeregulowanie, wydłużać przebieg przejściowy i prowadzić do zjawiska integrator windup.
Saturacja, integral wind-up i anti-windup
W równaniu PID łatwo założyć, że regulator może wygenerować dowolnie duży sygnał sterujący. Rzeczywisty napęd ma jednak ograniczenia fizyczne. Silnik ma maksymalny prąd i moment, falownik ograniczone napięcie, a sterownik może mieć zdefiniowany maksymalny zakres polecenia.
Jeżeli regulator obliczy wartość większą niż napęd jest w stanie wykonać, następuje saturacja, czyli nasycenie sygnału sterującego.
Przykładowo regulator może żądać momentu:
τ = 12 Nm
podczas gdy napęd jest ograniczony do:
τmax = 6 Nm
Do silnika zostanie więc przekazane najwyżej 6 Nm. Z punktu widzenia regulatora błąd może jednak nadal pozostawać duży.
I właśnie tutaj może pojawić się problem nazywany integral wind-up.
Czym jest saturacja regulatora?
Saturacja oznacza osiągnięcie ograniczenia sygnału sterującego. Nawet jeśli obliczony wynik PID nadal rośnie, rzeczywisty napęd nie może zwiększać swojej reakcji ponad dostępne maksimum.
W praktyce może to nastąpić między innymi podczas gwałtownego przyspieszania ciężkiego ramienia, próby zatrzymania szybko poruszającego się przegubu albo wtedy, gdy robot próbuje wykonać ruch niemożliwy z powodu przeszkody lub ograniczenia mechanicznego.
Sama saturacja nie jest błędem regulatora. Jest naturalnym skutkiem tego, że każdy fizyczny układ wykonawczy ma ograniczony zakres działania.
Problem pojawia się wtedy, gdy regulator nie uwzględnia tego ograniczenia.
Czym jest integral wind-up?
Jeżeli podczas saturacji nadal występuje uchyb, człon całkujący może go dalej gromadzić:
I ← I + e(t) · Δt
Wyobraźmy sobie przegub zablokowany przez przeszkodę. Regulator cały czas widzi błąd położenia. Napęd pracuje już z maksymalnym dopuszczalnym momentem, ale człon I nadal zwiększa swoją wartość.
Po usunięciu przeszkody zgromadzona całka może być bardzo duża. Regulator nadal generuje wtedy silne sterowanie, mimo że robot zaczyna szybko zbliżać się do celu. Rezultatem może być duże przeregulowanie i długi czas powrotu do normalnej pracy.
MIT opisuje integrator wind-up właśnie jako efekt gromadzenia błędu w sytuacji, gdy napęd nie może zrealizować wymaganego polecenia. Po ustąpieniu ograniczenia nagromadzona całka działa przez pewien czas jak dodatkowe zakłócenie i może powodować znaczne przeregulowanie.
Jak działa anti-windup?
Anti-windup to mechanizm ograniczający niepożądane narastanie członu całkującego podczas saturacji.
Nie istnieje tylko jedna metoda. Dwie bardzo popularne strategie to:
Conditional integration – całkowanie jest zatrzymywane lub ograniczane, gdy wyjście regulatora znajduje się w saturacji i dalsze całkowanie zwiększałoby nasycenie.
Back-calculation – regulator porównuje wartość obliczoną przed ograniczeniem z wartością faktycznie dopuszczoną po saturacji, a różnica jest wykorzystywana do odpowiedniej korekty całki.
Takie dwa mechanizmy są obecnie zaimplementowane również w control_toolbox używanym przez ros2_control: conditional_integration oraz back_calculation. Dokumentacja wskazuje wprost, że brak anti-windup może prowadzić do nadmiernego narastania całki, przeregulowania i powolnego wychodzenia z saturacji.
MIT przedstawia analogiczne podejścia: wyłączenie całkowania podczas saturacji oraz sprzężenie do integratora różnicy pomiędzy rzeczywistym ograniczonym sygnałem a sygnałem żądanym przez regulator.
Ograniczać wyjście czy samą całkę?
To nie jest dokładnie to samo.
Można ograniczyć końcowy sygnał regulatora do zakresu akceptowanego przez napęd, np.:
−6 Nm ≤ u(t) ≤ +6 Nm
ale samo ograniczenie u(t) nie musi zapobiegać wind-upowi, ponieważ wewnętrzny stan integratora może nadal narastać.
Dlatego mechanizm anti-windup powinien oddziaływać również na działanie członu I – zatrzymywać jego dalsze narastanie, odpowiednio je ograniczać albo aktywnie sprowadzać integrator do wartości zgodnej z rzeczywistym ograniczeniem napędu.
Aktualny control_toolbox rozróżnia ograniczenia wyjścia u_min/u_max od strategii anti-windup. W pid_controller dostępne są ponadto ograniczenia całki i_clamp_min i i_clamp_max, a także wspomniane strategie conditional_integration i back_calculation.
To bardzo dobrze pokazuje, że rzeczywisty PID jest czymś więcej niż tylko równaniem P + I + D. Implementacja musi uwzględniać ograniczenia fizycznego układu.
Częstotliwość pętli sterowania i czas próbkowania
W rzeczywistym robocie regulator PID nie oblicza sterowania w sposób ciągły. Sterownik cyfrowy wykonuje kolejne obliczenia w określonych odstępach czasu. Odstęp pomiędzy kolejnymi iteracjami nazywamy czasem próbkowania Ts, a jego odwrotność określa częstotliwość pętli sterowania.
Zależność jest prosta:
f = 1 / Ts
Jeżeli pętla pracuje z częstotliwością 100 Hz, nowe obliczenie wykonywane jest co 10 ms. Przy 500 Hz okres wynosi 2 ms, a przy 1000 Hz – 1 ms.
MIT w materiałach dotyczących sterowania cyfrowego podkreśla, że regulator cyfrowy obserwuje sygnały tylko w kolejnych chwilach próbkowania. Pomiędzy nimi nie otrzymuje nowej próbki pomiarowej. Dlatego dobór Ts staje się częścią projektu całego układu sterowania.
Co dzieje się, gdy pętla jest zbyt wolna?
Wyobraźmy sobie szybko poruszający się przegub. Jeżeli regulator wykonuje pomiar i korektę zbyt rzadko, mechanizm może w czasie pomiędzy kolejnymi iteracjami znacząco zmienić swoje położenie.
Informacja docierająca do regulatora jest wtedy mniej aktualna, a reakcja następuje z większym efektywnym opóźnieniem. Może to powodować pogorszenie śledzenia wartości zadanej, większe przeregulowanie, a w niekorzystnych warunkach nawet utratę stabilności.
Podobny kompromis pokazują materiały MIT dotyczące pomiaru prędkości z enkodera: wydłużenie czasu próbkowania może poprawiać jakość pewnych pomiarów impulsowych, ale zwiększa opóźnienie sprzężenia zwrotnego, co może negatywnie wpływać na stabilność układu.
Czy im wyższa częstotliwość, tym lepiej?
Nie zawsze.
Bardzo szybka pętla może ograniczać opóźnienie sterowania i pozwalać lepiej reagować na szybką dynamikę robota, ale jednocześnie stawia większe wymagania komputerowi, komunikacji oraz czujnikom.
Jeżeli enkoder lub inny sensor nie dostarcza wystarczająco dobrej informacji przy bardzo krótkim czasie próbkowania, kolejne pomiary mogą zawierać niewiele nowych danych. Szczególnie widoczne może być to przy wyznaczaniu prędkości na podstawie impulsów enkodera. MIT zwraca uwagę, że zbyt krótki okres pomiaru może zwiększać wpływ dyskretyzacji, zwłaszcza przy małych prędkościach.
Wyższa częstotliwość oznacza również mniej czasu na wykonanie wszystkich operacji:
odczyt czujników → obliczenie regulatora → zapis polecenia do napędu
Jeżeli cały cykl trwa dłużej niż przewidziany okres, pojawiają się przekroczenia czasu wykonania – overruns.
Czas próbkowania a człony I i D
Czas pomiędzy kolejnymi iteracjami ma szczególne znaczenie dla członu całkującego i różniczkującego.
W uproszczonej implementacji dyskretnej całka może być aktualizowana w postaci:
I[k] = I[k−1] + e[k] · Ts
natomiast pochodną można przybliżyć jako:
D[k] = (e[k] − e[k−1]) / Ts
Widać więc, że Ts występuje bezpośrednio w obliczeniach. Dlatego implementacja regulatora musi znać rzeczywisty czas pomiędzy kolejnymi aktualizacjami.
Trzeba tu jednak zachować precyzję: zmiana częstotliwości pętli nie oznacza automatycznie, że współczynniki Kp, Ki i Kd muszą zostać przeliczone w każdym regulatorze. Jeżeli implementacja prawidłowo uwzględnia Ts, współczynniki mogą być zdefiniowane jako parametry odpowiadające regulatorowi ciągłemu. Mimo to zmiana częstotliwości zmienia opóźnienie, dokładność dyskretyzacji i warunki pracy układu, dlatego po znaczącej zmianie okresu sterowania zachowanie regulatora powinno zostać ponownie zweryfikowane.
W innych implementacjach stosuje się współczynniki już przeliczone bezpośrednio do postaci dyskretnej. Wtedy zmiana Ts może wymagać również zmiany samych parametrów regulatora. To jedna z przyczyn, dla których wartości PID nie powinny być kopiowane bez sprawdzenia pomiędzy różnymi sterownikami.
Częstotliwość pętli w ros2_control
W aktualnej dokumentacji ros2_control parametr update_rate określa częstotliwość czasu rzeczywistego pętli controller_manager, która wykonuje kolejno odczyt stanu sprzętu, aktualizację kontrolerów i zapis poleceń do sprzętu. W dokumentacji Kilted domyślną wartością jest obecnie 100 Hz, ale jest to ustawienie frameworka, a nie uniwersalna wartość odpowiednia dla każdego robota.
ros2_control umożliwia również pracę poszczególnych komponentów sprzętowych z różnymi częstotliwościami. Dokumentacja podaje przykładowo sytuację, w której jeden sensor może wymagać 1000 Hz, podczas gdy inne elementy pracują przy 500 Hz.
Istotny jest również rzeczywisty czas wykonania pętli. Przy częstotliwości 100 Hz cały cykl ma do dyspozycji 10 ms. Jeżeli odczyt sprzętu, obliczenia kontrolerów i zapis poleceń wymagają więcej czasu, okres pętli nie zostanie zachowany. Aktualne ros2_control udostępnia mechanizmy monitorowania częstotliwości aktualizacji i pominiętych cykli właśnie po to, aby takie sytuacje wykrywać.
To również pokazuje, dlaczego w sterowaniu robotem liczy się nie tylko średnia częstotliwość, ale także regularność kolejnych wywołań. Zmienny okres wykonywania pętli, czyli jitter, powoduje, że kolejne obliczenia nie zachodzą dokładnie w takich samych odstępach czasu.
Szum pomiarowy i człon D
Człon różniczkujący D może poprawiać tłumienie układu i ograniczać przeregulowanie, ale ma jedną istotną wadę: jest szczególnie wrażliwy na szum pomiarowy.
W cyfrowym regulatorze pochodną błędu można w uproszczeniu wyznaczyć z kolejnych próbek:
D[k] = (e[k] − e[k−1]) / Ts
Oznacza to, że człon D reaguje nie tyle na samą wartość błędu, ile na różnicę pomiędzy kolejnymi pomiarami. Jeżeli odczyt z czujnika lekko „drży”, nawet wtedy, gdy rzeczywista pozycja robota prawie się nie zmienia, różniczkowanie może zamienić niewielkie wahania pomiaru w znacznie większe zmiany sygnału sterującego.
MIT zwraca uwagę, że czyste różniczkowanie jest rzadko stosowane w praktycznych regulatorach właśnie dlatego, że wzmacnia składowe o wysokiej częstotliwości. Im szybciej zmienia się zakłócenie pomiarowe, tym większy może być jego wpływ po różniczkowaniu.
Dlaczego niewielki szum może mieć duże znaczenie?
Załóżmy, że przegub praktycznie się nie porusza, ale kolejne pomiary enkodera wynoszą:
30,00° → 30,02° → 29,99° → 30,01°
Różnice są bardzo małe. Jeżeli jednak czas próbkowania wynosi tylko 1 ms, wyznaczona szybkość zmian może być znaczna.
Dla dwóch kolejnych próbek:
30,02° → 29,99°
zmiana wynosi:
−0,03°
Przy Ts = 0,001 s:
−0,03° / 0,001 s = −30°/s
Regulator może więc zobaczyć znaczącą wartość pochodnej, mimo że rzeczywisty przegub znajduje się praktycznie w tej samej pozycji.
Nie oznacza to oczywiście, że każdy taki pomiar wywoła niebezpieczny ruch. Ostateczny wpływ zależy między innymi od Kd, filtracji, rozdzielczości czujnika, częstotliwości próbkowania i architektury regulatora. Przykład pokazuje jednak, dlaczego człon D wymaga szczególnej uwagi.
Jak szum członu D może objawiać się w robocie?
Jeżeli różniczkowana informacja jest zaszumiona, polecenie regulatora może szybko zmieniać się w obu kierunkach. W praktyce może to powodować drobne drgania osi, nierówną pracę napędu, wzrost aktywności silnika albo charakterystyczne „nerwowe” zachowanie mechanizmu.
Przy większych wzmocnieniach mogą również wzrosnąć obciążenia elementów mechanicznych i napędu.
Nie każdy przypadek drgania robota oznacza jednak problem z członem D. Podobne objawy mogą powodować m.in. luzy przekładni, rezonanse konstrukcji, tarcie, zbyt duże Kp, opóźnienia komunikacyjne albo niewłaściwa estymacja prędkości.
Jak ogranicza się wpływ szumu?
Jednym z klasycznych rozwiązań jest filtrowanie członu różniczkującego. Zamiast idealnego różniczkowania stosuje się w praktyce różniczkowanie o ograniczonym paśmie, najczęściej z elementem filtrującym składowe o wysokiej częstotliwości. MIT opisuje takie podejście jako band-limited differentiator i wskazuje je jako praktyczny sposób ograniczania wpływu szumu czujników na działanie PD/PID.
Filtracja nie powinna jednak być traktowana jako magiczne rozwiązanie. Zbyt silny filtr może wprowadzić dodatkowe opóźnienie i ograniczyć informację o rzeczywistych szybkich zmianach ruchu. Potrzebny jest więc kompromis pomiędzy tłumieniem szumu a zachowaniem odpowiednio szybkiej informacji o stanie robota.
W robotyce często można również wykorzystać bezpośrednio zmierzoną lub estymowaną prędkość osi, zamiast numerycznie różniczkować zaszumioną pozycję. To zależy jednak od dostępnego sprzętu oraz architektury układu sterowania.
Pochodna błędu czy pochodna pomiaru?
Jest jeszcze jeden praktyczny szczegół. W klasycznej postaci PID człon D może być obliczany z pochodnej błędu:
de(t)/dt
Jeżeli jednak wartość zadana nagle zmieni się skokowo, również błąd zmienia się gwałtownie. W rezultacie człon D może wygenerować bardzo duży chwilowy impuls nazywany derivative kick.
Dlatego w praktycznych regulatorach spotyka się rozwiązanie, w którym człon różniczkujący działa na zmianę wartości zmierzonej, a nie bezpośrednio na skok wartości zadanej. Materiały MIT dotyczące praktycznych implementacji PID opisują właśnie takie podejście jako sposób ograniczania impulsów członu D przy zmianach setpointu.
Nie oznacza to, że istnieje tylko jedna poprawna implementacja PID. W zależności od sterownika można spotkać różne formy regulatora, dlatego przy analizie konkretnego robota warto sprawdzić, w jaki sposób faktycznie obliczany jest człon D.
W aktualnym control_toolbox dla ROS 2 regulator może sam wyznaczyć pochodną błędu na podstawie kolejnych wartości i dt, ale interfejs pozwala również przekazać wcześniej obliczoną wartość error_dot. Dzięki temu implementacja wyższej warstwy może dostarczyć własną informację o szybkości zmian błędu.
PID i feedforward – dlaczego samo sprzężenie zwrotne nie zawsze wystarcza?
Regulator PID działa na podstawie błędu, który już występuje. Jeżeli rzeczywista pozycja przegubu zaczyna odbiegać od wartości zadanej, sprzężenie zwrotne wykrywa różnicę i wprowadza korektę. Jest to ogromna zaleta PID, ponieważ regulator może reagować również na zakłócenia i niedokładności modelu.
Ma to jednak pewną konsekwencję: aby klasyczny człon sprzężenia zwrotnego zareagował, musi pojawić się uchyb lub jego zmiana.
Jeżeli natomiast znamy z wyprzedzeniem zadaną trajektorię albo dysponujemy modelem dynamiki robota, możemy oszacować część sterowania potrzebną do wykonania ruchu, zanim powstanie znaczący błąd. Takie działanie nazywamy feedforward, czyli sterowaniem wyprzedzającym.
Modern Robotics zwraca na to uwagę bezpośrednio przy przejściu od PID do sterowania wykorzystującego model dynamiki: klasyczne sprzężenie zwrotne potrzebuje błędu, aby rozpocząć odpowiednią korektę momentu, natomiast poprawny model może wcześniej określić moment potrzebny do realizacji zadanej trajektorii
Feedback i feedforward – dwie różne informacje
Feedback wykorzystuje informację o tym, co rzeczywiście zrobił robot:
wartość zadana − wartość zmierzona → błąd → korekta
Feedforward wykorzystuje natomiast informację dostępną wcześniej – na przykład zadaną prędkość, przyspieszenie, znane obciążenie albo model dynamiki.
Można to zapisać koncepcyjnie jako:
u = ufeedforward + ufeedback
gdzie ufeedforward reprezentuje sterowanie wynikające z informacji o żądanym ruchu lub modelu, a ufeedback jest korektą wynikającą ze sprzężenia zwrotnego.
Nie jest to jedno uniwersalne równanie konkretnego regulatora, lecz wygodny sposób pokazania podziału ról pomiędzy obiema częściami.
Przykład: robot podnosi ramię przeciwko grawitacji
Załóżmy, że przegub ramienia ma utrzymywać ciężki element w określonej pozycji.
Przy samym regulatorze sprzężenia zwrotnego działanie grawitacji może najpierw spowodować niewielkie odchylenie. Dopiero pojawienie się błędu wywoła odpowiednią reakcję regulatora.
PID lub PD pozostaje wtedy odpowiedzialny przede wszystkim za korygowanie:
niedokładności modelu, zmian rzeczywistego obciążenia, tarcia, zakłóceń zewnętrznych, błędów pomiarowych i pozostałych odchyleń.
W sterowaniu manipulatorami pozwala to połączyć zalety obu podejść: model wykonuje dużą część przewidywalnej pracy, a sprzężenie zwrotne stabilizuje rzeczywisty układ. Modern Robotics pokazuje tę ideę w metodzie computed-torque control.
Dlaczego nie stosować wyłącznie feedforward?
Ponieważ żaden model rzeczywistego robota nie jest idealny.
Masa przenoszonego obiektu może się zmienić, tarcie w przekładni zależy od warunków pracy, elementy konstrukcji mogą być elastyczne, a robot może zostać poddany nieprzewidzianemu zakłóceniu.
Jeżeli sterownik korzystałby tylko z feedforward, nie miałby mechanizmu pozwalającego wykryć, że rzeczywisty ruch zaczął odbiegać od oczekiwanego.
Modern Robotics pokazuje to na symulacji sterowania manipulatorem: przy samym feedforward niedokładność modelu powoduje stopniowe odchodzenie rzeczywistej trajektorii od zadanej. Połączenie modelu dynamiki ze sprzężeniem zwrotnym pozwala natomiast korygować te różnice.
Dlatego praktyczna idea brzmi:
feedforward realizuje to, co można przewidzieć, a feedback poprawia to, czego przewidzieć się nie udało.
Computed-torque control – krok dalej niż prosty PID
W robotach manipulacyjnych można wykorzystać pełniejszy model dynamiki. Sterownik uwzględnia wtedy między innymi:
konfigurację robota, macierz bezwładności, wymagane przyspieszenie, grawitację, siły Coriolisa i odśrodkowe, czasem również model tarcia.
Na tej podstawie można oszacować momenty potrzebne do wykonania zadanej trajektorii. Sprzężenie zwrotne PD lub PID koryguje natomiast błędy wynikające z niedoskonałości modelu.
Takie podejście nazywa się często computed-torque control. Modern Robotics pokazuje, że przy wystarczająco dobrym modelu dynamiki połączenie feedforward i feedback może poprawić śledzenie trajektorii w porównaniu zarówno z samym feedforward, jak i prostym PID bez wykorzystania modelu.
Feedforward w ros2_control
Aktualny pid_controller w ros2_control również obsługuje część feedforward. W bieżącej dokumentacji Rolling dostępny jest parametr:
feedforward_gain
który określa wzmocnienie części wyprzedzającej regulatora. Dokumentacja wskazuje, że kontroler może pracować z feedforwardem w celu poprawy dynamiki odpowiedzi.
Co istotne, w aktualnym wydaniu Kilted starsze parametry enable_feedforward i usługa set_feedforward_control zostały usunięte. Obecnie feedforward aktywuje się poprzez ustawienie feedforward_gain na wartość różną od zera.
Trzeba jednak rozróżnić dwie rzeczy:
feedforward_gain w prostym kontrolerze ROS 2 nie oznacza automatycznie pełnego modelu dynamiki robota.
Computed-torque control wykorzystuje znacznie bardziej rozbudowany model bezwładności, grawitacji i innych składników dynamiki.
To dwa przykłady tej samej ogólnej idei sterowania wyprzedzającego, ale o zupełnie różnym poziomie złożoności.
W JointTrajectoryController feedforward może być również łączony ze sprzężeniem zwrotnym PID podczas śledzenia trajektorii, np. poprzez odpowiednio skalowaną prędkość zadaną i korektę wynikającą z błędu pozycji oraz prędkości.
Ważny wniosek
PID jest bardzo skutecznym narzędziem, ale nie należy traktować go jako kompletnego opisu sterowania nowoczesnym robotem. W praktyce może być tylko jedną warstwą większego układu, współpracującą z:
planowaniem trajektorii → modelem dynamiki → feedforward → PID/PD → serwonapędem → czujnikami
To pozwala nam teraz przejść od samej teorii regulatora do praktycznych zastosowań.
PID w ramionach, robotach mobilnych, kroczących i humanoidalnych
Regulator PID nie pełni identycznej roli w każdym typie robota. W prostym serwonapędzie może bezpośrednio odpowiadać za pozycję jednej osi, natomiast w zaawansowanym robocie kroczącym lub humanoidalnym może być tylko jedną z najniższych warstw znacznie bardziej rozbudowanego systemu sterowania.
To ważne rozróżnienie. Stwierdzenie, że „robot wykorzystuje PID”, nie oznacza, że regulator PID odpowiada za całą nawigację, planowanie ruchu czy utrzymywanie równowagi.
PID w ramionach robotycznych
W manipulatorze regulatory mogą pracować osobno dla poszczególnych przegubów. Układ nadrzędny określa żądaną trajektorię, a warstwa sterowania osiami próbuje ją możliwie dokładnie odtworzyć.
W zależności od architektury napędu regulator może sterować pozycją, prędkością albo momentem. W ros2_control dobrze widać podział pomiędzy trajektorią zadaną a niższą warstwą regulacji. JointTrajectoryController interpoluje zadane punkty trajektorii, a przy interfejsach velocity lub effort może wykorzystywać regulator PID do przekształcenia błędu śledzenia w polecenie dla sprzętu.
Regulator PID nie oblicza więc zwykle całej trajektorii ramienia. Jego zadaniem może być dopilnowanie, aby rzeczywisty przegub nadążał za kolejnymi wartościami zadanymi.
PID w robotach mobilnych
W robocie kołowym bardzo naturalnym zastosowaniem regulatora jest kontrola prędkości poszczególnych kół.
Warstwa nadrzędna może określić, że lewe koło powinno obracać się z prędkością 4 rad/s, a prawe z 5 rad/s. Regulatory napędów porównują te wartości z rzeczywistymi prędkościami i korygują pracę silników.
PID może być również stosowany do regulacji prędkości liniowej, prędkości kątowej lub orientacji robota, ale nie należy utożsamiać tego z całym systemem nawigacyjnym.
Planowanie trasy, omijanie przeszkód, SLAM i lokalizacja należą do wyższych warstw systemu. Regulator niskiego poziomu realizuje jedynie polecenia ruchu wygenerowane przez te warstwy.
To dobrze pasuje do architektury ROS 2, gdzie kontroler napędu różnicowego może wyznaczać wymagane prędkości kół, natomiast niżej mogą pracować osobne regulatory realizujące te wartości na fizycznych napędach.
PID i PD w robotach kroczących
W robotach czworonożnych sytuacja jest bardziej złożona. System musi jednocześnie kontrolować wiele przegubów, kontakty nóg z podłożem, orientację korpusu oraz ruch całego robota.
Na poziomie pojedynczych przegubów bardzo często spotyka się sterowanie PD połączone z feedforwardem momentu.
Dobrym praktycznym przykładem jest oficjalne SDK Unitree. W aktualnym przykładzie niskopoziomowego sterowania Go2 dla każdego silnika przesyłane są m.in.:
q – pozycja zadana,
dq – prędkość zadana,
kp – wzmocnienie proporcjonalne,
kd – wzmocnienie różniczkujące,
tau – moment feedforward.
Przykładowy program producenta używa Kp = 60, Kd = 5 i aktualizuje polecenia z krokiem dt = 0,002 s. Są to wartości konkretnego przykładu demonstracyjnego, a nie uniwersalne nastawy dla robota.
To bardzo dobrze pokazuje praktyczną strukturę:
pozycja zadana + prędkość zadana + Kp + Kd + moment feedforward → sterowanie przegubem
Nie oznacza to jednak, że chód Go2 jest realizowany wyłącznie przez kilka regulatorów PD. Algorytm lokomocji znajdujący się wyżej musi rozwiązać znacznie trudniejszy problem: gdzie postawić nogi, jakie siły kontaktowe wytworzyć i jak stabilizować ruch całego korpusu.
PID i PD w robotach humanoidalnych
Jeszcze wyraźniej widać to w robotach humanoidalnych. Pojedyncze przeguby nadal mogą korzystać z regulatorów o charakterze P/PD/PID, ale utrzymanie równowagi całego humanoida jest zadaniem wielowymiarowym.
Oficjalne przykłady SDK Unitree G1 pokazują niskopoziomowe polecenia zawierające m.in. q_target, dq_target, kp, kd oraz tau_ff. Oznacza to, że również tutaj na poziomie osi występuje klasyczna idea sterowania pozycją i prędkością z dodatkiem momentu feedforward.
Natomiast algorytmy odpowiadające za ruch całego humanoida mogą wykorzystywać znacznie bardziej zaawansowane metody. Literatura dotycząca robotów kroczących obejmuje m.in. whole-body control, optymalizację, MPC, planowanie kroków i sterowanie wykorzystujące dynamikę centroidalną. Materiały MIT dotyczące wysokoartykulowanych robotów kroczących omawiają właśnie ZMP, planowanie ruchu środka masy, dynamikę centroidalną i whole-body control jako osobne warstwy problemu lokomocji.
W praktyce nie ma więc sprzeczności między stwierdzeniami:
„humanoid wykorzystuje PD w przegubach”
oraz
„humanoid wykorzystuje MPC lub whole-body control do utrzymywania równowagi”.
Obydwa mogą być prawdziwe jednocześnie, ponieważ dotyczą różnych poziomów sterowania.
Najważniejszy wniosek z tej sekcji jest taki: im bardziej zaawansowany robot, tym mniej sensowne jest pytanie „czy robot działa na PID?” bez określenia poziomu sterowania. PID może znakomicie regulować pojedynczy przegub, podczas gdy równocześnie ruch całego robota jest generowany przez znacznie bardziej złożony algorytm.
Widać to nawet w publicznych przykładach Unitree: Go2 i G1 udostępniają na niskim poziomie wartości Kp, Kd, pozycję, prędkość i moment feedforward, natomiast ich SDK posiada również osobne interfejsy wysokopoziomowe dla ruchu, równowagi czy śledzenia trajektorii. Związek pomiędzy położeniem przegubów a pozycją chwytaka opisuje kinematyka robota, która stanowi podstawę planowania i realizacji ruchu manipulatora.
