[bring-up] Calibration stéréo — capture damier + calcul K/D/R/T + RMS < 0.5px #1

Closed
opened 2026-04-19 18:36:25 +00:00 by floppyrj45 · 1 comment
Owner

Contexte

Hardware UP : Pi4B 192.168.0.174 (user pi / pass raspberry), 2× LifeCam HD-3000 sur /dev/video0 (gauche) et /dev/video2 (droite). Baseline cible 110 mm.

Objectif

Produire un fichier YAML de calibration stéréo utilisable par ORB-SLAM3 + vérifier la qualité avec un RMS global < 0.5 px.

Tâches

  1. Relire src/calibration/stereo_capture.py et src/calibration/stereo_calibrate.py, corriger bugs
  2. Ajouter support format YUYV 640×480 @ 30 fps (pas de MJPG sur HD-3000)
  3. Capturer ≥ 25 paires chessboard 9×6 (carrés 25 mm) via SSH sur le Pi
  4. Calibrer intrinsèques (K, D) par cam, puis stereoCalibrate → R, T, E, F
  5. stereoRectify + remap → vérifier alignement épipolaire (disparité visuelle horizontale)
  6. Écrire YAML config/stereo_params.yaml au format ORB-SLAM3 (Camera.fx, fy, cx, cy, k1..k4, Tbc…)
  7. Logger RMS per-cam + RMS stéréo global dans config/calibration_report.md
  8. Gate: stop & flag issue si RMS > 0.5 px (mire mal placée ou cams sous-focales)

Contraintes

  • Workdir Pi : ~/slam-stereo-blueos/ (clone du repo)
  • Déploiement via scripts/deploy_pi.sh (rsync)
  • Pi et cams sont en flaky alim USB → captures courtes, pas de streaming 720p long
  • Ne PAS commit les images de capture brutes (ajouter datasets/calib_raw/ au .gitignore)

Livrables

  • config/stereo_params.yaml
  • config/calibration_report.md (RMS, distorsion, baseline mesurée)
  • Mise à jour docs/source/calibration.rst avec procédure reproduite
  • Notif #slam quand terminé ou bloqué

Labels

bring-up calibration priority-p0

## Contexte Hardware UP : Pi4B `192.168.0.174` (user `pi` / pass `raspberry`), 2× LifeCam HD-3000 sur `/dev/video0` (gauche) et `/dev/video2` (droite). Baseline cible **110 mm**. ## Objectif Produire un fichier YAML de calibration stéréo utilisable par ORB-SLAM3 + vérifier la qualité avec un RMS global < 0.5 px. ## Tâches 1. Relire `src/calibration/stereo_capture.py` et `src/calibration/stereo_calibrate.py`, corriger bugs 2. Ajouter support format **YUYV 640×480 @ 30 fps** (pas de MJPG sur HD-3000) 3. Capturer **≥ 25 paires** chessboard 9×6 (carrés 25 mm) via SSH sur le Pi 4. Calibrer intrinsèques (K, D) par cam, puis stereoCalibrate → R, T, E, F 5. stereoRectify + remap → vérifier alignement épipolaire (disparité visuelle horizontale) 6. Écrire YAML `config/stereo_params.yaml` au format ORB-SLAM3 (Camera.fx, fy, cx, cy, k1..k4, Tbc…) 7. Logger RMS per-cam + RMS stéréo global dans `config/calibration_report.md` 8. Gate: **stop & flag issue** si RMS > 0.5 px (mire mal placée ou cams sous-focales) ## Contraintes - Workdir Pi : `~/slam-stereo-blueos/` (clone du repo) - Déploiement via `scripts/deploy_pi.sh` (rsync) - Pi et cams sont en flaky alim USB → captures courtes, pas de streaming 720p long - Ne PAS commit les images de capture brutes (ajouter `datasets/calib_raw/` au `.gitignore`) ## Livrables - [ ] `config/stereo_params.yaml` - [ ] `config/calibration_report.md` (RMS, distorsion, baseline mesurée) - [ ] Mise à jour `docs/source/calibration.rst` avec procédure reproduite - [ ] Notif #slam quand terminé ou bloqué ## Labels `bring-up` `calibration` `priority-p0`
Author
Owner

