Robotkar modellezés Készítette: Dévényi Péter (2011)
Néhány nagyon alapvető Matlab tudnivaló: Ha Matlab kódot akarunk írni akkor a következőt kell tenni. File->New->Script. Ezzel egy .m kiterjesztésű file-t hozunk létre. A Robotics Toolboxos feladatot ilyen állományban kell megírni. Simulink indítása: Matlab konzolban simulink parancs beírásával. A SimMechanics elérése: Simulink->SimScape->SimMechanics Új simulink feladathoz létrehozásához a következőt kell tenni: Simulinkben File->New>Model. Ez létre fog hozni egy .mdl kiterjesztésű állományt. Használjuk a Súgót, mert szinte minden le van írva benne.
Robotics Toolbox: Telepítés: A RoboticsToolbox.zip tartalmát másold a Matlab/Toolbox mappába, majd a Matlabban File->Seth Path és add meg az elérési utat. Indítás: Amennyiben demókat szeretnénk megtekinteni akkor Matlab konzolba írjuk be az rtdemo parancsot. Segédanyag: Kövesi-Nagy Dániel által fordított RoboticsToolbox.doc leírás. Itt minden fontos információt megtaláltok, illetve a honlapjáról (http://www.staff.u-szeged.hu/~kndani/ ) tudtok mintapéldákat elérni. Példa feladat megoldása: Először is hozzunk létre egy üres .m file-t. Robotkar létrehozása: link utasítással hozunk létre új szegmenst. link([alpha a theta d sigma(R/P)]), ahol az első négy tag a D-H feladatból ismert négy paraméter, az sigma(R/P) pedig megadja, hogy a csukló rotációs sigma=0 vagy transzlációs sigma!=0. A forgatásokat érdemes radiánban megadni, mintahogy a példában is látszik. Példa: L{1} = link([pi/2 0.0 0 0.0 0]); Amennyiben dinamikát is szeretnénk számolni, az egyes szegmenseknek megadhatunk tömeget (L{1}.m), tömegközéppont koordinátáját (L{1}.r), áttétel arányt (L{1}.G), motor tehetetlenségét (L{1}.Jm), szegmens tehetetlenségi tenzorát (L{1}.I) Példa: L{1}.m = 0.23;
L{1}.r =[0 0 0]; L{1}.G=1; L{1}.Jm =
0.1;
L{1}.I=I; A robot létrehozása a robot() utasítással történik. Megadhatunk a robotnak saját nevet, illetve gravitációt is. Példa: myrobot=robot(L); myrobot.name = 'Leg'; myrobot.gravity = [0 0 g]; A robotnak megadhatunk pályát, amely mentén haladhat. Ehhez definiálni kell egy idővektort. Illetve a szimulációs időt. Példa: t = [0:.01:1]; tab = [t 1+t 2+t 3+t 4+t 5+t];
A pálya pontjainak meghatározásához, használhatjuk a következő utasításokat például. transl(), amely megadja a transzláció homogén transzformációs mátrixát, rotx(), roty(), rotz(), melyek a megfelelő tengely körüli forgatás transzformációs mátrixát adják meg. Példa: T0 = transl(13, 0, 0); T1 = transl(13, 45, 0); T2 = rotx(40); A pálya kiszámításához a ctraj() utasítást lehet használni. Két pontot, és a pálya megtételéhez szükséges időt kell megadni neki. Példa: Tf0 = ctraj(T0, T1, length(t)); A cat() utasítással összekonkatenálhatjuk a részpályákat a megfelelő dimenzió mentén. Példa: Palya=cat(3, Tf0, Tf1); Amennyiben inverz kinematikát szeretnénk számolni a ikine() utasítást kell használni. Példa: qik=ikine(myrobot, Tf13, Q, M); ahol az első paraméter a robotunk, aminek a kinematikáját számoljuk, második a pálya, amelyen az inverz kinematikát számljuk, a harmadik kezdeti érték (általában Q=[0 0 0]), és a negyedik egy maszk, mellyel a 6 szabadsági foknál kevesebbel rendelkező robotok szabadságfokát lehet kimaszkolni.
M=[rotx roty rotz transx transy transz], és minden érték vagy 0 vagy 1 lehet az adott szabadságfok meglététől függően. Az inverz kinematika során csuklópozíciókat (illetve ennek deriváltjait is a Toolboxban) fogunk kapni a megadott pálya világkoordinátái alapján. Példa: [q0,q0d,q0dd] = jtraj(qik(1,:), qik(101,:), t); ahol a jtraj() első két paramétere a pálya két állapotát jelölik, míg a harmadik a pálya elemszámot, ami az idővektor (korábban t = [0:.01:1];) elemszámával egyenlő. Amennyiben dinamikát (inverz dinamikai feladat megoldása) is szeretnénk számolni az rne() utasítást kell használnunk. Példa: tau0 = rne(myrobot, q0, q0d, q0dd); Az első paraméter a robotunk, a második, harmadik, negyedik, sorrendben a csuklópozíció, csuklósebesség, csuklógyorsulás. Ha futási időt szeretnénk mérni, akkor a mérendő folyamat elé rakjuk a tic majd utána a toc utasítást. Az eredményeinket ki is tudjuk rajzolni. A kirajzoláshoz a plot() parancsot használjuk. Példa: plot(tab, tau(:,1:1)/10, 'r'); Az első paraméter az x tengely menti érték, a második az y tengely menti, a harmadik pedig a kirajzolás színe.
Ha szeretnénk a tengelyeket elnevezni akkor használjuk az xlabel() és ylabel() parancsokat. Példa: xlabel('Time (s)'); ylabel('Joint torque (mNm)');
Ha több plotot akarunk egy ablakban, de mindegyik plotot külön kirajzolva, akkor a subplot() utasítást használjuk. Példa: subplot(3,1,1); plot(tab, tau(:,1:1)/10, 'r'); subplot(3,1,2); plot(tab, qdd(:,1:1), 'g'); subplot(3,1,3); plot(tab, gl(:,1:1)/10, 'b');
A szimuláció animálása a következőképpen lehetséges: figure(2); plot(myrobot, qik); Ezzel a robotunk végre fogja hajtani a qik-ban letárolt pályát.
Simulink SimMechanics: SimMechanicox Toolbox célja, hogy komplex fizikai rendszereket tudjunk szimulálni és modellezni. A rendszer numerikus módon végzi a modellezést. Egy robotkar létrehozásához, hozzunk létre egy új .mdl filet. Feladat egy egyszerű robotkar létrehozása. Minden fizikai rendszernél definiálni kell a talajt és a környezetet. Ehhez nyissuk meg a következőt a Simulinkben: Simscape->Simmechanics>Bodies és húzzuk az üres állományunkba a Ground és Machine Environment dobozokat. A
Az előbbi definiálja a talaj pozícióját (és tulajdonképpen a világkoordináta rendszer origóját). Érdemes itt a show machine environment portot bepipálni, hogy a talajt hozzákapcsolhassuk a környezethez. A Machine Environmenttel beállíthatjuk a gravitációt, dinamikai vizsgálat típusát, vizualizációt... stb. azaz a modellezési környezetet.
Ezek után már csak a csuklókat és a szegmenseket kell létrehozni. A Ground-hoz közvetlenül nem kapcsolhatunk szegmens, csak csuklót. Vegyük a Joints-ok közül a Weld csuklót. Ez egy passzív csukló, amivel a robot talapzatát (vagy éppen a talaj fizikai megjelenését) tudjuk definiálni. A Weld egy passzív csukló (azaz nem végez forgást vagy tarnszlációt). A csuklókat megnyitva, megadhatjuk, hogy mi legyen a referenciaa koordinátarendszer, illetve, hogy melyik tengely mentén/körül hajtsa végre a mozgást (Weld esetében ez 0, hiszen ez egy rögzített passzív csukló). A dobozkán a két betű B és F a Base-t és a Follower-t jelenti, értelemszerűen az előző szegmenst a B-hez kötjük és a következőt az F-hez. A talapzat szegmensét (vagy talajszegmens) egy Body elemmel modellezzük. A Body-t megnyitva, beállíthatjuk szegmenset alkotó pontok koordinátáit, azok viszonyítási pontját és koordinátarendszerét, tömegét, tehetetlenségi tenzorát. Érdemes minden Body-t, úgy beállítani, hogy az előző jointhoz kapcsolódó pontja a szegmensnek legyen Adjoining viszonyítású, a többi pontot ehhez képest kell megadni.
Ahhoz, hogy lássuk a lemodellezett robotkarunkat a következőt kell beállítani: .mdl fileban>Simulation->Configure parameters->Simscape->SimMechanics->Show animation during simulation kipipálása.
A többi szegmenst és csuklót a fenntebb említett módon kell megadni.
Minden szegmenshez és csuklóhoz megadhatunk aktuátorokat szenzorokat, megszorításokat, kezdeti feltételeket. Az aktuátorokat alkalmazhatjuk, a külső erők modellezésére is, nemcsak vezérelt meghajtásra. Példa: A csuklóinkat akarjuk meghajtani, például úgy, hogy azok szinusos pályákat írjanak le. A megtett pályát pedig meg akarjuk jeleníteni.
A szenzorokat és aktuátorokat a SimMechanics->Sensors and Actuators blokkban találjuk. Megynyitva ezeket, hogy mivel szeretnénk meghajtani az aktuátort (pozíció/sebesség/gyorsulás vagy nyomatékkal), illetve hogy mit akarunk mérni (mozgást vagy erőt). Mivel csuklókat akarunk meghajtani, meg kell adnunk a jointjainknak új portokat, ahova beköthetjük ezeket. Ehhez meg kell nyitnunk a joint dobozunkat és beállítani a Number of sensor/actuator ports-ot a megfelelő számra. Az aktuátornak mozgást adok meg a példában azaz pozíció/sebesség/gyorsulás hármast kér inputnak. A matematikai függvények, jelirányítás (pl. mux/demux), jelforrások (pl. a szinusz jelünk) a Simulinkben a Simulink Toolboxban találhatóak a megfelelő blokkban. A példában a szinuszjel a pozíciót adja, amelyből deriválom a sebességet és a gyorsulást, majd multiplexálom a három jelet, mert csak egy bemenetet fogad az aktuátor. Ha meg akarjuk jeleníteni az eredményeket, akkor ezt a Simulink->Sinks blokkban lévő elemekkel tehetjük meg. A példában egy Scope-ot használok, mellyel a kimenet grafikonját jelenítem meg, ami a
példában a csukló elfordulási szöge. A Scope-ot megnyitva a Scope parameters megnyitva beállíthajuk, hogy a scope-unknak mennyi bemenete legyen.
Megjegyzés: A jegyzet tartalmazhat hibákat, ha valaki felfedez egyet, akkor nyugodtan jelezze e-mailben.