我不知道ROS代码的含义,也无法理解ROS Wiki的示例

时间:2019-07-02 08:12:03

标签: c++ ros

我希望对此代码进行详细说明。谢谢

rosbag::Bag  bag(rosbag, rosbag::bagmode::Read);//read bag?
rosbag::View view(bag, rosbag::TopicQuery(topics));//create a view on a bag.
BOOST_FOREACH(rosbag::MessageInstance const m, view){}//what?
const std::string& topic_name = m.getTopic();
if (topic_name == topics[0])//what?
{
  dvs_msgs::EventArray::ConstPtr msg = 
  m.instantiate<dvs_msgs::EventArray>();
  if (msg != NULL)
  {
    if(msg->events.empty())
    {
      continue;
    }
    const ros::Time& stamp = msg->events[0].ts;
  }

1 个答案:

答案 0 :(得分:0)

rosbag::Bag bag;
bag.open("test.bag", rosbag::bagmode::Read);

是的,您可以通过这种方式读取文件包

std::vector<std::string> topics;
rosbag::View view(bag, rosbag::TopicQuery(topics));

这将遍历提供的bag文件中的所有主题信息,并推回主题

BOOST_FOREACH(rosbag::MessageInstance const m, view){}//what?

您在这里有一个错误, BOOST_FOREACH 是宏,在这里它是如何使用的

#include <boost/foreach.hpp>
#define foreach BOOST_FOREACH

包括头文件,然后

foreach(rosbag::MessageInstance const m, view)
{
    const std::string& topic_name = m.getTopic();
    if (topic_name == topics[0])//what?
    {
      dvs_msgs::EventArray::ConstPtr msg = 
      m.instantiate<dvs_msgs::EventArray>();
      if (msg != NULL)
      {
         if(msg->events.empty())
         {
          continue;
         }
        const ros::Time& stamp = msg->events[0].ts;
      }
   }
}

这将遍历每条消息,m.getTopic()将获得与当前消息相对应的主题,msg是当前消息,stamp是此消息的时间被记录。