Op de laatste clubdag van de Nederlandse fischertechnikclub werd een wedstrijd voor autonoom rijdende wagentjes gehouden. Deze z.g. ‘Robocars’ moesten zelfstandig een parcours kunnen afleggen waarvan de route door middel van een zwarte lijn was aangegeven. In dit artikel beschrijf ik mijn experimenten met een Robocar die is uitgerust met een camera met eigen lijnherkennings-logica: de Pixy2 camera.
Met deze camera kan het parcours worden herkend. De herkende vectoren kunnen via de I2C bus worden uitgelezen en kunnen via een z.g. PID-regeling worden gebruikt voor het bijsturen van de wagen langs het parcours.
Ik greep de deelname aan deze clubwedstrijd aan om verschillende voertuigjes met uiteenlopende lijnvolg-technieken te bouwen. Bij de wagens met een microcontroller kon ik in de software experimenteren met een z.g. PID-motorregeling om de wagen zo soepel en snel mogelijk te reageren op bochten. Tevens probeerde ik een algoritme met meer dan de gangbare twee infrarood lijn-sensoren. Deze wagen vindt soepel en snel zijn weg met vijf IR-sensoren! Ook maakte ik een wagen met een camera met lijnherkenning. Hier wordt eerst de gele Robocar met I2C-camera geheel rechts op de foto hieronder besproken, de andere twee zal ik in de toekomst beschrijven.
Het parcours op de clubdag had geen kruispunten of splitsingen, maar wel een uitdaging in de vorm van een ‘rotonde’. Dat veel voertuigjes hier de kluts kwijt raakten is begrijpelijk: in de meeste gevallen, zoals ook bij de bekende fischertechnik bouwmodellen, worden slechts twee sensoren gebruikt om te detecteren dan het wagentje van de lijn raakt en moet bijsturen. Hierdoor is het van belang dat er zo snel mogelijk wordt bijgestuurd zodra de eerste sensor van de lijn raakt.
Als er met een microcontroller, zoals de TXT-controller, kan worden gewerkt is het slechts van belang wélke sensor het eerst de lijn verliet. De regeling in de software kan dan in elk geval de lijn weer proberen te vinden, ook als inmiddels beide sensoren de lijn hebben verlaten. Zonder een microcontroller met een regeling in software zal het liefst moeten worden vermeden dat beide sensoren van de lijn raken. Dit houdt in de praktijk echter in dat de snelheid niet te ver kan worden opgevoerd. Maar ook als een intelligenter sturing kan worden gemaakt met een microcontroller, blijft er een gevoelig samenspel tussen de maximale snelheid en het gewicht (en dus de massatraagheid) bij het sturen. Ook de afstand van de sensoren ten opzichte van het draaipunt van het wagentje mag niet te groot zijn om te voorkomen dat de lijn wordt verlaten.
Als microcontroller koos ik een 30 pins ESP32 WROOM32 in een ‘development-/expansion-board’. Dit board heeft het voordeel dat het zijn eigen 5 volt stroomvoorziening uit de DC input (5 ~ 16 volt) maakt. Deze voedingsspanning staat op het board ter beschikking bij elke GPIO-pin zodat het aansluiten van sensoren, servo’s enz. gemakkelijk met een driepolige Dupont stekker kan plaatsvinden. Voor dit project is het prettig dat het expansion-board zich direct laat voeden uit een compacte 7,2 volt modelbouw LiPo accu. Deze accu is met een female XT30 connector direct aangesloten op de gele fischertechnik cassette (32076), zoals in afbeelding 2 te zien is. Hierin zijn, naast een zekering en een aan/uit-knop, een klein display en een step-up boost converter opgenomen die de motorspanning (10 volt) voor de L298N ‘dual H-Bridge’ motor driver voor de twee XM-motoren (135485) verzorgt.
Om enkele, generiek te gebruiken, invoer- en uitvoer-mogelijkheden te creëren nam ik ook drie LEDs en twee drukknoppen op. Op het viercijferige 7-segmentsdisplay (TM1637) kan numerieke feedback worden weergegeven. Tijdens het rijden wordt het bijvoorbeeld gebruikt om de momentane fout van de PID-regeling op basis van de gevonden richtingsvectoren weer te geven. Achterop de wagen nam ik twee kleine potentiometers op waarmee zich respectievelijk de motorsnelheid en Kp-factor van de PID-regeling nog laten fijnregelen (zie foto hiernaast). Deze ingestelde waarden worden tevens op het kleine cijferdisplay getoond.
De Pixy2 camera is aangesloten op de I2C bus via de VSPI SPI pins van de ESP32 (MOSI=23, MISO=19, SCK=18, SS=5) en krijgt zijn 5 volt voedingsspanning direct van het expansion-board. Een gunstige bijkomstigheid is dat de Pixy2 een 3.3 volt I2C bus hanteert zodat deze direct op de ESP32 kan worden aangesloten. Overigens is de I2C bus van de camera 5 volt tolerant, dus ook een Arduino of andere 5 volt microcontroller zal geen problemen geven.
Ik was al enkele jaren in het bezit van een ‘Seeed Pixy 2 CMUcam5 Smart Vision Sensor’, maar had er nog steeds niets mee gedaan. De lijn-volgwedstrijd was een prima aanleiding om eens te onderzoeken of de richtingsvector-herkenning van de camera snel genoeg is om relatief snel en autonoom de weg over een lijnparcours te vinden. Uit een eerder artikel, waarin een voorganger van deze camera werd gebruikt werd reeds de conclusie getrokken dat de fischertechnik USB-camera hiertoe de noodzakelijke snelheid mist. De real-time beeldsnelheid van deze camera wordt begrenst door de maximale I2C snelheid van maximaal 400 kBit/s.
Online vindt u de specificaties en mogelijkheden van de door mij gebruikte Pixy2 camera, de opvolger van de originele Pixy1-camera. De Picy2 camera is kleiner, sneller en beschikt over meer functies dan zijn voorganger, inclusief een algoritme voor het herkennen van lijnen! Dat maakt deze Pixy vanzelfsprekend erg geschikt voor het bouwen van een lijnvolger.
De camera kan ook direct via een USB-snoer op de computer worden aangesloten. Via de PixyMon-software (beschikbaar voor Windows, MacOS en Linux) kunnen dan relatief eenvoudig proefondervindelijk de camera instellingen worden geoptimaliseerd (zie screenshot hiernaast). Na wat spelen met de instellingen lukte het uiteindelijk het aantal valse ‘herkenningen’ te minimaliseren. Met een snelheid van maar liefst 60 fps wordt telkens de meest relevante richtingsvector over het parcours bepaald. Deze data kan vervolgens eenvoudigweg over I2C worden bevraagd en in het sturingsprogramma worden gebruikt.
Het proces, waarop het programma met bijsturen zal moeten reageren, is aanschouwelijk gemaakt in de afbeeldingenreeks hieronder, waarin de verschillende posities van de Robocar langs een parcours zijn weergegeven. Op de printplaat van de camera bevinden zich een RGB-LED en een tweetal vrij felle witlicht LEDs (foto hiernaast). Door alle verlichting in te schakelen is het parcours goed belicht en voldoende herkenbaar. Er moest echter wel geëxperimenteerd worden met de hoek waaronder de camera het parcours ‘bekijkt’.
Te ver vooruit leidt snel tot vector-fouten waardoor de wagen onterecht kan ‘overstappen’ op een naastliggend parcours-traject. Tevens betekent een té ver vooruit herkennen van de rijrichting dat de bochten erg worden afgesneden. Maar ook te weinig vooruitkijken kan tot problemen leiden. Als de snelheid niet wordt beperkt kan de wagen dan behoorlijk de weg kwijt raken. Dat is de reden van het handvat op de wagen. Hiermee is het mogelijk de wagen snel van het parcours te grijpen als het de kortste weg naar de uitgang dreigt te willen vinden, of zich dreigt vast te rijden tegen een muur.
Ook de P-factor van de PID-regeling luisterde nauw. Omdat ik niet elke keer de gehele firmware wilde compileren en flashen, maakte ik achterop de wagen twee potmeters. Met de ene is de maximale snelheid percentueel te regelen, de andere biedt de mogelijkheid snel te kunnen experimenteren met de P-factor van de regeling om de wagen zo strak mogelijk over de lijn te laten rijden.
De behuizing baseerde ik op dit kastje voor de Pixy2 cam. Ik maakte de wanden iets hoger en ontwierp ook de lenshouder zodat dit in dezelfde kleur als de behuizing kan worden uitgevoerd. Hoewel voor de lijnvolg-functie niet werkelijk noodzakelijk, gaf ik de camera een pan-tilt mechanisme met twee digitale servo’s uit de fischertechnik Maker Kit Bionic (571902) welke direct op de Pixy2 cam print konden worden aangesloten.
De Als de Pixy2 direct met een USB-snoer op de computer word aangesloten, kan de PixyMon-software worden gebruikt om de camera met het pan-tilt mechanisme een, op kleur herkend, object te laten volgen. Voor de lijnvolg-toepassing zou eventueel met een onder een vaste hoek gefixeerde camera kunnen volstaan, maar voor toekomstige uitbreidingen (zoals bijvoorbeeld het opzoeken van objecten of ontwijken van hindernissen in een parcours) zal het pan-tilt mechanisme zeker van pas kunnen komen.
Hoewel de Pixy2 camera ook stand-alone of aangesloten op een computer kan worden gebruikt, is een microcontroller nodig voor mobiele toepassingen zoals deze. Zelf koos ik voor een ESP32, die zich eenvoudig via de Arduino IDE in C++ laat programmeren.
Om de wagen zo soepel en snel mogelijk over het parcours te laten rijden implementeerde ik een z.g. PID-regeling in de software. Een PID-regeling (Proportioneel-Integrerend-Differentiërend) is een veelgebruikt algorithme om een proceswaarde (in dit geval de afwijking van de lijn) continu op een gewenste instelwaarde (setpoint, het midden van de zwarte lijn) te houden door continue de afwijking (error) te berekenen. Hierbij beïnvloeden het heden (P), het verleden (I) en de toekomst (D) de momentane bijstuuractie. Een dergelijke regeling, indien geconfigureerd met de juiste constanten, houdt rekening met de stuureigenschappen (draaicirkel en massa-traagheid) van het voertuig. Het is een teruggekoppeld regelsysteem dat het mogelijk maakt de snelheid van het lijnvolgen te optimaliseren.
Kortweg bestaat een dergelijke regeling uit drie delen:
Al snel werd duidelijk dat de P-component de meeste invloed heeft. Hoewel ik de beide andere componenten ook in mijn regellus implementeerde, minimaliseerde ik de invloed er van om zo snel mogelijk tot een functioneel resultaat te komen waarmee ik kon deelnemen aan de clubwedstrijd. De I-component neem ik slechts voor een zeer gering deel mee in de berekeningen, de D-component negeer ik vooralsnog volledig.
Met een paar steekproeven werd duidelijk tussen welke waarden de Kp, de vaste invloedfactor voor de P-component, ongeveer moest liggen. Als deze waarde te laag wordt gekozen kan het wagentje in scherpe bochten de lijn kwijtraken. Bij een te hoog gekozen waarde schiet de wagen constant over de lijn heen om vervolgens weer te scherp tegen te sturen. Op YouTube zijn vele filmpjes van lijnvolgers te vinden die aan dit euvel lijden.
De Pixy2 camera bleek relatief eenvoudig aan te sluiten en te configureren en nodigt uit tot verdere experimenten in de toekomst. Het herkennen en ontwijken van hindernissen op het parcours is maar een van de vele mogelijkheden. Ook biedt de gebruikte ESP32 microcontroller, die is uitgerust met WiFi en Bluetooth, de mogelijkheid om de Robocar draadloos te monitoren of besturen. Een kleine opzet had ik reeds gemaakt door (met Python met Tkinter) een eenvoudige app voor de iPhone te ontwikkelen waarmee de Kp-constante tijdens de rit kon worden geconfigureerd. Het bleek echter eenvoudiger om deze eenmalige configuratie simpelweg met een potmeter op de wagen zelf in te regelen.
De twee andere lijnvolgers op de eerste foto hierboven gebruiken een meer conventionele sensor-techniek om de lijn te volgen. Er worden bij deze wagens infrarood-sensoren gebruikt. Als we de verschillende Robocars achtereenvolgens op hetzelfde parcours laten rijden is er een (verklaarbaar) verschil tussen deze methoden te zien: de Robocar met de Pixy2 camera anticipeert en snijdt de bochten af, terwijl de Robocars met de IR-sensoren alleen kunnen corrigeren. Ze nemen ruime ‘buitenbochten’. In de toekomst zal ik deze wagens met IR-sensoren nader bespreken.