在RVIZ中显示深度数据

news/2024/4/26 21:36:26/文章来源:https://blog.csdn.net/weixin_42990464/article/details/128111027

文章目录

  • 深入 RVIZ
  • 景深图
  • 深度云
  • 点云
  • 置信度
  • 视差
  • C++中的深度订阅
  • 参考

深入 RVIZ

在本教程中,您将详细了解如何配置您自己的 RVIZ 会话以仅查看您需要的深度数据。

深度信息可以通过许多不同的方式可视化:2D 深度图像、3D 点云、3D 注册深度云和置信度图像等等。

景深图

要可视化 a depth image,您可以使用 simpleImage plugin因为深度数据是在类型主题上发布的sensor_msgs/Image(见上文)。它与“普通”图像的不同之处在于,数据以 32 位(浮点)而非 8 位编码。

在这里插入图片描述
参数与 for 相同Image,增加了三个:

  • Normalize range:由于浮点图像不是直接渲染的,它被转换为8位灰度图像。启用此字段意味着自动计算归一化范围
  • Min value:如果Normalize range未选中,您可以手动设置以米为单位的最小深度范围
  • Max value:如果Normalize range未选中,您可以手动设置以米为单位的最大深度范围

如果您知道测量深度的最大值并且希望保持图像比例静态,则手动设置归一化范围很有用。

深度云

该Depth Cloud插件是第一种可视化由深度和视频数据流生成的注册点云的方法。该插件采用深度图像和 RGB 图像(均发布在同一个frame_id)并自动生成 3D RGB 点云。

在这里插入图片描述
关键参数:

  • Depth map topic:从组合框中的可用图像列表中选择要可视化的深度图像主题(选中Topic filter以仅选择名称让人想起深度图像的图像主题)
  • Color image topic:从组合框中的可用图像列表中选择 RGB 图像主题以与深度图像相关联
  • Style:用于渲染每个点的样式。使用Points和Size=1最大化 FPS
  • Color transformer:选择点的着色方式。用于RGB8将彩色图像像素与相应的深度像素相匹配。用于Axis color使用与值的Axis值成比例的颜色(例如Z,使用与距地板的距离成比例的色标或X使用与距相机的距离成比例的颜色)

点云

要直接可视化主题类型sensor_msgs/Pointcloud2,您可以使用该Pointcloud2插件。
在这里插入图片描述

关键参数:

  • Topic:从可用点云消息列表中选择要可视化的主题
  • Unreliable:勾选此选项以减少订阅 pointcloud2 主题所需的带宽。订阅者将使用 UDP 协议并根据可用带宽接收消息
  • Depthcloud您可以按照上面对插件的说明更改渲染样式和颜色转换器。

注意:如果启用映射(请参阅mapping/mapping_enabled参数),该Pointcloud2插件还用于可视化映射阐述的融合点云结果,订阅主题/zed/zed_node/point_cloud/fused_cloud_registered。

置信度

要将 可视Confidence Map化为图像,您可以使用Image订阅主题的插件/zed/zed_node/confidence/confidence_image。

在这里插入图片描述
像素越亮,其对应的深度值就越可靠。

视差

用于 RVIZ 的插件来可视化有关类型主题的差异消息stereo_msgs/Disparity不可用,但您可以使用包disparity_view中可用的节点image_view。

启动视差查看器以可视化在主题上发布的视差图像/zed/zed_node/disparity/disparity_image:

$ rosrun image_view disparity_view image:=/zed/zed_node/disparity/disparity_image

在这里插入图片描述

C++中的深度订阅

在本教程中,您将学习如何编写一个简单的 C++ 节点来订阅类型 sensor_msgs/Image的消息,以检索 ZED 节点发布的深度图像并获取图像中心的测量距离。

订阅者节点的源代码zed_depth_sub_tutorial.cpp:

#include <ros/ros.h>
#include <sensor_msgs/Image.h>/*** Subscriber callback*/
void depthCallback(const sensor_msgs::Image::ConstPtr& msg) {// Get a pointer to the depth values casting the data// pointer to floating pointfloat* depths = (float*)(&msg->data[0]);// Image coordinates of the center pixelint u = msg->width / 2;int v = msg->height / 2;// Linear index of the center pixelint centerIdx = u + msg->width * v;// Output the measureROS_INFO("Center distance : %g m", depths[centerIdx]);
}/*** Node main function*/
int main(int argc, char** argv) {// Node initializationros::init(argc, argv, "zed_video_subscriber");ros::NodeHandle n;// Depth topic subscriberros::Subscriber subDepth = n.subscribe("/zed/zed_node/depth/depth_registered", 10,depthCallback);// Node executionros::spin();return 0;
}

