===== OrbSlam =====
=== Installation sur Ubuntu 14.04: ===
Suivre pas à pas les recommendations du lien suivant :
[[https://github.com/raulmur/ORB_SLAM]]
En résumé, installer les librairies nécessaires, libBoost en premier :
  sudo apt-get install libboost-all-dev 
  
Puis installer ROS indigo (pour ubuntu 14.04), suivre les instructions sur :
[[http://wiki.ros.org/indigo/Installation/Ubuntu]] 
  
(Facultatif ) Installer g2o, DBoW2, qui sont en théorie installées avec ROS.
Ensuite cloner le dépôt:
  git clone https://github.com/raulmur/ORB_SLAM.git ORB_SLAM
  
Ajouter ROS_PACKAGE_PATH dans votre .bashrc
Compiler g2o dans le dossier:
  cd ORB_SLAM/Thirdparty/g2o/
  mkdir build
  cd build
  cmake .. -DCMAKE_BUILD_TYPE=Release
  make
Compiler DBoW2
  cd ORB_SLAM/Thirdparty/g2o/
  mkdir build
  cd build
  cmake .. -DCMAKE_BUILD_TYPE=Release
  make  
  
IMPORTANT, pour ROS INDIGO, Enlever dans le manifest.xml la dépendance à opencv2  
Compiler ORB_SLAM dans le répertoire racine
 mkdir build
 cd build
 cmake .. -DCMAKE_BUILD_TYPE=Release
 make  
=== Utilisation ===
Pour lancer ORB_SLAM, lancer tout d'abord ROS 
  roscore
  
Lancer pour INDIGO 
  roslaunch ExampleGroovyOrNewer.launch
Cette exemple lance ORB_SLAM, image_view et Rviz.
Télécharger ensuite un rosbag d'exemple à l'adresse suivante :
[[http://webdiis.unizar.es/~raulmur/orbslam/downloads/Example.bag.tar.gz.]] 
Décompressez et éxecuter ensuite la commande suivante afin de charger le vocabulaire et les param caméra:
 
  rosrun ORB_SLAM ORB_SLAM /Data/ORBvoc.txt /Data/Settings.yaml 
Exécuter enfin l'exemple (appuyer ensuite sur espace pour démarrer):
  rosbag play --pause Example.bag
===== ORBSLAM2 =====
Cette version d'OrbSlam n'utilise pas ROS et permet également d'être utilisée avec une paire stéréo Caméra ou une Kinect. La version monoculaire à été légérement amélioré.
Pour l'installation, suivre les instructions ici :
[[https://github.com/raulmur/ORB_SLAM2]] 
Pour l'utilisation, il faut lancer un executable, soit créer de toute pièce, soit un des exemples :
  ./Examples/Monocular/mono_kitti Vocabulary/ORBvoc.txt Examples/Monocular/KITTIX.yaml PATH_TO_DATASET_FOLDER/dataset/sequences/SEQUENCE_NUMBER 
  
Vocabulary/ORBvoc.txt est le chemin vers le vocabulaire ( fourni à l'avance)
Examples/Monocular/KITTIX.yaml est le fichier de config lié à votre éxécutable ( Param caméra et param Slam)
PATH_TO_DATASET_FOLDER/dataset/sequences/SEQUENCE_NUMBER est le chemin vers votre séquence
==== Avec Qtcreator ====
Afin de l'utiliser dans qtcreator, vous pouvez ouvrir directement le CMakelist.txt, et si vous voulez voir les sources dans l'éditeur, modifiez le Cmakelist.txt en y ajoutant :
  FILE(GLOB_RECURSE LibFiles "include/*.h")
  add_custom_target(headers SOURCES ${LibFiles})
Vous pouvez également ajouter de nouveaux exécutables adaptés à chaque situation.
  add_executable(mono_live
  Examples/Monocular/mono_live.cc)
  target_link_libraries(mono_live ${PROJECT_NAME})
  add_executable(mono_calib
  Examples/Monocular/mono_calib.cc)
  target_link_libraries(mono_calib ${PROJECT_NAME})
Ici on rajoute dans le Cmakelist un exécutable pour le calibrage et un pour le fonctionnement en live
===== LSD-SLAM ===== 
Pour ROS INDIGO et Ubuntu 14.04
  sudo apt-get install python-rosinstall
  mkdir ~/rosbuild_ws
  cd ~/rosbuild_ws
  rosws init . /opt/ros/indigo
  mkdir package_dir
  rosws set ~/rosbuild_ws/package_dir -t .
  echo "source ~/rosbuild_ws/setup.bash" >> ~/.bashrc
  bash
  cd package_dir
  
Pour éxécuter l'exemple fourni à l'adresse suivante:
[[http://vision.in.tum.de/research/vslam/lsdslam]]
Lancer les commandes suivantes après avoir décompresser l'archive:
  roscore
  rosrun lsd_slam_viewer viewer
  rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info
  rosbag play LSD_room.bag
Pour lancer une séquence 
  rosrun lsd_slam_core dataset_slam  _files:=images/  _hz:=0 _calib:=pinhole_example_calibWS.cfg 
  
Avec _files le chemin vers un dossier contenant les images, ou un fichier contenant le chemin/nom des images, _hz la fréquence des images, et _calib un fichier de calibration ( Voir LSD_SLAM github pour la forme du fichier)
=== Exemple ===
Sur la séquence roomBag.bag de test:
Sur la séquence fr1desk2, fail du tracking entre 25 et 100 frames suivant la fréquence renseignée:
Sur une séquence crée avec tablette Samsung :
= NB =
Les auteurs ont réussi à exécuter ce slam sur smartphone (sony Xperia Z1). Voir le papier 
  Semi-Dense Visual Odometry for AR on a Smartphone (T. Schöps, J. Engel, D. Cremers), In International
  Symposium on Mixed and Augmented Reality, 2014.
Et la vidéo de démonstration :
[[https://www.youtube.com/watch?feature=player_embedded&v=X0hx2vxxTMg]]
==== BagFromImages ====
Cet outils sert à créer un ros bag à partir d'un ensemble d'images
  git clone https://github.com/raulmur/BagFromImages.git BagFromImages
  cd BagFromImages
  mkdir build
  cd build
  cmake ..
  make
  
Créer un ros bag à partir de l'ensemble d'image en utilisant :
  rosrun BagFromImages BagFromImages PATH_TO_IMAGES IMAGE_EXTENSION FREQUENCY PATH_TO_OUPUT_BAG
===== NOTES =====
Il y a de nombreux problèmes à gérer pour l'installation concurrente de ORB_SLAM et LSD_SLAM
Pour un éventuel soucis avec g2o ( Orbslam ne parvient pas à initialiser et erreur undefined symbol: _ZN3g2o17EdgeSE3ProjectXYZC1Ev) voir :
[[https://github.com/raulmur/ORB_SLAM/issues/17]]
  
Il est également nécessaire de gérer les ROS_PATH qui change en fonction du soft à utiliser.
===== DPPTAM =====
Suivre l'installation depuis :
[[https://github.com/alejocb/dpptam]]
  
Il est nécessaire d'installer ROS, PCL et BOOST.
=== Installation ===
Aller dans votre répertoire source catkin :
  cd ~/catkin_ws/src
Puis cloner le dépôt depuis github :
  git clone  https://github.com/alejocb/dpptam.git
  
=== Compilation ===
Retourner dans le dossier racine de catkin
   cd ~/catkin_ws
   
   catkin_make --pkg dpptam
   
DPPSLAM utilise un soft tiers pour les superpixels, basée sur le papier 
  Efficient Graph-Based Image Segmentation. P. Felzenszwalb, D. Huttenlocher. International Journal of Computer Vision, Vol. 59, No. 2, September 2004
  
Il faut donc le compiler :
  cd ~/catkin_ws/src/dpptam/ThirdParty/segment
  make
  
NB: thirdparty semblait déjà compilé dans mon cas, éventuellement faire make clean puis make.
=== Utilisation ===
Pour utiliser dpptam, il faut se mettre dans le répertoire racine catkin:
  cd ~/catkin_ws
Lancer dpptam
  rosrun dpptam dpptam
Si le package dpptam n'existe pas ou n'est pas trouvé par ros, lancer la commande
  source devel/setup.bash
Lancer le visualisateur d'image ( ne fonctionne pas chez moi pour le moment)
  rosrun image_view image_view image:=/dpptam/camera/image
Lancer rviz:
  rosrun rviz rviz
Voir le lien suivant pour la configuration de rviz:
[[https://www.dropbox.com/s/pymufqi2i2aixys/visualization_rviz.png?oref=e&n=314995776]]
Le global Status ne sera pas Ok tant que le rosbag ne sera pas lancer:
  rosbag play yourRosBag.bag
 
== Fichier de config Yaml ==
Il est nécessaire également de configurer le fichier dpptam/src/data.yml. Par exemple pour le rosbag lab_unizar.bag fourni par les auteurs:
  camera_path:"/camera/rgb/image_color"
  cameraMatrix: !!opencv-matrix
     rows: 3
     cols: 3
     dt: d
     data: [ 520.908620, 0., 325.141442, 0., 521.007327 , 249.701764, 0., 0., 1. ]
  distCoeffs: !!opencv-matrix
     rows: 5
     cols: 1
     dt: d
     data: [ 0.231222, -0.784899, -0.003257, -0.000105, 0.917205 ]
Il faut mettre à jour le camera_path avec celui ou se trouve les images brutes, et également les coefficients caméra.
Fermer et relancer dpptam pour prendre en compte les modifications.
  
  
  
  
=====Ajout du profiling=====
Modification de  CMakeLists.txt pour ajout de infos de profiling
  
  #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
  #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -march=native -pipe -p -pg -g3 -Wall -W -D_REENTRANT -coverage -fprofile-arcs -ftest-coverage -Wextra -g")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -O0 -march=native -pipe -p -pg -g3 -Wall -W -D_REENTRANT -coverage -fprofile-arcs -ftest-coverage -Wextra -g")
===lancement orbslam2===
  bvandepo@rapid:~/orbslam/ORB_SLAM2/Examples/Monocular$ ./mono_kitti ../../Vocabulary/ORBvoc.txt ./KITTI00-02.yaml ../../../dataset/sequences/17/
Cette tentative de profiling ne fait apparaitre que le main mais pas les threads:
  gprof -zc mono_kitti gmon.out > analysis.txt
  gprof mono_kitti | ~/tmp/gprof2dot/gprof2dot/gprof2dot.py > gmon.dot
   dot gmon.dot -Tpng -o gmon.png
  dot -Tps gmon.dot -o gmon.pdf
  evince gmon.pdf 
projet qt dans: ~/orbslam/ORB_SLAM2/qt$ 
gprof ne supporte pas le multithread ni les appels aux fonctions situées dans des librairies dynamiques: http://gernotklingler.com/blog/gprof-valgrind-gperftools-evaluation-tools-application-level-cpu-profiling-linux/
====oprofile====
===installation===
Pour profiler une application multithreadée:
http://oprofile.sourceforge.net/download/
  cd ~/orbslam
  mkdir oprofile
  cd  oprofile
  git clone git://git.code.sf.net/p/oprofile/oprofile
  sudo apt-get install autoconf automake libpopt-dev l binutils-dev libiberty-dev
  ./autogen.sh
  ./configure
    Warning: The user account 'oprofile:oprofile' does not exist on the system.
         To profile JITed code, this special user account must exist.
         Please ask your system administrator to add the following user and group:
             user name : 'oprofile'
             group name: 'oprofile'
         The 'oprofile' group must be the default group for the 'oprofile' user.
  sudo adduser oprofile        
  make -j4
  sudo make install
===utilisation===
  cd ~/orbslam/ORB_SLAM2/Examples/Monocular  
  opgprof ./mono_kitti  # Generate the gmon.out file
  gprof -p ./mono_kitti > gmon.txt
  opreport -cl --demangle=smart `./mono_kitti ../../Vocabulary/ORBvoc.txt ./KITTI00-02.yaml ../../../dataset/sequences/17/`
  gprof -zc mono_kitti gmon.out > analysis.txt
  gprof mono_kitti | ~/tmp/gprof2dot/gprof2dot/gprof2dot.py > gmon.dot
  dot gmon.dot -Tpng -o gmon.png
  dot -Tps gmon.dot -o gmon.pdf
  evince gmon.pdf 
====valgrind====
  
  sudo apt-get install kcachegrind valgrind 
  valgrind --tool=callgrind ./mono_kitti ../../Vocabulary/ORBvoc.txt ./KITTI00-02.yaml ../../../dataset/sequences/04/
http://valgrind.org/docs/manual/quick-start.html#quick-start.prepare
  cd ~/orbslam/testvalgrind 
  nano myprog.c
  gcc -g myprog.c 
  ./a.out 
  valgrind --leak-check=yes ./a.out
  valgrind --tool=callgrind ./a.out
#ATTENTION LE NOM DU FICHIER callgrind.out change à l'execution
  kcachegrind callgrind.out.4904 
 
===test avec orbslam2===
  cd ~/orbslam/ORB_SLAM2/Examples/Monocular
  valgrind --tool=callgrind `./mono_kitti ../../Vocabulary/ORBvoc.txt ./KITTI00-02.yaml ../../../dataset/sequences/04/`
  kcachegrind  callgrind.out.3819
=====Problèmes=====
https://github.com/raulmur/ORB_SLAM2/issues/117
https://eigen.tuxfamily.org/dox-devel/group__TopicStructHavingEigenMembers.html
=====Vrai rosification=====
https://www.youtube.com/watch?v=PFgZKqeSh3c
====Par Jonathan====
  cd ~/catkin_ws/src
  ln -s /home/bvandepo/orbslam/ORB_SLAM2/Examples/ROS/ORB_SLAM2 orbslam2 
 
  catkin_make --pkg orb_slam2
  catkin_make install  --pkg orb_slam2
  cd ~/catkin_ws/devel
  source setup.sh 
ne pas éditer les fichiers dans ~/catkin_ws/install/  car ils sont écrasé lorsqu'on fait le catkin_make install
mettre a jour dans  /home/bvandepo/catkin_ws/src/orbslam2/launch/launch_kitti.launch
  
  
sauver dans launch_kitti_bvdp.launch
récupérer un bag pour tester:
  cd /home/bvandepo/orbslam/
  wget https://bvdp.inetdoc.net/files/kitti_05.bag
Executer
  cd ~/catkin_ws/
  roslaunch orb_slam2 launch_kitti_bvdp.launch bag_path:=/home/bvandepo/orbslam/kitti_05.bag