Ostatnia aktualizacja 28 IV 2006 | |||||||||||||||||||||||||||||||||||||
Automatyka, robotyka, elektronika, komputery | |||||||||||||||||||||||||||||||||||||
![]() | |||||||||||||||||||||||||||||||||||||
|
ZASTOSOWANIA MATLABA Poniżej zamieszczam opis kilku zagadnień, jakie przyszło mi rozwiązywać z użyciem Matlaba. W większości są tą problemy z zakresu automatyki i robotyki, chociaż część z nich da się z pewnością zastosować w innych dziedzinach. Piszcie, co interesuje Was w tym narzędziu - mam dużo pomysłów na rozbudowywanie tej strony, ale nie starczyłoby mi na nic więcej czasu :). SPIS TREŚCI
1. Podstwy matlaba. Czym jest matlab? Najkrócej rzecz ujmując, matlab jest interpretatorem. Pozwala na uruchamianie skryptów napisanych w specyficznym dla tego środowiska języku. Można także wydawać mu pojedyncze polecenia – działa wtedy jak linia poleceń dosu. Zoptymalizowany jest do obliczeń inżynierskich, ale można go bez problemu stosować w najprzeróżniejszych dziedzinach. Co ważne, podstawowym sposobem reprezentacji danych są tu macierze (matlab = mat(rix)+lab(oratory)) W kilku następnych artykułach spróbuję przybliżyć Wam podstawy obsługi matlaba, programowanie w nim, oraz jego praktyczne zastosowanie w różnych dziedzinach. Ponieważ matlab został przewidziany do skomplikowanych obliczeń, nie mamy tu najmniejszych problemów z rozwiązywaniem wielu problemów matematycznych. Udostępniono nam funkcje całkowania, różniczkowania, badanie transmitancji widmowych, rozwiązywanie równań i wiele, wiele innych. Na potrzeby kilku pierwszych artykułów zajmiemy się rachunkiem macierzowym, który okaże się niezbędny podczas tworzenia animacji.
Mamy do wykorzystania pełne spektrum operacji macierzowych dostępnych bezpośrednio jako funkcje matlaba.
» a=[1 2 4 Zademonstrowałem operację odwracania macierzy a. Opisy wszystkich podstawowychoperacji są dostępne po wpisaniu np. help * w linii poleceń matlaba. Bardziej rozbudowane funkcje wykonywane na macierzach również są dostępne. Przykładem jest sortrows(x,c) która pozwala na posortowanie wzrastająco macierzy x względem kolumny c. Te i kilka innych funkcji wykorzystamy podczas tworzenia ruchomej grafiki. Podstawą do tworzenia programów w matlabie są funkcje i skrypty. Jedne i drugie mają postać plików tekstowych ASCII i działają prawie tak samo, jak wpisanie serii poleceń do głównego okna matlaba. Na nasz użytek oddany został edytor z funkcjami zbliżonymi do tych umieszczonych w kompilatorach np. C++. Między funkcjami i skryptami występują między innymi następujące różnice:
- uruchomienie skryptu daje identyczny wynik, jak ręczne wpisanie komend w nim zawartych do
linii poleceń – funkcje się tak nie zachowują, Oto przykład prostej funkcji zrealizowanej w środowisku matlaba: function [s]=srednia(x)global s; suma=0; for i=1:lenght(x), suma=suma+x(i); end; s=suma/lenght(x);
Ta prosta funkcja pozwala wyliczyć średnią z liczb zawartych w wektorze x (jak wspomniałem, matlab z natury dobrze
radzi sobie z danymi wektorowymi i macierzowymi). Funkcja oparta jest na pętli,
korzysta dodatkowo z innej funkcji length(x) zwracającej ilość elementów
wektora x. Poza tym mamy tu dane wejściowe, jak i dane wyjściowe (co nie ma
miejsca zawsze) co pozwala nam zaobserwować, jak wygląda składnia definiowania
funkcji – pozostałe elementy nie różnią się od komend wpisywanych do okna
matlaba.
y=srednia([2
4 1 5])
w odpowiedzi dostaniemy wartość y = 3. W tym przypadku naszym wektorem wejściowym x jest [2 4 1 5]. Zauważmy, że
w matlabie elementy macierzy i wektorów rozdzielane są spacjami. Teraz kilka słów o skryptach. Jak wspomniałem wcześniej, skrypty są wykonywane identycznie, jak w przypadku ręcznego wpisywania komend do okna edycyjnego. Zmienne utworzone lub modyfikowane w skrypcie są ogólno dostępne. Nie ma możliwości korzystania ze skryptów w przypadku programów przeznaczonych do kompilacji. Jeśli zależy nam na użyciu jakiegoś skryptu w takim właśnie programie, wystarczy formalnie w nagłówku skryptu dodać nazwę funkcji i określić ją jako bezargumentową (np. srednia()). Tak samo jak w przypadku funkcji zmienne z workspace są dostępne. 3. Przekształcenia jednorodne. Przekształcenia przestrzeni trójwymiarowej.
Tego rodzaju przekształcenia stosowane są w robotyce do obliczania
zadań prostych i odwrotnych manipulatorów robotów. W pierwszej części akapitu zostały umieszczone informacje, jak za pomocą w/w przekształceń operować trójwymiarowymi obiektami. Druga część będzie opisem programu wyliczającego zadanie proste (i być może w niedalekiej przyszłości zadanie odwrotne) dla manipulatora typu stanfordzkiego.
By dokonać przekształceń obiektów w przestrzeni 3D będziemy stosować
homeogeniczne (jednorodne) przekształcenia macierzowe. [x, y, z] (klasycznie) = [x/k,y/k, z/k, k] (wsp. jednorodne).
Łatwo zauważyć, że mnożenie takiego wektora przez skalar nie wpływa no położenie reprezentowanego przez
niego punktu. Poza tym, najczęściej wektory współrzędnych jednorodnych
przyjmują postać [x, y, z, 1]. Od tej pory współrzędne będziemy zapisywać w
takiej właśnie postaci.
Ortonormalne (wzajemnie prostopadłe i o długości jednostkowej) wektory n, o, a tworzą lokalny układ
współrzędnych przywiązany do jakiegoś punktu naszego ciała. nx
stanowi długość (więc jest to skalar) rzutu wektora n na oś x
(zewnętrzny układ współrzędnych x, y, z jest również
ortonormalny), analogicznie dla innych osi.
Z kolei macierz przesunięcia (bez dokonywania obrotu) będzie wyglądać następująco:
Inne złożenia mają bardziej skomplikowaną postać.
Nadmienię tylko, że oś obrotu l przechodzi przez początek zewnętrznego układu współrzędnych. Najwyższy czas wyjaśnić, w jaki sposób odbywają się wymieniane przeze mnie przekształcenia. Mając dane położenia interesujących nas punktów w przestrzeni reprezentowanych w postaci jednorodnej możemy za pomocą przekształceń jednorodnych dokonać ich transformacji (przesunięcia i/lub obrotu). Działanie to polega na mnożeniu jednorodnej reprezentacji wektora przez macierz przekształcenia. Rozważmy przykład: Obrócić punkt o współrzędnych [1, 1, 1] wokół osi Z o kąt 90. Łatwo wyobrazić sobie, że nowy punkt będzie miał współrzędne [-1, 1, 1] ale dokonajmy tego mnożenia:
Jak widzimy otrzymane współrzędne są takie same, jak te przewidziane przez nas. function [p]=operator(c1,c2,teta,tranx,trany,tranz);syms c3 p real; c3=(1-c1^2-c2^2)^0.5; subs(c3); teta=teta*pi/180; tran=[0 0 0 tranx 0 0 0 trany 0 0 0 tranz 0 0 0 1]; p1=[1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0]; p1=p1*cos(teta); p2=[c1*c1 c1*c2 c1*c3 0 c2*c1 c2*c2 c2*c3 0 c3*c1 c3*c2 c3*c3 0 0 0 0 0]; p2=p2*(1-cos(teta)); p3=[0 -c3 c2 0 c3 0 -c1 0 -c2 c1 0 0 0 0 0 0]; p3=p3*sin(teta); p=p1+p2+p3+tran; p=real(p); Zainteresowanych tym, skąd biorą się poszczególne składniki (p1 – p3) przekształcenia odsyłam do miejsca gdzie podany był wzór na Rot(l,q) . Na tym etapie ważne jest tylko to, że wcześniej wymienione przekształcenie jest złożeniem (w tym przypadku jest to mnożenie macierzy) kilku odrębnych przekształceń.
Omówię teraz sposób korzystania z
powyższej funkcji: Szerszego omówienia wymaga zdefiniowanie osi obrotu. Na pytanie dlaczego do zdefiniowania osi obrotu użyto tylko dwóch współrzędnych odpowiadam: współrzędne te to współrzędne wersora tej osi. Pociąga to za sobą równość:
która zresztą jest uwidoczniona w 3. linii listingu. Zauważmy, że obliczona w ten sposób trzecia współrzędna ma
zawsze wartość nieujemną (jest to liczba rzeczywista). Co więc zrobić, jeśli
zależy nam na obrocie wokół osi, która skierowana jest w stronę ujemnych wartości Z? Radzimy sobie z tym w następujący sposób: zamiast obracać wokół osi
l = [x, y, -z] o kąt q, obracamy wokół osi [-x, -y, z] (przeciwnie skierowanej) o kąt -q.
Później wykażemy, że taka reprezentacja może być kłopotliwa, jeśli nasza funkcja jest
wykorzystywana przez inna funkcję, a my nie wiemy jakie są parametry wejściowe. Na razie
jednak ta forma jest bardziej dogodna.
» for i=1:100,
Teraz proszę skorzystać z obrotu
3D (przycisk na pasku narzędzi okna z wykresem) żeby sprawdzić, że faktycznie
jeden odcinek jest prostopadły względem drugiego w płaszczyźnie Z. W razie wątpliwości dotyczących funkcji użytych powyżej polecam wpisanie help ‘nazwa
funkcji’ w oknie matlaba. Wspomniałem już wcześniej, że macierz przekształcenia umożliwia zarówno obrót jak i przesunięcie obiektu. Można
jednak działania te rozdzielić. Przykłady obrotów pokazałem wyżej. Macierz
samego przesunięcia również została przedstawiona. Teraz zobaczymy, co dzieje
się kiedy mnożymy przez siebie macierze przekształcenia. Weźmy pod uwagę dwa
przekształcenia obrót względem osi Z o 90°
oraz kolejny obrót względem tej samej osi, tym razem o - Teraz coś, co na pewno bardziej ucieszy oczy: ten sam problem przedstawiony w postaci animacji: function Archimedes(); W następnym przykładzie użyjemy sprzętowego przyspieszania animacji (OpenGL lub Zbuffer). Na razie jednak chciałbym was zapoznać z funkcją Patch i jej zastosowaniem w tworzeniu grafiki w matlabie.
Funkcja patch służy do
nakładania łatek na wielokąty (zarówno dwu- jak i trójwymiarowe). Jednak pomimo
trójwymiarowości wielokąty te muszą
leżeć w jakiejś płaszczyźnie. Podstawowa składnia patch
wygląda następująco: patch(współrzędne_x, współrzędne_y,
współrzędne_z,kolor). Współrzędne podawane są w postaci wektorów (dla
pojedynczej łatki) lub macierzy (w przypadku tworu „wielołatkowego” np.
sześcianu). Kolor podany jest w postaci wektora [r g b] przy czym poszczególne
litery oznaczają składowe czerwieni, zieleni oraz niebieskiego i są z
przedziału 0 – 1. Przykładowo kolor biały to [1 1 1], czarny [0 0 0], czysty
zielony [0 1 0]. Kolory można podawać także w postaci ‘kolor’. Możemy więc
zamiast [1 0 0] wpisać ‘r’ (red –
czerwony). Do grafiki trójwymiarowej wygodnie będzie napisać funkcję która poda nam w dogodnej formie współrzędne na przykład prostopadłościanu. Mówiąc w dogodnej formie miałem na myśli formę, która pozwoli na bezproblemowe nakładanie łatek na ten prostopadłościan. Funkcja taka będzie bardzo przydatna w tworzeniu obiektów o nieco większym stopniu skomplikowania. Oto przykład:
Na początek parametry funkcji:
rozmiary a, b, c. Pozycja środka symetrii: x, y, z. Zakładamy że a jest rozmiarem
w kierunku osi X, pozostałe wymiary analogicznie. Funkcja może wyglądać tak:
Dodatkowego komentarza wymaga trzeci parametr
wyjściowy: punkty. Jest to jednorodna reprezentacja punktów naszej bryły.
Dzięki tej reprezentacji będziemy mogli wykorzystać przekształcenia jednorodne
do wykonywania obrotów i przesunięć brył. »
[a b c]=bryla(0,0,0,3,1,1); Większość
z podanych wcześniej informacji posłuży teraz do napisania kilku użytecznych
programów.
Funkcje obliczające kąty Eulera można pobrać tutaj.
Nie są to gotowe programy, ponieważ były używane
jako funkcje składowe w innym programie. Można jednak z nich wyłuskać
odpowiednie wzory (zajmują one kilka początkowych linijek każdego pliku). Program umożliwia obliczanie kątów Eulera a także prezentacje ruchu manipulatora wykonującego odpowiednie obroty. Mamy tutaj możliwość obliczenia kątów dla zadanej docelowej orientacji (dla wszystkich 24 konwencji), wykonanie obrotów dla 3 zdefiniowanych kątów i podanie operatorów obrotu dla każdego ruchu, a także dla sekwencji 3 ruchów. 7. Identyfikacja obiektów sterowania. Tym razem zajmiemy się zagadnieniem znanym automatykom – identyfikacją obiektów sterowania. Najogólniej rzecz biorąc, celem identyfikacji jest rozpoznanie rzeczywistych parametrów obiektu, układu, zjawiska. Weźmy przykład: masa zawieszona na sprężynie. Nie znamy ani wartości masy, ani współczynnika sprężystości sprężyny. Pobudzamy taki układ i obserwujemy, jak się zachowuje. Na podstawie obserwacji szacujemy interesujące nas wielkości. Dokładnie rzecz biorąc powyższa metodologia sprowadza się zastosowania poniższego układu:
Od wyjścia obiektu jest odejmowane wyjście modelu a różnica ta stanowi uchyb.
W istocie schemat ten winien zawierać dodatkowo zakłócenie działające na obiekt oraz sprzężenie od e (epsilon) wpływające na
parametry modelu. Wszystkie metody identyfikacji polegają na tym, że uchyb e jest minimalizowany poprzez zmianę parametrów modelu. Jeśli
uchyb jest minimalny, oznacza to, że model jest prawie dokładnym odzwierciedleniem obiektu (o ideale nie może być mowy ze względu na zakłócenia
oddziaływujące na obiekt a przez to również na jego wyjście). To samo zagadnienie w przypadku metody RML - największej wiarygodności: Niedługo (mam nadzieję :)) opis algorytmów i budowy programu. 8. Dostęp do portów i innych urządzeń z poziomu Matlaba. Z tym zagadnieniem spotkałem się przy
okazji tworzenia aplikacji pozwalającej na sterowanie kartą wejścia/wyjścia
Advantech PCI 1710. Program miał umożliwiać odczyt/zapis wejść
analogowych oraz cyfrowych. Niestety przy próbie skorzystania w Matlabie z
oryginalnego sterownika wynikły problemy, których nie udało się rozwiązać.
Tym sposobem autor zmuszony został do dostępu do karty bezpośrednio przez
jej rejestry. Tutaj mamy dwie możliwości: napisanie w C prostych funkcji
uzyskujących dostęp do przestrzeni wejścia/wyjścia komputera (z użyciem
na przykład poleceń outport, inport). Niestety cała idea pisania tych
tzw. funkcji MEX bierze w łeb w sytuacji, kiedy aplikacja będzie działać
w środowisku systemu operacyjnego klasy NT - są to systemy broniące dostępu
do portów i korzystanie z w/w poleceń nie daje rezultatu. Drugim sposobem
jest użycie któregoś z programików umożliwiających dostęp do portów.
STRONA W PRZYGOTOWANIU...
|
|
|||||||||||||||||||||||||||||||||||
Copyright by VIRESCO |