ROS2入门21讲__第19讲__Rviz:三维可视化显示平台

目录

前言

Rviz三维可视化平台

Rviz介绍

运行方法

彩色相机仿真与可视化

仿真插件配置

运行仿真环境

图像数据可视化

三维相机仿真与可视化

仿真插件配置

运行仿真环境

点云数据可视化

激光雷达仿真与可视化

仿真插件配置

运行仿真环境

点云数据可视化

Rviz vs Gazebo


前言

大家有没有畅想过一个问题,机器人眼中的世界是什么样的呢?如何能够看到机器人摄像头拍摄到的图像?

这就涉及到可视化显示的范畴了,本讲我们介绍一位ROS中的重量级嘉宾——Rviz,一款三维可视化显示的神器。

Rviz三维可视化平台

机器人开发过程中,各种各样的功能,如果我们只是从数据层面去做分析,很难快速理解数据的效果,比如给你一堆0到255的数字,问这幅图像描述的内容是什么?你肯定一脸懵。但如果我们把这些数字通过颜色渲染出来,岂不就一目了然么?

类似的场景还有很多,比如机器人模型,我们需要知道自己设计的模型长啥样,还有模型内部众多坐标系在运动过程中都在哪些位置。

再比如机械臂运动规划和移动机器人自主导航,我们希望可以看到机器人周边的环境、规划的路径,当然还有传感器的信息,摄像头、三维相机、激光雷达等等,数据是用来做计算的,可视化的效果才是给人看的。

所以,数据可视化可以大大提高开发效率,Rviz就是这样一款机器人开发过程中的数据可视化软件,机器人模型、传感器信息、环境信息等等,全都可以在这里搞定。

Rviz介绍

一句话说明Rviz的功能,只要有数据,它就可以可视化,只有我们想不到的,没有Rviz做不到的。

Rviz的核心框架是基于Qt可视化工具打造的一个开放式平台,官方出厂就自带了很多机器人常用的可视化显示插件,只要我们按照ROS中的消息发布对应的话题,就可以看到图形化的效果了。如果我们对显示的效果不满意,或者想添加某些新的显示项,也可以在Rviz这个平台中,开发更多可视化效果,方便打造我们自己的上位机。

运行方法

启动一个终端,使用如下命令即可启动:

$ ros2 run rviz2 rviz2

彩色相机仿真与可视化

摄像头肯定是最为常用的一种传感器了,我们先来给机器人装上摄像头。

仿真插件配置

关于传感器的仿真,都需要使用Gazebo提供的插件,摄像头对应的插件叫做libgazebo_ros_camera.so,我们对照模型的代码给大家介绍这个插件的使用方法。

learning_gazebo/urdf/sensers/camera_gazebo.xacro

<gazebo reference="${prefix}_link">
    <sensor type="camera" name="camera_node">
        <update_rate>30.0</update_rate>
        <camera name="head">
            <horizontal_fov>1.3962634</horizontal_fov>
            <image>
                <width>1280</width>
                <height>720</height>
                <format>R8G8B8</format>
            </image>
            <clip>
                <near>0.02</near>
                <far>300</far>
            </clip>
            <noise>
                <type>gaussian</type>
                <mean>0.0</mean>
                <stddev>0.007</stddev>
            </noise>
        </camera>
        <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
            <ros>
                <!-- <namespace>stereo</namespace> -->
                <remapping>~/image_raw:=image_raw</remapping>
                <remapping>~/camera_info:=camera_info</remapping>
            </ros>
            <camera_name>${prefix}</camera_name>
            <frame_name>${prefix}_link</frame_name>
            <hack_baseline>0.2</hack_baseline>
        </plugin>
    </sensor>
</gazebo>

主要配置项如下:

  • <sensor>标签:描述传感器

type:传感器类型,camera

name:摄像头命名,自由设置

  • <camera>标签:描述摄像头参数

分辨率,编码格式,图像范围,噪音参数等

  • <plugin>标签:加载摄像头仿真插件

运行仿真环境

模型已经配置好啦,能不能把摄像头成功仿真出来,并且在Rviz中看到图像信息,我们拭目以待。

$ ros2 launch learning_gazebo load_mbot_camera_into_gazebo.launch.py

可以使用命令行看下仿真出来的图像话题:

图像数据可视化

我们使用Rviz可视化显示图像信息,先来启动Rviz:

$ ros2 run rviz2 rviz2

启动成功后,在左侧Displays窗口中点击“Add”,找到Image显示项,OK确认后就可以加入显示列表啦,然后配置好该显示项订阅的图像话题,就可以顺利看到机器人的摄像头图像啦。

三维相机仿真与可视化

二维摄像头不过瘾,想不想试试三维相机,比如我们常用的Kinect体感传感器,或者Intel的Realsense,可以获取外部环境的点云数据。这种相机的价格比usb摄像头可贵不少,不过我们也可以通过仿真,一分钱不用,就可以玩起来。

仿真插件配置

