FAKULTA STROJNÍ - Ústav přístrojové a řídicí techniky Propojení Pythonu a softwaru V-REP Ročník: 4 (zimní semestr) Rok: 2016 Jméno a příjmení Vojtěch Kadlec
Obsah ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Úvod... 3 1. Instalace softwaru a vývojové prostředí... 4 2. Propojení Pythonu s V-REPem... 4 2.1. Vytvoření scény ve V-REPu... 4 2.2. Spyder (python)... 6 2.2.1. Kód pro propojení... 6 2.2.2. Pohyb robota... 7 2.2.3. Kompletní kód... 10 3. Závěr... 11 2
Úvod V této seminární práci se budeme zabývat propojením softwaru V-REP s Pythnem. Python je vysokoúrovňový skriptovací programovací jazyk. Je vyvíjen jako open source projekt, který zdarma nabízí instalační balíky pro většinu běžných platforem (Unix, Windows, Mac OS). V-REP je robotický simulátor s integrovaným vývojovým prostředím. Každý model/objekt může být individuálně ovládán pomocí vloženého scriptu, pluginu, vzdáleného klienta API nebo vlastním řešením. Díky tomu je V-REP velmi univerzální. Řízení robotů pak může být napsáno v jazycích C/C++, Python, Java, Lua, Matlab nebo Octave. Pro jednoduché znázornění si nejprve projdeme, jak V-REP s Pythnem propojit a následně, po vytvoření jednoduché scény, rozhýbáme robota jednotlivými příkazy. 3
1. Instalace softwaru a vývojové prostředí Python je možné stáhnout zdarma přímo od výrobce, protože se jedná o open source. Na oficiálních stránkách v záložce Download si můžeme vybrat verzi pythonu. Pro naše účely se bude více hodit verze 2.7.13. http://www.python.org Také si ale Python můžeme stáhnou jako součást již připraveného balíčku, v kterém se mimo jiné nachází mnoho potřebných knihoven a software s vývojovým prostředím. Takovými jsou například Anaconda, WinPython nebo Python(x,y). (Při vybírání instalačního balíčku je třeba dbát na správnou bitovou verzi. Po zkušenosti je lepší použít 32-bitovou verzi, která dokáže bez problému komunikovat s V-REPem.) V-REP je možné stáhnou také přímo z oficiálních stránek. Pro naše účely bude stačit neomezená volná verze pro vzdělávání. V-REP PRO EDU V3.3.2 rev3 http://www.coppeliarobotics.com/download.html 2. Propojení Pythonu s V-REPem Po úspěšné instalaci obou těch to prvků zkopírujeme obsah složky umístěné zde C:\Program Files\V-REP3\V-REP_PRO_EDU\programming\remoteApiBindings\python\python do námi vytvořené složky např. myvrep. Další soubor, který je zapotřebí zkopírovat do naší složky, se nachází zde C:\Program Files\V-REP3\V- REP_PRO_EDU\programming\remoteApiBindings\lib\lib\32Bit. Tímto jsme si připravili základ pro propojení. 2.1. Vytvoření scény ve V-REPu Ve V-REPu vytvoříme jednoduchou scénu viz obrázek 2.1. Scéna. Parametry objektů: Robot PhantomPincher Kvádrová stojna 2x (větší) X: 0.2m (Rozměry v daných osách) Y: 0.2m Z: 0.7m 4
Kvádrová stojna 1x (menší) X: 0.2m Y: 0.2m Z: 0.5m Přenášená krychle 1x X,Y,Z: 0.035m 2.1. Scéna Každý robot v základní sadě V-REPu má přidělený základní skript, díky kterému se nějak pohybuje. To je ovšem pro nás v tuto chvíli nežádoucí, protože mi chceme, aby se robot hýbal dle našeho scriptu, který budeme psát v Pythonu. Poroto je zapotřebí tyto základní skripty vypnout, to zajistíme ve V-REPu tak, že v levé části programu poklepeme na Scripts ( ) a v další nabídce vybereme skripty, které chceme vypnout (zaškrtnou políčko 5
Disabled). To tedy provedeme u těchto skriptů: Threaded child script (PhantomXPincher), Non-threaded child script (PhantomXPincher_gripperClose_joint). Posledním krokem ve V-REPu bude vložit regular API functions simextremoteapistart(19999) do naší scény. Pro vložení funkce musíme přidělit nějakému objektu v naší scéně skript. Například kameře, která snímá naši scénu. (Pravým tlačítekem poklepene na kameru v seznamu > Add > Associated child script > Threaded child script). Funkci do skriptu vložíme dle obrázku 2.1. Threaded child script (Default Camera). Aby propojení fungovalo, musíme spustit simulaci a nechat ji běžet. 2.1. Threaded child script (Default Camera) 2.2. Spyder (python) 2.2.1. Kód pro propojení Nyní si otevřeme software Spyder, který je součástí jednoho z instalačních balíčků viz. výše. Nový soubor uložíme do naší složky a pojmenujeme ji např. pythonvrep.py. Následně můžeme začít psát samotný kód. Nejprve naimportujeme knihovnu vrep a knihovnu systémových specifických parametrů a funkcí (sys). Modul sys obsahuje informace o konstantech, funkcích a metod Python interpret. import vrep import sys 6
Dále vložíme část kódu pro připojení: vrep.simxfinish(-1) # tato funkce nám uzavře všechny otevřené spoje clientid=vrep.simxstart('127.0.0.1',19999,true,true,5000,5) # Připojení do V-REPu if clientid!=-1: print ('Připojeno') else: print ('Nepřipojeno') sys.exit('nemohl se připojit') Pro správné fungování V-REPovských funkcí je třeba k nim psát předponu vrep.daná funkce. vrep.simxstart funkce pro navázání spojení s V-REP serverem. (IP adresa, kde je server umítěn; číslo portu pro připojení; pokud bude zapsáno TRUE, funkce vyčká než proběhne připojení nebo po zadanou dobu (5000); doba vyčkávání; počet opakování připojování (5)). Díky odpovědi z následujícímu ifu zjistíme, zda jme připojeni či nikoliv. 2.2.2. Pohyb robota Načtení jednotlivých proměnných robota, díky kterým budeme moci pohybovat s robotem. errorcode,rk1=vrep.simxgetobjecthandle(clientid,'phantomxpincher_joi nt1',vrep.simx_opmode_oneshot_wait) # Pohyb kloubu č.1 errorcode,rk2=vrep.simxgetobjecthandle(clientid,'phantomxpincher_joi nt2',vrep.simx_opmode_oneshot_wait) # Pohyb kloubu č.2 errorcode,rk3=vrep.simxgetobjecthandle(clientid,'phantomxpincher_joi nt3',vrep.simx_opmode_oneshot_wait) # Pohyb kloubu č.3 errorcode,rk4=vrep.simxgetobjecthandle(clientid,'phantomxpincher_joi nt4',vrep.simx_opmode_blocking) # Pohyb kloubu č.4 7
errorcode,rcc=vrep.simxgetobjecthandle(clientid,'phantomxpincher_gri pperclose_joint',vrep.simx_opmode_oneshot_wait) # Pohyb čelistí vrep.simxgetobjecthandle funkce, díky které načteme informaci o části objektu do naší proměnné (clientid vychází z funkce simxstart; název objektu; operační mód (viz. doporučené hodnoty: http://www.coppeliarobotics.com/helpfiles/en/remoteapifunctionspython.htm )) # 1. Sada příkazů pro uchopení kostky vrep.simxsetjointtargetvelocity(clientid,r1cc,0.02,vrep.simx_opmode_ streaming) # Otevření čelistí vrep.simxsetjointtargetposition(clientid,r1k2,0.5,vrep.simx_opmode_s treaming) # Pohyb kloubu č.2 vrep.simxsetjointtargetposition(clientid,r1k4,- 0.7,vrep.simx_opmode_streaming) # Pohyb kloubu č.4 vrep.simxsetjointtargetposition(clientid,r1k3,1.9,vrep.simx_opmode_s treaming) # Pohyb kloubu č.3 vrep.simxsetjointtargetvelocity(clientid,r1cc,- 1,vrep.simx_opmode_streaming) # Sevření čelistí (kostky) # 2. Sada příkazů pro přenesení kostky vrep.simxsetjointtargetposition(clientid,r1k2,- 0.5,vrep.simx_opmode_streaming) vrep.simxsetjointtargetposition(clientid,r1k4,0.7,vrep.simx_opmode_s treaming) vrep.simxsetjointtargetposition(clientid,r1k3,- 1.9,vrep.simx_opmode_streaming) # 3. Sada příkazů pro uvolnění kostky a navrácení robota do původní polohy vrep.simxsetjointtargetvelocity(clientid,r1cc,1,vrep.simx_opmode_str eaming) # Otevření čelistí (uvolnění kostky vrep.simxsetjointtargetposition(clientid,r1k2,0,vrep.simx_opmode_str eaming) vrep.simxsetjointtargetposition(clientid,r1k4,0,vrep.simx_opmode_str eaming) 8
vrep.simxsetjointtargetposition(clientid,r1k3,0,vrep.simx_opmode_str eaming) vrep.simxsetjointtargetposition funkce, která určuje pozici natočení kloubu (clientid vychází z funkce simxstart; název proměnné,kloubu; pozice; operační mód) vrep.simxsetjointtargetvelocity funkce, která určuje pozici/rychlost otevírání/zavíraní čelistí (clientid vychází z funkce simxstart; název proměnné,kloubu; pozice; operační mód) Pro správný pohyb robota je zapotřebí zadat sady příkazů jednotlivě, nikoliv naráz. 2.2.2. 1. Sada příkazů, 2. Sada příkazů, 3. Sada příkazů 9
2.2.3. Kompletní kód import vrep import sys vrep.simxfinish(-1) # tato funkce nám uzavře všechny otevřené spoje clientid=vrep.simxstart('127.0.0.1',19999,true,true,5000,5) # Připojení do V-REPu if clientid!=-1: print ('Připojeno') else: print ('Nepřipojeno') sys.exit('nemohl se připojit') #---------------------Načtení proměnných---------------------------- --- errorcode,rk1=vrep.simxgetobjecthandle(clientid,'phantomxpincher_joi nt1',vrep.simx_opmode_oneshot_wait) # Pohyb kloubu č.1 errorcode,rk2=vrep.simxgetobjecthandle(clientid,'phantomxpincher_joi nt2',vrep.simx_opmode_oneshot_wait) # Pohyb kloubu č.2 errorcode,rk3=vrep.simxgetobjecthandle(clientid,'phantomxpincher_joi nt3',vrep.simx_opmode_oneshot_wait) # Pohyb kloubu č.3 errorcode,rk4=vrep.simxgetobjecthandle(clientid,'phantomxpincher_joi nt4',vrep.simx_opmode_blocking) # Pohyb kloubu č.4 errorcode,rcc=vrep.simxgetobjecthandle(clientid,'phantomxpincher_gri pperclose_joint',vrep.simx_opmode_oneshot_wait) # Pohyb čelistí #---------------------Pohyb Prvního motoru-------------------------- ----- 10
# 1. Sada příkazů pro uchopení kostky vrep.simxsetjointtargetvelocity(clientid,rcc,0.02,vrep.simx_opmode_s treaming) # Otevření čelistí vrep.simxsetjointtargetposition(clientid,rk2,0.5,vrep.simx_opmode_st reaming) # Pohyb kloubu č.2 vrep.simxsetjointtargetposition(clientid,rk4,- 0.7,vrep.simx_opmode_streaming) # Pohyb kloubu č.4 vrep.simxsetjointtargetposition(clientid,rk3,1.9,vrep.simx_opmode_st reaming) # Pohyb kloubu č.3 vrep.simxsetjointtargetvelocity(clientid,rcc,- 1,vrep.simx_opmode_streaming) # Sevření čelistí (kostky) # 2. Sada příkazů pro přenesení kostky vrep.simxsetjointtargetposition(clientid,rk2,- 0.5,vrep.simx_opmode_streaming) vrep.simxsetjointtargetposition(clientid,rk4,0.7,vrep.simx_opmode_st reaming) vrep.simxsetjointtargetposition(clientid,rk3,- 1.9,vrep.simx_opmode_streaming) # 3. Sada příkazů pro uvolnění kostky a navrácení robota do původní polohy vrep.simxsetjointtargetvelocity(clientid,rcc,1,vrep.simx_opmode_stre aming) # Otevření čelistí (uvolnění kostky) vrep.simxsetjointtargetposition(clientid,rk2,0,vrep.simx_opmode_stre aming) vrep.simxsetjointtargetposition(clientid,rk4,0,vrep.simx_opmode_stre aming) vrep.simxsetjointtargetposition(clientid,rk3,0,vrep.simx_opmode_stre aming) 3. Závěr Tímto jsme si prošli, jak propojit V-REP s Pythonem a jak rozpohybovat základními příkazy robota. Je to ovšem jen základ z toho, co je možné provádět. Dalším pokračováním této práce by mohlo být zautomatizování dávkování příkazů tak, aby následující příkaz počkal na dokončení předchozí operace. 11