Skip to content

Robotrendszerek laboratórium projektfeladat: versenyautó autonóm vezetése méretarányosan kicsinyített versenypályán kamerás vonalkövetéssel

License

Notifications You must be signed in to change notification settings

fekete-d/race_car

Repository files navigation

Robotrendszerek laboratórium házi feladat

Versenyautó autonóm vezetése kamerás vonalkkövetéssel

Fekete Dániel (I0I7JK), Demeter Csaba (VV2GEA), Matics Bianka (U6IO4L)

Tartalomjegyzék

  1. Bevezetés
  2. Program felépítése
    1. Mapparendszer
  3. Ackermann kormányzás
  4. Az autó modellje
    1. Gazebo modell
    2. Vizuális modell
  5. Vonalkövetés
    1. Vonalfelismerés
    2. Vonalkövetés
  6. Telepítés

1. Bevezetés

A projektfeladat célja egy versenypálya, benne pedig egy versenyautó modellezése volt, amely Ackermann kormányzással irányítható, autonóm, kamerás vonalkövetés segítségével végig tud menni a pályán.

Működést bemutató videó

2. Program felépítése

2.1. Mapparendszer

A mappák struktúrája az internet talált hasonló projektek mintájára lett így strukturálva. Mapparendszer

race_car_description: Ebben a mappájában van definiálva az autó annak minden elemével, így a kerekekkel és a kamerával is.

steer_bot_hardware_gazebo: A plugin, amely az Ackermann kormányzás biciklimodelljében két kerékről átkonvertálja az elfordulásértékeket négy kerékre. Maga a plugin hibás, így módosítani kellett ez alapján. Emiatt nem dependency-ként van megadva, hanem a módosított package közvetlenül itt érhető el.

race_car_control: A kormányzás pluginjének és az ackermann_steering_control pluginnek vannak benne a konfigurációs fájljai.

race_car_gazebo: A pályamodellt tartalmazza. Maga a pálya a Forma 1-es monacói versenypálya 1:32 arányban Blenderben vizualizálva. Később az autó méreteit is ehhez kellett igazítani. A mappa tartalmazza továbbá azokat a fájlokat, amelyek elindítják magát a gazebot valamilyen konfigurációban.

race_car_line_following: A vonalkovetéshez szükséges fájlokat tartalmazza.

race_car_viz: Az RViz nevű vizualizációs program beállításait és indítási fájljait tartalmazza. Ezzel lehet összekötni a vizuális modelleket a gazeboban definiált modellekkel.

Ezek a mappák a hierarchia legtetején találhatók. Lényeges mappák még a launch mappák.

A launch mappákban az indításhoz szükséges programrészek kaptak helyet. A roslaunch parancsal a launch mappákban lévő elemeket tudjuk lefuttatni, amivel elindul a szimuláció. A program meghívja például az xacro fájlokban definiált dolgokat, így tud betöltődni a versenypálya, vagy az autómodell. A szimuláció legtöbb részének van saját launch mappája. Ez alól kivételt képez a steer_bot_hardware_gazebo, ugyanis ez mint plugin kerül elindításra, és nem a felhasználó indítja el.

3. Ackermann kormányzás

A szimuláció maga egy biciklit modellez, hátsó kereket hajt, elsőt kormányoz. Mivel a mi autónk négy kerékkel rendelkezik, ezt a bicikli modellt át kellett alakítani egy plugin segítségével. Az új modell működési elve, hogy a két első kerék két különböző szögben fordul, irányuk meghosszabbításának metszéspontja pedig kiadja a kört, ami mentén az autó elfordul. A program kiszámolja, hogy a kormányzott bal első és jobb első kerekeknek mennyire kell elfordulnia, hogy a megfelelő sugarú körön forduljon az autó, azaz, hogy a megfelelő irányba haladjon.

Ackermann kormányzás

A modellben a

  • joint: összekötőelem, "csukló",
  • a link: tagok.

A joint nem csak a kerekeket köti össze a testtel, de a kamera is ilyen módon van rögzítve.

4. Az autó modellje

4.1. Gazebo modell

A race_car_description mappájában van definiálva az autó annak minden elemével, így a kerekekkel és a kamerával is.

