Tartalomjegyzék:

Rpibot - A robotika tanulásáról: 9 lépés
Rpibot - A robotika tanulásáról: 9 lépés

Videó: Rpibot - A robotika tanulásáról: 9 lépés

Videó: Rpibot - A robotika tanulásáról: 9 lépés
Videó: rémisztõ dolgok amiket robotok mondtak 2024, November
Anonim
Rpibot - A tanuló robotikáról
Rpibot - A tanuló robotikáról

Beágyazott szoftvermérnök vagyok egy német autóipari vállalatnál. Ezt a projektet beágyazott rendszerek tanulási platformjaként kezdtem. A projektet korán törölték, de annyira élveztem, hogy szabadidőmben folytattam. Ez az eredmény…

A következő követelményeim voltak:

  • Egyszerű hardver (a hangsúly a szoftveren van)
  • Olcsó hardver (kb. 100 €)
  • Bővíthető (néhány lehetőség már a leírás része)
  • Tápfeszültség minden alkatrészhez egyetlen 5 V -os forrásból (powerbank)

A tanuláson kívül nem igazán volt cél. A platform tanulásra, megfigyelésre, robotversenyekre,…

Ez nem kezdő oktatóanyag. Szüksége van néhány alapvető tudásra a következőkről:

  • Programozás (Python)
  • Alap elektronika (a modulok megfelelő feszültségű csatlakoztatásához)
  • Alapvezérlés elmélet (PID)

Végül valószínűleg olyan problémákkal kell szembenéznie, mint én. Némi kíváncsisággal és kitartással végigmegy a projekten, és megoldja a kihívásokat. A kódom a lehető legegyszerűbb, és a kritikus kódsorokat megjegyzésekkel adják meg.

A teljes forráskód és fájlok itt érhetők el:

Kellékek:

Mechanika

  • 1x rétegelt lemez (A4 méret, 4 mm vastag)
  • 3x M4 x 80 Csavar és anya
  • 2x hajtóműves motorok másodlagos kimeneti tengelyekkel a jeladóhoz. Kerekek.
  • 1x szabad kerék

1x panoráma és dönthető kamera rögzítés (opcionális)

Elektronika

  • 1x Raspberry Pi Zero fejléccel és kamerával
  • 1x PCA 9685 szervo vezérlés
  • 2x Optikai kódoló kerék és áramkör
  • 1x női jumper vezeték
  • 1x USB powerbank
  • 1x DRV8833 kettős motoros meghajtó
  • 2x SG90 mikro szervó a fényképezőgép mozgatásához és döntéséhez (opcionális)
  • 1x MPU9250 IMU (opcionális)
  • 1x HC-SR04 ultrahangos távolságérzékelő (opcionális)
  • 1x perforált tábla és forrasztóhuzal, fejlécek,…

1. lépés: Az alváz építése

Építsd meg az alvázat
Építsd meg az alvázat
Építsd meg az alvázat
Építsd meg az alvázat
Építsd meg az alvázat
Építsd meg az alvázat

Nem vagyok jó szerelő tervező. A projekt célja az is, hogy ne töltsön túl sok időt az alvázon. Egyébként a következő követelményeket határoztam meg:

  • Olcsó anyagok
  • Gyors összeszerelés és szétszerelés
  • Bővíthető (pl. Hely további érzékelők számára)
  • Könnyű anyagok, amelyek energiát takarítanak meg az elektronika számára

Egy egyszerű és olcsó alváz rétegelt lemezből készülhet. Könnyen megmunkálható fűrésszel és kézi fúróval. Kisméretű fa alkatrészeket ragaszthat, hogy megtartsa az érzékelőket és a motorokat.

Gondoljon a hibás alkatrészek cseréjére vagy az elektromos hibakeresésre. A fő alkatrészeket csavarokkal kell rögzíteni, hogy cserélhetők legyenek. A forró ragasztópisztoly egyszerű lehet, de valószínűleg nem a legjobb módja az alváz megépítésének … Sok időre volt szükségem, hogy átgondoljak egy egyszerű koncepciót az alkatrészek könnyű szétszereléséhez. A 3D nyomtatás jó alternatíva, de meglehetősen drága vagy időigényes lehet.

