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/
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
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)
ajouter ddans ~/.bashrc
unset QT_QPA_PLATFORMTHEME
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
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
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.
sudo apt-get install lcov gcov
http://alex.dzyoba.com/linux/profiling-gprof-gcov.html
Ajouter les flags gcov à CFLAGS et LDFLAGS
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
script bash profilage: passer en paramètre le nom du fichier de config yaml
profilage ../config_example.yaml
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)
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
see git
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/
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.
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' {} \;
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
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.
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