auteurs : Idwes Sough, Arthur Saunier, Younes Abouchi
Faire naviguer des véhicules (Turtlebot + Limo) dans un environnement urbain (route, feu, piétons, signalisation, ...) en respectant sa réglementation (laisser)
Le projet consiste à faire naviguer un véhicule dans un environnement urbain. Le véhicule devra respecter les règles de circulation et les règles de priorité. Il devra également être capable de détecter les panneaux de signalisation et les feux tricolores.[copil]
Les moyens mis en place pour atteindre cet objectif sont les suivants :
- Un véhicule mobile équipé Limo (voir ici pour plus d'informations)
- Un ordinateur de DeepLearning (CUDA GPU) pour l'entraînement du réseau de neurones ainsi que ces inférences durant toute la durée de la navigation du robot autonome.
Le Limo est compatible avec le grand framework de robotique ROS (Robot Operating System) et sa montée de version ROS2, l'objectif est de piloter ce robot Limo de la marque Agilex au sein d'une map de type Smart City comme illustré ci-dessous :
Le Limo est compatible ROS2 avec les différentes caractéristiques hardware suivantes : lower size of image
- Fonctionnelles :
- Un réseau de neurone dont les inférences tournent sur GPU CUDA (configuré pour RTX 2070 Super et RTX 3090?):
- Classe requises :
- Tous les panneaux fournis (jouets)
- Tous les personnages fournis (jouets)
- Signalisation lumineuse (état des feux tricolores)
- Objets sensibles (poussette chien)
- Classe requises :
- Un noeud ROS avec :
- en entrée : un flux vidéo (caméra)
- un traitement pour définir le déplacement du robot:
- Réseau de neurone
- Post-traitement, par exemple l'état du feu (roue, vert, orange)
- en sortie : à minima une commande en vélocité du robot, mais idéalement un client d'action lié à la couche de navigation du robot
- Un réseau de neurone dont les inférences tournent sur GPU CUDA (configuré pour RTX 2070 Super et RTX 3090?):
La solution dockerisée devra pouvoir tourner indépendamment sur un Agilex Limo (sur Jetson Nano à 5FPS ou 7FPS ou à 37FPS sur un PC Predator (RTX 2070 Super & i7 10th) voir 120FPS avec 2 RTX 3090 en SLI)
Le projet nécessite de maquetter une route, en collaboration avec un autre projet de Smart City consistant à la synchronisation de feux tricolores de signalisation lumineuse par le biai d'une LED par couleur à detecter et prendre en compte dans la conduite autonome.
- Un conteneur docker contenant :
- Un réseau de neurone YOLO/Darknet
- Reconnaissance panneaux
- Reconnaissance personnage
- Reconnaissance signalisation lumineuse de feux tricolores
- Reconnaissance d'objets hautement sensibles (ex poussette)
- ROS nodes
- Flux vidéos en entrée (rgb depth)
- YOLO Darknet
- Post-traitement
- Line follower
- Docker
- Docker ROS2 PC
- Docker ROS1 PC
- Docker Reseau
- Docker Limo ROS2
- Docker Limo ROS1
- Launch global via docker-compose
- Un réseau de neurone YOLO/Darknet
- ROS
- Python
- darknet/TF
- Docker
Labélisation des images pour entraînement du réseau de neurones YOLO/Darknet avec Dataset personnalisé (panneaux, personnages, feux tricolores, objets sensibles) liés à la Smart City du use case.
Choix de Yolo/Darknet car c'est un réseau de neurones très performant et rapide pour la détection d'objets étant également open source et implémentable dans le framework ROS. Les ajustements de paramètres du réseau de neurones sont réalisés sur un PC avec GPU CUDA (RTX 2070 Super) et les inférences sont réalisées sur un Limo avec GPU CUDA (Jetson Nano) dans un premier temps.
sudo apt-get install nvidia-cuda-toolkit
(Bien vérifier la disponibilité et la compatibilité de version CUDA avec votre GPU https://developer.nvidia.com/cuda-downloads)
./darknet detector demo YOLOV3_YCB_tiny/ycb.data YOLOV3_YCB_tiny/yolov3-tiny-traffic.cfg YOLOV3_YCB_tiny/backup/yolov3-tiny-traffic.weights
-
Lancer
roscore
-
Lancer LIDAR
roslaunch limo_bringup limo_start.launch pub_odom_tf:=false
-
Lancer caméra
roslaunch astra_camera dabai_u3.launch
-
lancer nav (après avoir mapper l'environnement)
roslaunch limo_bringup limo_navigation_ackerman.launch
-
Lancer ROSCore de Limo
rosrun web_video_server web_video_server
-
Vérifier la présence de Topic suivant avec :
rostopic list
/camera/rgb/image_raw
/camera/depth/image_raw
rostopic echo /camera/depth/camera_info
(pour vérifier la bonne récéption des données de profondeur)
- modifier CUDA version dans MakeFile
NVCC=/usr/local/cuda-11.8/bin/nvcc
./darknet detector demo YOLOV3_YCB_tiny/ycb.data YOLOV3_YCB_tiny/yolov3-tiny-traffic.cfg YOLOV3_YCB_tiny/backup/yolov3-tiny-traffic.weights http://localhost:8080/stream?topic=/camera/rgb/image_raw``
graph LR
T1(Sign detection) -- /limo_action --> Node((nav_limo_projet))
T2(Line follower) -- /limo_twist --> Node((nav_limo_projet))
Node -- /cmd_vel -->D[limo base]
graph LR
S1[Camera pkg] -. /camera/rgb/image_rect_color .-> Node((line_follower))
Node -- /limo_twist -->D(nav_limo_projet)
Node -- /line_follower/processed_image -->R(rviz)
graph LR
T1(darknet_ros) -- /darknet_ros/bounding_boxes --> Node((sign_detection))
S1[Camera pkg] -. /camera/depth/image_raw .-> Node((sign_detection))
Node -- /limo_action -->D(nav_limo_projet)
Node <-- /tf --> TF[[/tf_sign_to_odom_broadcaster]]
TF <-- /tf --> D
sequenceDiagram
participant dabai_a3
participant darknet_ROS
participant sign_detection
participant nav_limo
participant line_follower
participant limo_bringup
dabai_a3->darknet_ROS: /camera
darknet_ROS-->sign_detection: /darknet_ros/bounding_boxes
loop sign location
sign_detection->sign_detection: sign location computation and tf broadcast
end
sign_detection-->nav_limo: /limo_action
line_follower-->nav_limo: /limo_twist
loop state machine
nav_limo->nav_limo: Check action tag and act accordingly
end
nav_limo-->limo_bringup: /cmd_vel
sequenceDiagram
participant sign_detection
participant nav_limo
participant limo_bringup
critical State Machine
sign_detection-->>nav_limo: /limo_action
option Action = STOP
nav_limo->nav_limo: Check tf /STOP in /baseLink t get distance
option Distance euclidienne < 0.6
nav_limo-->>limo_bringup: /cmd_vel x.linear =0
option Timeout 3sec
nav_limo-->>limo_bringup: /cmd_vel x.linear =0.15
end
Darknet ROS fonctionnel sur triton 1 et sur triton 9 (dossier ROS1_ws sur bureau) Problème de publish de topic sur le triton 1 observé jeudi matin. Pas réussi a la régler.
Sur le limo utilisé (etiquette limo nav autonome):
- conf docker modifié, sauvegarde des images et conteneur déplacé sur la carte SD
- Docker ROS2 présent sur carte SD également, possiblité d'utiliser le script bash présent ds le workspace pour le lancer.
- Le script de lancement ROS2 docker réalisé par agilex, mais corrigée par notre groupe pour permettre son fonctionnement. Explication supplémentaire dispo sur le git limo_ros2 de agilex.
Suivre ce lien