三维相机使用的Gazebo插件也是libgazebo_ros_camera.so,配置方法如下:

learning_gazebo/urdf/sensers/kinect_gazebo.xacro

<gazebo reference="${prefix}_link">
    <sensor type="depth" name="${prefix}">
        <always_on>true</always_on>
        <update_rate>15.0</update_rate>
        <pose>0 0 0 0 0 0</pose>
        <camera name="kinect">
            <horizontal_fov>${60.0*M_PI/180.0}</horizontal_fov>
            <image>
                <format>R8G8B8</format>
                <width>640</width>
                <height>480</height>
            </image>
            <clip>
                <near>0.05</near>
                <far>8.0</far>
            </clip>
        </camera>
        <plugin name="${prefix}_controller" filename="libgazebo_ros_camera.so">
            <ros>
                <!-- <namespace>${prefix}</namespace> -->
                <remapping>${prefix}/image_raw:=rgb/image_raw</remapping>
                <remapping>${prefix}/image_depth:=depth/image_raw</remapping>
                <remapping>${prefix}/camera_info:=rgb/camera_info</remapping>
                <remapping>${prefix}/camera_info_depth:=depth/camera_info</remapping>
                <remapping>${prefix}/points:=depth/points</remapping>
            </ros>
            <camera_name>${prefix}</camera_name>
            <frame_name>${prefix}_frame_optical</frame_name>
            <hack_baseline>0.07</hack_baseline>
            <min_depth>0.001</min_depth>
            <max_depth>300.0</max_depth>
        </plugin>
    </sensor>
</gazebo>

运行仿真环境

使用如下命令启动仿真环境:

$ ros2 launch learning_gazebo load_mbot_rgbd_into_gazebo.launch.py

启动成功后,可以看下当前的话题列表,已经产生了三维相机的相关话题。

点云数据可视化

运行Rviz:

$ ros2 run rviz2 rviz2

同样的流程,点击Add,添加PointCloud2,设置订阅的点云话题,还要配置Rviz的参考系是odom,就可以看到点云数据啦,每一个点都是由xyz位置和rgb颜色组成。

激光雷达仿真与可视化

除了摄像头和三维相机,激光雷达也是很多移动机器人常备的传感器,包括自动驾驶汽车,我们也来试一试。

仿真插件配置

雷达使用的Gazebo插件是libgazebo_ros_ray_sensor.so,配置方法如下:

learning_gazebo/urdf/sensers/lidar_gazebo.xacro

<gazebo reference="${prefix}_link">
    <sensor type="ray" name="rplidar">
        <update_rate>20</update_rate>
        <ray>
            <scan>
              <horizontal>
                <samples>360</samples>
                <resolution>1</resolution>
                <min_angle>-3</min_angle>
                <max_angle>3</max_angle>
              </horizontal>
            </scan>
            <range>
              <min>0.10</min>
              <max>30.0</max>
              <resolution>0.01</resolution>
            </range>
            <noise>
              <type>gaussian</type>
              <mean>0.0</mean>
              <stddev>0.01</stddev>
            </noise>
        </ray>
        <plugin name="gazebo_rplidar" filename="libgazebo_ros_ray_sensor.so">
      <ros>
    <namespace>/</namespace>
    <remapping>~/out:=scan</remapping>
      </ros>
      <output_type>sensor_msgs/LaserScan</output_type>
        </plugin>
    </sensor>
</gazebo>

运行仿真环境

使用如下命令启动仿真环境:

$ ros2 launch learning_gazebo load_mbot_laser_into_gazebo.launch.py

在话题列表中也可以看到激光雷达啦。

点云数据可视化

启动Rviz:

$ ros2 run rviz2 rviz2

点击Add,选择Laserscan,然后配置订阅的话题名,rviz的固定坐标系依然是odom,此时就可以看到激光点啦。

Rviz vs Gazebo

好啦,通过这几个案例,相信大家对Rviz可视化平台的使用流程已经非常熟悉了,也了解了常用传感器的仿真方法。

讲到这里,Gazebo和Rviz这两个软件的具体功能,大家是不是会有一些混淆。

我们再来强调下:

  • Gazebo是仿真平台,核心功能是创造数据,我们没有机器人或者传感器,它可以帮我们做一个虚拟的;
  • Rviz是可视化平台,核心功能是显示数据,如果没有数据,它也巧妇难为无米之炊。

所以在很多时候,我们使用Gazebo做机器人仿真的时候,也会启动Rviz来显示仿真环境的信息,如果自己手上有真实机器人的话,Gazebo就用不到了,不过还是会用Rviz显示真实机器人传感器的信息。

