Zad. 6: Sterowanie manipulatorem – przypadek 2D

Transkrypt

Zad. 6: Sterowanie manipulatorem – przypadek 2D
Zad. 6: Sterowanie manipulatorem – przypadek 2D
1
Cel ćwiczenia
Wykształcenie umiej˛etności korzystania z szablonu vector<> oraz dalsze rozwijanie umiej˛etności projektowania struktur danych oraz definiowanie odpowiednich przecia˛żeń operatorów.
2
Program zaj˛eć
• Ocena realizacji zadania z poprzedniego laboratorium – ocenie podlega poprawność realizacji zadania, styl pisania programu oraz dokumentacja wygenerowana za pomoca˛ systemu doxygen.
• Ocena przygotowania do zaj˛eć – ocenie podlega diagram klas i diagram czynności (patrz
rozdział 4).
• Modyfikacja programu wg wskazań osoby prowadzacej
˛ – ocenie b˛edzie podlegała poprawność realizacji modyfikacji. Prac˛e nad modyfikacja˛ programu (wszystkie operacje
należy wykonywać na kopii) należy rozpoczać
˛ już w trakcie pierwszej fazy laboratorium,
gdyż prowadzacy
˛ nie b˛edzie w stanie ocenić wcześniejszego programu wszystkim jednocześnie.
• Realizacja wst˛epnej fazy prac nad nowym zadaniem – należy stworzyć uproszczona˛ wersj˛e programu, która rysuje zmiany postury manipulatora składajacego
˛
si˛e z pojedynczego
ogniwa. Głównym celem jest przećwiczenie użycia modułu lacze_do_gnuplota.
• Ocena realizacji wst˛epnej fazy zadania
3
Opis zadania programowego
Należy napisać program, który umożliwi wyznaczenie postury manipulatora. Zakładamy, że
manipulator przedstawiony jest schematycznie w postaci łamanej (patrz rysunek poniżej). Każdy
z segmentów łamanej ma symbolizować pojedyncze ogniowo ramienia manipulatora. Tak wi˛ec
w ten sposób postawione zadanie sprowadza si˛e do wyznaczenia położenia poszczególnych
przegubów manipulatora i jego efektora. Postura manipulatora jest zadana poprzez wartości
katów
˛
q0 , q1 , q2 , . . . mi˛edzy kolejnymi ogniwami ramienia. Dla uproszczenia, postury manipulatora b˛eda˛ rozważane tylko w jednej płaszczyźnie XOY . Zakłada si˛e, że liczba ogniw ramienia
nie jest ograniczona Przyjmuje si˛e, że długość każdego z ogniw może być różna. Konfiguracja
manipulatora (tzn. liczba ogniw oraz ich długości) b˛eda˛ zadane w pliku tekstowym. Podobnie postury manipulatora b˛eda˛ również zapisane osobnym pliku tekstowym. Program powinien
umieć wczytać wspomniane dane i nast˛epnie wyliczyć oraz zobrazować postur˛e manipulatora.
Program nie powinien posiadać żadnego menu.
4
Przygotowanie do zaj˛eć
Należy przygotować wst˛epny diagram czynności obrazujacy
˛ sposób wyliczenia postury manipulatora. Ponadto należy stworzyć diagram klas dla problemu rozwiazywanego
˛
w ramach tego
1
Rysunek 1: Szkielet manipulatora i zaznaczonymi katami
˛
pozwalajacymi
˛
sterowanie nachyleniem poszczególnych ogniw manipulatora.
zadania. Diagramy powinny być przygotowane w wersji elektronicznej.
5
Wyznaczanie współrz˛ednych przegubów
Istnieje ogólna procedura wyznaczania współrz˛ednych kolejnych ogniw łańcucha kinematycznego. Została ona opisana w materiałach dodatkowych (patrz strona kursu → tabela zadań →
wiersz tego zadania → kolumna Dod.). Osoby, którym programowanie nie sprawia problemu,
zach˛eca si˛e do zastosowania podejścia ogólnego. Niemniej w wersji podstawowej można skorzystać prostszej metody, która˛ można zastosować dla manipulatora planarnego dla przypadku
2D. Tak można postapić
˛ pod warunkiem, że osoba prowadzaca
˛ laboratorium nie zdecyduje inaczej. W dalszej cz˛eści przedstawiona jest wspomniana prostsza metoda.
Tak jak w metodzie ogólnej, z każdym przegubem zwia˛żmy lokalny układ współrz˛ednych.
Inaczej niż w metodzie ogólnej, wybierzmy osie OX oraz OY w taki sposób, aby były one
równoległe do analogicznych osi układu globalnego (patrz rys. 2). Współrz˛edne punktu P0 w
Rysunek 2: Szkielet manipulatora
układzie globalnym sa˛ oczywiście równe (0, 0). Łatwo zauważyć, że współrz˛edne punktu P1
możemy wyznaczyć bezpośrednio jako
P1 = (l1 cos q0 , l1 sin q0 )
2
gdzie l1 jest długościa˛ pierwszego ogniwa. Jednakże należy pami˛etać, że jest to uproszczenie
wynikajace
˛ z faktu, że przegub P0 znajduje si˛e w środku układu współrz˛ednych i lokalny układ
współrz˛ednych zwiazany
˛
z tym przegubem pokrywa si˛e z układem współrz˛ednych globalnych.
Jeśli tak nie jest, trzeba to uwzgl˛ednić dodajac
˛ współrz˛edne tego punktu, a wi˛ec ogólnie jest:
P1 = P10 + P0 ,
gdzie P10 = (l1 cos q1 , l1 sin q1 ).
Współrz˛edne punktu P2 w lokalnym układzie współrz˛ednych X1 OY1 możemy wyrazić analogicznie jako
P21 = (l2 cos α, l2 sin α)
(1)
gdzie l2 to długość drugiego ogniwa. Z faktu, że odpowiadajace
˛ sobie osie układów współrz˛ednych XOY oraz X1 OY1 sa˛ równoległe wynika bezpośrednio, że kat
˛ α to
α = q0 + q1 .
(2)
Co widać bezpośrednio na rys. 2. Należy przy tym pami˛etać, że dodatni kierunek miary kata
˛
przyjmujemy jako przeciwny do ruchu wskazówek zegara. Tak wi˛ec w tym przypadku q0 ∼
110◦ , zaś q1 ∼ −70◦ (kat
˛ q1 ma wartość ujemna,˛ gdyż na rys. 2 mierzony jest on w kierunku
zgodnym z ruchem wskazówek zegara). Tak wi˛ec kat
˛ α to ok. 40◦ .
Uwzgl˛edniajac
˛ (2) wzór (1) możemy przepisać w postaci
P21 = (l2 cos(q0 + q1 ), l2 sin(q0 + q1 )).
Aby wyznaczyć współrz˛edne punktu P2 w globalnym układzie XOY , należy zauważyć, że
układy XOY oraz X1 OY1 sa˛ wzgl˛edem siebie tylko przesuni˛ete, a współrz˛edne wektora translacji, to nic innego jak współrz˛edne punktu P1 . Tak wi˛ec
P2 = P21 + P1 .
Obliczenie współrz˛ednych punktu P3 realizujemy w analogiczny sposób. Najpierw wyznaczamy je w lokalnym układzie współrz˛ednych X2 OY2 . Wykonujac
˛ analogiczna˛ analiz˛e możemy
stwierdzić, że
β = q0 + q1 + q2 .
Tak wi˛ec
P32 = (l3 cos(q0 + q1 + q2 ), l3 sin(q0 + q1 + q2 )).
Chcac
˛ przejść ze współrz˛ednych lokalnych układu X2 OY2 do współrz˛ednych globalnego układu
XOY korzystamy z faktu, że układy te sa˛ przesuni˛ete mi˛edzy soba˛ o wektor ~T2 , którego współrz˛ednymi sa˛ współrz˛edne punktu P2 . Tak wi˛ec
P3 = P32 + P2 .
Z nast˛epnymi przegubami post˛epujemy analogicznie. Zaleta˛ tej procedury jest to, że w nast˛epnym kroku, w którym wyznaczmy współrz˛edne przegubu Pi możemy wykorzystać sum˛e katów
˛
q0 , qq , . . . , qi−1 oraz współrz˛edne przegubu Pi−1 wyznaczone w kroku poprzednim.
Uwaga: Należy zauważyć, że
P = (l sin α, l cos α) = l(cos α, sin α).
Mamy tu do czynienia z mnożeniem wektora przez liczb˛e. Pozwala to w bardziej zwarty
sposób zapisać operacje w prezentowanej metodzie i tak należy postapić.
˛
3
Rysunek 3: Powiazanie
˛
mi˛edzy układami współrz˛ednych XOY oraz X2 OY2
6
Działanie programu
Program ma nie mieć żadnego menu. Wszystkie dane (tzn. konfiguracja manipulatora i postury)
przekazywane sa˛ poprzez pliki. Nazwy plików umieszczane sa˛ w linii wywołania programu.
Składnia wywołania programu:
./a.out plik_konfiguracji.dat
plik_postury1.dat [ plik_postury2.dat ... ]
Pierwsza˛ nazwa˛ jest nazwa pliku zawierajacego
˛
konfiguracj˛e manipulatora. Jest to plik tekstowy zawierajacy
˛ liczby określajace
˛ długość poszczególnych ogniw w kolejności od pierwszego ogniwa. Przykład zawartości pliku plik_konfiguracji.dat:
40 45.5
64.5
32
Poszczególne liczby moga˛ być oddzielone dowolna˛ ilościa˛ białych znaków. Ilość liczb określa
jednocześnie ilość ogniw manipulatora.
Oprócz wspomnianego pliku może wystapić
˛
dowolna ilość plików reprezentujacych
˛
poszczególne postury manipulatora. Zawieraja˛ one wartości katów
˛
dla poszczególnych przegubów poczawszy
˛
od kata
˛ q0 . Wszystkie wartości wyrażone sa˛ w stopniach. Zapisane sa˛ w jednej
linii i moga˛ być rozdzielone dowolna˛ ilościa˛ spacji lub znaków tabulacji. Przykład zawartości
pliku plik_postury1.dat:
75.2
-20
-31
-15
Program po wczytaniu pliku konfiguracji manipulatora powinien wyświetlić rysunek manipulatora w posturze poczatkowej
˛
przyjmujac
˛ wartości katów:
˛
q0 = 90◦ , q1 = 0◦ , . . . , qn = 0◦ , gdzie
n jest ilościa˛ ogniw. Oprócz tego na ekranie terminala powinien wypisać wczytana˛ konfiguracj˛e. Nast˛epnie powinien odczekać 2s i wczytać plik z katami
˛
dla pierwszej postury, wyliczyć
położenia przegubów i wyświetlić rysunek manipulatora. Na ekranie terminala powinien natomiast wypisać katy
˛ i współrz˛edne przegubów. Nast˛epnie powinien odczekać tym razem 1s i
wczytać katy
˛ z nast˛epnego pliku dla kolejnej postury. Dalsze operacje powtarzaja˛ si˛e. Po wczytaniu katów
˛
z ostatniego pliku i wyświetlenie ostatniej postury program powinien oczekiwać na
przyciśni˛ecie przycisku ENTER, aby zakończyć działanie.
4
6.1
Reakcja na bł˛edy
Jeżeli plik z konfiguracja˛ manipulatora lub kolejna˛ jego postura˛ nie b˛edzie mógł zostać otwarty,
to program powinien w tym momencie przerwać działanie i wyświetlić stosowny komunikat.
W analogiczny sposób należy zareagować, jeśli w pliku pojawia˛ si˛e inne napisy niż te, które
oznaczaja˛ liczby.
Jeżeli w pliku opisujacego
˛
postur˛e manipulatora jest mniej danych niż przegubów, katy
˛
pozostałych przegubów nie należy zmieniać, zaś na wyjściu standardowym powinno zostać
wyświetlone ostrzeżenie. Powinna również zostać podana ilość przegubów, dla których brakuje
wartości katów.
˛
Po wyświetleniu ostrzeżenia program powinien normalnie działać i wyznaczyć
nowa˛ postur˛e, dla tych danych, które posiada.
7
Przykład działania programu
Niniejszy przykład nie obejmuje widoku okienka z rysunkiem wygenerowanym przez program
gnuplot. Przedstawiona˛ form˛e interakcji z użytkownikiem należy traktować jako obowiazu˛
jac
˛ a.˛
jkowalsk@panamint: rozwiazanie> ./manipulator konfig.dat postura1.dat postura2.dat
Konfiguracje wczytano z pliku: plik_konfiguracji.dat
Konfiguracja:
Dlugos ogniwa
Dlugos ogniwa
Dlugos ogniwa
Dlugos ogniwa
Postura:
q0 = 90.0
q1 =
0.0
q2 =
0.0
q3 =
0.0
0:
1:
2:
3:
40
45.5
64.5
32
Przegub 0:
Przegub 1:
Przegub 2:
Przegub 3:
Efektor:
(
(
(
(
(
0.0,
0.0)
-0.0, 40.0)
-0.0, 85.5)
-0.0, 150.0)
-0.0, 182.0)
Postura wczytana z pliku: plik_postury1.dat
Postura:
q0 = 75.2
q1 = -20.0
q2 = -31.0
q3 = -15.0
Przegub 0:
Przegub 1:
Przegub 2:
Przegub 3:
Efektor:
(
0.0,
0.0)
( 10.2, 38.7)
( 36.2, 76.0)
( 95.0, 102.5)
( 126.6, 107.6)
Postura wczytana z pliku: plik_postury2.dat
Postura:
5
q0
q1
q2
q3
=
=
=
=
100.0
-30.0
-41.0
-25.0
Przegub 0:
Przegub 1:
Przegub 2:
Przegub 3:
Efektor:
(
(
(
(
(
0.0,
0.0)
-6.9, 39.4)
8.6, 82.1)
65.0, 113.4)
97.0, 115.7)
Aby zakonczyc nacisnij ENTER ...
Przedstawiony przykład należy uznać za obligatoryjny pod wzgl˛edem rodzaju i sposobu wyświetlania informacji.
8
Wymagania i zarys programu zaj˛eć w okresie realizacji zadania
Oprócz samego programu należy stworzyć i wygenerować za pomoca˛ programu doxygen dokumentacj˛e programu. Powinna ona zawierać diagramy wymagane w ramach przygotowania
do zaj˛eć. Diagramy powinny zostać odpowiednio zaktualizowane, aby odzwierciedlały stan
faktyczny zaimplementowanego rozwiazania.
˛
Oprócz tego pozostaja˛ w mocy wszystkie wcześniejsze wymagania dotyczace
˛ struktury katalogów, pliku Makefile, modułowej struktury programu, jak też opisów.
8.1
Tydzień 0
Wymagania co do tygodnia 0 zostały opisane w rozdziale 4.
8.2
Tydzień 1
Należy stworzyć odpowiedni diagram czynności dla implementowanej procedury obliczania
współrz˛ednych poszczególnych przegubów. Należy również skorygować odpowiednio wcześniejszy diagram klas, tak aby odzwierciedlał aktualny koncepcj˛e projektu struktur danych.
Oczekuje si˛e, że b˛eda˛ stworzone moduły z niezb˛ednymi klasami, które pozwola˛ zamodelować poj˛ecie manipulatora i przeprowadzić niezb˛edne obliczenia. W klasach tych nie musza˛ być
jeszcze w pełni zdefiniowane metody odpowiedzialne za wyliczenie współrz˛ednych przegubów.
Stworzona cz˛eść kodu musi być zdokumentowana w systemie doxygen, a sama dokumentacja
musi być wygenerowana i przedstawiona osobie prowadzacej
˛ na zaj˛eciach.
Minimalna˛ funkcjonalnościa,˛ która˛ musi dysponować na tym etapie program jest otwieranie
plików, których nazwy podane sa˛ w linii polecenia, i wyświetlenie wczytywanych liczb (w
trakcie czytania).
8.3
Tydzień 2
Rozliczenie si˛e z gotowego programu i rozpocz˛ecie nast˛epnego zadania.
6
9
9.1
Warianty zadania
Wersja podstawowa
W tej wersji proponuje si˛e użycie zewn˛etrznego modułu lacze_do_gnuplota. Znajduje si˛e
on w kartotece ˜bk/edu/kpo/zad/z6/przyklad_2D wraz z przykładem jego wykorzystania.
Wspomniany moduł pozwala uruchomić program gnuplot z poziomu własnego programu i
przesłać do niego polecenie wykonania rysunku. Ponadto umożliwia on ustalenie zakresu osi
współrz˛ednych OX i OY .
9.2
Wersja uproszczona
W tej wersji zadania można ograniczyć si˛e do r˛ecznego uruchamiania programu gnuplot po
każdorazowym przeliczeniu współrz˛ednych przegubów. Program gnuplot uruchamiamy w
osobnym okienku terminala graficznego po wcześniejszym przejściu do podkatalogu, w którym
znajduje si˛e plik manipulator.dat. Realizacja zadania w tym wariancie nie b˛edzie mogła być
wyżej oceniona niż na ocen˛e 4, 0.
9.2.1
Uruchomienie rysowania z linii polecenia
Przykładowy sposób uruchomienia programu:
echo "plot ’manipulator.dat’; pause 999" | gnuplot
Przerwanie działania programu realizujemy poprzez naciśni˛ecie przycisków Ctrl-C, gdy focus
znajduje si˛e w okienku terminala, z poziomu którego został on uruchomiony.
9.3
Wersja rozszerzona
W wersji rozszerzonej proponuje si˛e, aby zmiana pozycji ogniw była animowana i odbywała
si˛e możliwie płynnie.
9.4
Wersja bardziej rozszerzona
Program powinien umożliwiać jednoczesne sterowanie dowolnej ilości manipulatorów. W tym
przypadku wywołanie programu powinno mieć postać:
./a.out konf_rob1.dat konf_rob2 -p rob1_post1.dat rob2_post2.dat -p rob1_post2.dat rob2_post2.dat [ -p ... ]
Opcja -p została tu użyta, aby oddzielić kolejny zestaw postur.
10
Materiały pomocnicze
W podkatalogu ∼bk/edu/kpo/zad/z6/przyklad_2D znajduje si˛e przykład użycia modułu
lacze_do_gnuplota, który pozwala wizualizować postur˛e manipulatora. W podkatalogu
∼bk/edu/kpo/zad/z6/bin.panamint znajduje si˛e przykładowa realizacja programu w wersji podstawowej. Program można uruchomić po zalogowaniu si˛e na panaminta.
7