Elementy animacji – sterowanie manipulatorem 1

Cel zadania

Wykształcenie umiejętności korzystania z szablonów std::vector<> i std::list<>.

2

Opis zadania

Należy napisać program, który umożliwi wyznaczenie konfiguracji (postury) manipulatora. Za-kładamy, że manipulator przedstawiony jest schematycznie w postaci łamanej (patrz rysunek poniżej). Każdy z segmentów łamanej ma symbolizować pojedynczy segment ramienia manipulatora. Tak więc w ten sposób przedstawione zadanie sprowadza się do wyznaczenia położenia poszczególnych przegubów manipulatora i jego efektora. Postura manipulatora jest zadana poprzez wartości kątów q0, q1, q2, . . . między jego kolejnymi segmentami ramienia. Dla uprosz-czenia, postury manipulatora będą rozważane tylko w jednej płaszczyźnie X OY . Zakłada się, Rysunek 1: Szkielet manipulatora i zaznaczonymi kątami pozwalającymi sterowanie nachyle-niem poszczególnych segmentów manipulatora.

że ilość segmentów ramienia nie jest ograniczona (w uproszczonej wersji zadania – słabiej oce-nianej – można przyjąć, że liczba ta jest stała i wynosi 3). Ponadto przyjmuje się, że długość wszystkich segmentów jest jednakowa. Wartość parametru określającego długość może być zmieniana w trakcie działania programu. Wyznaczone współrzędne mają być zapisane do pliku o ustalonej nazwie manipulator.dat.

3

Format zapisu współrzędnych

Przyjmuje się, że współrzędne kolejnych przegubów zapisywane są w pliku tekstowym. Każda para współrzędnych zapisana zostaje w osobnej linii. W pierwszej linii zapisane są zawsze współrzędne początku układu współrzędnych. Przykładowa postać pliku ze współrzędnymi przedstawiona jest poniżej.

0

0

-2.4

10.23

7.3

20.14

15.1

16.23

18.21

23.19

1

4

Wizualizacja

Chcąc zobaczyć, posturę manipulatora w środowisku systemu Unix/Linux można skorzystać z programu gnuplot (znajduje się on w każdej dystrybucji Linuksa). Program ten jest dostępny również dla systemu MS Windows. Adres strony umożliwiającej pobranie programu to: http://sourceforge.net/project/showfiles.php?group_id=2055

4.1

Wersja uproszczona

W tej wersji zadania można ograniczyć się do ręcznego uruchamiania programu gnuplot po każdorazowym przeliczeniu współrzędnych przegubów. Program gnuplot uruchamiamy w osobnym okienku terminala graficznego po wcześniejszym przejściu do podkatalogu, w którym znajduje się plik manipulator.dat.

4.1.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ęcie przycisków Ctrl-C, gdy focus znajduje się w okienku, w którym on został uruchomiony.

4.1.2

Uruchomienie rysowania z w trybie interakcjnym Z programem gnuplot można pracować w trybie interakcyjny. Uruchamiamy go poleceniem gnuplot, następnie wydajemy polecenie plot ’manipulator.dat’. Wyjście z programu poprzez polecenie exit.

Uwaga: W przypadku pracy w trybie interakcyjnym nie ma sensu kończyć jego działanie po jed-nokrotnym narysowaniu łamanej. Po ponownym przeliczeniu współrzędnych można powtórzyć polecenie plot ’manipulator.dat’ (program gnuplot pamięta historię poleceń, przejście do poprzedniego polecenia dokonuje się poprzez naciśnięcie strzałki w górę), które spowoduje zaktualizowanie poprzedniego rysunku. Przykład sesji z programem gnuplot.

diablo@jkowalsk> gnuplot

G N U P L O T

Version 4.0 patchlevel 0

last modified Thu Apr 15 14:44:22 CEST 2004

System: SunOS 5.10

...

gnuplot>

plot ’manipulator.dat’

gnuplot>

plot ’manipulator.dat’

...

gnuplot>

plot ’manipulator.dat’

gnuplot>

exit

diablo@jkowalsk> _

2

4.2

Wersja podstawowa

W tej wersji proponuje się użycie zewnętrznego modułu lacze_do_gnuplota. Znajduje się on kartotece ˜bk/edu/po/zad/z-manipulator1/przyklad_2D wraz z przykładem jego wy-korzystania. Wspomniany moduł pozwala uruchomić program gnuplot z poziomu własnego programu i przesłać do niego polecenie wykonania rysunku. Ponadto umożliwia na ustalenie zakresu osi współrzędnych OX i OY .

5

Przykład działania programu

Niniejszy przykład nie obejmuje widoku okienka z rysunkiem wygenerowanym przez program gnuplot.

jkowalsk@panamint: rozwiazanie> ./manipulator Aktualne wspolrzedne i parametry:

q0 =

105

Przegub_0: (0, 0)

q1 =

-70

Przegub_1: (-2.59, 9.66)

q2 =

-60

Przegub_2: (5.6, 15.4)

Efektor: (14.7, 11.2)

l = 10

Menu:

0 - Zmiana kata q0

1 - Zmiana kata q1

2 - Zmiana kata q2

z - zmiana ilosc segmentow

l - zmiana dlugosci segmentu

? - ponowne wyswietlenie menu

k - koniec programu

Twoj wybor?> 0

Wprowadz q0: 82

Aktualne wspolrzedne i parametry:

q0 =

82

Przegub_0: (0, 0)

q1 =

-70

Przegub_1: (1.39, 9.9)

q2 =

-60

Przegub_2: (11.2, 12)

Efektor: (17.9, 4.55)

l = 10

Menu:

0 - Zmiana kata q0

