Outils pour utilisateurs

Outils du site


synchro_camera

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
synchro_camera [2016/11/04 14:26]
bvandepo
synchro_camera [2016/11/17 00:36] (Version actuelle)
bvandepo
Ligne 1: Ligne 1:
- +=====Programme sur Arduino===== 
 +voir Diviseur de fréquence + affichage nombre de fronts descendants sur MAX7221 sur [[timer]]: http://homepages.laas.fr/bvandepo/wiki/doku.php?do=export_code&id=timer&codeblock=0  
  
 =====Noeud pour l'enregistrement des images au format PPM===== =====Noeud pour l'enregistrement des images au format PPM=====
Ligne 7: Ligne 7:
 La camera de gauche est master, elle envoie un signal à la caméra de droite et à elle même pour démarrer la prise de photo. L'arduino récupère ce signal pour incrémenter un compteur qu'il affiche sur l'afficheur 8 segments.  La camera de gauche est master, elle envoie un signal à la caméra de droite et à elle même pour démarrer la prise de photo. L'arduino récupère ce signal pour incrémenter un compteur qu'il affiche sur l'afficheur 8 segments. 
  
 +====Création d'un catkin etc====
  
-Il n'y a pas de launch. Pour lancer le programme: +  
-  rosrun test_ueye listenerUeye+Pour créer un catkin initialement 
 +  mkdir -p ~/catkin_ws/src 
 +  cd ~/catkin_ws/src 
 +  catkin_init_workspace 
 +il faut charger les variables d'environnement pour ce catkin (normalement on stocke le source ... dans ~/.bashrc) 
 +  cd ~/catkin_ws/ 
 +  source devel/setup.bash 
 +  echo $ROS_PACKAGE_PATH
      
