Nopeusprofiilin generointi liikkuvalle robotille
Tämä postaus perustuu diplomityöhöni, jonka tarkoituksena oli uudelleensuunnitella itsenäisesti liikkuvan robotin nopeusprofiiligeneraattori. Nopeusprofiilin avulla voi suunnitella ja optimoida robotin liikettä.
Mikä on nopeusprofiili?
Nopeusprofiili on kuvaus nopeudesta ajan tai matkan funktiona. Tunnetulle reitille voidaan laatia nopeusprofiili etukäteen, jos tiedetään reittiin ja robottiin kohdistuvat rajoitukset. Itsenäisesti liikkuva robotti voi käyttää etukäteen tehtyä nopeusprofiilia nopeutensa asetusarvoina ja näin optimoida liikettään.
Mitä nopeusprofiilin tekemiseen tarvitaan?
Nopeusprofiili voidaan laatia tunnetun reitin ja muiden rajoitusten perusteella. Yksinkertainen reitti koostuu suorista ja käännöksistä. Yleisesti ottaen robotin pitää liikkua käännöksissä hitaammin kuin suorilla, jotta se ei esimerkiksi kaadu tai joudu luisuun. Reitin muodon eli sen geometrian perusteella reitille voidaan tehdä nopeusrajafunktio eli kuvaus, joka kertoo maksiminopeuden kullekin reitin kohdalle. Alla olevassa kuvassa nopeusraja on ensimmäisen 20 metrin ajan 4 m/s, sitten 5 metrin ajan 2 m/s ja lopuksi 20 metrin ajan 5 m/s.
Muita rajoituksia ovat esimerkiksi robotin ominaisuudet, kuten sen painopiste, moottorien teho, renkaiden ominaisuudet ja niin edelleen. Nämä rajoitukset on yksinkertaistettu nopeusrajojen lisäksi kiihtyvyyden (nopeuden derivaatta eli kuinka nopeasti nopeus saa muuttua) ja nykäyksen (kiihtyvyyden derivaatta eli kuinka nopeasti kiihtyvyys saa muuttua) maksimi- ja minimiarvoiksi.
Kun nopeusrajafunktio, kiihtyvyys ja nykäys tiedetään, voidaan laatia nopeusprofiili, joka noudattaa niitä. Nopeusprofiili voidaan tehdä ja esittää useilla eri tavoilla. Alla olevassa kuvassa nopeusprofiili on esitetty ajan funktiona. Kuvaajaan on piirretty lisäksi nopeusrajafunktio, kiihtyvyys ja nykäys.
Miksi olemassa oleva generaattori korvataan?
Nopeusprofiiligeneraattorin on tarkoitus toimia osana olemassa olevaa laajempaa robotin automaatio-ohjelmistoa. Ohjelmiston nykyinen nopeusprofiiligeneraattori on kirjoitettu C++:lla, joka on yleiskäyttöinen, staattisesti tyypitetty ja olio-ohjelmointia ja dynaamista muistinhallintaa tukeva ohjelmointikieli. Generaattorin toteutus on monimutkainen ja altis virheille; erityisesti muistinhallinnan kanssa pitäisi olla huolellinen, jotta vakavia virhetilanteita ei tapahtuisi.
Olemassa oleva algoritmi tekee nopeusprofiilin analyyttisesti eli se luo erilaisia polynomeja, jotka muodostavat nopeusprofiilin. Esimerkiksi yllä olevassa kuvassa nopeuden funktio on aikavälillä 0–2 s toisen asteen polynomi, aikavälillä 2–4 s ensimmäisen asteen polynomi, aikavälillä 4–6 s taas toisen asteen polynomi ja nopeusrajan saavutettuaan se on lyhyen hetken ajan vakio.
Koska generaattorin toteutus on vaikeasti ymmärrettävä ja analyyttinen generointi- ja esitystapa on turhan monimutkainen tarpeeseen nähden, päätettiin tehdä uusi generaattori. Se päätettiin kirjoittaa Haskellilla, joka on (lähes) täysin funktionaalinen, staattisesti tyypitetty ja laiskasti suoritettava ohjelmointikieli.
Uutta nopeusprofiiligeneraattoria varten tutkittiin erilaisia nopeusprofiilin generointi- ja esitystapoja. Nopeusprofiilin voi esittää funktion sijaan listana diskreettejä pisteitä; kukin piste sisältää ainakin nopeusarvon ja arvon ajalle tai etenemälle. Nopeusprofiilin tuottavaksi algoritmiksi oli useampia vaihtoehtoja ja niistä valittiin ”benjiköysialgoritmi”, joka toimii yksinkertaisesti: se nostaa profiilin pisteiden nopeuksia hieman monien iteraatioiden ajan ja yrittää pitää profiilin annetuissa rajoissa.
Millainen uusi nopeusprofiiligeneraattori on?
Uusi algoritmi käy yhden iteraation aikana nopeusprofiilin pisteet läpi ja yrittää nostaa jokaisen pisteen nopeutta kerran. Kun yksi piste yrittää nostaa nopeuttaan, se kysyy kahdelta edelliseltä ja kahdelta seuraavalta pisteeltä, käykö nopeuden kasvatus niille. Muut pisteet voivat vastata ei, kyllä tai kyllä, jos kyselyn kohteena oleva piste itsekin voi muuttaa nopeuttaan. Kysely voi lähteä etenemään profiilissa pidemmällekin. Kun jossain vaiheessa jokin piste vastaa pelkästään kyllä tai ei, muut pisteet joko suorittavat nopeusmuutoksensa tai eivät tee muutoksia. Tarkastelua jatketaan seuraavasta pisteestä, joka ei ole muuttanut nopeuttaan.
Alla olevassa kuvassa on esimerkki profiilin ensimmäisistä pisteistä ja ensimmäisestä iteraatiosta, jossa (pienin) nopeuden nostoaskel on 0,03125 m/s ja aika-askel 0,125 s. Millään pisteellä ei ole vastalauseita nopeuksien nostoon.
Uusi algoritmi pyrkii kasvattamaan nopeuden mahdollisimman suureksi mahdollisimman pian ja pitämään nopeuden mahdollisimman suurena mahdollisimman pitkään, siitäkin huolimatta, että profiilin seuraavien pisteiden nopeuksia jouduttaisiin pudottamaan. Tästä toiminnallisuudesta seuraa aaltoilua iteroinnin alussa ja ”kuoppia” lopulliseen nopeusprofiiliin.
Alla olevassa kuvassa on esitetty aallon syntyminen iteraatioiden 8, 10, 12 ja 14 aikana.
Alla olevaan kuvaan on merkitty lopullisen profiilin ”kuopat” violeteilla nuolilla.
Yhteenveto
Uusi nopeusprofiiligeneraattori tuottaa suhteellisen hyviä nopeusprofiileja, ja profiilit noudattavat kiihtyvyyden ja nykäyksen rajoituksia ja lähes kaikkia nopeusrajoja. Algoritmissa on kuitenkin vielä joitain jatkokehitystarpeita.
Veini Lehkonen
Software designer