Motoman SDA10F vs. pick&place

pick_place_title„Everyone’s first industrial robot is pick & place machine“. Pamätná veta, ktorú vyslovil Eric Nieves vo svojej prednáške a ktorá platí aj vyše 50 rokov potom ako Devol a Engelberger skonštruovali prvý priemyselný robot. Aj napriek tomu, ako ďaleko už pokročil technologický výoj, pick&place je klasika, ktorú si chce vyskúšať takmer každý začínajúci vývojár.

V predchádzajúcom príspevku sme si ukázali ako využiť ROS-Industrial pre pokročilé riadenie priemyselného robota a v tomto článku si postupne vysvetlíme, čo všetko je potrebné nato, aby robot dokázal nájsť, uchopiť a preniesť náhodne umiestnený objekt vo svojom pracovnom priestore. Na konkrétnom príklade budeme opäť demonštrovať silné stránky ROS,  ktorými senzorika a vizualizácia bezpochyby sú.

Pre túto úlohu sme na Katedre Robotiky SjF TUKE pripravili jednoduché pracovisko s Motomanom SDA10F, Kinectom a objektom nachádzajúcim sa na rovine v pracovnom priestore robota.

IMG_2806

Experimentálne pracovisko pre pick&place z náhodnej pozície

1. Krok – doplnenie senzoriky

Máme k dispozícii kompletný model robota aj s prepojením na reálny systém, vieme ho ovládať zo simulácie aj z kódu a chceme do tohto systému zapojiť senzoriku. ROS tým, že bol primárne vytváraný pre servisné roboty je v oblasti senzoriky tradične silný a k dispozícii máte drivere a hotové pkg-e pre množstvo rôznych snímačov od web kamier a jednoduchých ultrazvukových SRF04iek cez Kinecty, IMU jednotky až po laserové senzory. V našom prípade pre vyhľadávanie objektu v pracovnom priestore manipulátora volíme Kinect, ako najdostupnejší 3D senzor na trhu.  Po jednoduchej inštaláci Openni drivera pre Kinect, pripojíte USB a rovno môžete v RVize sledovať obraz, disparitu či dokonca zregistrovaný pointcloud. Súčasťou drivera je aj súbor s „továrenskými“ kalibračnými parametrami, čiže Kinect pred použitím nie je potrebné ani intristicky kalibrovať.

2. Krok – spracovanie pointcloudu

Bez ohľadu na to, ktorým senzorom je pointcloud získaný, vždy je to v podstate množina bodov v priestore. Aby sme mohli robotom manipulovať s konkrétnym objektom ale potrebujeme zistiť jeho súradnice, inak povedané potrebujeme z pointcloudu vytiahnuť pozíciu, a orientáciu nášho cieľového objektu. Ak by sme mali obyčajnú kameru umiestnenú kolmo nad rovinou, určiť súradnice objektu pomocou funkcií rozpoznávania obrazu a základnej kalibrácie by až také zložité nebolo. Ale ako to isté spraviť v pointcloude ak je navyše Kinect uchytený pod uhlom 50 stupňov voči rovine?

Tak ako je knižnica OpenCV určená na spracovanie obrazu, na prácu s pointcloudmi bola vytvorená PCL Library. Vznikla v roku 2011, čiže pár mesiacov potom ako bol spustený predaj prvej verzie Kinectu a za jej vznikom nestojí nikto iný ako Willow Garage. Podobne ako OpenCV je tiež open-source pod BSD licenciou čiže voľne použiteľná aj pre komerčné účely. Za tri roky jej existencie stihla komunita spraviť obrovský kus práce a dnes už PCL ponúka množstvo funkcií od jednoduchých filtrov až po pokročilú segmentáciu a rozpoznávanie objektov v pointcloude.

Možností ako nájsť polohu a orientáciu nášho cieľového objektu v pointcloude je viacero, ale vo všeobecnosti ide o kombináciu filtrovania, segmentácie, clusteringu a výpočtu ťažísk nájdených objektov. Tento postup sme zvolili aj my, a pri správnom nastavení parametrov fungoval celkom spoľahlivo. Celý proces od zosnímania až po spracovanie pointcloudu trval na našom hadrwari okolo 0.2 sekundy. Jednotlivé kroky postupu sú v obrázku nižšie.

cloud_coor

3. Krok – excentrická kalibrácia

Máme už k dispozícii súradnice nášho objektu ale tieto dáta ešte nemôžeme použiť ako cieľovú polohu pre pohyb ramena. Poloha [X,Y,Z] je totiž vztiahnutá na súradnicový systém horného Kinectu a nie základne (base_linku) robota. Nato aby sme pozícu objektu dokázali prepočítať, potrebujeme poznať polohu a orientáciu Kinectu voči základni robota – potrebujeme spraviť excentrickú kalibráciu.

Na začiatok, aby sa bolo od čoho odraziť je dobré poznať aspoň približnú polohu a orientáciu Kinectu, ktorá sa dá odmerať aj klasickým metrom a uhlomerom. Model Kinectu sa následne doplní do xacro súboru definujúceho model celej pracovnej bunky a pozícia voči robotovi sa rôznymi spôsobmi doladzuje. Už je na skúsenostiach programátora, či využije pevne zadefinované body v priestore, kalibračnú mriežku alebo skalibruje systém na základe pohybu robota. V ROS sa v tejto situácii výborne hodí možnosť premietať do simulácie „live“ poincloud zo snímača, na základe ktorého je možné odsledovať a doladiť skutočnú polohu Kinectu voči robotovi (viac vo videu).

Výsledok síce pri ručnom doladení nikdy nebude úplne presný ale tým, že v našom prípade máme na efektore robota prísavku a presnosť navádzania nie je kritická nám mierne odchýlky až tak veľmi vadiť nebudú. Samozrejme, ak by bola požiadavka na vyššiu presnosť polohovania, výber senzora aj spôsob kalibrácie by bol iný.

SwRI ako líder amerického konzorcia ROS-Inudstial momentálne intenzívne pracuje na kalibračnom toolboxe umožňujúcom pomocou šachovnicovej mriežky a optimalizačných solverov ceres presne vypočítať polohu 3D senzora voči robotovi. Prvý experimentálny release je už dostupný na GitHube, no pre excentrickú kalibráciu Kinectu voči nášmu SDA10F sa nám ho aj napriek značnému úsiliu ešte nepodarilo použiť. V budúcnosti, keď bude doplnená podpora pre dvojramenné štruktúry, prípadne budeme kalibrovať iné manipulátory sa ku kalibračnému toolboxu ešte určite vrátime.

Pick&Place

Ak poznáme polohu a orientáciu Kinectu voči base_linku robota, prepočítať súradníce [X,Y,Z] do basu robota je možné pomocou štandardných funkcií z „tf“ API.  Získanú polohu už použijeme ako cieľ generovanej trajektórie. V tomto konkrétnom príklade robot vyhľadáva náhodne umiestnené objekty na rovine a presúva ich do zásobníka.

Aj keď ide na prvý pohľad o úplne jednoduchú operáciu, zvládnutie pick&place „pipelinu“ je nevyhnutným predpokladom pre vývoj všetkých pokročilejších aplikácií. Samozrejme od konkrétnej úlohy a pracoviska závisí výber senzorov, spracovanie obrazu, pointcloudov či generorvanie trajektórií pohybu, no základný princíp zostáva rovnaký.

František Ďurovský