Mise En Route D’ORB-SLAM3 En Mode Monoculaire Sous ROS2 Pour Un Environnement Indoor Sur Raspberry Pi 4

by mbarkkabous999 in Circuits > Robots

51 Views, 0 Favorites, 0 Comments

Mise En Route D’ORB-SLAM3 En Mode Monoculaire Sous ROS2 Pour Un Environnement Indoor Sur Raspberry Pi 4

ima.png

La localisation et la cartographie simultanées (SLAM — Simultaneous Localization and Mapping) sont devenues des composantes essentielles dans les systèmes intelligents modernes, notamment en robotique mobile, en réalité augmentée, et en navigation autonome. Le SLAM permet à un robot ou à un dispositif embarqué de se localiser dans un environnement inconnu tout en construisant une carte cohérente de ce dernier.

Parmi les différentes approches, le SLAM visuel monoculaire, qui repose uniquement sur une caméra, offre une solution légère et économique, particulièrement adaptée aux plateformes embarquées à ressources limitées. Toutefois, ce type de SLAM présente des défis spécifiques tels que l’estimation de l’échelle absolue, la sensibilité aux variations de lumière et le besoin d’une calibration précise de la caméra.

Dans ce contexte, ORB-SLAM2, un système de SLAM visuel open-source, s’impose comme une référence. Il repose sur des descripteurs visuels ORB robustes et propose une estimation précise de la pose de la caméra ainsi qu’une reconstruction 3D de l’environnement. L’intégration d’ORB-SLAM2 dans l’écosystème ROS2 permet de bénéficier d’une architecture modulaire, interopérable et orientée robotique, favorisant ainsi son déploiement dans des systèmes réels.

Ce tutoriel explique comment installer, configurer et exécuter ORB-SLAM2 en mode monoculaire dans un environnement ROS2. ORB-SLAM2 est un système de SLAM visuel performant qui permet de se localiser tout en construisant une carte de l’environnement.

Supplies

14.jpg
13.jpg
mat (1).jpeg

Matériel Utilisé

  1. Raspberry Pi 4 Modèle B (8GB) → Cœur du système embarqué
  2. Écran + Souris + Clavier → Débogage avec rqt_graph et visualisation RViz2
  3. Carte SD (32GB+) → Installation du système (Ubuntu 22.04 / ROS 2 Humble)
  4. Alimentation stable (5V/3A)
  5. Camera RGB logitech C920

Install Pangolin V6

pango.png

Il est important de noter qu’ORB-SLAM3 est particulièrement exigeant en ressources, ce qui peut poser des contraintes lors de son exécution sur une plateforme comme le Raspberry Pi 4. En plus de la charge de calcul, ce système requiert également plusieurs bibliothèques tierces spécifiques, notamment pour l’affichage et la visualisation.

Dans ce contexte, la bibliothèque Pangolin version 0.6 constitue un choix adapté, car elle offre une compatibilité stable avec ORB-SLAM2 tout en étant plus légère que les versions ultérieures.

  1. Installation des dépendances nécessaires
sudo apt update
sudo apt install cmake g++ libglew-dev libpython3-dev \
libeigen3-dev ffmpeg libjpeg-dev libpng-dev libtiff-dev \
libgl1-mesa-dev libxkbcommon-dev libxcb-xkb-dev libxi-dev \
libxxf86vm-dev libxrandr-dev libxinerama-dev libxcursor-dev \
libboost-dev
  1. Compilation de Pangolin 0.6:
cd ~/Pangolin-0.6
mkdir build
cd build
cmake ..
make -j$(nproc)

Install OPENCV

ver.png

L'installation de la bibliothèque OpenCV est une étape essentielle, car elle est nécessaire au bon fonctionnement du projet.

sudo apt update
sudo apt install libopencv-dev python3-opencv

Vérification de l'installation :


pkg-config --modversion opencv4

"Il est recommandé d’utiliser OpenCV 4.5.4 pour une meilleure expérience avec ORB-SLAM3.

Verifie Le Compilateur G++ Et Cmake

ver1.png

Ce projet nécessite une version de g++ ≥ 11. Toute version inférieure est incompatible et entraînera des erreurs de compilation.

g++ --version

Et un Cmake ≥ 3.5 a verifier.

cmake --version

Installer Eigen

ver2.png

