ROS2 bag中自定义msg信息转为rviz中显示信息

本文介绍如何在ROS2环境中使用rviz显示自定义bag文件中的msg信息。通过解析自定义msg,将其转换为PCL点云,然后转化为rviz兼容的点云消息进行发布,从而在rviz中实现可视化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际开发中,往往会参考传感器信息类型需要,定义专门的msg信息,然后提取其中的有用数据用于后续的计算开发。

试验过程中采集的各种场景下的ROSbag也非常多,经常会在某个场景采集多次,有时候会希望在PC端实现采集场景的信息复现,ROS中常用的可视化显示中包括rviz。

本文简述一个小功能,在ROS2的rviz中显示出自定义msg信息。

原理主要是,将自定义bag里面msg中自定义的信息解析并提取出来(subscription),赋值给PCL格式下的例如PointCloud<pcl::PointXYZ>,然后再将PCL格式的点云以rviz中常用的数据格式显示出来。

首先iclude所有涉及到的msg编译好的.h文件

#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/point_cloud.hpp"
#include "yourmsg/msg/pose_estimation.hpp"
#include <pcl/point_types.h>

 再者,PCL点云格式转化成rviz中可显示的std::msg信息,需要用到转换工具:

#include "pcl_conversions/pcl_conversions.h"

如果没有安装PCL工具的需要提前先安装对应ROS版本的PCL工具。

sudo apt install ros-你的ROS版本代号-pcl*

之后就是按照原理所述,先订阅bag中的msg信息,解析为基本数据结构(例如结构体),提取其中的有用信息赋值给PCL中的点云格式点,在将其转化为std::msg

class Ros2bagshow: public rclcpp::Node
{
public:
    Ros2bagshow(): Node("ros2bag_show")
    {
        subscription_SLAM = this->create_subscription<yourmsg::msg::PoseEstimation>("fuse_localization_pub", 10, std::bind(&Ros2bagshow::topic_callback, this, std::placeholders::_1));
        publisher_SLAM = this->create_publisher<sensor_msgs::msg::PointCloud2>("point_cloud_topic", 10);
    }
    
private:
    rclcpp::Subscription<yourmsg::msg::PoseEstimation>::SharedPtr subscription_SLAM;
    rclcpp::Publisher<sensor_msgs::msg::PointCloud2>::SharedPtr publisher_SLAM;

    void topic_callback(const yourmsg::msg::oseEstimation::SharedPtr msg){
        sensor_msgs::msg::PointCloud2 std_msg;
        pcl::PointCloud<pcl::PointXYZ> pcl_cloud;
        pcl::PointXYZ msg_p;

        msg_p.x = msg->x;
        msg_p.y = msg->y;
        msg_p.z = msg->z;
        std::cout << msg_p.x << " " << msg_p.y << " " << msg_p.z << std::endl;

        pcl_cloud.push_back(msg_p); 
        pcl::toROSMsg(pcl_cloud, std_msg);
        std_msg.header.frame_id = "ros2bag_show_frame";
        publisher_SLAM->publish(std_msg);
    }
};


int main(int argc, char * argv[])
{
    rclcpp::init(argc, argv);
    auto node = std::make_shared<Ros2bagshow>();
    rclcpp::spin(node);
    rclcpp::shutdown();

    return 0;
}

编译成功能包,之后再将其与rosbag一起运行之后就可以完成新格式的数据解析和发布,再打开rviz就可以在显示的topic中找到对应的项目选中显示即可。

ROS 2中,如果要录制自定义消息类型(message),首先你需要确保自定义消息已经被正确地定义并且已经在Node上发布。以下是录制自定义msg类型的步骤: 1. **创建自定义消息**: - 使用ROS msg工具(如`rosmsg`, `rosidl_generator_cpp`等)生成对应的消息文件。例如,假设你有一个名为`MyCustomMsg`的自定义消息,你可以通过以下命令生成: ```shell ros2 interface add my_custom_msg MyCustomMsg.xml ``` 这会创建一个`.msg`文件和对应的`.srv`文件(如果有服务的话)。 2. **将消息包含到node中**: - 在你的节点代码中,使用`import`语句引入刚刚生成的消息定义。 3. **开始录制**: - 使用`ros2 bag record`命令,指定要记录的主题名(topic)以及包含自定义msg的节点,加上自定义msg的type作为参数: ```shell ros2 bag record --duration=60 /my_topic --topics '/my_topic' --clock your_node_name ``` `your_node_name`应替换为你的节点名称。`--duration`参数设置录制的时间长度,`--clock`选项确保时间戳的一致性。 4. **确认消息类型已被识别**: 在运行前,确保你的节点已经注册了自定义消息类型,并且在`ros2 topic list`中能看到`/my_topic`主题显示为`YourMessageType`。 5. **结束录制并验证**: 录制结束后,你可以通过`ros2 bag info`检查是否成功记录了自定义消息。 注意,自定义消息必须先在ROS 2的命名空间(namespace)中注册才能被其他节点接收。如果还没有注册,需要在相应的节点启动时使用`ros2 topic pub`命令发布几条消息以便初始化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值