A szabad kerék végül nagyon könnyű és könnyen felszerelhető. Az alternatívák mind súlyosak vagy súrlódások voltak (néhányat kipróbáltam, mielőtt megtaláltam a végsőt). Csak egy fából készült távtartót kellett kivágnom a fark nélküli kerék kiegyenlítéséhez a fő kerekek felszerelése után.

Keréktulajdonságok (szoftveres számításokhoz)

Kerület: 21, 5 cm Impulzusok: 20 impulzus/fordulat. Felbontás: 1, 075 cm (végül 1 impulzus körülbelül 1 cm, ami könnyen kiszámítható)

2. lépés: Elektronika és huzalozás

Elektronika és huzalozás
Elektronika és huzalozás
Elektronika és huzalozás
Elektronika és huzalozás
Elektronika és huzalozás
Elektronika és huzalozás

A projekt különböző modulokat használ, az ábrán látható módon.

A Raspberry Pi Zero a fő vezérlő. Az érzékelőket leolvassa, és a motorokat PWM jel alapján vezérli. Wifi -n keresztül csatlakozik egy távoli számítógéphez.

A DRV8833 egy kétmotoros H-híd. Ez biztosítja a megfelelő áramot a motoroknak (amit a Raspberry Pi nem tud megtenni, mivel a kimenetek csak néhány mA -t tudnak leadni).

Az optikai kódoló négyzet alakú jelet ad minden alkalommal, amikor a fény áthalad a kódoló kerekein. A Raspberry Pi HW megszakításait fogjuk használni az információ minden egyes alkalommal, amikor a jel átvált.

A pca9695 egy szervo vezérlőpanel. I2C soros busszal kommunikál. Ez a kártya biztosítja a PWM jeleket és a tápfeszültséget, amelyek vezérlik a vezérlőberendezés és a billentés szervóit.

Az MPU9265 egy 3 tengelyes gyorsulás, 3 tengelyes szögletes forgási sebesség és 3 tengelyes mágneses fluxusérzékelő. Elsősorban az iránytű irányának meghatározásához fogjuk használni.

A különböző modulokat áthidaló huzal köti össze. A kenyérsütő diszpécserként működik, és tápfeszültséget (5 V és 3,3 V) és földelést biztosít. A csatlakozásokat a csatlakozási táblázat tartalmazza (lásd a mellékletet). Ha 5V -ot csatlakoztat egy 3.3V -os bemenethez, valószínűleg tönkreteszi a chipet. Legyen óvatos, és ellenőrizze az összes vezetéket kétszer a tápellátás előtt (itt különösen a kódolót kell figyelembe venni). Mielőtt az összes táblát csatlakoztatná, multiméterrel meg kell mérnie a fő tápfeszültséget a feladó táblán. A modulokat nejloncsavarokkal rögzítették a házba. Itt is örültem, hogy kijavítottuk őket, de meghibásodás esetén is eltávolíthatjuk.

Az egyetlen forrasztás végül a motorok, a kenyérlap és a fejek voltak. Őszintén szólva, szeretem az áthidaló vezetékeket, de ezek laza kapcsolathoz vezethetnek. Bizonyos esetekben bizonyos szoftverfigyelések segíthetnek a kapcsolatok elemzésében.

3. lépés: Szoftverinfrastruktúra

Szoftver infrastruktúra
Szoftver infrastruktúra
Szoftver infrastruktúra
Szoftver infrastruktúra

A mechanika elérése után néhány szoftverinfrastruktúrát állítunk fel a kényelmes fejlesztési feltételek biztosítása érdekében.

Git

Ez egy ingyenes és nyílt forráskódú verziókezelő rendszer. Nagy projektek kezelésére szolgál Linux -ként, de könnyen használható kisebb projektekhez is (lásd Github és Bitbucket).

A projektváltozások helyben nyomon követhetők, és távoli szerverre is elküldhetők, hogy megosszák a szoftvereket a közösséggel.

A főleg használt parancsok a következők:

git klón https://github.com/makerobotics/RPIbot.git [A forráskód és a git konfiguráció letöltése]

git pull origin master [szerezze be a legújabbat a távoli tárból]

git status [a helyi lerakat állapotának lekérése. Vannak -e módosított fájlok?] Git log [a kötelezettségek listájának beszerzése] git add. [add hozzá az összes módosított fájlt ahhoz a szakaszhoz, amelyet a következő véglegesítésnél figyelembe kell venni] git comm -m "megjegyzés a véglegesítéshez" [a változtatások véglegesítése a helyi adattárban] git push origin master [az összes elkötelezettséget a távoli lerakatba küldd]