Eigen est une bibliothèque C++ de matrices et de calculs linéaires qui offre une interface efficace et facile à utiliser pour la manipulation de vecteurs, matrices, et autres objets mathématiques. Elle est largement utilisée dans des projets de calcul scientifique, de robotique, de vision par ordinateur, et de SLAM, notamment en raison de sa rapidité et de son efficacité, installer eigen via apt:

sudo apt update
sudo apt install libeigen3-dev

Puis vérifier que Eigen a bien été install:

dpkg -s libeigen3-dev


DBoW2 Et G2o (Inclus Dans Le Dossier Thirdparty)

DBoW2 est une bibliothèque pour la gestion de Bag of Words (BoW), qui est un modèle couramment utilisé dans les systèmes de reconnaissance de formes et de SLAM. Cette bibliothèque permet de créer une base de données de "mots visuels" extraits d'images, qui sont ensuite utilisés pour la localisation et la reconnaissance de scènes dans les algorithmes de SLAM, la compilation de DBoW2 est faite via:

cd Thirdparty/DBoW2
mkdir build
cd build
cmake ..
make -j$(nproc)

g2o est une bibliothèque d'optimisation utilisée pour résoudre des problèmes d'optimisation dans les graphes. Elle est largement utilisée dans les systèmes de SLAM et de localisation pour minimiser les erreurs d'estimation, comme dans le cas des poses de caméra et des points 3D, son compilation est faite par la commande:

cd Thirdparty/g2o
mkdir build
cd build
cmake ..
make -j$(nproc)

Installer Sophus

Screenshot 2025-05-15 101059.png

ORB-SLAM3 repose sur Sophus, une bibliothèque C++ qui implémente les groupes de Lie utilisés pour les transformations géométriques (SO(3), SE(3), etc.). Son installation est indispensable pour compiler correctement le SLAM.

  1. Installer les dépendances requises:
sudo apt-get update
sudo apt-get install libeigen3-dev cmake
  1. Cloner le dépôt Sophus :
git clone https://github.com/strasdat/Sophus.git
cd Sophus
  1. Construire et installer Sophus :
mkdir build && cd build
cmake ..
make -j1
sudo make install

La commande make -j1 est faite pour réduire le nombre de cœurs utilisés pendant la compilation (1 cœur) permet de limiter la charge mémoire,

Installer Boost

Boost est une collection de bibliothèques C++ très utilisées dans les projets complexes pour des fonctionnalités telles que les structures de données, la gestion des threads, les mathématiques, etc.

Installation via les paquets Ubuntu:

sudo apt-get update
sudo apt-get install libboost-all-dev

Pour la majorité des projets ROS2 (et ORB-SLAM3), la version disponible dans les dépôts Ubuntu est suffisante.

Compilation Du Projet ORB-SLAM3

unnamed.png
vvvv.png
  1. Téléchargement du code source d’ORB-SLAM2:
git clone https://github.com/raulmur/ORB_SLAM3.git
cd ORB_SLAM3
  1. Avant de commencer la compilation, il est important de créer un répertoire de construction pour séparer les fichiers sources et les fichiers générés. Utilise les commandes suivantes pour le faire :
mkdir build
cd build
  1. Configuration avec CMake
cmake ..
  1. Compilation du projet:
make -j$(nproc)

Cette commande utilise tous les cœurs du processeur disponibles (nproc renvoie le nombre de cœurs). Cela permet une compilation plus rapide sur des machines puissantes.

  1. Remarque importante pour les plateformes embarquées comme le Raspberry Pi 4

Sur une plateforme embarquée telle que le Raspberry Pi 4, il est important de gérer correctement la mémoire, notamment en activant le swapping.

Le swapping consiste à utiliser une partie du stockage (carte SD ou SSD) comme mémoire virtuelle lorsque la RAM est saturée. Cela évite les plantages pendant des opérations gourmandes, comme la compilation de gros projets.

Sur des modèles de Raspberry Pi avec moins de 8 Go de RAM, le manque de mémoire peut provoquer l'arrêt du système ou un échec de compilation.

Dans notre cas, nous utilisons un Raspberry Pi 4 avec 8 Go de RAM, ce qui est généralement suffisant pour compiler ORB-SLAM3. Cependant, nous avons observé que le système cesse de répondre à environ 66 % de la compilation lorsque la commande make -j4 est utilisée. Cela est dû à la charge de calcul élevée et à la consommation mémoire liée à l'utilisation des 4 cœurs en parallèle.

  1. Solution:

Réduire le nombre de cœurs utilisés pendant la compilation permet de limiter la charge mémoire :

