3

我正在编写一个程序来直接从 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;
    }
}

在这方面的任何帮助都将是可观的。

4

1 回答 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

于 2020-03-13T16:15:28.057 回答