Fakitermelés

A Python néhány beépített naplózási funkciót kínál. A szoftverstruktúrának már meg kell határoznia az összes naplózási keretet a további fejlesztés megkezdése előtt.

A naplózó konfigurálható úgy, hogy meghatározott formátumú naplózást végezzen a terminálon vagy naplófájlban. Példánkban a naplózót a webszerver osztály konfigurálja, de mi magunk is megtehetjük. Itt csak a naplózási szintet állítottuk DEBUG -ra:

logger = logging.getLogger (_ név_)

logger.setLevel (logging. DEBUG)

Mérés és ábrázolás

A jelek időbeli elemzéséhez a legjobb, ha diagramba rajzoljuk őket. Mivel a Raspberry Pi csak konzol terminállal rendelkezik, az adatokat pontosvesszővel elválasztott csv fájlban fogjuk nyomon követni, és a távoli számítógépről ábrázoljuk.

A pontosvesszővel elválasztott nyomkövetési fájlt a fő python -kódunk generálja, és ilyen fejlécekkel kell rendelkeznie:

timestamp; yawCorr; encoderR; I_L; odoDistance; ax; encoderL; I_R; yaw; eSpeedR; eSpeedL; pwmL; speedL; CycleTimeControl; wz; pwmR; speedR; Iyaw; hdg; m_y; m_x; eYaw; cycleT

1603466959.65;0;0;25;0.0;-0.02685546875;0;25;0;25;25;52;0.0;23;0.221252441406;16;0.0;0;252.069366413;-5.19555664062;-16.0563964844;0;6; 1603466959.71;0;0;50;0.0;0.29150390625;0;50;0;25;25;55;0.0;57;-8.53729248047;53;0.0;0;253.562118111;-5.04602050781;-17.1031494141;0;6; 1603466959.76;0;-1;75;0.0;-0.188232421875;1;75;2;25;25;57;0;52;-24.1851806641;55;0;0;251.433794171;-5.64416503906;-16.8040771484;2;7;

Az első oszlop az időbélyeget tartalmazza. Az alábbi oszlopok ingyenesek. A rajzolószkript meghívásra kerül a rajzolni kívánt oszlopok listájával:

távoli@pc: ~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR

A szkript az eszköz mappában érhető el:

A plotter mathplotlib -et használ a Pythonban. A számítógépre kell másolnia.

A nagyobb kényelem érdekében a python parancsfájlt egy bash szkript hívja meg (plot.sh), amely a Raspberry Pi nyomkövetési fájlt másolja a távoli PC -re, és hívja a plottert jelkiválasztással. A "plot.sh" bash szkript megkérdezi ha a fájlt másolni kell. Ez kényelmesebb volt számomra, ahelyett, hogy minden alkalommal kézzel másoltam volna. Az "sshpass" a fájl másolására szolgál a Raspberry Pi -ről a távoli számítógépre az scp -n keresztül. Képes másolni egy fájlt anélkül, hogy kérné a jelszót (paraméterként kerül átadásra).

Végül egy ablak nyílik meg, ahol a kép látható.

Távoli kommunikáció

A Raspberry Pi fejlesztői interfésze az SSH. A fájlok közvetlenül szerkeszthetők a célhelyen, vagy másolhatók az scp segítségével.

A robot vezérléséhez egy webszerver fut a Pi -n, amely a Websocketen keresztül biztosítja az irányítást. Ezt a felületet a következő lépés írja le.

Állítsa be a Raspberry Pi -t

Van egy fájl, amely leírja a Raspberry Pi beállítását a forráskód "doc" mappájában (setup_rpi.txt). Nincs sok magyarázat, de sok hasznos parancs és link.

4. lépés: A felhasználói felület

A felhasználói felület
A felhasználói felület

A könnyű Tornado webszervert használjuk a felhasználói felület fogadására. Ez egy Python modul, amelyet a robotvezérlő szoftver elindításakor hívunk.

Szoftver architektúra

