Software

Software voor het maken van robots: CAD, elektronische circuits, IDEs, Jupyter notebooks, Git, Linux en meer

Naast allerlei roboticakennis heb je ook gereedschap of tools nodig om een robot te maken. Goede tools kunnen de ontwikkeling een stuk vereenvoudigen. Nadeel is dat hiermee leren werken ook tijd in beslag neemt. Hierbij alvast enkele suggesties voor tools en workflows die ook in de industrie en aan universiteiten gebruikt worden. Deze pagina behandelt software, zie hier voor hardware.

CAD (Computer Aided Design) #

Mechanische ontwerpen #

Een 3D-ontwerp op computer is super handig. Het laat toe om vlot na te kijken of de onderdelen passen en kunnen bewegen zoals het moet. Daarnaast is de 3D-tekening ook een grote hulp zijn om het ontwerp om te zetten in werkelijkheid, door de tekening te gebruiken voor het aansturen van een lasercutter, 3D-printer of andere machine.

CAD ontwerp voor de Robocup Junior competitie
CAD ontwerp voor de Robocup Junior competitie
Detailontwerp van een stappende robot
Detailontwerp van een stappende robot

De laatste jaren is Autodesk Fusion 360 onder hobbyisten erg populair geworden, onder meer omwille van de eenvoudige gebruikersinterface en de gratis (maar iets beperktere) versie. VariCAD valt eveneens te overwegen. In de industrie zijn Siemens SolidEdge en Dassault Systèmes SolidWorks gebruikelijk, maar beide zijn vrij kostelijk voor jongeren.

Elektronische circuits #

Voor eenvoudige circuits is potlood en papier meestal voldoende. Wil je meer, kan je zeker eens kijken naar KiCad EDA en Altium CircuitMaker. Beide bieden functionaliteit voor elektronische schema’s en PCB-ontwerp, maar komen met een steile leercurve. Daarnaast zijn er ook de meer professionele Altium Designer en Autodesk EAGLE, maar deze komen met een stevig prijskaartje. Tot slot is er het Chinese EasyEDA, wat meer gericht is op het gemakkelijk bestellen van geassembleerde PCB’s.

IDE #

Een IDE (Integrated Development Environment) is software voor het ontwikkelen van softwareprogramma’s. De twee basisfeatures van een IDE zijn een tekstverwerker (vaak met syntax highlighting) en knoppen om de code te compileren (compile) en uit te voeren (run). Andere populaire features zijn code completion, uitvoeren in debug mode, breakpoints, en integratie met een VCS (Version Control System). De twee screenshots hieronder tonen twee zo’n IDE’s.

Geany IDE
Geany IDE
VS Code IDE
VS Code IDE

Systemen met een desktop OS (Operating System) zoals een Raspberry Pi kunnen met quasi elke IDE, of zelfs een algemene tekstverwerker zoals Gedit, Nano, Vim of Emacs, geprogrammeerd worden.

Twee veelgebruikte IDE’s zijn:

  • Geany
    • lage systeemvereisten (draait vlot op een Raspberry Pi)
    • eenvoudige interface
    • beperkte functionaliteit
  • Visual Studio Code (VS Code)
    • grote keuze aan extensies
    • quasi ongelimiteerde functionaliteit dankzij makkelijk installeerbare extensies
    • de vele functies kunnen beginners afschrikken

Microcontrollers en -borden, zoals Arduino, daarentegen komen vaak met een eigen IDE die specifiek voor die microcontroller(borden) geoptimaliseerd is. Bijvoorbeeld de Arduino IDE voor de Arduino-borden. Deze IDE’s bieden typisch naast de standaard features ook bibliotheken voor de specifieke hardware van de chip, een specifieke compiler voor de betreffende architectuur en integratie met de programmer.

Voor het programmeren van microcontrollers kun je eens kijken naar de Embeetle IDE.

Jupyter notebooks #

Jupyter notebooks laten toe om code, tekst, afbeeldingen en plots visueel aantrekkelijk te combineren in één bestand. Deze notebooks zijn onderverdeeld in cellen die je selectief kan uitvoeren in de interactieve webinterface. Jupyter notebooks ondersteunen meerdere populaire programmeertalen waaronder Python (.ipynb). Hieronder zie je een voorbeeld van zo’n notebook:

Jupyter notebook
Jupyter notebook: code en grafieken samen in de browser

In tegenstelling tot klassieke codebestanden kun je functionaliteit gedefinieerd in een notebook niet importeren in een ander. De nadruk ligt eerder op een zo overzichtelijk mogelijke weergave en het is niet de bedoeling om veel code in een notebook te steken. (Heb je toch veel code nodig, steek deze dan in een klassiek codebestand en importeer dat bestand in het notebook.) Gebruik je Jupyter notebooks met een VCS en moeten de celoutputs niet per se worden behouden (aangezien deze toch te allen tijde kunnen geregenereerd worden), wis dan de celoutputs om de bestandsveranderingen klein en overzichtelijk te houden.

