当前位置: 首页 > news >正文

ROS2从入门到精通2-2:详解机器人3D可视化工具Rviz2与案例分析

目录

  • 0 专栏介绍
  • 1 什么是Rviz2?
  • 2 Rviz2基本界面
  • 3 Rviz2基本数据类型
  • 4 数据可视化案例
    • 4.1 实例1:显示USB摄像头数据
    • 4.2 实例2:显示球体

0 专栏介绍

本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。

🚀详情:《ROS2从入门到精通》


1 什么是Rviz2?

机器人是复杂的机电系统,其运行过程中自身或与环境交互将产生大量数据,这些数据通常以复杂的数据结构保存在内存或磁盘中,例如栅格地图数据

# This represents a 2-D grid map, in which each cell represents the probability of
# occupancy.Header header #MetaData for the map
MapMetaData info# The map data, in row-major order, starting with (0,0).  Occupancy
# probabilities are in the range [0,100].  Unknown is -1.
int8[] data

这种抽象的数据结构不利于开发者直观第感受数据所描述的内容,因此ROS提供了一个三维可视化工具,用于可视化传感器的数据和状态信息——Rviz2

Rviz很好地兼容了各种基于ROS软件框架的机器人平台。在Rviz2中,可以使用XML对机器人、周围物体等任何实物进行

  • 尺寸
  • 质量
  • 位置
  • 材质
  • 关节

等属性的描述,并且在界面中呈现出来。同时,Rviz2还可以通过图形化的方式,实时显示机器人传感器的信息、机器人的运动状态、周围环境的变化等。

在这里插入图片描述

2 Rviz2基本界面

Rviz2已经集成在桌面完整版的ROS2系统当中,可以通过命令行启动

ros2 run rviz2 rviz2

启动成功的Rviz2主界面如下

在这里插入图片描述

分为几个区域:

  • 3D视图区:用于可视化显示数据,目前没有任何数据,所以显示黑色
  • 工具栏:提供视角控制、目标设置、发布地点等工具
  • 显示列表:左侧的显示列表是从各种话题当中选择用户所需的数据的视图的区域。单击左下方的Add可以添加显示插件,具体的插件参见第3节
  • 视图设置:右侧的视图设置可以选择多种观测视角
  • Orbit:以指定的视点(在这里称为Focus)为中心旋转。这是默认情况下最常用的基本视图。
  • FPS(第一人称):显示第一人称视点所看到的画面。
  • ThirdPersonFollower:显示以第三人称的视点尾追特定目标的视图
  • TopDownOrtho:这是Z轴的视图,与其他视图不同,以直射视图显示,而非透视法。
  • XYOrbit:类似于Orbit的默认值,但焦点固定在Z轴值为0的XY平面上。
  • 时间:显示当前的系统时间和ROS时间

3 Rviz2基本数据类型

类型描述消息类型
Axes显示坐标系
Camera打开一个新窗口显示机器人摄像头图像sensor_msgs/msg/Image

sensor_msgs/msg/CameraInfo

Grid显示2D或3D网格
Grid Cells绘制网格的每个单元格,主要用于显示导航的costmap中的障碍nav_msgs/msg/GridCells
Image打开一个新窗口显示图像信息sensor_msgs/msg/Image
LaserScan显示激光扫描值,将传感器信息中的数据显示为世界上的点sensor_msgs/msg/LaserScan
Map显示导航中使用的栅格地图nav_msgs/msg/OccupancyGrid
Markers绘制各种基本形状(箭头、立方体、球体、圆柱体、点、文本等)visualization_msgs/msg/Marker

visualization_msgs/msg/MarkerArray

Path显示导航中使用的机器人路径nav_msgs/msg/Path
PointCloud

PointCloud2

显示点云数据,一般用于深度相机sensor_msgs/msg/PointCloud

sensor_msgs/msg/PointCloud2

Polygon绘制一个多边形轮廓geometry_msgs/msg/Polygon
Odomerty显示里程计数据,例如,将随着机器人运动产生的连续路径(位置与方向)沿着时间间隔以箭头形式呈现nav_msgs/msg/Odometry
RobotModel显示机器人模型
TF显示TF树

4 数据可视化案例

进行数据可视化的数据以对应的消息类型发布,在Rviz2中使用相应的显示插件订阅该消息即可实现可视化。

在这里插入图片描述
添加完成后,Rviz2左侧的显示列表中会列出已经添加的插件,根据每个插件属性列表的需求设置即可。其中Topic属性用来声明该显示插件所订阅的数据来源,如果订阅成功,在中间的显示区应该会出现可视化后的数据。如果显示有问题,请检查属性区域的Status状态。Status有四种状态:OKWarningErrorDisabled,如果显示的状态不是OK,那么请查看错误信息,并详细检查数据发布是否正常。

下面介绍两个使用Rviz2的实例。

4.1 实例1:显示USB摄像头数据

USB摄像头的基本配置可以参考文章从零开始Ubuntu16.04+ORBSLAM2+ROS实验实录(二):相机测试与标定

编写启动文件配置Rviz2以及usb_cam节点