下面对上述源码做一个简单的说明。

void depthCallback(const sensor_msgs::Image::ConstPtr& msg) {// Get a pointer to the depth values casting the data// pointer to floating pointfloat* depths = (float*)(&msg->data[0]);// Image coordinates of the center pixelint u = msg->width / 2;int v = msg->height / 2;// Linear index of the center pixelint centerIdx = u + msg->width * v;// Output the measureROS_INFO("Center distance : %g m", depths[centerIdx]);
}

当订阅者节点接收sensor_msgs/Image到与订阅的主题匹配的类型的消息时,将执行此回调/zed/zed_node/depth/depth_registered。回调的参数是boost::shared_ptr收到的消息。这意味着您不必担心内存管理。

回调演示了如何访问消息数据:

  • 指向data字段的指针被强制转换为,因为它被声明为指向值float*数组的指针char
  • 计算深度图中心的图像坐标[u,v]
  • 由于数据是以线性向量组织的,因此中心像素的索引是根据图像坐标计算的
  • 中心点的测量值(以米为单位)打印在屏幕上

上述代码最重要的一课是如何定义订阅者:

// Subscribers
ros::Subscriber subDepth = n.subscribe("/zed/zed_node/depth/depth_registered", 10,depthCallback);

Aros::Subscriber是一个 ROS 对象,它监听网络并等待自己的主题消息可用。收到消息时,它会执行分配给它的回调。

在本教程中,我们声明了一个深度数据订阅者。该主题的订阅者在收到 与该主题匹配的类型的消息时/zed/zed_node/depth/depth_registered调用该函数。depthCallbacksensor_msgs/Image

参考

本教程的完整源代码可在 GitHub 上的zed_depth_sub_tutorial子包中找到。除了节点源代码,您还可以找到完成教程包的package.xml和CMakeLists.txt文件。

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

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

相关文章

剑指Offer专项突破版(76)—— 数组中的第 k 大的数字

题目 剑指 Offer II 076. 数组中的第 k 大的数字 思路 假设有个划分函数divide&#xff1a; divide&#xff1a;将num在[l,r]范围内&#xff0c;按照nums[l]进行划分&#xff0c;返回一个数组range&#xff0c;划分为&#xff1a; 所有小于nums[l]的数&#xff1a;移动到nu…

[NCTF2019]SQLi

进来就有个弹窗 甚至给了sql语句 sqlquery : select * from users where username and passwd 先扫一下目录&#xff0c;发现有个robots.txt 提示有个hint.txt $black_list "/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00…

Kotlin高仿微信-第18篇-单聊-删除单条信息

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

Qt编写视频监控系统67-录像计划(支持64通道7*24录像设置)

一、前言 录像计划这个功能一直挂了很久&#xff0c;之前做的也都有保存视频文件功能&#xff0c;其中还分了三大种&#xff0c;第一种是手动开启和停止录像&#xff1b;第二种是按照指定时长比如10s保存文件&#xff1b;第三种是定时30分钟一个文件一直保存。这三种功能直接写…

opengl,opengl es,egl,glfw,glew

OpenGL ES之GLFW窗口搭建 - Plato - 博客园概述 本章节主要总结如何使用GLFW来创建Opengl窗口。主要包括如下内容&#xff1a; OpenGl窗口创建介绍 GLFW Window版编译介绍 GLFW简单工程源码介绍 OpenGL窗口创建介绍 能用于Ohttps://www.cnblogs.com/feng-sc/p/5093262.htmlOp…

2022-11-30 Github Forking 工作流模式

Forking 工作流 fork 操作是在个人远程仓库新建一份目标远程仓库的副本&#xff0c;流程如下&#xff1a; 比如在 GitHub 上操作时&#xff0c;在项目的主页点击 fork 按钮&#xff08;页面右上角&#xff09;&#xff0c;即可拷贝该目标远程仓库。 假设开发者 A 拥有一个远程仓…

电脑怎么提取图片中的文字?

图片记录着我们生活的点点滴滴&#xff0c;比如各种办公截图、查快递单号、布置的课堂作业等等&#xff0c;都离不开这种便捷的方法。而我们有时难免需要从图片中提取想要的文字&#xff0c;总不能就靠打字打到手软吧&#xff0c;那么电脑怎么提取图片中的文字呢?有需要的朋友…

