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 directory
    simulation_dir = os.path.abspath(os.path.join(__file__, "../../"))

    # Create the launch configuration variables
    rviz_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 rviz
    start_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 populate
    ld = LaunchDescription()

    # Declare the launch options
    ld.add_action(declare_rviz_config_file_cmd)

    # Add any conditioned actions
    ld.add_action(start_rviz_cmd)

    # Add other nodes and processes we need
    ld.add_action(exit_event_handler)

    ld.add_action(camera_handler)
    return ld

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

/**:
    ros__parameters:
      video_device: "/dev/video0"
      framerate: 30.0
      io_method: "mmap"
      frame_id: "camera"
      pixel_format: "mjpeg2rgb"  # see usb_cam/supported_formats for list of supported formats
      av_device_format: "YUV422P"
      image_width: 640
      image_height: 480
      camera_name: "test_camera"
      camera_info_url: "package://simulation/config/camera_info.yaml"
      brightness: -1
      contrast: -1
      saturation: -1
      sharpness: -1
      gain: -1
      auto_white_balance: true
      white_balance: 4000
      autoexposure: true
      exposure: 100
      autofocus: false
      focus: -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深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/745140.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python turtle 001画两只小狗

效果图&#xff1a; 代码&#xff1a; pythonturtle001画两只小狗资源-CSDN文库 # 作者V w1933423import turtle # 导入turtle模块def draw_dogs():turtle.setup(800, 800) # 设置画布大小为800x800p turtle.Pen() # 创建一个画笔对象p.pensize(14) # 设置画笔大小为14p.…

【PL理论深化】(7) Ocaml 语言:静态类型语言 | 自动类型推断 | 多态类型和多态函数 | let-多态类型系统

&#x1f4ac; 写在前面&#xff1a;OCaml 是一种拥有静态类型系统的语言&#xff0c;本章我们就要探讨静态类型系统。 目录 0x00 静态类型系统 0x01 自动类型推断&#xff08;automatic type inference&#xff09; 0x02 多态类型和多态函数 0x03 let-多态类型系统&#…

微信群聊不见了?掌握这4个技巧轻松找回,简直太爽了

微信&#xff0c;作为国内最受欢迎的社交应用之一&#xff0c;其群聊功能极大地方便了人们的工作与生活。然而&#xff0c;随着加入的群聊数量日益增多&#xff0c;如何快速找到并管理这些群聊成为了一个难题。 幸运的是&#xff0c;微信提供了一些实用的技巧&#xff0c;帮助…

Linux 安装ElasticSearch + FSCrawler 扫描本地的文件资源

文章目录 0. 前言1. 安装ElasticSearch1.1 下载安装包1.2 新增用户1.3 解压安装包1.4 更改文件夹用户1.5 修改配置文件1.6 修改系统配置1.7 启动集群 2. 安装FSCrawler2.1 下载安装包2.2 创建配置文件2.3 修改配置文件2.4 启动2.5 验证是否被索引 0. 前言 Elasticsearch 是一个…

Ubuntu-22.04 安装禅道

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

绿色共享购:共创绿色消费新纪元

在当今快节奏的社会中&#xff0c;人们对绿色消费和共享经济的追求愈发凸显其重要性。为了满足这一需求&#xff0c;我们创新推出了“绿色共享购”这一前沿的消费增值模式。该模式不仅有效整合了商家资源&#xff0c;更通过其独特的机制&#xff0c;实现了商家与消费者的双重增…

国产音频放大器工作原理以及应用领域

音频放大器是在产生声音的输出元件上重建输入的音频信号的设备&#xff0c;其重建的信号音量和功率级都要理想&#xff1a;如实、有效且失真低。音频范围为约20Hz&#xff5e;20000Hz&#xff0c;因此放大器在此范围内必须有良好的频率响应&#xff08;驱动频带受限的扬声器时要…

【代码随想录——动态规划——序列问题】

1.最初上升子序列 func lengthOfLIS(nums []int) int {length : len(nums)dp : make([]int, length)for i:0;i<length;i{dp[i] 1}//对于每一个i&#xff0c;我们都需要回过头去遍历是否可以更新长度for i:0;i<length;i{for j:0;j<i;j{if nums[i]>nums[j]{dp[i] m…

聊聊AI在企业数字化转型中的作用

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经深入到我们生活的方方面面&#xff0c;尤其在数字化转型的浪潮中&#xff0c;AI技术更是扮演着举足轻重的角色。数字化转型&#xff0c;简而言之&#xff0c;就是企业利用数字技术来改造其业务运营方式&a…

SpringBoot学习03-[Spring Boot与Web开发]

Spring Boot与Web开发 RestTemplateMockMvc在SPringBoot中使用 SpringBoot整合swagger2SpringBoot的springmvc自动配置底层原理包含ContentNegotiatingViewResolver和BeanNameViewResolverContentNegotiatingViewResolverBeanNameViewResolver 支持提供静态资源&#xff0c;包括…

【面试干货】Java中==和equals()的区别

【面试干货】Java中和equals&#xff08;&#xff09;的区别 1、操作符2、equals()方法3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;和equals()是两个常用的比较操作符和方法&#xff0c;但它们之间的用法和…

聚星文社官网

推文工具可以帮助你将小说内容简洁明了地转化为推文形式&#xff0c;以便更好地在社交媒体上进行宣传和推广。以下是一些建议的小说推文工具&#xff1a; 聚星文社 字数统计工具&#xff1a;使用字数统计工具&#xff0c;如Microsoft Word或在线字数统计器&#xff0c;来确保你…

PCM、WAV,立体声,单声道,正弦波等音频素材

1&#xff09;PCM、WAV音频素材&#xff0c;分享给将要学习或者正在学习audio开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 常用的Audio PCM WAV不同采样率&#xff0c;不同采样深度&#…

【结构体】详解

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

web前端大作业--美团外卖1

文章目录 概述代码截图代码链接 概述 web美团 登录和注册功能、页面展示。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href&quo…

大模型技术的应用场景

大模型技术&#xff08;Large Language Model&#xff0c;LLM&#xff09;是指具有大量参数和训练数据的神经网络模型&#xff0c;它能够学习语言的统计规律&#xff0c;并生成与人类书写的文本相似的文本。大模型技术在近年来取得了重大进展&#xff0c;并开始在各种领域得到应…

中国杀出全球首个烹饪大模型

什么&#xff1f;烹饪也有大模型&#xff1f;&#xff01; 没有听错&#xff0c;这就是国产厨电龙头老板电器最新发布——“食神”大模型。 数十亿级行业数据&#xff0c;数千万级知识图谱加持&#xff0c;据称还是全球首个。 它能为每个人提供个性化量身定制的解决方案&…

从入口文件搭建php项目

入口文件index.php <?phprequire CallBack.php; // 处理回调请求逻辑 $bot new CallBack();// 请求方式 if (isset($_GET[method])) {$method $_GET[method];if (method_exists($bot, $method)) {return $bot->$method();} else {echo "没有该功能";die();…

系统思考—啤酒游戏经营决策沙盘

在日常的教学中&#xff0c;我们通过系统思考仿真演练深入探索决策背后的动因。例如&#xff0c;我经常教授的麻省理工学院研发的“啤酒游戏”和“人民航空策略模拟”&#xff0c;这些都是麻省理工MBA学生的必修课。此外&#xff0c;还有更简洁的“红黑游戏”“收获季节”等模拟…

Typora 更换皮肤

typora 下载激活 上面的链接已经讲了如何下载激活typora工具,本篇说一下如何给typora换肤 typora 中文官网 进入官网,在整体界面布局的上方找到主题 下面以其中一个主题为例,跟换主题皮肤 下载该主题 找到旁边的release 下拉窗体,在Assets里面找这种压缩包,通过名字很容易区…