VCS en remote repositories #

Een VCS (Version Control System) biedt functionaliteit voor versiebeheer. Typische features zijn de mogelijkheid om eenvoudig terug te gaan naar een vorige versie, om versies te vergelijken (nuttig om uit te zoeken welke wijziging nu zorgt voor die ene bug) en om simultaan te werken aan meerdere versies (zeer handig om met meer dan twee aan een project te werken!). Een VCS bevat een geschiedenis van elke wijziging in het project en vult daarmee het projectlogboek aan. De quasi standaard in dit domein is Git. Git heeft zeer veel features, gelukkig kom je voor basisgebruik toe met slechts een paar commando’s (git add, git commit, git pull en git push). Git werkt vlot in de command line. Voor een meer grafisch overzicht van een repository kan een GUI (graphical user interface) zoals gitg een bijdrage leveren.

Vaak wordt een VCS gecombineerd met een remote repository. Dit is een server waarmee ieder zijn lokale versie/branch uitwisselt. Zo kun je met meerderen aan één project werken! Werk je alleen aan een project, dan kun je het gebruiken als back-up en om meerdere computers te synchroniseren. Heel wat bedrijven bieden een remote repository aan als service, bijvoorbeeld GitLab en GitHub. In principe kun je zo’n server ook thuis draaien.

Enkele dingen om te weten over Git:

  • Wijzigingen aan bestanden niet in tekstvorm (binary files, bijvoorbeeld png en jpeg afbeeldingen en PDF- en MS Word-bestanden) worden beperkt ondersteund in de zin dat je deze bestanden wel in de repository kunt steken maar dat Git elke bestandswijziging dan ziet als een verandering van het complete bestand, omdat Git geen begrip heeft van de inhoud (Git ziet deze bestanden gewoon als een reeks enen en nullen). Kies daarom waar mogelijk voor bestanden in tekstvorm.
  • De grootte van een repository is, grofweg, de som van alle veranderingen.
  • Veranderingen worden geregistreerd per lijn. Voor teksten kun je daarom alinea-inhouden best splitsen over meerdere lijnen van elk minder dan een 80 karakters. Doe je dat niet, dan wordt het veranderen van één letter geregistreerd als de verandering van de gehele alinea! In bestanden van type Markdown en reStructuredText hebben de newlines geen effect op de gecompileerde output.
  • Het samenvoegen (mergen) van twee branches, bijvoorbeeld jouw lokale en die op de remote repository, gebeurt vaak automatisch bij het uitvoeren van een git pull. Als er toch conflicten zijn (omdat dezelfde lijn tekst veranderd is in beide branches), moet je deze manueel oplossen. Zo heb je volledige controle over hoe je de twee versies wilt samenvoegen.

Voor het uitwisselen van bestanden niet in tekstvorm is een cloudopslagservice zoals Google Drive vaak meer geschikt dan Git met een remote repository.

Notities en verslagen #

Voor eenvoudige notities zoals een logboek en vergaderverslagen zijn Markdown (.md) en reStucturedText (.rst) ideaal. Deze bestandstypes zijn goed leesbaar als gewone tekst maar evenzeer compileerbaar naar een visueel aantrekkelijk document. De pagina’s van deze website zijn bijvoorbeeld geschreven in Markdown en vervolgens gecompileerd naar HTML.

De meeste remote repositories, waaronder GitLab en GitHub, tonen standaard van Markdown bestanden de gecompileerde versie. En enkele Markdown compilers bieden ondersteuning voor wiskundige uitdrukkingen en diagrammen, zodat je probleemloos Griekse letters, vierkantswortels en afgeleiden netjes kan weergeven.

Desktopbesturingssysteem #

Als besturingssysteem (OS, Operating System) geniet een GNU/Linux-distributie de voorkeur, onder meer omdat Linuxdistributies aanzienlijk betere ondersteuning bieden voor vele ontwikkeltools. Een Linuxdistributie is een OS bestaande uit de Linux kernel en een set andere software. Naast de software reeds deel van de distributie kan je extra software (bijvoorbeeld een IDE zoals Geany) bij-installeren, mits die software compatibel is met die distributie. Typisch gebeurt dit via de package manager, een programma dat deel is van de desktopdistributie.

Er zijn tal van Linuxdistributies die elk licht verschillende prioriteiten stellen (bijvoorbeeld ondersteunen van nieuwe features, stabiliteit, een specifiek gebruiksdoel). Twee populaire en makkelijk bruikbare desktopdistributies zijn Ubuntu en Linux Mint.

De Raspberry Pi-organisatie biedt sinds een paar jaar een desktop editie van hun Raspberry Pi OS aan, zeker de moeite waard om te bekijken. Komt voorgeladen met een heleboel educatieve tools en is visueel wat vereenvoudigd om deze toegankelijker te maken voor beginners. Deze Linuxdistributie is gebaseerd op Debian, een zeer degelijke Linuxdistributie populair voor webservers.