Az urdf mappa elemei vannak hierarchiában legalul. Ez tartalmazza az xacro fájlokat. Ezek azok a programrészek, amelyekkel megalkottuk az autómodellt, amellyel inicializáltuk a színeket és a többi. Egy ilyen urdf mappa található az előbb tárgyalt description-ben is. Az xacro fájlok makrózottak, így az alárendelt fájlok (wheels.xacro, camera.xacro) paraméteresen számolnak, a paraméterek értékeit az f1_car.xacro-ban adjuk meg.

  • materials.xacro: A színek rgb kódjait tartalmazza az RViz megjelenítéshez.
  • wheels.xacro: A kerekek modelljeit tartalmazza.
  • f1_car.xacro: Az autó modellje.
  • camera.xacro: Az óraival megegyező módon definiálja az autómodellre szerelt kamerát.

4.2. Vizuális modell

A pályán körbeefutó autó egy 2017-es forma 1-es autó egyszerűsített modellje, amit egy online 3D modellezőprogramban, a Oneshape-ben készítettünk. Ez egy online CAD program, amely a felhőben tárol minden adatot, maga a program is online, így letölteni sem kell.

Az autó eredeti méreteiben lett lemodellezve, és egy a paraméter segítségével arányosan 32 részére csökkentettük, hogy megfelelően illeszkedjen a pálya méreteihez. Mivel paraméteresen lettek megadva a dimenziói, egy változó átírásával könnyen át lehet méretezni a modellt bármilyen méretarányba.

Az autó vizuális modellezéséhez YouTube-ra feltöltött tutoriált vettünk alapul, amelyet a Gazeboban megalkotott modell méreteihez igazítottunk. A későbbiekben, amikor beillesztettük a vizuális modellt a programba, figyelni kellett a kamera és a kerekek pontos helyzeteire.

Autó váz

Kerék

A program .dae fájlt tud feldolgozni, ezért a kész autómodellt Blenderben színeztünk ki és exportáltuk a megfelelő formátumra. Mivel a kerekek egymástól függetlenül kell, hogy tudjanak mozogni, az autó váza, az első és hátsó kerék három külön fáljba lett kiexportálva. Ezek után már csak össze kellett kötni a vizuális modelleket az irányított modellel. Ahogy már a mapparendszerben is említettük, az RViz-es vizualizációért a race_car_viz mappában található programrészek felelnek. Amire figyelni kellett, hogy a megfeleltetésnél a méretek és a dimenziók megegyezzenek, és a jointok jó pozícióban legyenek.

5. Vonalkövetés

5.1. Vonalfelismerés

A vonalfelismerés megalkotása során ezt a videót vettük alapul. Ezen felül a képen elvégzendő átalakításokhoz az OpenCV csomagot használtuk fel.

Első lépésként a /head_camerea/image_raw topicon keresztül kapott képet az OpenCV-nek megfelelő formátumra konvertáltuk, majd csökkentettük a kép méretét, így gyorsítva a képelemzési folyamatokat. Ezután az RGB színtérből HSV színtérbe konvertáltuk, amely formátumra a fényviszonyok kevésbé vannak hatással. Következő lépésben a képet fekete és fehér részekre bontottuk, mégpedig úgy, hogy kiválasztottuk a vonal színével megegyező küszöbértéket, és minden, ami ez alatt az érték alatt van az fekete lett, minden más fehér, így egy bináris képet hoztunk létre. Ezek után kontúr keresést hajtottunk végre a képen az OpenCV findContours nevű függvényével, majd kiszámítottuk az így kapott alakzatnak a középpontját. Ha több alakzat is van, akkor azt a centroid értéket választottuk ki, amelyik közelebb van a robotunkhoz.

A futtatás során három képet monitorozunk folyamatosan. Az egyik a HSV színkeveréssel kapott kép, a második a bináris kép, a harmadik kép pedig egy olyan, amin egy pont segítségével ábrázoljuk a bináris képen a kapott centroid értéket, így vizuálisan is ellenőrizni tudjuk a vonalkövetést eredményét.

5.2. Vonalkövetés:

A szabályozás során kapott sebesség és szögsebesség értékeket az /ackermann_steering_controller/cmd_vel topicra továbbítjuk.

A vonalkövetés során elsőként egy egyszerű arányos szabályozóval próbálkoztunk, ami egyenesben szépen követte a felrajzolt pályát, de a nagyobb kanyarokat már nem tudta bevenni. Ezután egy robosztusabb PID szabályozót választottunk a feladatra mind a sebesség, mind a szögsebesség szabályozására. Ehhez a Python-hoz letölthető simple_pid csomagot használtuk fel. Ezzel a konfigurációval már sikerült elérnünk, hogy a robotunk kellően lelassítson a kanyarhoz, ennek köszönhetően a robot be tudja már venni a kanyart.