我的机器人模型:<!-- 组合小车底盘与传感器 --> <robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro"> <xacro:include filename="my_head.urdf.xacro" /> <xacro:include filename="my_base.urdf.xacro" /> <xacro:include filename="my_laser.urdf.xacro" /> <xacro:include filename="move.urdf.xacro" /> <!-- 雷达仿真的 xacro 文件 --> <xacro:include filename="my_sensors_laser.urdf.xacro" /> </robot> 请帮我修改my_sensors_laser.urdf.xacro:<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro"> <!-- 雷达(VLP-16) --> <gazebo reference="laser"> <sensor type="gpu_ray" name="vlp16"> <pose>0 0 0 0 0 0</pose> <visualize>true</visualize> <update_rate>10</update_rate> <ray> <scan> <horizontal> <samples>2000</samples> <resolution>0.18</resolution> <min_angle>-3.1415926535</min_angle> <max_angle>3.1415926535</max_angle> </horizontal> <vertical> <samples>16</samples> <resolution>0.2</resolution> <min_angle>-0.261799</min_angle> <max_angle>0.261799</max_angle> </vertical> </scan> <range> <min>0.10</min> <max>100.0</max> <resolution>0.03</resolution> </range> <noise> <type>gaussian</type> <mean>0.0</mean> <stddev>0.03</stddev> </noise> </ray> <plugin name="gazebo_vlp16" filename="libgazebo_ros_gpu_laser.so"> <topicName>/velodyne_points</topicName> <frameName>laser</frameName> <min_range>0.10</min_range> <max_range>100.0</max_range> <hmin>-3.1415926535</hmin> <hmax>3.1415926535</hmax> <vmin>-0.261799</vmin> <vmax>0.261799</vmax> <samples>2000</samples> <resolution>1.0</resolution> <gpu>true</gpu> </plugin> </sensor> </gazebo> </robot>让rostopic info /velodyne_points Type: sensor_msgs/LaserScan 输出的类型为Pointcloud2
最新发布
04-02
为了让你的 Gazebo 模拟器发布 `/velodyne_points` 话题的数据类型从 `sensor_msgs/LaserScan` 改为 `sensor_msgs/PointCloud2`,你需要对当前的 `my_sensors_laser.urdf.xacro` 文件做一些关键性的更改。 以下是修改后的文件内容及其解释: --- ### 修改后的 `my_sensors_laser.urdf.xacro` ```xml <robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro"> <!-- 定义雷达链路 --> <link name="laser"> <visual> <geometry> <box size="0.1 0.1 0.1"/> </geometry> </visual> <collision> <geometry> <box size="0.1 0.1 0.1"/> </geometry> </collision> </link> <!-- 雷达(VLP-16)仿真配置 --> <gazebo reference="laser"> <sensor type="gpu_ray" name="vlp16"> <pose>0 0 0 0 0 0</pose> <visualize>true</visualize> <update_rate>10</update_rate> <!-- 设置扫描参数 --> <ray> <scan> <horizontal> <samples>2000</samples> <resolution>0.18</resolution> <min_angle>-3.1415926535</min_angle> <max_angle>3.1415926535</max_angle> </horizontal> <vertical> <samples>16</samples> <resolution>0.2</resolution> <min_angle>-0.261799</min_angle> <max_angle>0.261799</max_angle> </vertical> </scan> <!-- 范围参数 --> <range> <min>0.10</min> <max>100.0</max> <resolution>0.03</resolution> </range> <!-- 添加噪声模拟 --> <noise> <type>gaussian</type> <mean>0.0</mean> <stddev>0.03</stddev> </noise> </ray> <!-- 替换插件为 PointCloud2 类型 --> <plugin name="gazebo_ros_vlp16" filename="libgazebo_ros_velodyne_lidar.so"> <frameName>laser</frameName> <topicName>/velodyne_points</topicName> <minRange>0.10</minRange> <maxRange>100.0</maxRange> <updateRate>10.0</updateRate> <numLaserBeams>16</numLaserBeams> <rpm>300.0</rpm> <pointCloudFormat>VLP_16</pointCloudFormat> </plugin> </sensor> </gazebo> </robot> ``` --- ### 关键点解析 1. **插件更换** 将原来的 `libgazebo_ros_gpu_laser.so` 插件替换为专门用于 Velodyne LiDAR 的插件 `libgazebo_ros_velodyne_lidar.so`。这个插件会直接发布 `sensor_msgs/PointCloud2` 类型的消息。 2. **参数调整** - 新增了 `<numLaserBeams>` 参数,表示激光束的数量(对于 VLP-16 来说就是 16 束)。 - 使用 `<pointCloudFormat>` 明确指定了输出格式为 "VLP_16"。 3. **话题名称保持一致** 确保发布的消息仍然在 `/velodyne_points` 上,以便下游节点能够无缝对接。 4. **可视化支持** 在 Gazebo 中启用 `<visualize>true</visualize>`,可以直观地查看雷达的行为和范围。 --- ### 测试结果 当你运行完整系统后,输入以下命令检查主题信息: ```bash rostopic info /velodyne_points ``` 此时应显示: ``` Type: sensor_msgs/PointCloud2 ``` 此外,还可以使用 RViz 查看点云数据是否正确呈现出来。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值