Makkelijkste is om Linux te installeren op een computer zonder een andere besturingssysteem (bijvoorbeeld door de bestaande harde schijf te vervangen door een lege). Ook mogelijk met bijna alle Linuxdistributies is om deze te installeren naast andere (Windows-)besturingssystemen (een dual boot-configuratie, met een bootloader zoals GRUB). Bij voorkeur vooraf een backup maken, zeker als het de eerste keer is.

Een andere optie is om de Linuxdistributie in een virtual machine zoals Oracle Virtualbox te installeren. Dit geeft vaak slechts beperkte ondersteuning voor USB-apparaten.

Tip #

De meeste Linuxdistributies draaien vlot op oudere computers (2 GB RAM is voldoende). Onder meer Linux Mint met de Xfce-desktop (‘Xfce edition’) en Raspberry Pi OS zijn bij de snellere desktopdistributies. Oude computers bieden dan ook een aantrekkelijke manier om te experimenteren met Linux.

Een (tweedehands) Raspberry Pi (RPi) SBC is ook een voordelige weg mits je de randapparatuur (muis, toetsenbord, scherm) voor handen hebt (of de RPi over SSH of met een remote desktop gebruikt).

Robotica softwarebibliotheken en -pakketten #

ROS (Robot Operating System) #

ROS is een set van software voor het ontwikkelen van robots die zeer populair is in robotica R&D aan universiteiten en bedrijven alsook in heel wat industriële toepassingen. Het idee achter ROS is dat allerlei robots, van zelfstandige stofzuigers tot drones, heel wat gelijkaardige software vereisen en dat het dus efficiënter is om deze gemeenschappelijke componenten een enkele keer te ontwikkelen en vervolgens steeds te hergebruiken.

Vijf belangrijke componenten van ROS zijn:

  • Een krachtig message-systeem om makkelijk en flexibel data uit te wisselen tussen ROS nodes (processen).
  • RViz: visualiseert in 3D de robot(s) en sensordata (LIDAR, camera etc.).
  • Gazebo: simuleert de robot(s) in een virtuele 3D-omgeving.
  • Een groot aantal packages met allerlei robotica-gerelateerde functionaliteit.
  • Een krachtige buildtool (catkin/colcon) voor het bouwen van een softwarestack.

Er zijn twee pakketten, ROS 1 en ROS 2. ROS 2 is vrij recent en de meeste tutorials en projecten gebruiken nog ROS 1. ROS distributies zijn gekoppeld aan de tweejaarlijkse Ubuntu LTS releases. ROS nodes worden naar keuze geprogrammeerd in onder meer Python of C++.

Naast het begrijpen van vele roboticabegrippen vereist het toepassen van ROS goede programmeer- en computerskills. Voor de meeste robots niveau middelbaar (lijnvolgers etc.) is de mogelijke bijdrage van ROS beperkt en brengt het meer studiewerk met zich mee dan dat het bijdraagt. Maar voor meer complexe robots kun je moeilijk om ROS heen.

OpenCV (Open Computer Vision) #

OpenCV is de standaardbibliotheek voor klassieke beeldverwerking in C++. Ook goed bruikbaar met Python. OpenCV biedt onder meer volgende vijf belangrijke functionaliteitsgroepen:

  • Mat klasse: krachtige klasse voor het werken met matrices, met vele opties zoals bitdiepte en aantal kleurkanalen.
  • Ondersteuning voor webcams en inlezen en uitschrijven van afbeeldings- en videobestanden.
  • Camerakalibratie: schatten van camerakalibratieparameters (lensvervorming etc.) aan de hand van een filmpje van een kalibratiebord, alsook de bijhorende effecten om de parameters toe te passen.
  • Standaardalgoritmen zoals Hough-lijndetectie, featureherkenning (FAST, SIFT, SURF etc.), binaire thresholding, RGB naar HSV conversies, schalen, draaien, projecteren, croppen.
  • GUI-functionaliteit voor eenvoudige desktopapplicaties, bijvoorbeeld een venster met het camerabeeld en enkele sliders om live parameters aan te passen.

Veel beeldverwerkingsfunctionaliteit in ROS steunt op OpenCV. Als je graag klassieke beeldverwerking doet, bijvoorbeeld om een gekleurde bal te herkennen, kun je moeilijk rond OpenCV heen. Ook als je werkt met AI-algoritmen die ontbreken in OpenCV, kan OpenCV nog steeds nuttig zijn om jouw beeldverwerkingspijplijn op stellen, met bijvoorbeeld voorbereidende stappen als bijsnijden, schalen en belichtingscorrectie.

De OpenCV-bibliotheek kan op de meeste Linuxdistributies op twee manieren geïnstalleerd worden: via de package manager en door broncompilatie. De tweede optie vereist meer werk en tijd maar biedt wat extra functionaliteit. De basisfunctionaliteit is aanwezig in beide opties. Voor gebruik met Python zal je mogelijk de nodige Python bindings moeten installeren. OpenCV gebruiken in Windows is vrij gecompliceerd en wordt zelden gedaan.