Lidt naivt har jeg forsøgt, at lave en selvbalancerende robot baseret på en gul DC-motor og en micro:bit. Bitten har en indbygget gyro-sensor, som kan måle om den er ved at vælte til den ene eller anden side.
[youtube https://www.youtube.com/watch?v=LDcZrqrbFec?rel=0]
Robotten kan ikke balancere selv, og jeg er derfor skiftet til Arduino, en ekstern gyro og er på vej mod at udskifte DC-motoren med to Stepper-motorer. Desuden skal motorerne sikkert have mindst en kapacitor for at give mere jævn spænding under start.
Stepper-motorer kan ligesom servoer dreje til præcise gradtal, og reagerer hurtigere end DC-motorer. Steppere er ikke begrænset til 180 grader, som servo-motorer er, men kan dreje flere omgange, hvorfor de anvendes i 3D printere og andre CNC maskiner.
Alligevel skal deres omdrejninger stabiliseres af et PID-system. Og det er sjovt.
PID kan betragtes som maskinlæring, om end det har været anvendt i mange år (ligesom nogle typer af maskinlæring). Kort fortalt går det ud fra at motorens hastighed reguleres som summen af tre led:
Proportionelt med en sensormåling. I dette tilfælde gyro’ens afvigelse i en dimension fra balance.
Integralet af afvigelse fra balance. Her akkumuleres fejl over en vis periode, så motoren yder mere jo større fejl, der registreres. Når systemet kommer mere i balance givet motorens større reaktion, bliver mindre fejl akkumuleret og integral-leddet bliver mindre. På den måde forsøges erfaringer inkorporeret i systemet.
Differentialet er differential-kvotienten af motorens hastighed. Når systemet går mod balance, vil motoren ofte have forholdsvis store omdrejninger, som dog er på vej nedad -de bliver mindre. Men de mindskes ikke hurtigt nok, hvorfor systemet ofte vil overskyde balancepunktet og svinge over i den modsatte side. Differentialet dæmper dette overskud en smule, så systemet nemme kan finde balance. På den måde forsøges fremtiden inkorporeret i systemet.
Dvs. systemet lærer delvist på baggrund af de data den opsamler, heraf maskinlæring, dog uden neurale netværk. Alligevel kan systemet være ret svært at stabilisere. En Arduino-kode kunne se ud noget i denne stil:
kilde: http://web.csulb.edu/~hill/ee444/Lectures/08_PID%20Control.pdf
Hvert led (P+I+D) er forsynet med en faktor (Kp, Ki og Kd), som skal indstilles til den rigtige værdi. Hver værdi kan som regel kun findes ved små justeringer (tuning). Her kunne maskinlæring også være en oplagt tilgang. Dog en udfordring, at efter hvert run, skal jeg bringe robotten i balance igen.
Må se om jeg får tid til at gå videre med systemet.