Sajnos nagy sebesség esetén a kigyorsítás során a robot elveszti a stabilitását és ennek következtében nem tudja követni a vonalat és a falba ütközik. Ez a probléma ideiglenesen kiküszöbölhető, ha csökkentjük a sebességét. Ilyenkor viszonylag szépen követi a vonalat, de pl. a visszafordító kanyar, vagy az egymásba fűzött kanyarok bevétele során ismét akadályba ütközik. Összességében elmondható, hogy egy jó kiindulási alappal rendelkezünk, melyben a paraméterek megfelelő megválasztásával rengeteg potenciál rejlik.

Ennek a problémának a fő forrása a modellalkotásban rejlhet. Valamiért a vezérelt jointok oszcillálni kezdtek (a hátsó kerék esetén a hajtás, az első kerék esetén a kormányzás), amely ellehetetlenítette a vonalkövetést. Erre a megoldás az volt, hogy a sebességek, gyorsulások és jerkök értékeit lecsökkentettük, ezzel csillapítva a rezgéseket. Emiatt van az, hogy csak lassan tud fordulni a modell, és ezért lassú a vonalkövetés. Az oszcilláció eredeti okára nem tudtunk rájönni, bármilyen paramétert változtattunk is. Lehetséges tippek: inerciák, csillapítások, PID szabályozó paraméterei.

6. Telepítés

A programot úgy indíthatjuk el, ha ezt a GitHub repository-t egy meglévő catkin workspace-be másoljuk a

git clone https://github.com/fekete-d/race_car.git

paranccsal. A futtatáshoz telepített ROS Noetic verziót feltételezünk. A következő csomagok szükségesek a program működéséhez:

  • ros-noetic-actionlib
  • ros-noetic-rospy
  • ros-noetłc-theora-image-transport
  • ros-noetic-urdf
  • ros-noetic-xacro
  • ros-noetic-roslaunch
  • ros-noetic-joint-state-publisher
  • ros-noetic-joint-state-publishér-gui
  • ros-noetic-robot-state-publisher
  • ros-noetic-rviz
  • ros-noetic-ackermann-steering-controller
  • ros-noetic-controller-manager
  • ros-noetic-joint-state-controller
  • ros-noetic-ros-control
  • ros-noetic-ros-controllers
  • ros-noetic-control-toolbox
  • ros-noetic-gazebo-ros-control
  • ros-noetic-joint-limits-interface
  • ros-noetic-gazebo-ros
  • ros-noetic-rqt-robot-steering
  • ros-noetic-hector-trajectory-server

A még nem telepített dependency-k ki is írathatóak, ha a catkin workspace gyökérmappájában lefuttatjuk a rosdep check --from-paths src --ignore-src --rosdistro noetic parancsot. Ezt követően a rosdep install --from-paths src --ignore-src --rosdistro noetic -y paranccsal ezeket telepíthetjük is. Ezek után már buildelhetjük a catkin workspace-ünket a catkin_make parancs segítségével.

Ahhoz, hogy a Pythonban írt vonalkövető kódot futtathatóvá tegyük, a chmod +x line_following.py utasítás szükséges a race_car/race_car_line_following/scripts mappában. A Python kód a rospy, cv2, cv_bridge, numpy és simple_pid könyvtárakat használja, így ezeket is telepíteni kell (pip install <mudule-name>).

Ezek után már minden készen áll, hogy elindítsuk a programot. Itt három launch fájl érdekes számunkra. Maga a Gazebo és a vonalkövetés a roslaunch race_car_gazebo race_car_track_monaco.launch paranccsal indítható. Ha fut a Gazebo, a roslaunch race_car_viz view_f1_car_robot.launch utasítás elindít egy RVizes vizualizációt. Amennyiben nem a mozgó versenyautót, hanem magát a modellt szeretnénk megtekinteni, a roslaunch race_car_viz view_f1_car_model.launch parancsot írjuk be (ezt célszerű a Gazebo indítása előtt futtatni, hogy a kerekek ne mozogjanak).

Források

About

Robotrendszerek laboratórium projektfeladat: versenyautó autonóm vezetése méretarányosan kicsinyített versenypályán kamerás vonalkövetéssel

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published