- +Pour péréniser:   
-adapter les 2 lignes suivantes pour chercher le bon dossier   +  echo "source ~/catkin_ws/devel/setup.bash" >>~/.bashrc
-  include_directories( /home/jcombier/DiversTools/OpenCV/opencv-2.4.11/installation/include) +
-  link_directories( /home/jcombier/DiversTools/OpenCV/opencv-2.4.11/installation/lib) +
- +
-<file txt CMakeLists.txt> +
-cmake_minimum_required(VERSION 2.8.3) +
-project(test_ueye) +
- +
-## Find catkin macros and libraries +
-## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +
-## is used, also find other catkin packages +
-find_package(catkin REQUIRED COMPONENTS +
-  camera_calibration_parsers +
-  camera_info_manager +
-  image_transport +
-  nodelet +
-  roscpp +
-  sensor_msgs +
-  std_msgs +
-  cv_bridge +
-+
-#find_package(OpenCV REQUIRED) # Have to be in a different find_package() line +
- +
-## System dependencies are found with CMake's conventions +
-# find_package(Boost REQUIRED COMPONENTS system)+
  
  
-## Uncomment this if the package has a setup.py. This macro ensures +====Récupération du node ueye_cam====
-## modules and global scripts declared therein get installed +
-## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +
-# catkin_python_setup()+
  
 +Installation noeud ueye modifié par Ariel et Jessica:
 +  cd ~/catkin_ws/src
 +  #changé de git clone ssh://git@redmine.laas.fr/laas/users/apodlubn/ueye_cam.git en:
 +  git clone https://github.com/bvandepo/ueye_cam.git
  
-################################################ +pour visualiser l'image en provenance d'une caméra: 
-## Declare ROS messages, services and actions ## +  cd ~/catkin_ws 
-################################################+  roslaunch ueye_cam rgb8.launch  
 +  rosrun image_view image_view image:=/camera/image_raw 
 +  rostopic list 
 +  rostopic echo /camera/camera_info
  
-## To declare and build messages, services or actions from within this +pour étalonner en monoculaire avec une seule petite mire
-## package, follow these steps+  rosrun camera_calibration cameracalibrator.py --size 7x5 --square 0.01 image:=/camera/image_raw 
-## * Let MSG_DEP_SET be the set of packages whose message types you use in +pour étalonner en monoculaire avec deux mires
-##   your messages/services/actions (e.gstd_msgs, actionlib_msgs, ...). +  rosrun camera_calibration cameracalibrator.py --size 7x6 --square 0.108 --size 8x5 --square 0.029 image:=/camera/image_raw
-## * In the file package.xml+
-##   * add a build_depend tag for "message_generation" +
-##   * add a build_depend and a run_depend tag for each package in MSG_DEP_SET +
-##   * If MSG_DEP_SET isn't empty the following dependency has been pulled in +
-##     but can be declared for certainty nonetheless+
-##     * add a run_depend tag for "message_runtime" +
-## * In this file (CMakeLists.txt): +
-##   * add "message_generation" and every package in MSG_DEP_SET to +
-##     find_package(catkin REQUIRED COMPONENTS ...) +
-##   * add "message_runtime" and every package in MSG_DEP_SET to +
-##     catkin_package(CATKIN_DEPENDS ...) +
-##   * uncomment the add_*_files sections below as needed +
-##     and list every .msg/.srv/.action file to be processed +
-##   * uncomment the generate_messages entry below +
-##   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)+
  
-## Generate messages in the 'msg' folder 
-# add_message_files( 
-#   FILES 
-#   Message1.msg 
-#   Message2.msg 
-# ) 
  
-## Generate services in the 'srv' folder 
-# add_service_files( 
-#   FILES 
-#   Service1.srv 
-#   Service2.srv 
-# ) 
  
-## Generate actions in the 'action' folder +====Création du node ueye_cam_test pour test synchro====
-# add_action_files( +
-#   FILES +
-#   Action1.action +
-#   Action2.action +
-# )+
  
-## Generate added messages and services with any dependencies listed here +pour créer un nouveau node vide avec les dépendances adéquates 
-# generate_messages( +  cd ~/catkin_ws/src 
-  DEPENDENCIES +  catkin_create_pkg ueye_cam_test camera_calibration_parsers   camera_info_manager   image_transport   nodelet   roscpp   sensor_msgs   std_msgs   cv_bridge
-  sensor_msgs  std_msgs +
-# )+
  
-################################################ +compléter le fichier créé en ajoutant à la fin de src/ueye_cam_test/CMakeLists.txt  
-## Declare ROS dynamic reconfigure parameters ## +<file txt CMakeLists.txt> 
-################################################ +###############BVANDEPO############## 
- +  include_directories(include ${catkin_INCLUDE_DIRS}) 
-## To declare and build dynamic reconfigure parameters within this +  add_executable(ueye_cam_test_exe src/ueye_cam_test.cpp) 
-## package, follow these steps: +  target_link_libraries(ueye_cam_test_exe ${catkin_LIBRARIES}) 
-## * In the file package.xml+
-##   * add a build_depend and a run_depend tag for "dynamic_reconfigure" +
-## * In this file (CMakeLists.txt): +
-##   * add "dynamic_reconfigure" to +
-##     find_package(catkin REQUIRED COMPONENTS ...) +
-##   * uncomment the "generate_dynamic_reconfigure_options" section below +
-##     and list every .cfg file to be processed +
- +
-## Generate dynamic reconfigure parameters in the 'cfg' folder +
-# generate_dynamic_reconfigure_options( +
-#   cfg/DynReconf1.cfg +
-#   cfg/DynReconf2.cfg +
-# ) +
- +
-################################### +
-## catkin specific configuration ## +
-################################### +
-## The catkin_package macro generates cmake config files for your package +
-## Declare things to be passed to dependent projects +
-## INCLUDE_DIRS: uncomment this if you package contains header files +
-## LIBRARIES: libraries you create in this project that dependent projects also need +
-## CATKIN_DEPENDS: catkin_packages dependent projects also need +
-## DEPENDS: system dependencies of this project that dependent projects also need +
-catkin_package( +
-  INCLUDE_DIRS include +
-  LIBRARIES test_ueye +
-  CATKIN_DEPENDS camera_calibration_parsers camera_info_manager image_transport nodelet roscpp sensor_msgs std_msgs cv_bridge +
-#  DEPENDS system_lib +
-+
- +
-########### +
-## Build ## +
-########### +
- +
-## Specify additional locations of header files +
-## Your package locations should be listed before other locations +
-include_directories(include+
-include_directories( +
-  ${catkin_INCLUDE_DIRS} +
- ${OpenCV_INCLUDE_DIRS} +
-+
-#--- FOR LOCAL OPENCV COMPILED LIBRAIRIE --- +
-include_directories( /home/jcombier/DiversTools/OpenCV/opencv-2.4.11/installation/include) +
-link_directories( /home/jcombier/DiversTools/OpenCV/opencv-2.4.11/installation/lib) +
- +
-## Declare a C++ library +
-# add_library(test_ueye +
-#   src/${PROJECT_NAME}/test_ueye.cpp +
-# ) +
- +
-## Add cmake target dependencies of the library +
-## as an example, code may need to be generated before libraries +
-## either from message generation or dynamic reconfigure +
-# add_dependencies(test_ueye ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) +
- +
-## Declare a C++ executable +
-add_executable(test_ueye_node src/test_ueye_node.cpp) +
- +
-## Add cmake target dependencies of the executable +
-## same as for the library above +
-# add_dependencies(test_ueye_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) +
- +
-## Specify libraries to link a library or executable target against +
-target_link_libraries(test_ueye_node +
-#   ${catkin_LIBRARIES} +
-# ) +
- +
-#--- FOR LOCAL OPENCV COMPILED LIBRAIRIE --- +
-set(OpenCV_LIBS opencv_core opencv_imgproc opencv_calib3d opencv_imgcodecs opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu) +
- +
-add_executable(listenerUeye src/test_ueye.cpp) +
-target_link_libraries(listenerUeye ${catkin_LIBRARIES}) +
-target_link_libraries(listenerUeye ${OpenCV_LIBS}) #/home/jcombier/DiversTools/OpenCV/opencv-2.4.11/cmake/ +
-add_dependencies(listenerUeye test_ueye_cpp) +
- +
-############# +
-## Install ## +
-############# +
- +
-# all install targets should use catkin DESTINATION variables +
-# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html +
- +
-## Mark executable scripts (Python etc.) for installation +
-## in contrast to setup.py, you can choose the destination +
-# install(PROGRAMS +
-#   scripts/my_python_script +
-#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +
-# ) +
- +
-## Mark executables and/or libraries for installation +
-# install(TARGETS test_ueye test_ueye_node +
-#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +
-#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +
-#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +
-# ) +
- +
-## Mark cpp header files for installation +
-# install(DIRECTORY include/${PROJECT_NAME}/ +
-#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +
-#   FILES_MATCHING PATTERN "*.h" +
-#   PATTERN ".svn" EXCLUDE +
-# ) +
- +
-## Mark other files for installation (e.g. launch and bag files, etc.) +
-# install(FILES +
-#   # myfile1 +
-#   # myfile2 +
-#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +
-# ) +
- +
-############# +
-## Testing ## +
-############# +
- +
-## Add gtest based cpp test target and link libraries +
-# catkin_add_gtest(${PROJECT_NAME}-test test/test_test_ueye.cpp) +
-# if(TARGET ${PROJECT_NAME}-test) +
-#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +
-# endif() +
- +
-## Add folders to be run by python nosetests +
-# catkin_add_nosetests(test)+
 </file> </file>
  
 +copier le fichier cpp source dans:
 +  ~/catkin_ws_/src/ueye_cam_test/src/ueye_cam_test.cpp
  
- +<file cpp ueye_cam_test.cpp>
-<file cpp test_ueye.cpp>+
 // from ueyecam_nodelet // from ueyecam_nodelet
 #include <ros/package.h> #include <ros/package.h>
Ligne 274: Ligne 107:
     fclose(f);     fclose(f);
 } }
 +/*****************************************************/ 
 +/***               SAVE_PPM_NAMED                  ***/ 
 +/*****************************************************/ 
 +void save_ppm_named(char *basename, int k,char *endname,cv_bridge::CvImagePtr  cv_ptr_1) 
 +
 +    std::stringstream sstm; 
 +    std::string nameFileL; 
 +    sstm << basename << std::setfill('0') << std::setw(5) << k << endname; 
 +    nameFileL = sstm.str(); 
 +    save_ppm((char*)nameFileL.c_str(), (char*)cv_ptr_1->image.data, cv_ptr_1->image.cols, cv_ptr_1->image.rows); 
 +}
 /*****************************************************/ /*****************************************************/
 /***              IMAGE CALLBACK                   ***/ /***              IMAGE CALLBACK                   ***/
Ligne 282: Ligne 125:
     try     try
     {     {
 +        cv_bridge::CvImagePtr cv_ptr_1 = cv_bridge::toCvCopy(msg, "bgr8");
 + save_ppm_named((char*)"/tmp/images/ueye_", k,(char*)"_mono.ppm",cv_ptr_1);
         cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);         cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);
         cv::waitKey(30);         cv::waitKey(30);
 +        k++;
     }     }
     catch (cv_bridge::Exception& e)     catch (cv_bridge::Exception& e)
