Pokazany w poprzednim wpisie filmik obrazował jak wyrobiły się otwory w mocowaniu silnika z drukarki 3D. W sumie można się było tego spodziewać, w końcu te tworzywa nie są super wytrzymałe, a ja używam je już od roku. W końcu postanowiłem je poprawić dodając na górze nakrętki na śruby. Powinienem to zrobić od razu po złożeniu i nie mieć problemów z luzowaniem się mocowań. Wpływały one między innymi na działanie regulatora silnika. W tym wpisie opiszę szczegóły prowadzące do poprawienia dokładności regulacji. Na początek jednak filmik pokazujący końcowy efekt (wartości zadane: 0.5m/s i 90°/s przez 2 sekundy):

Usunięcie offsetu

Do tej pory w kodzie na lewy silnik podawałem większe sterowanie, aby robot jechał prosto. Ten offset wyznaczyłem doświadczalnie już jakiś czas temu. Jednak po usztywnieniu silników okazało się, że nie jest potrzebny. Nagle silniki zaczęły pracować tak samo. Co prawda są jeszcze pewne różnice w działaniu – przy starcie czasem jedna strona szybciej się rozpędza. Jednak po pierwsze to zachowanie nie jest deterministyczne – czasem skręca w jedną stronę, czasem w drugą, kąt też jest zawsze inny. A po drugie regulator prędkości kątowej i nadrzędny moduł korygujący pozycję sobie z tym poradzą.

Ponowne strojenie

Zmiana w mechanice i brak offsetu spowodowały, że postanowiłem od nowa przeprowadzić identyfikację silników i wyregulować PIDy. Przy okazji naniosłem poprawki w implementacji, które opisywałem już tu i tu. Przy okazji identyfikacji poprawiłem również skrypt w pythonie i modele w simulinku. Można je znaleźć na GitHubie. Okazało się, że wyznaczone teoretyczne nastawy PIDów działają całkiem dobrze. Przynajmniej przy testach pojedynczego regulatora, z wykomentowanym drugim. Jednak po ich połączeniu okazało się, że robot kręci kółka o coraz mniejszym promieniu. Analiza odczytów z enkoderów i sterowania podanego na silniki wykazała, że na problem mają wpływ następujące czynniki:

  • przeregulowanie obu regulatorów – optymalny teoretyczny PID ma spory człon całkujący, który zmniejsza czas ustalania sygnału, ale powoduje przeregulowanie. Alternatywą jest dłuższe dochodzenie do docelowej prędkości mogące trwać nawet kilka sekund.
  • podczas ruszania z miejsca inercja układu jest dużo większa niż podczas zmiany prędkości później. Oznacza to, że dobre działanie przy starcie powoduje zbyt gwałtowne zmiany podczas późniejszej jazdy. Natomiast dobre działanie później powoduje pogorszenie jakości regulacji przy starcie.
  • startując z miejsca od razu dawałem spore wartości zadane zarówno dla prędkości liniowej, jak i kątowej (1m/s i 360°/s). Przez to przeregulowania i niedokładności sterowania z obu regulatorów się kumulowały utrudniając dalszą regulację.

Pierwsze dwa problemy wymagają kompromisu. Należy zmniejszyć człon całkujący, jednak nie zbyt dużo. Zastosowałem tutaj dobrze znaną wszystkim studentom „metodę inżynierską”, czyli ręcznie zmieniałem wartości i patrzyłem jakie zmiany powodują, aż uzyskałem zadowalające wyniki.

Ostatni problem natomiast wymaga po prostu nie dawania zbyt dużego obrotu przy szybkiej jeździe do przodu. Podczas szybkiej jazdy po prostu robotowi trudniej jest skręcić i narastający uchyb sterowania prędkością kątową powoduje, że po pewnym czasie robot zaczyna coraz agresywniej skręcać. Przy mniejszych wartościach zadanych (0.5m/s i 90°/s), robot bardzo dobrze realizował sterowanie.

Postanowiłem do regulatora silników dodać możliwość resetowania wewnętrznego stanu regulatora PID. Dzięki temu na przykład po zakończonym skręcie moduł nadrzędny będzie mógł skorzystać z resetu, aby suma uchybu potrzebna dla modułu całkującego była wyzerowana.

Kolejne kroki

Ostatnie zmiany zamykają jak narazie temat regulacji silników. Sterowanie jest zdecydowanie lepsze niż wcześniej. Mogę więc spokojnie przejść do dostrojenia modułu estymacji pozycji. Głównie będzie się to sprowadzało do modyfikacji wartości początkowych i macierzy kowariancji filtru Kalmana. Ważnym aspektem będzie takie dobranie tych wartości, żeby dryft żyroskopu był dobrze estymowany zarówno podczas stania w miejscu, jak i podczas ruchu.