make -j1

La compilation de la bibliothèque et des exemples doit être effectuée après chaque modification du code.

Pour les architectures inferieur a 8GB, augmenter le swapp suivant:

sudo fallocate -l 8G /swapfile

# Set swap file permissions:
sudo chmod 600 /swapfile

# Enable the swap file:
sudo mkswap /swapfile
sudo swapon /swapfile

# Verify swap:
swapon --show

# Make it permanent by adding to /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Préparer Le Fichier De Configuration Vocabulaire

ssssssss.png

ORB-SLAM3 utilise un vocabulaire binaire basé sur Bag-of-Words (BoW) pour la relocalisation et la détection de boucles.

Le fichier ORBvoc.bin (format binaire ~40 Mo) n’est souvent pas inclus par défaut, donc le télécharger manuellement est essentiel:

cd ~/ORB-SLAM3/Vocabulary
wget https://github.com/UZ-SLAMLab/ORB_SLAM3/releases/download/v1.0/ORBvoc.bin


Préparer Le Fichier De Calibration De La Camera C920

camera-calibration-focal-point.png

Une calibration correcte est essentielle pour garantir une performance précise du SLAM.

Nous utilisons le modèle sténopé (Pinhole) comme base théorique.

Ce modèle est l’un des fondements de la vision par ordinateur pour représenter la formation d’une image à partir d’une scène 3D.

La correction de la distorsion est indispensable pour assurer une correspondance précise entre les points du monde réel et leurs projections sur l’image.

Paramètres de calibration de la Logitech C920:

File.version: "1.0"
2
3 Camera.type: "PinHole"
4
5 # Camera calibration and distortion parameters (OpenCV)
6 Camera1.fx: 517.306408
7 Camera1.fy: 516.469215
8 Camera1.cx: 318.643040
9 Camera1.cy: 255.313989
10
11 Camera1.k1: 0.262383
12 Camera1.k2:-0.953104
13 Camera1.p1:-0.005358
14 Camera1.p2: 0.002628
15 Camera1.k3: 1.163314
16
17 # Camera frames per second
18 Camera.fps: 20
19
20 # Color order of the images (0: BGR, 1: RGB. It is ignored if images are
grayscale)
21 Camera.RGB: 1
22
23 # Camera resolution
24 Camera.width: 640
25 Camera.height: 480

Préparer Le Fichier De Configuration Des Parametres Orb

Le fichier de configuration YAML contient les paramètres clés pour l’extraction des caractéristiques ORB. Ces paramètres influencent directement la qualité de la détection des points clés, la robustesse du suivi, et la performance du SLAM.


# Nombre de caractéristiques ORB à extraire par image
ORBextractor.nFeatures: 1000

# Échelle maximale entre les niveaux de l'octave pyramidale
ORBextractor.scaleFactor: 1.2

# Nombre de niveaux dans la pyramide
ORBextractor.nLevels: 8

# Seuil FAST pour les caractéristiques de niveau initial (fort)
ORBextractor.iniThFAST: 20

# Seuil FAST pour les caractéristiques restantes (faible)
ORBextractor.minThFAST: 7

Ou:

  1. nFeatures : nombre de points clés ORB à détecter par image. Plus ce nombre est élevé, plus le traitement est coûteux mais précis.
  2. scaleFactor : facteur d’échelle entre chaque niveau de la pyramide. Typiquement entre 1.2 et 1.5.
  3. nLevels : nombre de niveaux dans la pyramide d’échelle. Plus il y a de niveaux, plus la détection est robuste aux changements d’échelle.
  4. iniThFAST et minThFAST : seuils pour l’algorithme FAST utilisé pour la détection des coins. Le seuil initial est utilisé en priorité, si trop peu de coins sont détectés, le seuil minimal est utilisé.

Creation Rosbag2 Dans ROS 2 : Enregistrement Et Lecture Des Données

ddd.png

rosbag est un outil essentiel de l’écosystème ROS permettant d’enregistrer et de rejouer les messages publiés sur les différents topics du système. Il est couramment utilisé pour la collecte de données, le débogage, ainsi que pour l’évaluation hors ligne des algorithmes de perception et de localisation.

Dans ROS 2, rosbag2 remplace le système classique avec une architecture plus modulaire. Par défaut, les données sont stockées dans une base de données SQLite3, ce qui permet une consultation plus flexible et performante via des requêtes SQL. Cette approche facilite l’analyse, le filtrage et l’extraction des informations pertinentes, sans nécessiter de conversion intermédiaire.