Ligne 290: Ligne 136:
     }     }
 } }
- 
 /*****************************************************/ /*****************************************************/
 /***              STEREO CALLBACK                  ***/ /***              STEREO CALLBACK                  ***/
Ligne 301: Ligne 146:
         cv_bridge::CvImagePtr cv_ptr_1 = cv_bridge::toCvCopy(image1, "bgr8");         cv_bridge::CvImagePtr cv_ptr_1 = cv_bridge::toCvCopy(image1, "bgr8");
         cv_bridge::CvImagePtr cv_ptr_2 = cv_bridge::toCvCopy(image2, "bgr8");         cv_bridge::CvImagePtr cv_ptr_2 = cv_bridge::toCvCopy(image2, "bgr8");
- 
         // save left image         // save left image
-        std::stringstream sstm; + save_ppm_named((char*)"/tmp/images/ueye_", k,(char*)"_left.ppm",cv_ptr_1);
-        std::string nameFileL; +
-        sstm << "/tmp/images/ueye_" << std::setfill('0'<< std::setw(5) << k << "_left" << ".ppm" +
-        nameFileL = sstm.str(); +
-        save_ppm((char*)nameFileL.c_str()(char*)cv_ptr_1->image.data, cv_ptr_1->image.cols, cv_ptr_1->image.rows); +
         // save right image         // save right image
-        std::string nameFileR; + save_ppm_named((char*)"/tmp/images/ueye_", k,(char*)"_right.ppm",cv_ptr_2);
-        sstm.str(std::string()); +
-        sstm << "/tmp/images/ueye_" << std::setfill('0'<< std::setw(5) << k << "_right" << ".ppm" +
-        nameFileR = sstm.str(); +
-        save_ppm((char*)nameFileR.c_str()(char*)cv_ptr_2->image.data, cv_ptr_2->image.cols, cv_ptr_2->image.rows); +
         // show image         // show image
         cv::imshow("view_left", cv_ptr_1->image);         cv::imshow("view_left", cv_ptr_1->image);
Ligne 327: Ligne 161:
     }     }
 } }
