Software-architectuur voor mobiele robots: ROS drivers, het robotmodel… en een bonus

Software ontwikkelen voor een mobiele robot lijkt in het begin misschien simpel, maar zodra je ermee begint kan het snel overweldigend worden. Loop jij hier tegenaan? Je bent niet de eerste, en je zult ook niet de laatste zijn. Anderen zijn je voor geweest en hebben lessen geleerd zodat jij dat niet opnieuw hoeft te doen. Er valt meer te leren dan ik in een simpele blogpost kan opschrijven, dus laten we bij het begin beginnen. Als je een prototype in elkaar hebt gezet, is de eerste stap om een fundering te leggen waarop je de autonome functionaliteit kunt gaan bouwen. In deze post kijken we wat dat betekent en hoe het je helpt om een hoogwaardige robot te bouwen.

Drivers

Voordat je begint met de autonomie van je autonome mobiele robot, moet je eerst in staat zijn data uit te lezen van sensoren en setpoints naar je motoren en andere actuatoren te sturen. Dit is de verantwoordelijkheid van hardware drivers; de fundering waarop je later kunt gaan bouwen. Het zijn daarom ook misschien wel de belangrijkste onderdelen van het softwaresysteem van je robot. Drivers zorgen ervoor dat de bits en bytes die je sensoren uitsturen omgezet worden in iets dat de rest van je systeem begrijpt.

De output van zo’n driver is bij voorkeur iets dat niet specifiek is voor de sensor zelf, maar voor het type sensor. Lidars, bijvoorbeeld, heb je in alle soorten en maten, en van verschillende marken. Toch is de output altijd ongeveer hetzelfde: een lijst afstandsmetingen, gelijkmatig uitgespreid over een gezichtsveld. Dit betekent dat, hoewel iedere fabrikant zijn eigen communicatieprotocol heeft, de driver altijd kan worden weergegeven als

scan:
  ranges: [...]
  intensities: [...]
  min_angle: -x
  max_angle: y
  angle_increment: z

Hier kunnen we gebruik van maken, omdat de andere subsystemen zoals obstacle avoidance nu kunnen uitgaan van dit datatype, zonder dat je direct vastzit aan een bepaald merk of type lidar. 

Deze strategie kan voor vrijwel alle sensoren en actuatoren worden toegepast, zodat je een generieke interface met je robot hebt. De open source community rondom ROS biedt een veelvoud aan datatypes en drivers voor veelgebruikte sensoren zoals de sensor_msgs, maar je zou ook kunnen kijken naar geometry_msgs of de nav_msgs.

Robotmodel

Hoewel we alle interfaces naar sensoren en actuatoren hebben gelijkgetrokken, zijn we nog niet klaar om de robot autonoom te laten rijden. De autonome software moet ook weten hoe en waar de wielen en sensoren gemonteerd zijn om ze op de juiste manier aan te kunnen sturen of te interpreteren. Dit kunnen we in de besturingssoftware programmeren, maar als er dan iets aan de afmetingen verandert, moeten we op zoek gaan naar alle plekken waar we uitgegaan zijn van die afmetingen. In plaats daarvan maken we gebruik van een intern robotmodel. Dit kan vervolgens gebruikt worden voor de berekeningen in alle componenten die iets moeten weten over afmetingen van de robot.

ROS standaardiseert het URDF (Universal Robot Description Format) als een formaat voor het beschrijven van robotmodellen. Door het aaneenschakelen van links (schakels, of vaste onderdelen) door middel van joints (verbindingen tussen links) kun je iedere denkbare geometrie van een robot modelleren. Vervolgens kun je hier representaties van sensoren aan koppelen.

Het lijkt misschien wat omslachtig om een heel model van een robot te bouwen alleen om een paar afmetingen en hoeken te configureren. Het mooie is echter, omdat verschillende andere subsystemen rekenen met deze afmetingen, dat een aanpassing in het mechanisch ontwerp alleen een aanpassing in het model vereist. De rest van de software is automatisch up to date. Op de lange termijn scheelt dat heel veel werk en hoofdpijn.

Bonus: Simulatie

Nu we een volledig gestandaardiseerd voertuig hebben, kunnen we het model en de gegeneraliseerde hardware-interfaces gebruiken voor een mooie bonus: een simulator. Gazebo, een spin-offproject van ROS, biedt een open source simulator. Deze is specifiek ontworpen voor om een digital twin te bieden voor robots. Er zijn plugins voor sensoren zoals camera’s, lidar en GPS, en voor actuatoren. Omdat deze plugins dezelfde datastructuren hanteren als de drivers, kun je software voor autonomie op de simulator bouwen alsof het de echte robot is. Zodra je ervan overtuigd bent dat dit goed genoeg werkt, kun je de besturingssoftware in zijn geheel overzetten naar het fysieke systeem.

Natuurlijk is de vraag in hoeverre je wil simuleren. Je zou bijvoorbeeld de wrijving tussen wielen en ondergrond kunnen modelleren om slip mee te nemen. In de praktijk is het zo moeilijk om dit accuraat te modelleren, dat het slimmer is om in simulatie te doen alsof dit perfect is. Bij RUVU simuleren we vaak helemaal geen fysica, maar schrijven we direct verplaatsingen voor die worden ingegeven door de navigatiesoftware. Dit resulteert in perfect volggedrag, maar het biedt je wel de mogelijkheid om de high-level algoritmes en logica te testen. Dit bespaart waardevolle tijd op de echte robot voor het tunen van de parameters die met ruis en slip moeten omgaan.

Jouw beurt!

We hebben gezien dat een set goede drivers je de mogelijkheid geeft om op een later moment nog eens van sensorfabrikant te wisselen. Met een robotmodel kun je verschillende mechanische ontwerpen testen. En als een bonus krijg je ook nog de mogelijkheid om een simulatie van je robot te testen alsof het het echte voertuig is. Als je dit hebt voorbereid, kun je gaan beginnen aan het echte werk: de autonome applicatie. Eerst in simulatie, en vervolgens met dezelfde software op het echte voertuig.

Zoals je ziet zijn al deze stappen er om de complexiteit van het uiteindelijke systeem te beperken. Dit geldt of je nu ROS gebruikt of niet. Als je deze architectuurkeuzes goed hanteert, kost het je in het begin wellicht iets meer tijd, maar het gaat je op lange termijn veel tijd schelen. Al helemaal bij het ontwikkelen van je tweede autonome mobiele robot.

Als je nog vragen hebt over drivers, hoe je een robot moet modelleren, of wat je nu precies moet met zo’n simulator, twijfel dan niet om contact met ons op te nemen. RUVU is er om je te helpen. Succes!