Grâce à cette intégration, il est possible d’interroger directement les données d’un fichier .db3, rendant l’exploitation des fichiers rosbag bien plus rapide et structurée.

Commande d'enregistrement utilisée :

ros2 bag record -o camera_walkthrough /anafi/camera/image

Le topic /anafi/camera/image correspond aux images publiées en temps réel par le package video_capture, à travers le nœud video_publisher présenté précédemment.

Vous pouvez toujours cloner ce package via la commande suivante :

git clone https://github.com/Mbarek999/ros2_tuto.git

Après l’avoir intégré dans votre espace de travail ROS 2 à l’aide de colcon, vous pouvez l’exécuter avec :

ros2 run video_capture_node video_capture_node

Installer Octomap

OctoMap est une bibliothèque open-source permettant de générer des cartes d’occupation 3D à partir de capteurs comme les caméras RGB-D, stéréo ou LiDAR. Sous ROS 2, l'installation du serveur OctoMap (octomap_server) est nécessaire pour publier une grille d’occupation en temps réel.

  1. Installez les dépendances nécessaires :
sudo apt update
sudo apt install ros-humble-octomap ros-humble-octomap-msgs ros-humble-octomap-server
  1. Vérifiez l’installation :
ros2 run octomap_server octomap_server_node
  1. Vous devriez voir les logs de lancement du nœud octomap_server_node et les topics suivants :
ros2 topic list


Integration Dans Espace ROS2 Humble Wrapper

Un nœud ROS 2 spécifique a été développé pour encapsuler le système ORB-SLAM3.

Ce nœud assure plusieurs fonctions essentielles dans la chaîne de traitement SLAM :

  1. Capture vidéo depuis un fichier rosbag.
  2. Traitement des images en temps réel via le pipeline ORB-SLAM3.
  3. Publication des sorties principales sur des topics ROS 2 standard, notamment :
  4. La pose de la caméra (geometry_msgs/msg/PoseStamped),
  5. Les points de la carte 3D (sensor_msgs/msg/PointCloud2),
  6. Les images de suivi et de détection des features, utiles pour le débogage (sensor_msgs/msg/Image),
  7. Les frames clés et graphes de covisibilité, si activés.

Le wrapper ROS2 utiliser est le suivant:

mkdir -p ~/ros2_pose/src
cd ~/ros2_pose/src
git clone https://github.com/ozandmrz/orb_slam3_ros2_mono_publisher.git
cd ~/ros2_pose
rosdep install --from-paths src --ignore-src -r -y
colcon build
echo "source ~/ros2_pose/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

Ce nœud facilite l'intégration transparente d’ORB-SLAM3 dans un écosystème ROS 2, permettant une exploitation directe dans des applications de navigation, visualisation RViz2, ou cartographie 3D avec des outils comme octomap_server.

Visualisation Et Test

rosgraph.png

La visualisation est effectuée dans le visualiseur RViz2, où les résultats du SLAM peuvent être testés et évalués en temps réel. Ce test permet d’afficher :

  1. La trajectoire estimée de la caméra (chemin en temps réel),
  2. Les points de carte reconstruits (point cloud),
  3. L’image avec les points ORB détectés et les suivis actifs,
  4. Les frames clés insérées dans la carte (KeyFrames).

Pour lancer RViz2 avec la configuration adaptée, on peut utiliser :

rviz2 -d /home/robot/ros_ws/src/orb_slam3_ros2_mono_publisher/your_config.rviz

Verification Et Validation

Occupancy-Grid-Map-of-multiple-spaces-stitched-into-a-common-map.png

Vérification et validation sont effectuées en sortie à travers la grille d’occupation (occupancy grid) générée par OctoMap, permettant de visualiser la carte 3D reconstruite et le chemin estimé suivi par la caméra.

Cette étape permet de confirmer :

  1. La cohérence spatiale entre la trajectoire de la caméra et les obstacles détectés,
  2. La qualité de la reconstruction de l’environnement intérieur,
  3. La validité du SLAM en comparant les points d’intérêt (landmarks) détectés avec la réalité physique de la scène.

L’OctoMap Server publie la grille d’occupation via le topic : /octomap_full

La visualisation se fait dans RViz2 en important ce topic, ainsi que celui de la trajectoire estimée (/orbslam3/pose) pour une évaluation visuelle complète.