KognitĂv robotika tárgynak fĂ©lĂ©ves projekt feladata, ahol ROS Noetic környezetben fejlesztettem egy mobil robotot.
A projektet kĂ©szĂtette:
- Czémán Róbert
- FeladatleĂrás
- TelepĂtĂ©si ĂştmutatĂł
- Szimuláció futtatása
- Versenypálya megtervezése
4.1. Gazebo szimuláció - Versenyautó megtervezése
5.1. RViz szimuláció - Alaklmazott szenzorok
6.1. Kamera - Kormányzás
- Képfeldolgozás
8.1. Képfeldolgozás lépései
8.2. Nehézségek a képfeldolgozás során
8.3 .A problémák megoldása
8.4. Az alkalmazott megoldások hátrányai - Végeredmény
A feladat megvalĂłsĂtása során a következĹ‘ pontoknak kellett eleget tennĂĽnk:
- mĂ©retarányosan kicsinyĂtett versenypálya kĂ©szĂtĂ©se,
- versenyautĂł modell kĂ©szĂtĂ©se,
- a robot autonĂłm vezetĂ©se saját ROS node segĂtsĂ©gĂ©vel.
- A repositoryt az alábbi paranccsal tudjuk megszerezni:
git clone https://github.com/czrobi2001/KogRob_HW_23_24.git-
WSL használata esetĂ©n: XServer telepĂtĂ©se (grafikus alkalmazás futtatása miatt)
- a telepĂtĂ©s megtehetĹ‘ pĂ©ldául a következĹ‘ linkre kattintva: XServer
- XServer konfigurálása: Az Extra settings oldalon pipáljuk be a Disable access control opciĂłt, valamint az Additional parameters for VcXsrx felirĂtĂş mezĹ‘be gĂ©peljĂĽk be a következĹ‘k:
-nowgl -
SzĂĽksĂ©ges fĂĽggĹ‘sĂ©gek (dependency) telepĂtĂ©se:
- Pythonhoz a scipy könytár az alábbi parancs segĂtsĂ©gĂ©vel:
pip install scipy- Az alábbi ROS package-ek:
ros-noetic-actionlibros-noetic-rospyros-noetłc-theora-image-transportros-noetic-urdfros-noetic-xacroros-noetic-roslaunchros-noetic-joint-state-publisherros-noetic-joint-state-publishér-guiros-noetic-robot-state-publisherros-noetic-rvizros-noetic-ackermann-steering-controllerros-noetic-controller-managerros-noetic-joint-state-controllerros-noetic-ros-controlros-noetic-ros-controllersros-noetic-control-toolboxros-noetic-gazebo-ros-controlros-noetic-joint-limits-interfaceros-noetic-gazebo-rosros-noetic-rqt-robot-steeringros-noetic-hector-trajectory-server
Ezek telepĂthetĹ‘k, az alábbi paranccsal:
rosdep install -y --from-paths src --ignore-src --rosdistro noetic -r -
Legvégül futtassuk le a workspace gyökérkönyvtárában a
catkin_makeparancsot. -
A neurális háló modell generálása a
train_network.pyfuttatásával, hogy a kĂ©pfeldolgozáshoz rendelkezĂ©sre álljon a tanĂtott hálĂł.
A lĂ©pĂ©sek teljesĂtĂ©sĂ©vel már kĂ©pesek leszĂĽnk a szimuláciĂłt futtatni. Ennek a lĂ©pĂ©seit a követkeezĹ‘ fejezet tartalmazza.
A szimuláciĂł elindĂtáshoz elĹ‘ször a mobil robotot kell megnyitni gazebo-ban, amit az alábbi paranccsal tehetĂĽnk meg.
roslaunch line_follower spawn_robot.launchMajd miután elindult a szimuláciĂł elindĂthatjuk a follow_curve.py scriptet, ami a kĂ©pfeldogozást vĂ©gzi.
rosrun line_follower line_follower_cnn.pyHa az irányĂtáshoz használt paramĂ©terekre is kĂváncsiak vagyunk, akkor egy 3. terminál ablakba Ărjuk be a következĹ‘t:
rqtMiután megnyĂlt az rqt a Plugins > Topics > Topic Monitor menĂĽpontra kattintás után keressĂĽk ki a cmd_vel topicot Ă©s pipáljuk be. Ezen belĂĽl a linear Ă©s angular opciĂłkat lenyitva láthatĂłk a pontos Ă©rtĂ©kek.
A versenypályát Solidworks-ben egy letöltött, Ă©s importált kĂ©p segĂtsĂ©gĂ©vel terveztem meg, aminek kontĂşrját körberajzoltam Besier görbĂ©kkel, Ă©s kiexportáltam egy .stl fájlt.
Blenderbe beimportálva kĂ©szĂtettem egy a gazebo által is kezelhetĹ‘ collada mesht, ami tartalmazza a blenderben beállĂtott szĂneket is. Ahhoz, hogy a Gazebo megnyitáskor lássa a modellt, az alábbi sort kell a .bashrc-hez hozzá adni.
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/bme_catkin_ws/src/KogRob_HW_23_24/gazebo_modelsA modellt a szimulációs környezetben, vagyis a gazebo-ban is megtekinthetjük, ehhez az alábbi parancsot futtassuk:
roslaunch line_follower world.launch A szimuláciĂł elindĂtásához egy .world kiterejesztĂ©sű fájlra van szĂĽksĂ©gĂĽnk, ami tartalmazza a világ, szimuláciĂłhoz szĂĽksĂ©ges fizikai beállĂtásait, valamint a hozzáadott további modelleket.
A kocsi beimportálása a világba a spawn_robot.launch fájl elindĂtásával törtĂ©nik, ahol argumentumkĂ©nt a robot kezdeti pozĂciĂłját is megadhatjuk.
A versenyautĂł tervezĂ©snĂ©k ötletĂ©t internetes forrásbĂłl vettem, ami egy kis lego kocsi, amit Solidworks-ben az egyszerűbb kezelhetĹ‘sĂ©g Ă©rdekĂ©ben mĂłdosĂtottam.
Ezekután blenderben beállĂtottam a megfelelĹ‘ szĂneket, majd exportáltam egyenkĂ©nt a mozgĂł komponenseket. A mobil robot vázát illetve a szimuláciĂłhoz szĂĽksĂ©ges paramĂ©terek beállĂtását a mogi_bot.xacro fájlban tettĂĽk meg, a robot irányĂtásáért Ă©s a kamera kĂ©pĂ©rt felelĹ‘s gazebo plug-in-ket a mogi_bot.gazebo fájlban adtuk hozzá.
A robot modellt megtekinthetjĂĽk RViz-ben az alábbi parancs segĂtsĂ©gĂ©vel:
roslaunch line_follower_race_car check_urdf.launchA kĂ©pfeldogozáshoz egy kamera kerĂĽlt elhelyezĂ©sre a versenykocsi elejĂ©n, aminek paramĂ©tereit az Ăłrán használtak alapján állĂtottuk be.
A kamerát az alábbi plugin valĂłsĂtja meg.
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
<alwaysOn>true</alwaysOn>
<updateRate>0.0</updateRate>
<cameraName>head_camera</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
<frameName>camera_link_optical</frameName>
<hackBaseline>0.07</hackBaseline>
<distortionK1>0.0</distortionK1>
<distortionK2>0.0</distortionK2>
<distortionK3>0.0</distortionK3>
<distortionT1>0.0</distortionT1>
<distortionT2>0.0</distortionT2>
</plugin>A kormányzás megtervezĂ©se volt az egyik fĹ‘ feladat a projekt során. Fontos volt a megfelelĹ‘ tĂpus kiválasztása, mivel a pálya Ă©s az autĂł adottságai miatt több szempontnak is meg kellett felelni. Ezek közĂĽl pĂ©ldául kiemelnĂ©m azt, hogy az autĂłnak kĂ©pesnek kell lennie nagyon kis Ăven is elfordulnia.
VĂ©gĂĽl a feladatot a skid-steer kormányzással valĂłsĂtottuk meg. Az erre alkalmazott plugin:
<gazebo>
<plugin name="ros_force_based_move" filename="libgazebo_ros_force_based_move.so">
<commandTopic>cmd_vel</commandTopic>
<odometryTopic>odom</odometryTopic>
<odometryFrame>odom</odometryFrame>
<torque_yaw_velocity_p_gain>10000.0</torque_yaw_velocity_p_gain>
<force_x_velocity_p_gain>10000.0</force_x_velocity_p_gain>
<force_y_velocity_p_gain>10000.0</force_y_velocity_p_gain>
<robotBaseFrame>base_footprint</robotBaseFrame>
<odometryRate>50.0</odometryRate>
<publishOdometryTf>true</publishOdometryTf>
</plugin>
</gazebo>A robot irányĂtásáért a line_follower_cnn.py nevű Python script felel.
- tanĂtĂł kĂ©pek mentĂ©se, Ă©s cĂmkĂ©zĂ©se
save_training_images.pysegĂtsĂ©gĂ©vel
- a gazebo szimuláciĂłban kĂ©szĂtett kamerakĂ©pek kimentĂ©se
- a kĂ©pek cĂmkĂ©zĂ©se, kiválogatása jobb, bal, elĹ‘re, állj, lassĂts Ă©s semmi kĂ©pekre,amik a neurális hálĂł tanĂtĂł bemenetei lesznek.
-
neurális hálĂł tanĂtása
Az alkalmazott neurális háló LeNet jellegű konvolúciós neruális háló, ami 128x128 képet vár bemenetként, és 6 kimenetet szolgáltat, amik:
- Előre
- Jobbra
- Balra
- Ne mozdulj!
- Sebesség korlát
if label == 'forward': label = 0 elif label == 'right': label = 1 elif label == 'left': label = 2 elif label == 'pedestrian': label = 3 elif label == 'speed_limit': label = 4 else: label = 5
A LeNet neurális hálóról bővebben: LeNet
Neurális hálĂł tanĂtásához az Ăłrán is használt Python scriptet használtam, aminek futtatásával a cĂmkĂ©zett tanĂtĂł minták alapján meghatározza a modell paramĂ©tereit.
A tanĂtáshoz az alábbi sort kell lefuttatni parancsorban, a scriptet tartalmazĂł mappán belĂĽl:
python3 train_network.py -
iteráciĂł, amĂg a modell nem elĂ©g pontos, Ă©s nem elĂ©g alacsony a vesztesĂ©g a tanĂtás elĹ‘rehaladtával
A tanĂtás addig folytatĂłdott, amĂg a mobil robot minden kanyart hibátlanul nem vett, ahol elakadt rátanĂtás volt szĂĽksĂ©ges. Az 1. Ă©s 2. pontok között iteráltam addig, amĂg nem kaptam egy megfelelĹ‘ modellt.
-
robot irányĂtásához szĂĽksĂ©ges paramĂ©terek meghatározása
- ezek a paraméterek a robot sebessége az x-tengelye mentén (
linear.x) és az elfordulása a z-tengelye mentén (angular.z) - a paramétereket, amiket feltételben vitsgálunk, a neurális háló kimenetei
# last change reaches defined value change the speed/rotation if prediction == 0: # Forward self.cmd_vel.linear.x = 0.5 self.cmd_vel.angular.z = 0 elif prediction == 1: # Right self.cmd_vel.angular.z = -1 self.cmd_vel.linear.x = 0 elif prediction == 2: # Left self.cmd_vel.angular.z = 1 self.cmd_vel.linear.x = 0 elif prediction == 3: # Pedestrian self.cmd_vel.angular.z = 0.0 self.cmd_vel.linear.x = 0.0 elif prediction == 4: # Speed_limit self.cmd_vel.linear.x = 0.2 else: # Nothing self.cmd_vel.angular.z = 0.0 self.cmd_vel.linear.x = 0.0
- ezek a paraméterek a robot sebessége az x-tengelye mentén (
-
a meghatározott paraméterek közlése
- a paramétereket a cmd_vel topic-ba küldjük
Twistüzenet formájában
- a paramétereket a cmd_vel topic-ba küldjük
Sok-sok kĂsĂ©rletezĂ©st követĹ‘en eljutottam oda, hogy a robot kĂ©pes vĂ©gighaladni a teljes pályán hiba nĂ©lkĂĽl, egĂ©sz jĂł tempĂłban. A korábbi verziĂłkban az alábbi hibák álltak fenn:
- a kanyarokat nagyon lassan veszi be
- kanyar szélén nem ismeri fel a háló a kanyarodást
- nem elegendő pixel mérte esetén információ vesztés áll fent, emiatt a még az erőforrás zsempontjából megnegedhető pixel méret a 128x128
Az elĹ‘zĹ‘ rĂ©szben emlĂtett problĂ©mákra vĂ©gĂĽl a következĹ‘ megoldásokat eszközöltem:
- minden mozgást meghatározĂł feltĂ©telben pluszban vizsgálok egy változĂłt, aminek Ă©rtĂ©kĂ©t figyelem aszerint, hogy mennyi idĹ‘ telt el az utolsĂł hálĂł kimenet változás Ăłta. Ha ez meghaladja a beállĂtott Ă©rtĂ©ket, növelem a beavatkozást addig, amĂg nem változik a hálĂł kimenete.
- a problĂ©mát az idĂ©zte elĹ‘, hogy nem volt elĂ©g tanĂtĂł minta minden esethez, Ăgy rá kellett tanĂtani a hálĂłra az Ăşj kĂ©pekkel.
- az meghatározott időértĂ©kek alapvetĹ‘en a jelenlegi pálya alapján lettek kikĂsĂ©rletezve, Ăgy nem garantálhatĂł, hogy minden más esetben megfelleĹ‘en fog működni
- változtatva a beavatkozás mĂ©rtĂ©kĂ©t Ăşj pálya Ăvekre futhat a robot az eddig megszokottĂłl, Ăgy lehetsĂ©ges, hogy Ăşjabb tanĂtás lesz szĂĽksĂ©ges az Ăşj kĂ©pekkel
- egy kimenetet szolgáltat a neurális hálĂł, amit ebben az esetben jobb lenne több kimnetre terjeszteni. Egyiken megmondani a kanyarodás mĂ©rtĂ©kĂ©t, másikon pedig a kĂ©pen detektált táblát, mert jelenleg egy kimeneten van ez lekezelve, Ă©s ahhoz hogy az elvártaknak megfeleljen a robot mozgása, jelentĹ‘sen több tanĂtĂłkĂ©ppel kellene felvenni.
Az elkészült projekt demonstrációs videója:




