Table des matières

Installation Cslam

mkdir ~/CSLAM/
cd ~/CSLAM/
git clone ssh://<username>@trac.laas.fr/git/robots/embedded-vision.git

cslam multi-thread est dans : projects/sw/eslam-mt

cd embedded-vision/projects/sw/eslam-mt/

Récupération de la séquence parking LAAS tronquée (250MO)

cd ~
wget http://homepages.laas.fr/pagohard/files/parking_laas.zip
unzip parking_laas.zip
rm  parking_laas.zip

pour traiter la séquence

./CslamMt  ../config_example.yaml 

voir sauvegarde pour utilisation de rdfind

Dans un dossier qui contient plusieurs fois les mêmes fichiers, en gardant les fichiers originaux de ./parking_laas/ et en remplaçant les autres par des symlinks:

cd /media/HD500GO/CSLAM
rdfind ./parking_laas/ ./pgm/  -makesymlinks true -dryrun true 

vérifier que les propositions sont correctes, puis pour les appliquer:

rdfind ./parking_laas/ ./pgm/  -makesymlinks true 

Gestion avec QTCreator

fichier qt.pro et qt.pro.user dans ~/CSLAM/embedded-vision/projects/sw/eslam-mt/Qt

cd ~/CSLAM/embedded-vision/projects/sw/eslam-mt/Qt
qtcreator qt.pro &

pour générer le makefile et compiler sans qtcreator

cd ~/CSLAM/embedded-vision/projects/sw/eslam-mt/Qt
qtmake  
make

En cas d'ouverture avec QT5, il faut mettre en projets→Run→Arguments le nom du fichier yaml de configuration et décocher l'option Shadow build

Dans QTcreator, pour accélérer la compilation et tenir compte du multi processeur, ajouter -j2 comme argument de make (pour 2 coeurs et donc 2 make en parallèle)

Problème de barre de menu qui a disparu avec QT5

ajouter ddans ~/.bashrc

unset QT_QPA_PLATFORMTHEME

Pour utiliser une version de opencv non installee dans le root file system

ajouter a ~/.bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dtertei/opencv-2.4.9/build/lib

dans qt.pro ajouter:

INCLUDEPATH += /home/dtertei/opencv-2.4.9/modules/highgui/include/
INCLUDEPATH += /home/dtertei/opencv-2.4.9/modules/core/include/
INCLUDEPATH += /home/dtertei/opencv-2.4.9/modules/imgproc/include/
QMAKE_LFLAGS *= -L/home/dtertei/opencv-2.4.9/build/lib