- 
 /*****************************************************/ /*****************************************************/
 /***                    MAIN                       ***/ /***                    MAIN                       ***/
Ligne 341: Ligne 174:
  
     if(!stereo){     if(!stereo){
 + ROS_INFO("ueye_cam_test in moncular mode"); 
         cv::namedWindow("view");         cv::namedWindow("view");
         cv::startWindowThread();         cv::startWindowThread();
  
         image_transport::ImageTransport it(nh);         image_transport::ImageTransport it(nh);
-        image_transport::Subscriber sub = it.subscribe("/stereo/left/image_raw", 1, imageCallback);+        image_transport::Subscriber sub = it.subscribe("/camera/image_raw", 1, imageCallback);
  
         ros::spin();         ros::spin();
Ligne 352: Ligne 186:
     }     }
     else{     else{
 + ROS_INFO("ueye_cam_test in binocular mode");
         cv::namedWindow("view_left");         cv::namedWindow("view_left");
         cv::namedWindow("view_right");         cv::namedWindow("view_right");
Ligne 368: Ligne 203:
 } }
 </file> </file>
 +
 +
 +Adapter dans  ~/catkin_ws_/src/ueye_cam_test/src/ueye_cam_test.cpp la ligne pour s'abonner au topic image/raw ou  /stereo/right/image_raw et /stereo/left/image_raw
 +  bool stereo(false);  ou  bool stereo(true);  
 +
 +
 +pour compiler:
 +  cd ~/catkin_ws/
 +  catkin_make 
 +
 +
 +Il n'y a pas de launch. Pour lancer le programme en monoculaire:
 +  roscore
 +  roslaunch ueye_cam rgb8.launch 
 +  rosrun image_view image_view image:=/camera/image_raw
 +  rosrun ueye_cam_test ueye_cam_test_exe
 +
 +TODO: expliquer pour lancer en stéréo et tester
 +
  
 =====Résultats===== =====Résultats=====
