Baróthy_Berencsi_Dankó_Tancsa
Feladatunk vonalkövetés megvalósítása turtlebottal neurális háló segítségével. A neurális hálót feltanítjuk a vonalkövetésre illetve, hogy milyen színű vonalon milyen sebességgel közlekedjen. A robot által bejárt út 2D-s felülnézeti reprezentációját egy külön python node segítségével ábrázoljuk. A modellt szerettük volna feltanítani arra az eshetőségre is, hogy egy táblát meglátva
Az alkalmazott függvények, logikák és scriptek nagymértékben támaszkodnak az óra segédletre.
A feladatunkhoz az F1-es Monza nevű pályát vettük alapul, kiegészítve egy boxutca szerűséggel, ahova a robotot egy tábla segítségével lehet kiterelni. A pályát Blender-ben hoztuk létre egy bezier görbe segítségével. Először kialakítottuk a pálya vonalvezetését, majd ráillesztettük az úttestet jelképező modellelemet. Ezt követően elkészítettük a tábla modellt, amit a kitereléshez fogunk használni.
A végeredményt collada(.dae
) fájlformátumba mentettük, hogy a Gazebo kezelni tudja. Gazebon belül összeraktuk a teljes modellt és létrehoztuk a .world
fájlt.
A train_network.py
tartalmazza a felépített neurális hálót, ami a robotot végigvezeti a vonalon. A háló struktúrája a kiadott segédlethez hasonlóan LeNet-5 jellegű. A segédlethez képest a kimenet aktivációs függvényét változtattuk meg sigmoid-ra, mert néhány helyen említik, hogy a multi-label klasszifikációs feladatoknál ez a használatos. Az elért legjobb modellsúlyok kimentéséért a ModelCheckpoint()
callback felel.
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 24, 24, 20) 1520
activation (Activation) (None, 24, 24, 20) 0
max_pooling2d (MaxPooling2D (None, 12, 12, 20) 0
)
conv2d_1 (Conv2D) (None, 12, 12, 50) 25050
activation_1 (Activation) (None, 12, 12, 50) 0
max_pooling2d_1 (MaxPooling (None, 6, 6, 50) 0
2D)
flatten (Flatten) (None, 1800) 0
dense (Dense) (None, 500) 900500
activation_2 (Activation) (None, 500) 0
dense_1 (Dense) (None, 10) 5010
activation_3 (Activation) (None, 10) 0
=================================================================
Total params: 932,080
Trainable params: 932,080
Non-trainable params: 0
_________________________________________________________________
A tanításhoz használt képeket a kapott save_training_images.py
node-al készítettük. Annak érdekében, hogy minden színt minden pozícióban helyesen felismerjen és, hogy a robot mindig pontosan navigáljon, formális és buzgó kollégám kb 1100 képet kategorizált 10 különböző mappába manuálisan. (jó nagy b@rom ..lol)
A háló feltanításának eredménye a következő képen látható:
A line_follower_cnn.py
ros node-ot a segédlethez képest több helyen módosítottuk. A robot x-y síkban elfoglalt helyét kiolvassuk az odometryából a Position
callback segítségével, majd az eredményeket átadtuk a cvThread
class drawTrajectory
függvényének.
A robot mozgásának és a vonal szinének meghatározásához két argmax()
függvényt használtunk egyet az irányra, egyet pedig a színre és a robot mozgásparamétereit ennek megfelően módosítottuk
if prediction_color == 0: # Red
self.color = [1,0,0]
color_linfaktor = 0.5
color_angfaktor = 1.5
elif prediction_color == 1: # Green
self.color = [0,1,0]
color_linfaktor = 1.2
color_angfaktor = 1
elif prediction_color == 2: # Blue
self.color = [0,0,1]
color_linfaktor = 1
color_angfaktor = 1
elif prediction_color == 3: # Magenta
self.color = [1,0,1]
color_linfaktor = 2
color_angfaktor = 0.5
elif prediction_color == 4: # Yellow
self.color = [1,1,0]
color_linfaktor = 0.8
color_angfaktor = 1.2
elif prediction_color == 5: # Cian
self.color = [0,1,1]
color_linfaktor = 0.7
color_angfaktor = 0.8
if prediction_dir == 0: # Forward
self.cmd_vel.angular.z = 0*color_angfaktor
self.cmd_vel.linear.x = 0.1*color_linfaktor
elif prediction_dir == 1: # Right
self.cmd_vel.angular.z = -0.2*color_angfaktor
self.cmd_vel.linear.x = 0.05*color_linfaktor
elif prediction_dir == 2: # Left
self.cmd_vel.angular.z = 0.2*color_angfaktor
self.cmd_vel.linear.x = 0.05*color_linfaktor
elif prediction_dir == 3: # Stop
self.cmd_vel.angular.z = 0.1*color_angfaktor
self.cmd_vel.linear.x = 0.0*color_linfaktor
A kamera által látott kép mutatására a segédletben található programrészletet használtuk fel.
A modellkörnyezet felépítéséhez a /turtlebot3_hf/launch/simulation_line_follow.launch
lauch fájlt használjuk, amit a segédlethez képest annyival módosítottunk, hogy az Rviz elindítására vonatkkozó részt eltávolítottuk, mert arra nem volt szükségünk.
Végeredmény a line_follower_cnn
node elindítása után:
A házifeladat megvalósítása során ROS Noetic-et és Windows WSL2 Linux subsystemet használtunk Ubuntu-20.04 disztribúcióval.
A ROS feltelepítéséhez nagy segítségget nyújtott a How to Install ROS Noetic on Ubuntu 20.04 című útmutató.
Mi az ajánlott full desktop
csomagot töltöttük le:
sudo apt install ros-noetic-desktop-full
Első lépésként a ROS telepítése után be kell tölteni a terminálba a ROS környezetét:
source /opt/ros/noetic/setup.bash
Ha rendelkezünk catkin workspace-el akkor navigáljunk bele. Ha viszont még nem, akkor a következő parancsok lefuttatásával hozzunk létre és fordítsunk le egy catkin_ws mappát.
cd ~
mkdir -p catkin_ws/src
cd catkin_ws
catkin_make
Ezután a catkin workspace-ünket is tudjuk source-olni:
source ~/catkin_ws/devel/setup.bash
Figyeljünk arra, hogy azt a workspace-t source-oljuk, amibe dolgozni szeretnénk és lépjünk az src mappába.
A turtlebot3 szimulációhoz használt alapcsomagjainak GIT repoját töltsük be a workspace-ünk src mappájába:
git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations
git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs
git clone https://github.com/MOGI-ROS/turtlebot3
A MOGI-ROS/turtlebot3 repojából a mogi-ros branch-et fogjuk használni, ahol a robotra a kamera már elhelyezésre és konfigurálásra került. A branchek közötti váltás a következőképpen kell végrehajtani:
git checkout mogi-ros
git pull origin mogi-ros
Ezt követően le kell tölteni ezt a repo-t a következő paranccsal:
git clone https://github.com/mediforr12/Kogrob_HF
A szimulációhoz még be kell állítani néhány környezeti változót a robot fajtájára és az elkészített modellek elérhetőségére vonatkozóan.
export TURTLEBOT3_MODEL=burger
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/catkin_ws/src/Kogrob_HF/turtlebot3_hf/gazebo_models/
Ezzel készen is áll a szimulációnk a futtatásra. A roslaunch parancs segítségével el is indíthatjuk a szimulációt:
roslaunch turtlebot3_hf simulation_line_follow.launch
Egy másik terminálablakban szintén source-oljuk a ROS környezetet és az általunk használt catkin workspace-t
source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
Amennyiben még nem rendelkezünk python package installer-el akkor telepítsük:
sudo apt install python3-pip
Ha ezzel megvagyunk telepítsük fel a python script lefutásához szükséges package-ket.
python3 -m pip install tensorflow==2.9.2
Ebben a terminálablakban le is futtathatjuk a vonalkövetéshez készített scriptet:
rosrun turtlebot3_hf line_follower_cnn.py