终于有阿里p8进行了大汇总(Redis+JVM+MySQL+Spring)还有面试题解全在这里了!

Redis特性 Redis是一直基于键值对的NoSQL数据库&#xff1b; Redis支持5种主要数据结构&#xff1a;string、hash、list、set、zset以及bitmaps、hyperLoglog、GEO等特化的数据结构&#xff1b; Redis是内存数据库&#xff0c;因此它有足够好的读写性能&#xff1b; Redis支持…

verilog实现分频(奇数分频和偶数分频,通用版)

大家好&#xff0c;最近写了一些分频器的设计&#xff0c;发现奇数分频和偶数分频是比较常用分频效果&#xff0c;所以写了一个比较简单的分频代码&#xff0c;适用于奇数分频和偶数分频&#xff08;不考虑占空比&#xff09;&#xff0c;代码已经经过测试&#xff0c;需要可自…

如何应对Redis并发访问带来的问题

前言 我们在使用Redis的过程中&#xff0c;难免会遇到并发访问及数据更新的问题。但很多场景对数据的并发修改是很敏感的&#xff0c;比如库存数据如果没有做好并发读取和更新的版本控制&#xff0c;就会导致严重的业务问题。今天就来说说应该如何做好并发访问及数据更新问题。…

ROS2--概述

ROS2概述1 ROS2对比ROS12 ROS2 通信3 核心概念4 ros2 安装5 话题、服务、动作6 参数参考1 ROS2对比ROS1 多机器人系统&#xff1a;未来机器人一定不会是独立的个体&#xff0c;机器人和机器人之间也需要通信和协作&#xff0c;ROS2为多机器人系统的应用提供了标准方法和通信机…

Windows系统--AD域控--DHCP服务器

Windows系统--AD域控--DHCP服务器 虚拟机网络准备 1.将VMware网络编辑器的NAT模式--取消勾选 使用本地DHCP服务器; 从机(win10)将内置网卡的IPv4网络改为 自动获取IP地址、自动获取DNS AD服务器 部署 DHCP服务器

VF01销售开票发票金额控制增强

实施隐式增强 全部代码如下&#xff1a; method IF_EX_BADI_SD_BILLING~INVOICE_DOCUMENT_CHECK. CALL FUNCTION ‘SIPT_DOC_CHECK_SD’ EXPORTING it_xvbrk fxvbrk it_xvbrp fxvbrp it_xkomv fxkomv it_xvbpa fxvbpa IMPORTING ev_bad_data fbad_data. “”“”“”“…

Word控件Spire.Doc 【图像形状】教程(8): 如何借助C#/VB.NET在 Word 中插入艺术字

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

Kotlin高仿微信-第12篇-单聊-图片

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

【JavaEE】MyBatis

文章目录1.MyBatis介绍2.MyBatis快速入门3.Mapper代理开发4.MyBatis核心配置文件5.配置文件完成增删改查5.1 查询5.2 添加/修改5.3 删除6.MyBatis参数传递7.注解完成增删改查1.MyBatis介绍 1.什么是MyBatis? MyBatis是一款优秀的 持久层框架&#xff0c;用于简化JDBC开发MyBat…

入门力扣自学笔记208 C++ (题目编号:895)

895. 最大频率栈​​​​​​ 题目&#xff1a; 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。 void push(int val) 将一个整数 val 压入栈顶。 int pop() 删除…

Kotlin高仿微信-第11篇-单聊-语音

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

基于Tree-LSTM网络语义表示模型

TC&#xff1b;DR 目前的LSTM仅能对序列信息进行建模&#xff0c; 但是自然语言中通常由词组成的短语形成了句法依存的语义树。为了学习到树结构的语义信息。论文中提出了两种Tree-LSTM模型。Child-Sum、Tree-LSTM、和N-ary Tree LSTMs。实验部分的Tree-LSTM、对比多种LSTMs的…

nuxtjs中asyncData异步数据请求、代理配置、fetch网络请求、vuex的使用、中间件处理

文章目录1. asyncData异步数据请求2. 代理配置3. fetch网络请求4. vuex4.1 state中的数据展示4.2 同步方法与异步方法4.3 数据持久化处理5. 中间件处理1. asyncData异步数据请求 Nuxt.js 扩展了 Vue.js&#xff0c;增加了一个叫 asyncData 和 fetch 的方法&#xff0c;使得我们…