如何在ROS2中从rosbag2读取数据

4
我正在编写一个程序,用于直接从rosbag中读取数据而不播放它在ros2中。以下是示例代码片段。该代码的目的是检查ros2主题并仅获取该主题中的消息。但我无法从袋中获取数据。当打印时,控制台将打印十六进制值。
auto read_only_storage = factory.open_read_only(bag_file_path, storage_id);
while(read_only_storage->has_next())
{
    auto msg = read_only_storage->read_next();
    if(msg->topic_name == topic)
    {
        cout << msg->serialized_data<<endl;
    }
}

任何在这方面的帮助都是可取的。
1个回答

1
你需要对“msg->serialized_data”数据进行反序列化。如果你使用的是以cdr格式序列化的数据,请查看以下代码。
    // deserialization and conversion to ros message
    my_pkg::msg::Msg msg;
    auto ros_message = std::make_shared<rosbag2_introspection_message_t>();
    ros_message->time_stamp = 0;
    ros_message->message = nullptr;
    ros_message->allocator = rcutils_get_default_allocator();
    ros_message->message = &msg;
    auto type_support = rosbag2::get_typesupport("my_pkg/msg/Msg", "rosidl_typesupport_cpp");

    rosbag2::SerializationFormatConverterFactory factory;
    std::unique_ptr<rosbag2::converter_interfaces::SerializationFormatDeserializer> cdr_deserializer_;
    cdr_deserializer_ = factory.load_deserializer("cdr");

    cdr_deserializer_->deserialize(msg, type_support, ros_message);

完整代码: https://github.com/Kyungpyo-Kim/ROS2BagFileParsing


你知道如何使消息类型(例如my_pkg :: msg :: Msg)通用吗?我现在拥有的是一个包含消息类型(“my_pkg / msg / Msg”)和SerializedMessage的字符串,我需要以某种方式将其转换回原始消息,以便可以内省MemberFields。 - nyxaria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接