De voorzitter van de Forth gebruikersgroep knutselde aan een robot-arm met vijf motoren
(twee in de schouder, één in de elleboog en twee in de pols) en vroeg me een algoritme
te verzinnen om het ding soepel te laten bewegen.
- Maar ik heb absoluut geen verstand van hardware.
- Je stuurt een getal naar zo'n motor.
Die gaat dan met een ruk naar de stand die overeenkomt met dat getal.
Je hoeft de actuele stand van de motor dus niet te kennen.
En de allerlaagste routine maak ik wel.
Gewapend met deze hardware kennis heb ik een programma bedacht, én,
het blijkt te werken!
Na aanpassing van het woord
>MOTOR natuurlijk.
Bij mij thuis, zonder de hardware,
heb ik het resultaat alleen maar op het scherm bekeken (met
.HIER).
Omdat ik geen specifieke kennis van de arm gebruik,
zit er geen beveiliging in tegen opdrachten voor onmogelijke posities.
Je kunt zelfs het aantal motoren anders kiezen. Het programma coördineert processen
die in onderling verschillende tempi verlopen:
ze beginnen tegelijk, lopen gelijkmatig, en zijn tegelijk klaar.
Er zijn dus andere toepassingen denkbaar.
Bijvoorbeeld een tekenfilm van Achilles en de Schildpad,
of rechte lijnen trekken met de vijfdimensionale plotter die je altijd al had willen bouwen.
Het probleem
Stel, ik beweeg van stand
<0 0 0 0 0> naar
<10 20 13 7 30>. Dan draait de laatste motor over de grootste hoek (
30). Die grootste hoek (
30) wordt het uitgangspunt voor de algoritme: ik verdeel de beweging van elke motor in 30 etappes. En een motor doet per etappe óf slechts één stap (
PLOP) óf niets (
PILI).
De laatste motor doet in alle etappes 1 stap (30 keer
PLOP).
Dat is eenvoudig. Nu de andere motoren.
- Afstand 10: 10 etappes 1 stap (PLOP) en 20 etappes niets (PILI),
regelmatig verdeeld wordt dat: PILI PLOP PILI (10 maal).
- Afstand 20 blijft ook eenvoudig: PLOP PILI PLOP (10 maal).
- Afstand 13 is moeilijker: 13 keer PLOP en 17 keer PILI.
Hoe verdeel je dat een beetje netjes over 30 etappes?