A felhasználói felület a következő fájlokból épül fel: gui.html [A weboldal vezérlőinek és elrendezésének leírása] gui.js [Tartalmazza a javascript kódot a kezelőszervek kezeléséhez és a webes aljzat kapcsolatának megnyitásához robotunkkal] gui.css [A a html vezérlők. A kezelőszervek helyzetét itt határozzák meg]

A websocket kommunikáció

A felhasználói felület nem a legmenőbb, de teszi a dolgát. Itt olyan technológiákra összpontosítottam, amelyek újak voltak számomra, mint például a Websockets.

A weboldal a Websockets segítségével kommunikál a robot webszerverével. Ez egy kétirányú kommunikációs csatorna, amely nyitva marad a kapcsolat kezdeményezésekor. Elküldjük a robot parancsait a Websocketen keresztül a Raspberry Pi -hez, és információkat (sebesség, pozíció, kamerafolyam) kapunk vissza megjelenítésre.

A felület elrendezése

A felhasználói felület kézi bevitellel rendelkezik a parancsokhoz. Ezt használták az elején parancsok küldésére a robotnak. A jelölőnégyzet be- és kikapcsolja a kamerafolyamot. A két csúszka vezérli a kamera panelt és döntését. A felhasználói felület jobb felső része a robotok mozgását vezérli. Szabályozhatja a sebességet és a cél távolságot. Az alapvető telemetriai információk megjelennek a robot rajzon.

5. lépés: A robotplatform programozása

A robotplatform programozása
A robotplatform programozása
A robotplatform programozása
A robotplatform programozása
A robotplatform programozása
A robotplatform programozása

Ez a rész volt a projekt fő célja. Sok szoftvert újratelepítettem, amikor bemutattam az új alvázat az egyenáramú motorokkal. Python programozási nyelvet használtam különböző okokból:

  • Ez a Raspberry Pi fő nyelve
  • Ez egy magas szintű nyelv, sok beépített funkcióval és bővítménnyel
  • Objektumorientált, de szekvenciális programozásra is használható
  • Nincs szükség összeállításra és szerszámláncra. Szerkessze a kódot és futtassa.

A szoftver fő architektúrája

A szoftver objektumorientált, néhány objektumra osztva. Az ötletem az volt, hogy a kódot három funkcionális blokkra osztom:

Sense Think Actuate

Értelem.py

Fő érzékelő beszerzése és feldolgozása. Az adatokat egy szótárban tárolják, amelyet a következő szakaszban használnak fel.

Control.py

Egy működtető alosztály némi absztrakció után vezérli a motorokat és a szervókat. A fő vezérlőobjektum a magas szintű parancsokat és a motor vezérlő algoritmusait (PID) kezeli.

rpibot.py

Ez a fő objektum a Tornado webszerver felügyelete és az érzékszervi és vezérlő osztályok létrehozása külön szálakban.

Minden modul futtatható egyedül vagy a teljes projekt részeként. Csak érzékelheti és kinyomtathatja az érzékelő adatait, hogy ellenőrizze, hogy az érzékelők megfelelően vannak -e csatlakoztatva és megfelelő információkat szolgáltatnak -e.

A PID vezérlés

Az első feladat az, hogy megtudjuk, mit akarunk irányítani. Azzal kezdtem, hogy megpróbáltam irányítani a helyzetet, ami nagyon összetett volt, és nem sokat segített.

Végül szeretnénk szabályozni az egyes keréksebességeket és a robot irányát is. Ehhez két vezérlési logikát kell lépcsőzetesen végrehajtanunk.

A bonyolultság fokozatos növelése érdekében a robotot irányítani kell:

nyílt hurok (állandó erővel)

pwm = K

majd adja hozzá a záró hurok algoritmust

pwm = Kp.speedError+Ki. Integráció (speedError)

és végül adja hozzá az irányszabályozást utolsó lépésként.

A fordulatszám -szabályozáshoz "PI" vezérlőt és "P" -t csak az elforduláshoz használtam. Kísérletezéssel manuálisan állítottam be a paramétereket. Valószínűleg itt sokkal jobb paramétereket lehetne használni. A célom csak egy egyenes volt, és majdnem elértem. Létrehoztam egy felületet a szoftverben, hogy néhány változót írhassak a felhasználói felületen. A Kp paraméter 1.0 -ra állítása a következő parancsot igényli a felhasználói felületen:

SET; Kp; 1.0