def generate_launch_description():# Get the launch directorysimulation_dir = os.path.abspath(os.path.join(__file__, "../../"))# Create the launch configuration variablesrviz_config_file = LaunchConfiguration('rviz_config')declare_rviz_config_file_cmd = DeclareLaunchArgument('rviz_config',default_value=os.path.join(simulation_dir, 'rviz', 'simulation.rviz'),description='Full path to the RVIZ config file to use')# Launch rvizstart_rviz_cmd = Node(package='rviz2',executable='rviz2',arguments=['-d', rviz_config_file],output='screen')exit_event_handler = RegisterEventHandler(event_handler=OnProcessExit(target_action=start_rviz_cmd,on_exit=EmitEvent(event=Shutdown(reason='rviz exited'))))camera_handler = Node(package='usb_cam', executable='usb_cam_node_exe', output='screen',name="camera1",parameters=[os.path.join(simulation_dir, 'config', 'params.yaml')],)# Create the launch description and populateld = LaunchDescription()# Declare the launch optionsld.add_action(declare_rviz_config_file_cmd)# Add any conditioned actionsld.add_action(start_rviz_cmd)# Add other nodes and processes we needld.add_action(exit_event_handler)ld.add_action(camera_handler)return ld

其中相机参数文件params.yaml如下所示,可以根据自己的相机情况配置

/**:ros__parameters:video_device: "/dev/video0"framerate: 30.0io_method: "mmap"frame_id: "camera"pixel_format: "mjpeg2rgb"  # see usb_cam/supported_formats for list of supported formatsav_device_format: "YUV422P"image_width: 640image_height: 480camera_name: "test_camera"camera_info_url: "package://simulation/config/camera_info.yaml"brightness: -1contrast: -1saturation: -1sharpness: -1gain: -1auto_white_balance: truewhite_balance: 4000autoexposure: trueexposure: 100autofocus: falsefocus: -1

USB相机的图像话题是/image_raw,那么在Rviz2中订阅该话题即可,如下图所示。

在这里插入图片描述

4.2 实例2:显示球体

第三节提到过Rviz2Marker的消息类型是visualization_msgs::msg::Marker,因此我们向话题visualization_marker发布定义的球体数据,包括大小、颜色、位置等,接着在Rviz2中订阅即可。

int main(int argc, char *argv[])
{rclcpp::init(argc, argv);auto node = std::make_shared<PublisherNode>();rclcpp::Rate loop_rate(10);while (rclcpp::ok()){auto sphere = visualization_msgs::msg::Marker();sphere.header.frame_id = "map";sphere.header.stamp = node->get_clock()->now();sphere.ns = "rviz_lab";sphere.id = 0;// 声明为球体sphere.type = visualization_msgs::msg::Marker::SPHERE;sphere.action = visualization_msgs::msg::Marker::ADD;// 位姿sphere.pose.position.x = 0;sphere.pose.position.y = 0;sphere.pose.position.z = 0;sphere.pose.orientation.x = 0.0;sphere.pose.orientation.y = 0.0;sphere.pose.orientation.z = 0.0;sphere.pose.orientation.w = 1.0;// 大小sphere.scale.x = 1.0;sphere.scale.y = 1.0;sphere.scale.z = 1.0;// 颜色sphere.color.r = 0.0f;sphere.color.g = 1.0f;sphere.color.b = 0.0f;sphere.color.a = 1.0;node->publish(sphere);RCLCPP_INFO(node->get_logger(), "Publishing SPHERE in Rviz2");loop_rate.sleep();}rclcpp::shutdown();return 0;
}

在这里插入图片描述

完整代码通过下方博主名片联系获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇
http://www.lryc.cn/news/383542.html

相关文章:

  • 国企:2024年6月中国铁路相关招聘信息,6.27截止
  • React+TS前台项目实战(十九)-- 全局常用组件封装:带加载状态和清除等功能的Input组件实现
  • php composer 报错
  • 数据安全如何防护?迅软加密软件保护企业数据资产
  • Android 11 ,默认授予预置应用/APK 需要的权限,解决permission denied for window type 2003 问题。
  • RabbitMQ(消息队列)
  • LeetCode-数组/回溯-No40组合总和II
  • 直接调用 Java 线程的 run() 方法会发生什么?
  • 计算机毕业设计Thinkphp/Laravel学生考勤管理系统zyoqy
  • 3浏览器安全
  • 昇思25天学习打卡Day01
  • Python-爬虫 下载天涯论坛帖子
  • 创建github个人博客
  • 【五子棋game】
  • 从入门到精通:使用Python的Watchdog库监控文件系统的全面指南
  • Linux 进程管理指令
  • Java OA系统通知公告模块
  • 简约的服务器监控工具Ward
  • 新能源发电乙级资质所需办理标准
  • Elasticsearch:使用 Llamaindex 的 RAG 与 Elastic 和 Llama3
  • AcWing算法基础课笔记——高斯消元
  • 【JavaScript脚本宇宙】图形魔术:探索领先的图像处理库及其独特功能
  • Nemotron-4
  • 【神经网络】神经元的基本结构和训练过程
  • 第28课 绘制原理图——绘制导线
  • NLP 相关知识
  • Java中的设计模式:实战案例分享
  • 并发编程理论基础——合适的线程数量和安全的局部变量(十)
  • Python使用抽象工厂模式和策略模式的组合实现生成指定长度的随机数
  • python-17-零基础自学python-