1 - Zmiana kata q1

2 - Zmiana kata q2

z - zmiana ilosc segmentow

l - zmiana dlugosci segmentu

? - ponowne wyswietlenie menu

k - koniec programu

3

Twoj wybor?> k

jkowalsk@panamint: rozwiazanie> _

6

Rozszerzenie (nieobowiązkowe)

W wersji rozszerzonej proponuje się dodatkowe elementy:

• Animację zmiany pozycji danego segmentu. Chodzi o zapewnienie płynnej zmiany pozycji segmentu (tak jak to jest zrealizowane w dostarczonym przykładzie).

• Skonstruowanie trójwymiarowego rysunku manipulatora. Można tego dokonać wykorzy-stując moduł lacze_do_gnuplota. Przykład jego użycia dla wersji 3D jest umieszczony w kartotece

˜bk/edu/po/zad/z-manipulator1/przyklad_3D

Wspomniany moduł pozwala uruchomić program gnuplot z poziomu programu i przesłać do niego polecenie wykonania rysunku. W tej wersji programu zakłada się, że kon-strukcja manipulatora jest w programie zaszyta na sztywno (bez możliwości zmiany ilości segmentów i ich długości). Przykład wizualizacji manipulatora znajduje się na zamiesz-Rysunek 2: Przykład wizualizacji manipulatora zrealizowany w ramach studenckich zajęć la-boratoryjnych

czonym rysunku.

7

Obliczanie współrzędnych przegubów

Wyznaczanie współrzędnych przegubów i efektora najłatwiej jest zrealizować łącząc z każdym z przegubów i efektorem lokalny układ współrzędnych. Przeguby znajdują się w początku ta-kich układów współrzędnych. Dzięki temu i-ty przegub (oznaczony jako punkt Pi) w swoim lokalnym układzie współrzędnych XiOYi ma współrzędne Pi = (0, 0). Zastosowane oznacze-i

nie Pi odzwierciedla fakt, że są to współrzędne punktu P

i

i w układzie współrzędnych i-tego

przegubu. To samo dotyczy efektora.

Naszym zadaniem jest wyliczenie współrzędnych poszczególnych punktów w układzie glo-balnym XOOYO. W przedstawionym przykładzie można to zrealizować dokonując następują-

4

Rysunek 3: Lokalne układy współrzędnych związane z każdym z przegubów.

cych transformacji:

P0

= [0 0]T ,

0

P1

= R(q

+ T ),

0

0) · (P11

³

´

P2

= R(q

R(q

+ T ) + T ,

(1)

0

0) ·

1) · (P22

³

³

´

´

P3

= R(q

R(q

R(q

+ T ) + T + T .

0

0) ·

1) ·

2) · (P33

Współrzędne punktu we wzorze przedstawionym powyżej reprezentowane są jako macierz jed-nokolumnowa. Natomiast T to wektor translacji reprezentowany przez macierz jednokolum-nową [l 0]T , gdzie l jest długością segmentu. R(qi) jest macierzą rotacji w współczynnikach postaci:

· cos q

¸

R(q

i

− sin qi

i) =

(2)

sin qi

cos qi

Należy zauważyć, że wyliczanie współrzędnych przegubu np. P2 jest ciągiem transformacji do układów współrzędnych kolejnych przegubów reprezentowanych przez punkty P1 i P0. Po-dobnie dla P3 jest to ciąg transformacji do układów współrzędnych związanych z przegubami reprezentowanych przez punkty P2, P1 oraz P0. Tak więc wyliczenie współrzędnych przegubu P3 można byłoby rozpisać następująco:

P3

= R(q

+ T ),

2

2) · (P33

P3

= R(q

+ T ),

(3)

1

1) · (P32

P3

= R(q

+ T ).

0

0) · (P31

To spostrzeżenie należy wykorzystać przy implementacji rozwiązania zadania.

8

Materiały pomocnicze

Dodatkowe pomocnicze elementy ułatwiające rozpoczęcie realizację zadania znaleźć można na serwerze diablo lub panamint w katalogu ˜bk/edu/po/zad/z-manipulator1. W katalogu tym znajdują się następujące podkatalogi i pliki:

˜bk/edu/po/zad/z-manipulator1/.

bin.diablo/manipulator

bin.panamint/manipulator

przyklad_2D/Makefile

5

przyklad_2D/src/start.cpp

przyklad_2D/src/lacze_do_gnuplota.cpp

przyklad_2D/inc/lacze_do_gnuplota.hh

przyklad_3D/Makefile

przyklad_3D/src/start.cpp

przyklad_3D/src/lacze_do_gnuplota.cpp

przyklad_3D/inc/lacze_do_gnuplota.hh

przyklad_3D/inc/prostopadloscian1.dat

przyklad_3D/inc/prostopadloscian2.dat

przyklad_3D/inc/prostopadloscian3.dat

bin.diablo/manipulator, bin.panamint/manipulator Są to programy binarne. Stanowią one

przykład realizacji programu, w wersji podstawowej (z dodatkiem animacji), który został skom-pilowany odpowiednio na serwerze diablo i na serwerze panamint.

przyklad_2D

Katalog zawiera przykład użycia modułu lacze_do_gnuplota pozwalającego uruchomić program gnuplot z poziomu własnego programu i nawiązać z nim komunikację. W

przykładzie pokazane jest rysowanie z wykorzystaniem grafiki 2D.

przyklad_3D

Katalog zawiera przykład użycia modułu lacze_do_gnuplota pozwalającego uruchomić program gnuplot z poziomu własnego programu i nawiązać z nim komunikację. W

przykładzie pokazane jest rysowanie z wykorzystaniem grafiki 3D.

6