Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <ros/ros.h>
00030 #include <rosbag/bag.h>
00031 #include <rosbag/view.h>
00032
00033 #include <boost/foreach.hpp>
00034 #include <boost/progress.hpp>
00035
00036 #include <message_filters/subscriber.h>
00037 #include <message_filters/time_synchronizer.h>
00038
00039 #include <sensor_msgs/Image.h>
00040 #include <sensor_msgs/CameraInfo.h>
00041
00042
00043 namespace bag_tools
00044 {
00045
00050 template <class M>
00051 class BagSubscriber : public message_filters::SimpleFilter<M>
00052 {
00053 public:
00054 void newMessage(const boost::shared_ptr<M const> &msg)
00055 {
00056 signalMessage(msg);
00057 }
00058 };
00059
00060 class StereoBagProcessor
00061 {
00062
00063 public:
00064 StereoBagProcessor(const std::string& stereo_base_topic) :
00065 stereo_base_topic_(stereo_base_topic),
00066 sync_(l_img_sub_, r_img_sub_, l_info_sub_, r_info_sub_, 25)
00067 {
00068 ros::Time::init();
00069 }
00070
00071 template<class C>
00072 void registerCallback(const C& callback)
00073 {
00074 sync_.registerCallback(callback);
00075 }
00076
00081 void processBag(const std::string &filename)
00082 {
00083
00084
00085 std::string l_cam = stereo_base_topic_ + "/left";
00086 std::string r_cam = stereo_base_topic_ + "/right";
00087 std::string l_cam_image = l_cam + "/image_raw";
00088 std::string r_cam_image = r_cam + "/image_raw";
00089 std::string l_cam_info = l_cam + "/camera_info";
00090 std::string r_cam_info = r_cam + "/camera_info";
00091
00092 std::vector<std::string> topics;
00093 topics.push_back(l_cam_image);
00094 topics.push_back(r_cam_image);
00095 topics.push_back(l_cam_info);
00096 topics.push_back(r_cam_info);
00097
00098 std::cout << "Starting processing " << filename << ", ";
00099 rosbag::Bag bag;
00100 bag.open(filename, rosbag::bagmode::Read);
00101 rosbag::View view(bag, rosbag::TopicQuery(topics));
00102
00103 int num_messages = view.size();
00104 std::cout << num_messages << " messages to process." << std::endl;
00105
00106
00107 boost::progress_display show_progress(num_messages);
00108 BOOST_FOREACH(rosbag::MessageInstance const m, view)
00109 {
00110 if (m.getTopic() == l_cam_image || ("/" + m.getTopic() == l_cam_image))
00111 {
00112 sensor_msgs::Image::ConstPtr l_img = m.instantiate<sensor_msgs::Image>();
00113 if (l_img != NULL)
00114 l_img_sub_.newMessage(l_img);
00115 }
00116
00117 if (m.getTopic() == r_cam_image || ("/" + m.getTopic() == r_cam_image))
00118 {
00119 sensor_msgs::Image::ConstPtr r_img = m.instantiate<sensor_msgs::Image>();
00120 if (r_img != NULL)
00121 r_img_sub_.newMessage(r_img);
00122 }
00123
00124 if (m.getTopic() == l_cam_info || ("/" + m.getTopic() == l_cam_info))
00125 {
00126 sensor_msgs::CameraInfo::ConstPtr l_info = m.instantiate<sensor_msgs::CameraInfo>();
00127 if (l_info != NULL)
00128 l_info_sub_.newMessage(l_info);
00129 }
00130
00131 if (m.getTopic() == r_cam_info || ("/" + m.getTopic() == r_cam_info))
00132 {
00133 sensor_msgs::CameraInfo::ConstPtr r_info = m.instantiate<sensor_msgs::CameraInfo>();
00134 if (r_info != NULL)
00135 r_info_sub_.newMessage(r_info);
00136 }
00137 ++show_progress;
00138 }
00139 bag.close();
00140 std::cout << "Finished processing " << filename << std::endl;
00141 }
00142
00143 private:
00144
00145
00146 BagSubscriber<sensor_msgs::Image> l_img_sub_, r_img_sub_;
00147 BagSubscriber<sensor_msgs::CameraInfo> l_info_sub_, r_info_sub_;
00148
00149 std::string stereo_base_topic_;
00150
00151 message_filters::TimeSynchronizer<sensor_msgs::Image, sensor_msgs::Image, sensor_msgs::CameraInfo, sensor_msgs::CameraInfo> sync_;
00152
00153 };
00154
00155 }
00156