Skip to content

Autonomous Driving behaviour for a 4 wheel drive robot vehicle using AI and ROS to drive autonomously in a scaled city

Notifications You must be signed in to change notification settings

idwessough/autonomous-driving

Repository files navigation

Navigation de véhicules en milieu urbain

auteurs : Idwes Sough, Arthur Saunier, Younes Abouchi

Objectifs

Faire naviguer des véhicules (Turtlebot + Limo) dans un environnement urbain (route, feu, piétons, signalisation, ...) en respectant sa réglementation (laisser)

Introduction

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 : alt text

Le Limo est compatible ROS2 avec les différentes caractéristiques hardware suivantes : alt text lower size of image

alt text alt textalt text alt text alt text alt text

Fonctionnalités spécifique au projet :

  • 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)
    • 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

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.

Listes des fonctionnalités :

  1. Un conteneur docker contenant :
    1. Un réseau de neurone YOLO/Darknet
      1. Reconnaissance panneaux
      2. Reconnaissance personnage
      3. Reconnaissance signalisation lumineuse de feux tricolores
      4. Reconnaissance d'objets hautement sensibles (ex poussette)
    2. ROS nodes
      1. Flux vidéos en entrée (rgb depth)
      2. YOLO Darknet
      3. Post-traitement
      4. Line follower
    3. Docker
      1. Docker ROS2 PC
      2. Docker ROS1 PC
      3. Docker Reseau
      4. Docker Limo ROS2
      5. Docker Limo ROS1
      6. Launch global via docker-compose

Technologies

  • ROS
  • Python
  • darknet/TF
  • Docker

SPRINT 1

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.

Installation de Darknet

Installation de CUDA

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)

Demo avec camera pc

./darknet detector demo YOLOV3_YCB_tiny/ycb.data YOLOV3_YCB_tiny/yolov3-tiny-traffic.cfg YOLOV3_YCB_tiny/backup/yolov3-tiny-traffic.weights

On Limo:

  • 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``

SPRINT 2

Noeuds ROS:

Noeud nav_limo

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]

Noeud Line_follower

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)

Noeud Sign_detection

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

Description fonctionnement complet

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

Description fonctionnement state machine, reception /action

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

Liste des dépendances et pré-requis

  • Package ROS-darknet lien
  • Package Limo ROS1 lien
  • Package Limo ROS2 lien
  • Doc du limo lien

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.

Procédure de mise en route

Suivre ce lien

Liens vidéos