A P paramétert elég alacsonyra állíthatom, hogy elkerüljem a túllépést. A fennmaradó hibát az I paraméter javítja (integrált hiba)

Nehéz volt rájönnöm, hogyan lehet a két vezérlőt kaszkádba helyezni. A megoldás egyszerű, de sok más módszert is kipróbáltam korábban … Így végül megváltoztattam a kerekek sebességcélját, hogy egyik vagy másik irányba forduljanak. A sebességszabályozó kimenet közvetlen megváltoztatása hiba volt, mivel a sebességszabályozó megpróbálta eltávolítani ezt a zavarást.

A használt vezérlési rajz mellékelve. Csak a robotvezérlő bal oldalát mutatja.

6. lépés: Az érzékelő kalibrálása

Az érzékelő kalibrálása
Az érzékelő kalibrálása
Az érzékelő kalibrálása
Az érzékelő kalibrálása
Az érzékelő kalibrálása
Az érzékelő kalibrálása

Az első dolog, amit figyelembe kell venni, hogy az egész IMU -nak megfelelően kell működnie. 3 alkatrészt rendeltem és visszaküldtem, amíg meg nem lett a működő érzékelőm. Minden korábbi érzékelőnek volt néhány része, amelyek nem működtek megfelelően vagy egyáltalán nem. Néhány példa szkripttel próbáltam ki az alapokat, mielőtt a robotba szereltem volna.

Használat előtt az IMU érzékelő jeleit kalibrálni kell. Néhány érzékelőjel a rögzítési szögtől és pozíciótól függ.

A gyorsulás és a forgási sebesség kalibrálása

A legegyszerűbb kalibrálás a hosszirányú gyorsulásra (A_x) vonatkozik. Álló helyzetben 0 m/s² körül kell lennie. Ha megfelelően forgatja az érzékelőt, meg tudja mérni a gravitációt (körülbelül 9,8 m/s²). Az a_x kalibrálásához csak megfelelően fel kell szerelni, majd meg kell határozni az eltolást, hogy álló helyzetben 0 m/s² legyen. Most az A_x kalibrálva van. A forgási sebességek eltolását hasonló módon kaphatja meg álló helyzetben.

A magnetométer kalibrálása az iránytűhöz

A mágneses mező érzékelőihez bonyolultabb kalibrálás szükséges. Az m_x és m_y függvényeket használjuk a mágneses mező vízszintes szintre állításához. Az m_x és az m_y megadásával lehetőséget kapunk egy iránytű irányának kiszámítására.

Egyszerű célunkból csak a kemény vas eltérést kalibráljuk. Ezt úgy kell végrehajtani, hogy az érzékelő a végső helyzetben van, mivel a mágneses mező zavarától függ.

M_x és m_y rögzítjük, miközben a robotot a z tengely körül forgatjuk. Az m_x vs m_y ábrázoljuk egy XY diagramban. Az eredmény a képen látható ellipszis. Az ellipszist az eredetre kell összpontosítani. Itt figyelembe vesszük az m_x és m_y maximális és minimális értékeit, hogy mindkét irányban megkapjuk az eltolásokat. Végül ellenőrizzük a kalibrálást, és látjuk, hogy az ellipszis középre áll.

A lágyvas kalibrálás azt jelentené, hogy a képet ellipszisről körre változtatjuk. Ezt úgy tehetjük meg, hogy minden egyes érzékelő értékhez hozzáadunk egy tényezőt.

Egy tesztrutin kódolható az újrakalibráláshoz, vagy legalább annak ellenőrzéséhez, hogy az érzékelők még mindig kalibráltak -e.

Az iránytű iránya

A magnetométer adatait most az iránytű irányának kiszámításához használjuk. Ehhez az m_x és m_y jeleket szöggé kell alakítanunk. A Python közvetlenül biztosítja a math.atan2 függvényt, amelynek ez a célja. A teljes számítást az mpu9250_i2c.py fájl határozza meg ("calcHeading (mx, my, mz)").

7. lépés: Alternatív tervek

Alternatív tervek
Alternatív tervek
Alternatív tervek
Alternatív tervek
Alternatív tervek
Alternatív tervek

A projekt sok időt vett igénybe, mivel a tervezés teljesen nyitott volt. Minden komponenshez készítettem néhány prototípust, és megtapasztaltam a rendszer korlátait.