Ligne 379: Ligne 233:
 {{http://homepages.laas.fr/bvandepo/files/synchro_camera/_calibUeye-00008right.png?600}} {{http://homepages.laas.fr/bvandepo/files/synchro_camera/_calibUeye-00008right.png?600}}
  
 +
 +=====BagFromFiles node=====
 +Node créé par Raul Mur Artal et adapté par Ariel pour gérer les séquences en stéréo
 +
 +Nous l'utilisons pour regénérer un fichier bag contenant une séquence d'images précédemment enregistrée par l'outils cameracalibrator.py dans le fichier calibrationdata.tar.gz . Ceci sert à pouvoir réutiliser une séquence en simulant une (paire de) caméra(s) à partir d'un fichier en utilisant rosplay. 
 +
 +il y a déjà pas mal d'explications sur: http://homepages.laas.fr/bvandepo/wiki/doku.php?id=ueye#camera_synchronization
 +
 +Pour capturer les images depuis les 2 caméras en stéréo:
 +  cd ~/catkin_ws
 +  roslaunch ueye_cam stereo.launch
 +Pour lancer l'étalonnage et sauver automatiquement les images en /tmp/calibrationdata.tar.gz 
 +  rosrun camera_calibration cameracalibrator.py --size 7x6 --square 0.108 --size 8x5 --square 0.029 right:=/stereo/right/image_raw left:=/stereo/left/image_raw
 +  click calibrate
 +  click save
 +
 +
 +
 +  cd ~/catkin_ws
 +  cd src
 +  git clone ssh://git@redmine.laas.fr/laas/users/danes/apodlubn/bagfromimages.git
 +  echo "export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/home/bvandepo/catkin_ws/src/bagfromimages" >>~/.bashrc
 +  mkdir build
 +  cd build
 +  cmake ..
 +  make
 +  sudo make install
 +  cd ..
 +
 +  mkdir -p ~/2ears/seq1
 +  cd ~/2ears/seq1
 +y écrire ce fichier:
 +<file sh constructbag.sh>
 +tar xvf calibrationdata.tar.gz 
 +mkdir left
 +mkdir right
 +mv left-* left/
 +mv right-* right/
 +FOLDER=`pwd`
 +echo $FOLDER
 +rosrun bagfromimages bagfromimages  $FOLDER/left/ $FOLDER/right/ .png 2 $FOLDER/images.bag
 +rm -rf left/
 +rm -rf right/
 +</file>
 +  chmod a+x constructbag.sh
 +  ./constructbag.sh
 +
 +Le script génère dans le dossier courant un fichier images.bag 
 +
 +Les paramètres passés à rosrun bagfromimages bagfromimages sont les suivants:
 +  -1: Left images folder
 +  -2: Right images folder
 +  -3: image format
 +  -4: number of frames per second to export to the bag file
 +  -5: bag's output
 +
 +
 +
 +Pour rejouer une séquence enregistrée:
 +  cd ~/2ears/seq1
 +  rosbag play images.bag
 +  
 +  
 +=====Modifications pour le cas où les images stéréos sont inclinées à 90 degrés=====
 +
 +
 +if the rectified images appears small in a corner, apply this change to the .py:
 +  gedit  /opt/ros/kinetic/lib/python2.7/dist-packages/camera_calibration/calibrator.py
 +Après:
 +           cv2.stereoCalibrate(opts, lipts, ripts,
 +                               self.l.intrinsics, self.l.distortion,
 +                               self.r.intrinsics, self.r.distortion,
 +                               self.size,
 +                               self.R,                            # R
 +                               self.T,                            # T
 +                               criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 1, 1e-5),
 +                               flags = flags)
 +Changer: 
 +  self.set_alpha(0)
 +en:
 +  self.set_alpha(-1.0)
 +  
 +pour calculer la différence entre les 2 fichier et générer le patch:  
 +  cd ~/2ears
 +  diff calibrator.py /opt/ros/kinetic/lib/python2.7/dist-packages/camera_calibration/calibrator.py  >>calibrator.diff
 +  sudo patch /opt/ros/kinetic/lib/python2.7/dist-packages/camera_calibration/calibrator.py calibrator.diff
 +
 +  
 +
 + 
 +create the ini files from yaml files:
 +  rosrun camera_calibration_parsers convert left.yaml left.ini
 +  rosrun camera_calibration_parsers convert right.yaml right.ini
 +  
 +Script pour convertir les résultats d'étalonnage en yaml et lancer le noeuds d'acquisition des images en stéréo avec les caméras réelles:
 +  
 +<file sh debugscript.sh>
 +#!/bin/bash
 +rosrun camera_calibration_parsers convert /home/bvandepo/.ros/camera_conf/stereo/left.ini /home/bvandepo/.ros/camera_info/stereo/left.yaml
 +rosrun camera_calibration_parsers convert /home/bvandepo/.ros/camera_conf/stereo/right.ini /home/bvandepo/.ros/camera_info/stereo/right.yaml
 +source ~/catkin_ws/devel/setup.bash
 +roslaunch ueye_cam stereo.launch 
 +</file>
 +
 +Script pour visualiser les images en provenance des caméras et les images épipolaires réctifiées:
 +<file sh image_procDebug.sh>
 +#ROS_NAMESPACE=stereo rosrun stmage_proc stereo_image_proc &
 +rosrun image_view image_view image:=/stereo/left/image_raw &
 +rosrun image_view image_view image:=/stereo/left/image_rect_color &
 +rosrun image_view image_view image:=/stereo/right/image_raw &
 +rosrun image_view image_view image:=/stereo/right/image_rect_color &
 +read -p "Press any key"
 +pkill image_view 
 +#pkill stereo_image_proc
 +#pkill ueye_cam
 +</file>
  
synchro_camera.1478266011.txt.gz · Dernière modification: 2016/11/04 14:26 de bvandepo