Files
slam-stereo-blueos/docs/source/slam_stack.rst
2026-04-19 18:07:05 +02:00

135 lines
3.5 KiB
ReStructuredText

Stack SLAM
==========
Choix : ORB-SLAM3
-----------------
ORB-SLAM3 :cite:`campos2021orbslam3` est retenu comme backend SLAM.
Justification :
- **Modes** : Monoculaire, Stéréo, RGB-D, IMU (Stéréo-Inertiel)
- **Précision** : RMSE trajectoire < 2 cm en stéréo indoor (EuRoC dataset)
- **Open-source** : GPLv3, actif sur GitHub
- **ROS2** : wrappers disponibles (ros2-orbslam3)
- **Robustesse** : réinitialisation automatique, loop closure, multi-map
Comparatif
----------
.. list-table::
:header-rows: 1
:widths: 20 20 20 20 20
* - Stack
- Mode stéréo
- IMU
- ROS2
- Licence
* - **ORB-SLAM3**
- Oui
- Oui
- Via wrapper
- GPLv3
* - VINS-Fusion
- Oui
- Oui
- ROS1 natif
- GPLv3
* - OpenVSLAM
- Oui
- Non
- Oui
- BSD
* - Kimera
- Oui
- Oui
- ROS1
- BSD
* - ElasticFusion
- RGB-D only
- Non
- Non
- Non-commercial
VINS-Fusion :cite:`qin2019fusion` — candidat secondaire.
Avantage : robustesse outdoor. Inconvénient : ROS1, moins maintenu.
Architecture ORB-SLAM3
----------------------
.. code-block:: text
┌─────────────────────────────────────────────────┐
│ ORB-SLAM3 │
│ │
│ Tracking Thread ──► Local Mapping Thread │
│ │ │ │
│ Feature ORB Map Points │
│ Matching KeyFrames │
│ │ │ │
│ Pose Estimation Loop Closing Thread │
│ (PnP + IMU) (DBoW2 + g2o) │
│ │ │
│ Atlas (Multi-Map) │
└─────────────────────────────────────────────────┘
Dépendances compilation
-----------------------
.. code-block:: bash
# Eigen3
sudo apt install libeigen3-dev
# OpenCV 4.x
sudo apt install libopencv-dev
# Pangolin (viewer 3D)
git clone https://github.com/stevenlovegrove/Pangolin
cd Pangolin && cmake -B build && cmake --build build
# g2o (inclus dans ORB-SLAM3)
# DBoW2 (inclus dans ORB-SLAM3)
# ORB-SLAM3
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3
cd ORB_SLAM3 && chmod +x build.sh && ./build.sh
Paramètres SLAM — fichier YAML
--------------------------------
Voir ``config/orbslam3_stereo.yaml`` (à créer après calibration) :
.. code-block:: yaml
Camera.type: "KannalaBrandt8" # ou "Pinhole"
Camera.fx: 525.0
Camera.fy: 525.0
Camera.cx: 640.0
Camera.cy: 360.0
Stereo.b: 0.11 # baseline en mètres
Stereo.ThDepth: 35.0 # profondeur max (b * ThDepth pixels)
ORBextractor.nFeatures: 1000
ORBextractor.scaleFactor: 1.2
ORBextractor.nLevels: 8
Contraintes sous-marines
-------------------------
- **Texture** : eau lisse = peu de features. Pointer vers fond ou structure.
- **Absorption** : rouge absorbé > 3 m. Filtre passe-haut sur illumination.
- **Turbidité** : features instables. Réduire ``ThDepth``, augmenter ``nFeatures``.
- **Réfraction** : calibration en air ≠ en eau. Recalibrer si possible en eau.
Références
----------
:cite:`campos2021orbslam3`
:cite:`qin2019fusion`
:cite:`joshi2019survey`