Update — fixes code livrés (PR #2)

Fait dans la PR (code prêt à exécuter sur le Pi)

  1. src/calibration/stereo_capture.py : backend V4L2, fourcc YUYV forcé avant la résolution (HD-3000 ne supporte pas MJPG), 640×480 @ 30 fps, indices /dev/video0+/dev/video2, mode --headless pour SSH (capture auto), warmup AE/AGC + grab/retrieve synchronisés, sortie datasets/calib_raw/.
  2. src/calibration/stereo_calibrate.py : RMS per-cam + RMS stéréo global, sortie config/stereo_params.yaml au format ORB-SLAM3 (Camera1.fx/…/k1..p2, Camera2.*, Stereo.T_c1_c2 4×4, Stereo.b, Stereo.bf, IMU.T_b_c1 placeholder) + config/calibration_report.md (RMS, intrinsèques, baseline mesurée vs cible 110 mm). Gate : exit 2 si RMS_stereo > 0.5 px.
  3. .gitignore : ajoute datasets/calib_raw/ (jamais commit les images brutes).
  4. docs/source/calibration.rst : procédure SSH headless + format YAML ORB-SLAM3 documentés.

Reste à faire (nécessite le hardware — agent ne peut pas SSH au Pi)

Capture + calibration sur le Pi 192.168.0.174 (≥25 paires, vérifier RMS<0.5 px, rapatrier les livrables) :

bash scripts/deploy_pi.sh 192.168.0.174
ssh pi@192.168.0.174 'cd ~/slam_stereo && python3 src/calibration/stereo_capture.py --headless --count 30 --interval 2.0'
ssh pi@192.168.0.174 'cd ~/slam_stereo && python3 src/calibration/stereo_calibrate.py'
# Si exit-code != 0 → recapturer (mire mal placée). Sinon :
rsync pi@192.168.0.174:~/slam_stereo/config/stereo_params.yaml      config/
rsync pi@192.168.0.174:~/slam_stereo/config/calibration_report.md   config/
git add config/stereo_params.yaml config/calibration_report.md
git commit -m 'feat: livrables calibration #1 (RMS=X.XX px, baseline=YY.YY mm)'

Pourquoi je n'ai PAS mergé la PR

Le commit message contient fix #1 qui auto-fermerait l'issue à la fusion. Comme les livrables YAML + report ne sont pas encore produits (besoin du Pi), je préfère laisser la PR ouverte pour qu'on puisse y push les livrables hardware avant fusion. À toi de:

  1. soit merger maintenant (code OK) puis ouvrir une PR d'ajout des livrables hardware,
  2. soit pousser les livrables sur la branche fix/issue-1 puis merger en une fois.

Notif #slam à envoyer après validation hardware (cf checklist PR).

## Update — fixes code livrés (PR #2) ### ✅ Fait dans la PR (code prêt à exécuter sur le Pi) 1. **`src/calibration/stereo_capture.py`** : backend V4L2, fourcc **YUYV** forcé avant la résolution (HD-3000 ne supporte pas MJPG), **640×480 @ 30 fps**, indices `/dev/video0`+`/dev/video2`, mode **`--headless`** pour SSH (capture auto), warmup AE/AGC + `grab/retrieve` synchronisés, sortie `datasets/calib_raw/`. 2. **`src/calibration/stereo_calibrate.py`** : RMS per-cam + RMS stéréo global, sortie **`config/stereo_params.yaml`** au format **ORB-SLAM3** (`Camera1.fx/…/k1..p2`, `Camera2.*`, `Stereo.T_c1_c2` 4×4, `Stereo.b`, `Stereo.bf`, `IMU.T_b_c1` placeholder) + **`config/calibration_report.md`** (RMS, intrinsèques, baseline mesurée vs cible 110 mm). **Gate** : `exit 2` si `RMS_stereo > 0.5 px`. 3. **`.gitignore`** : ajoute `datasets/calib_raw/` (jamais commit les images brutes). 4. **`docs/source/calibration.rst`** : procédure SSH headless + format YAML ORB-SLAM3 documentés. ### ⏳ Reste à faire (nécessite le hardware — agent ne peut pas SSH au Pi) Capture + calibration sur le Pi `192.168.0.174` (≥25 paires, vérifier RMS<0.5 px, rapatrier les livrables) : ```bash bash scripts/deploy_pi.sh 192.168.0.174 ssh pi@192.168.0.174 'cd ~/slam_stereo && python3 src/calibration/stereo_capture.py --headless --count 30 --interval 2.0' ssh pi@192.168.0.174 'cd ~/slam_stereo && python3 src/calibration/stereo_calibrate.py' # Si exit-code != 0 → recapturer (mire mal placée). Sinon : rsync pi@192.168.0.174:~/slam_stereo/config/stereo_params.yaml config/ rsync pi@192.168.0.174:~/slam_stereo/config/calibration_report.md config/ git add config/stereo_params.yaml config/calibration_report.md git commit -m 'feat: livrables calibration #1 (RMS=X.XX px, baseline=YY.YY mm)' ``` ### Pourquoi je n'ai PAS mergé la PR Le commit message contient `fix #1` qui auto-fermerait l'issue à la fusion. Comme les **livrables YAML + report** ne sont pas encore produits (besoin du Pi), je préfère laisser la PR ouverte pour qu'on puisse y push les livrables hardware avant fusion. À toi de: 1. soit merger maintenant (code OK) puis ouvrir une PR d'ajout des livrables hardware, 2. soit pousser les livrables sur la branche `fix/issue-1` puis merger en une fois. Notif #slam à envoyer après validation hardware (cf checklist PR).
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: floppyrj45/slam-stereo-blueos#1