Programowanie ruchu robota
Programowanie silnika polega na kontrolowaniu jego pracy. Z lektury poprzednich sekcji wiesz, że silniki sterowane są przez wysyłanie sygnałów sterujących prędkością obrotową i położeniem wału. Wały silników są połączone z kołami, nogami lub gąsienicami i pozwalają robotowi się poruszać. Roboty wyposażone w koła i gąsienice mogą wykonywać cztery podstawowe rodzaje ruchów:
- do przodu po linii prostej,
- obrót,
- po łuku,
- zatrzymanie.
Ruchy te mogą zostać połączone w sekwencję, w której robot będzie wykonywał skomplikowane manewry i przemieszczał się w środowisku pracy. Wykonanie każdego z wymienionych ruchów wymaga ustalenia pewnych danych — na przykład w celu wykonania ruchu po linii prostej w tył lub w przód silniki muszą wiedzieć, jak długo mają pracować lub jak daleko mają się przemieścić. Obrót robota wymaga podania kąta i kierunku. Oto lista parametrów niezbędnych do wykonania poszczególnych ruchów:
- do przodu: czas, kierunek, odległość;
- obrót: kąt w stopniach, kierunek;
- po łuku: promień, kierunek
Niektóre ruchy mogą być ze sobą łączone — robot może na przykład jechać po łuku do przodu. Parametry mogą przyjmować wartości dodatnie lub ujemne — ruch może mieć kierunek zgodny z kierunkiem ruchu wskazówek zegara lub przeciwny do niego, robot może skręcać w prawo lub w lewo, a także wykonywać ruch do przodu i do tyłu. Dodatkowym parametrem charakteryzującym
ruch robota jest prędkość. Jak zaprogramować silniki w celu wykonania tych ruchów? Sposób programowania zależy od liczby silników napędzających robota i kilku innych czynników.
Ile silników?
Sposób napędzania robota jest ważnym czynnikiem wpływającym na sposób jego programowania, a także na możliwość ruchu w różnych warunkach. Roboty poruszające się na kołach, podobnie jak samochody, mogą być wyposażone w napęd na dwa koła lub na cztery koła. W przypadku napędu na cztery koła każde koło jest napędzane za pomocą oddzielnego silnika. W przypadku napędu na dwa koła dwa silniki napędowe są montowane z przodu lub z tyłu robota. Roboty poruszające się na gąsienicach mogą być wyposażone w dwa silniki z kołami zębatymi znajdujące się po obu stronach korpusu (do kół zębatych doczepione są gąsienice, a także dodatkowe koła). Rysunek 7.19 przedstawia różne konfiguracje układów przeniesienia napędu robota.
Rysunek 7.19. Wybrane konfiguracje układów przeniesienia napędu robota
Każda konfiguracja napędu charakteryzuje się pewnymi wadami i zaletami. Większa liczba silników oznacza większy moment obrotowy. Wcześniej opisaliśmy rożne problemy, które muszą pokonywać roboty poruszające się — zagadnienia te dotyczyły prędkości, momentu obrotowego, masy, terenu, przyczepności itp.
Wykonywanie ruchów
Istnieją różne rozwiązania umożliwiające koordynację silników w celu wykonywania ruchów do przodu, obrotu, po łuku i zatrzymania się — może być to na przykład układ sterowania znany z samochodów (zwany również układem Ackermana), skręcanie kół tylnej osi, koła wielokierunkowe i niezależne sterowanie prędkością obrotową poszczególnych kół (technika ta pozwala na zmianę prędkości obrotowej wybranych kół w celu zmiany kierunku ruchu robota). Dwa pierwsze rozwiązania są skomplikowane i wymagają stosowania serwomotorów i układów logicznych. Najprostszą metodą, którą warto poznać, rozpoczynając swoją przygodę z programowaniem autonomicznych robotów, jest niezależne sterowanie prędkością obrotową poszczególnych kół.
Niezależne sterowanie prędkością obrotową poszczególnych kół umożliwia zmianę prędkości i kierunków obrotu poszczególnych kół w celu wykonywania określonych manewrów. Roboty korzystające z tej techniki są zwykle wyposażone w dwa koła napędowe zamontowane po przeciwnych stronach podwozia. Roboty takie mogą być wyposażone również w pasywne koła, takie jak na przykład koło samonastawne zapobiegające przewróceniu się robota. Oto lista podstawowych operacji, które mogą być wykonane dzięki niezależnemu sterowaniu prędkością obrotową poszczególnych kół:
- Gdy oba koła obracają się z taką samą prędkością i w tym samym kierunku, robot porusza się do przodu lub do tyłu po linii prostej.
- Gdy jedno koło obraca się szybciej od drugiego, robot porusza się po łuku, skręcając w kierunku koła obracającego się wolniej.
- Gdy koła obracają się w przeciwnych kierunkach, robot obraca się, stojąc w miejscu.
- Gdy koła obracają się z tą samą prędkością w przeciwnych kierunkach, robot może obrócić się o 360°.
Programowanie ruchów
W tej sekcji znajdziesz pseudokod i stworzony na jego bazie kod programu obsługującego silniki prądu stałego firmy Tetrix za pośrednictwem mikrokontrolera EV3 i sterownika silników firmy Tetrix. W listingu 7.1 przedstawiliśmy program korzystający z interfejsu programistycznego leJOS, a także klas TetrixControllerFactory, TetrixMotorController i TetrixRegulatedMotor. Listing zawiera pseudokod i opracowany na jego podstawie kod w Javie. Program ten pozwala sprawdzić działanie silników, wykonując związane z nimi podstawowe operacje.
Listing 7.1. Mechanizm PUMT — testowanie silników robota Unit1
Dane wejściowe mechanizmu PUMT
Nazwa: Unit1
Części:
Sekcja silników:
Akcje:
Krok 1.: Inicjalizuj silniki.
Krok 2.: Sprawdź działanie silników, wykonując wybrane podstawowe operacje.
Zadania:
Sprawdź działanie silników, wykonując wybrane podstawowe operacje.
Koniec ramy
Dane wyjściowe mechanizmu PUMT: implementacja w Javie
74 {
75 basic_robot Unit1 = new basic_robot();
76 Unit1.testMotors();
77 Unit1.closeLog();
78 }
W 75. linii deklarowany jest obiekt basic_robot. Następnie wywoływane są dwie funkcje (metody).
Listing 7.2 zawiera kod konstruktora.
Listing 7.2. Mechanizm PUMT — konstruktor obiektu basic_robot
Dane wyjściowe mechanizmu PUMT: implementacja w Javie
29 {
30 Log = new PrintWriter("basic_robot.log");
31 Port APort = LocalEV3.get().getPort("S1");
32 CF = new TetrixControllerFactory(APort);
33 Log.println("Zakończono konstrukcję współczynnika kontrolera firmy Tetrix");
34 MC = CF.newMotorController();
35 LeftMotor = MC.getRegulatedMotor(TetrixMotorController.MOTOR_1);
36 RightMotor = MC.getRegulatedMotor(TetrixMotorController.MOTOR_2);
37 LeftMotor.setReverse(true);
38 RightMotor.setReverse(false);
39 LeftMotor.resetTachoCount();
40 RightMotor.resetTachoCount();
41 Log.println("Zakończono konstrukcję obiektów typu silnik");
42 Thread.sleep(1000);
43 }
Spójrz jeszcze raz na 31. linię kodu:
31 Port APort = LocalEV3.get().getPort("S1");
LocalEV3 jest egzemplarzem mikrokontrolera EV2. Klasa ta jest używana do zwracania różnych zasobów systemowych podłączonych do mikrokontrolera. Funkcja getPort() zwraca obiekt Port dla S1 — określa port, do którego podłączony jest kontroler silnika prądu stałego. Zmienna APort jest przekazywana do funkcji TetrixControllerFactory.
W 34. linii kodu:
34 MC = CF.newMotorController();
MC jest obiektem TetrixMotorController, który jest używany do zwracania egzemplarzy obiektów podłączonych do niego silników.
W liniach 35. i 36.:
35 LeftMotor = MC.getRegulatedMotor(TetrixMotorController.MOTOR_1);
36 RightMotor = MC.getRegulatedMotor(TetrixMotorController.MOTOR_2);
LeftMotor i RightMotor są obiektami TetrixRegulatedMotor. Aby metody działały poprawnie, do sterowanego silnika należy domontować enkoder podłączony do sterownika.
W liniach 37. i 38.:
37 LeftMotor.setReverse(true);
38 RightMotor.setReverse(false);
lewy silnik (LeftMotor) jest konfigurowany do wykonywania obrotów w tył, a prawy silnik (RightMotor) do pracy w przód.
W liniach 39. i 40.:
39 LeftMotor.resetTachoCount();
40 RightMotor.resetTachoCount();
wyzerowywane są tachometry obu silników. Tachometr jest urządzeniem mierzącym prędkość obrotową wału silnika (wyrażaną w stopniach). Wyzerowanie tachometru powoduje zatrzymanie wału silnika.
Programowanie robotów. Sterowanie pracą robotów autonomicznych Autorzy: Cameron Hughes, Tracey Hughes Wydawnictwo: Helion