TODO

  1. Faire des générateurs de nombres aléatoires pour pouvoir rejouer cslam avec les mêmes donnees 1 séquence par thread au moins → NON finalement, on fait une version non multithreadée et il suffit de démarrer avec une unique graine
  2. Observer le fichier gmon.out (créé à la fin de l’exécution de cslam) pour déterminer quelles sont les parties du code inutile
  3. Faire une liste des conditions d'utilisation (archi, hors/en ligne, type de capteurs, ros/non…)
  4. Permettre l'envoi des données via des noeuds ros et la diffusion des résultats aussi: Question est ce que l'on rossifie cslam (avec eventuellement des #define pour virer cette partie du code ) ou est ce que l'on fait une diffusion (par exemple via socket) vers une autre appli qui est un noeud ros et qui fait le lien…?
  5. Lister les caractéristiques de cslam, notamment celles qui sont paramétrables.
  6. Lister les limitations inhérentes à cslam.
  7. Lister ce qu'il faudrait améliorer et gérer une liste des priorités
  8. Gérer le projet qt pour régler les options dans qt.pro.shared: http://doc.qt.io/qtcreator/creator-sharing-project-settings.html

profilage

valgrind

Use valgrind to check from where the problem can come…. As expected there are PLENTY of memory leaks:

valgrind -v  --leak-check=full --track-origins=yes --show-reachable=yes ./CslamMt ../config_example.yaml

gprof

outils pour la génération de graphique: https://github.com/jrfonseca/gprof2dot

Installation depuis les paquets:

sudo apt-get install gprof2dot

Sinon, installation manuelle:

mkdir -p ~/tmp/gprof2dot
cd ~/tmp/gprof2dot
git clone https://github.com/jrfonseca/gprof2dot.git
cd gprof2dot/
sudo apt-get install python-setuptools

utilisation: http://codeyarns.com/2013/06/24/how-to-visualize-profiler-output-as-graph-using-gprof2dot/

cd ~/CSLAM/embedded-vision/projects/sw/eslam-mt/Qt
qmake && make clean && make
rm gmon.out
./CslamMt ../config_example.yaml 

The program has to close correctly and a gmon.out file has to be created in the current directory

gprof -zc CslamMt gmon.out > analysis.txt
gedit analysis.txt &
gprof CslamMt | ~/tmp/gprof2dot/gprof2dot/gprof2dot.py > gmon.dot
dot gmon.dot -Tpng -o gmon.png
dot -Tps gmon.dot -o gmon.pdf
evince gmon.pdf 

Détermination des fonctions jamais appelées:

gprof
     "-z"
     "--display-unused-functions"
         If you give the -z option, "gprof" will mention all functions in
         the flat profile, even those that were never called, and that had
         no time spent in them.  This is useful in conjunction with the -c
         option for discovering which routines were never called.
     "-c"
     "--static-call-graph"
         The -c option causes the call graph of the program to be augmented
         by a heuristic which examines the text space of the object file and
         identifies function calls in the binary machine code.  Since normal
         call graph records are only generated when functions are entered,
         this option identifies children that could have been called, but
         never were.  Calls to functions that were not compiled with
         profiling enabled are also identified, but only if symbol table
         entries are present for them.  Calls to dynamic library routines
         are typically not found by this option.  Parents or children
         identified via this heuristic are indicated in the call graph with
         call counts of 0.

gcov et lcov

sudo apt-get install lcov gcov

http://alex.dzyoba.com/linux/profiling-gprof-gcov.html

Ajouter les flags gcov à CFLAGS et LDFLAGS

  1. fprofile-arcs -ftest-coverage -coverage -lcrypto -pthread -lrt -Wall -Wextra

There are 2 gcov flags: -fprofile-arcs and -ftest-coverage. First will instrument your program to profile so called arcs — pathes in program’s control flow. Second option will make gcc to collect additional notes for arcs profiling and gcov itself.

lcov is a graphical front-end for GCC's coverage testing tool gcov: http://ltp.sourceforge.net/coverage/lcov.php

lcov --capture --directory ./ --output-file coverage.info
genhtml coverage.info --output-directory lcov-out

automatisation profilage

script bash profilage: passer en paramètre le nom du fichier de config yaml

profilage ../config_example.yaml

Analyse en cours par profilage

rob.c 

void moveRobotConstVel(slam *sl, float dt) { appelée uniquement quand slam pure vision

filter_thread.c  

processGPS(&slam, &sgps); n'est appelée que lorsque le cap a été déterminé (500 images sur séquence parking laas)

Gestion des fichiers de config

Pour éviter les problèmes de gestion de version sur les fichiers de config, procéder à des copies du fichier original pour faire des tests en local:

cd ~/CSLAM/embedded-vision/projects/sw/eslam-mt
cp config_example.yaml config_example_b1.yaml 

Git

see git

Génération de la doc

Doxygen

doc doxygen gérée dans embedded-vision/projects/sw/eslam-mt/doc Pour installer les outils:

sudo apt-get install doxygen-gui doxygen-doc doxygen

Pour construire ou modifier le fichier de configuration de la doc (déjà fait):

cd doc
doxywizard
configurer et sauver en doc/Doxyfile

pour avoir tous les call tree régler dans doc/Doxyfile

+EXTRACT_ALL = YES
+CALL_GRAPH = YES
+EXTRACT_LOCAL_CLASSES = YES

Pour générer la doc:

cd doc/ 
doxygen Doxyfile
cd generated/latex
pdflatex refman.tex 
pdflatex refman.tex 
evince refman.pdf &

Pour la doc en html

firefox html/index.html

Pour voir le call graph des fonctions en html

firefox html/main_8c.html

Doc stockée en ligne à l'adresse: https://bvdp.inetdoc.net/CSLAMDOC/

Graphviz

syntaxe: http://www.graphviz.org/content/dot-language

exemple avec code (en cliquant sur les graphes): http://www.graphviz.org/Gallery.php

ligne de commande: http://www.graphviz.org/content/command-line-invocation

fichiers dot à ranger dans dossier doc, utiliser le script makdot pour générer des png.

Séquences vidéo de résultats

https://bvdp.inetdoc.net/files/cslam/

Vrac

Désactiver l'optimisation pour pouvoir debugger:

find . -name "*.mk" -exec sed -i 's,-O3,-O0,g' {} \;

Activer l'optimisation:

find . -name "*.mk" -exec sed -i 's,-O0,-O3,g' {} \;

en debug, bloque à la ligne 95 de image_acq_thread.c quand i=1

Adapter le nom des dossiers en remplaçant dans les makefile

find . -name "*.mk" -exec sed -i 's,/home/pantoine,/home/bvandepo, g' {} \;
genereList
rm list
#ls -c1 *.pgm | sort >>list
find ./ -type f -printf "%f\n" | grep pgm | sort >>list

Pour traiter la séquence:

cd ~/CSLAM/embedded-vision/projects/sw/eslam-mt/
find . -name "config_example.yaml" -exec sed -i 's,/home/jpiat/Pictures/,/home/bvandepo/, g' {} \; 
find . -name "config_example.yaml" -exec sed -i 's,display_camera : no,display_camera : yes, g' {} \;
find . -name "config_example.yaml" -exec sed -i 's,debug_step : 0,debug_step : 1, g' {} \;
cd ~/CSLAM/embedded-vision/projects/sw/eslam-mt/Debug
make

fichier makefile à mettre dans embedded-vision/projects/sw/eslam-mt/Debug

Simulateur

Pour utiliser le simulateur :

cd ~/CSLAM/embedded-vision/projects/sw/matlab/visionSimulator/

Ouvrir matlab, et executer le script beginSimul. Ce script crée une trajectoire définie à l'avance, calcule l'accélération et la vitesse angulaire de cette trajectoire, et affiche le parcours de cette trajectoire. Les données des observations sont stockées dans un fichier obs.txt, et les fichiers timestamps des images dans un dossier time. Dans le fichier obs.txt, les données sont organisées de la sorte:

IdLmk0, uLmk0, vLmk0; IdLmk1, uLmk2, vLmk2; IdLmk3, uLmk3, vLmk3; (...)

Chaque ligne correspond à toutes les observations de landmark réalisées dans une frame. IdLmk correspond à l'indice du landmark, uLmk la position de l'observation du landmark en u, vLmk la position de l'observation du landmark en v.

Dans le dossier time, un fichier texte est crée pour chaque frame, avec pour nom le numéro de l'image ( commençant à 00000001) et contenant uniquement le timestamp de l'image concernée en seconde.

TODO

  1. Corriger le problème de repère de l'accélération
  2. Ajouter le stockage des données IMU dans un fichier
  3. Corriger la vitesse angulaire pour être en Radians/sec
  4. Ajouter un modèle de bruit aux données
  5. Ajouter la gestion des distorsions
  6. Créer un outil de création de trajectoire intuitif et pratique
  7. Ajouter de nouvelles trajectoires
  8. Ajouter la gestion du Rolling Shutter

Cslam with Simulated data

To use these datas with Cslam, checkout the branch named CslamSimu (Stash or commit your local change before) :

git checkout CslamSimu 

Then to run Cslam you'll need to define in config_file the path of the timestamp folder and the obs.txt files created by the matlab scripts. So in your yaml config file redefine image_time_stamp_path :

image_time_stamp_path : ~/CSLAM/embedded-vision/projects/sw/matlab/visionSimulator/time #path to folder containing timestamps

And add :

simu_obs_path : ~/CSLAM/embedded-vision/projects/sw/matlab/visionSimulator/obs.txt

To go back to master branch:

git checkout master