A legbonyolultabb téma a kerék -kódoló volt. 3 különböző lehetőséget teszteltem, mielőtt megtaláltam a jelenleg használt optikai kódolót. Úgy gondolom, hogy az elvetélt megoldások is nagyon érdekesek egy ilyen projektben. Azokra a részekre vonatkozik, ahol a legtöbbet tanultam.

Folyamatos forgás szervó a pca 9695 -hez csatlakoztatva

Az egyenáramú motor további H-hídjának elkerülése érdekében először folyamatos forgású szervókkal kezdtem. Ezeket a már meglévő pca 9695 szervo meghajtó vezette. Az összes meghajtómechanika és a megfelelő elektronika sokkal egyszerűbb volt. Ennek a kialakításnak két hátránya volt:

  • A szervók rossz szabályozási tartománya.
  • Hiányzó kódoló tartási hely

A szervók 50% -os pwm sebességgel mozognak, és teljes sebességük körülbelül 55%. Ez nagyon rossz szabályozási tartomány.

Kódolótartó nélkül nagyon nehéz volt készen álló kódolót találni. 3 különböző fényvisszaverő jeladót teszteltem, amelyek az alvázra voltak felszerelve. Egy saját készítésű kódoló kereket ragasztottam a kerék külső oldalára, fekete -fehér részekkel. A QTR-1RC érzékelőket használtam, amelyeknek sok jelfeldolgozásra van szükségük a megfelelő jel eléréséhez. A Raspberry Pi nem volt képes ilyen típusú valós idejű feldolgozásra. Ezért úgy döntöttem, hogy NodeMCU D1 mini -t adok hozzá valós idejű vezérlőként a robothoz. A soros UART a málna Pi -hez csatlakoztatta a feldolgozott érzékelőadatok továbbítására. A NodeMCU a HC-SR04 érzékelőt is kezelte. A mechanika nehéz volt és nem túl robusztus, a soros vonal zajt kapott az I2C vonaltól és a motoroktól, így végül megépítettem a futómű második változatát egyszerű hajtóműves egyenáramú motorokkal egy H-híd. Ezek a motorok másodlagos kimeneti tengelyekkel rendelkeznek egy optikai kódoló elhelyezéséhez.

8. lépés: Képfeldolgozás

Képfeldolgozás
Képfeldolgozás
Képfeldolgozás
Képfeldolgozás
Képfeldolgozás
Képfeldolgozás
Képfeldolgozás
Képfeldolgozás

Az autonóm vezetés javítása érdekében végezhetünk némi képfeldolgozást.

Az opencv könyvtár erre hivatkozik. A Python segítségével gyorsan megvalósítható az akadályérzékelés.

Elkészítünk egy képet, és alkalmazunk néhány képfeldolgozási feladatot:

Az első teszteket Canny és Sobel transzformációkkal végezték. Canny jó jelölt lehet, de nem elég értelmes. Sobel túl érzékeny (túl sok tárgyat észlelt).

Végül elkészítettem saját szűrőmet, hogy összekeverjem az összes vízszintes és függőleges gradienst (érzékeljük a bútorokat):

  • Alakítsa át a színes képet szürke színű képpé
  • Homályosítsa el a képet, és távolítsa el az apró zajt
  • Határozza meg a képet fekete -fehér képre
  • Most vízszintes és függőleges lejtőket észlelünk, hogy a tárgyakat falakként és bútorokként érzékeljük
  • Csak a fennmaradó nagy kontúrokat szűrjük (lásd a színes kontúrokat a képen)

Most ezt az új információt használhatjuk az akadályok észlelésére…

9. lépés: Következő lépések…

Következő lépések…
Következő lépések…
Következő lépések…
Következő lépések…

Most van egy egyszerű robotplatformunk szenzorokkal, működtetőkkel és kamerával. A célom az, hogy önállóan mozogjak és visszamenjek az állomásra további érzékelők hozzáadása nélkül. Ehhez a következő lépésekre lesz szükségem:

  • Az elfordulás és a mágneses irányjelzések érzékelőfúziója
  • Kamera képfeldolgozás (ehhez csak alacsony CPU áll rendelkezésre)
  • Ütközésérzékelés (ultrahangos távolság és kamera)
  • Térképépítés vagy tájolás

Most menjen, és készítse el saját kihívásait vagy céljait…

Ajánlott: