【问题标题】:How to read data from rosbag2 in ros2如何在ros2中从rosbag2读取数据
【发布时间】:2020-06-02 13:21:57
【问题描述】:

我正在编写一个程序直接从rosbag读取数据,而不是在ros2中播放。示例代码 sn-p 如下。该代码的目的是检查 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;
    }
}

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

【问题讨论】:

    标签: c++ c++14 ros ros2 rosbag


    【解决方案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

    【讨论】:

    • 你知道一种使 msg 类型(即 my_pkg::msg::Msg)通用的方法吗?我现在拥有的是一个字符串,它具有消息类型(“my_pkg/msg/Msg”)和一个 SerializedMessage,我需要以某种方式将其恢复为原始消息,以便我可以自省 MemberFields。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多