DORA 机器人中间件学习教程(5)——3D激光雷达数据可视化

DORA中3D激光雷达数据可视化

  • 1 总体思路
  • 2 DORA数据接收节点
  • 3 编写yml文件
  • 4 启动节点
  • 参考资料

截止目前 DORA还没有类似于ROS2中RVIZ这样的可视化工具,而在调试算法时我们又需要将数据进行可视化以验证代码的正确性。目前的解决方法是将DORA中的数据发送到ROS2中,利用RVIZ工具进行可视化。

1 总体思路

DORA提供了ROS2的样例 https://github.com/dora-rs/dora-ros2-bridge 。如下图所示,在这篇博客中我们基于该样例的思路,编写DORA节点,接收雷达驱动发送的激光点云,对数据进行反序列化并转发到ROS2中。
在这里插入图片描述

2 DORA数据接收节点

考虑到DORA对python环境下的ROS2接口支持的更好,在我们的系统中绝大部分可视化相关的脚本都基于python语言进行编写。
该代码可以从这个地址下载:https://github.com/dora-rs/autoware.universe/blob/feature/autoware_dora/dora-hardware/vendors/lidar/lidar_to_ros2.py

在上一篇博客中创建的激光雷达驱动节点目录下,创建名为 lidar_to_ros2.py 的文件,并填入以下内容:


from typing import Callable, Optional
import pyarrow as pa
from dora import DoraStatus
import dora
import numpy as np
import time
class Operator:def __init__(self) -> None:self.ros2_context = dora.experimental.ros2_bridge.Ros2Context()# create ros2 nodeself.ros2_node = self.ros2_context.new_node("lidar2ros","/ros2_bridge",dora.experimental.ros2_bridge.Ros2NodeOptions(rosout=True))# create ros2 qosself.topic_qos = dora.experimental.ros2_bridge.Ros2QosPolicies(reliable=True, max_blocking_time=0.1)# create ros2 topicself.lidar_data_topic = self.ros2_node.create_topic("/ros2_bridge/lidar_data","sensor_msgs::PointCloud2",self.topic_qos)# create ros2 publisherself.lidar_data_publisher = self.ros2_node.create_publisher(self.lidar_data_topic)def on_event(self,dora_event,send_output,) -> DoraStatus:if dora_event["type"] == "INPUT":print("dora event value over, it len:",len(dora_event["value"]), '\n')pointdata_raw = np.array(dora_event["value"][16:]).reshape(-1, 16)pointdata_raw = pointdata_raw[:, 0:16]        points = pointdata_raw    print("==========================================================\n")current_time = time.time()sec = (current_time)nanosec = ((current_time - sec) * 1e9)lidar_data_dict = {"header": {"stamp": {"sec": np.int32(sec),"nanosec": np.uint32(nanosec),},"frame_id": "rslidar",},"height": np.uint32(1),"width": np.uint32(len(points)),"fields":[{"name": "x", "offset": np.uint32(0), "datatype": np.uint8(7), "count": np.uint32(1)}, {"name": "y", "offset": np.uint32(4), "datatype": np.uint8(7), "count": np.uint32(1)},{"name": "z", "offset": np.uint32(8), "datatype": np.uint8(7), "count": np.uint32(1)},{"name": "i", "offset": np.uint32(12), "datatype": np.uint8(7), "count": np.uint32(1)},],"is_bigendian": False,"point_step": np.uint32(16),"row_step": np.uint32(len(points)),"data": points.ravel().view(np.uint8),#np.asarray(points, np.float32).ravel().view(np.uint8),"is_dense": False,}# print(pa.array([lidar_data_dict]))self.lidar_data_publisher.publish(pa.array([lidar_data_dict]))return DoraStatus.CONTINUE

注意运行该文件需要保证电脑上安装了ROS2的环境。上述代码中“self.ros2_node”函数表示创建一个ROS2节点,“ self.lidar_data_topic”则是对节点的话题和发布的数据类型进行描述,注意这里的 "sensor_msgs::PointCloud2"应该是ROS2中标注的数据类型。若使用了自定义的数据类型,则需要先对消息类型进行编译,并手动加载到ROS2环境中,保证系统能正确查找到自定义消息类型。

代码“pointdata_raw = np.array(dora_event[“value”][16:]).reshape(-1, 16)”则是将原来的序列化的数据(一个连续的uint8类型数组)转化为n行16列的2维数据,这里的16列是应为点云数据中一个反射点由 x,y,z,i 四个变量进行描述,每个变量都是一个float类型数据(占4个Byte),因此一个激光反射点对应 16个Byte。

3 编写yml文件

创建dataflow.yml 文件,与上一篇激光雷达驱动的博客编写驱动文件位于同一级目录下,这里我们在一个yml文件中启动了lidr驱动节点和lidar2ROS2数据转发节点。


nodes:#rslidar driver   node- id: rslidar_drivercustom:source: build/rslidar_driverinputs:tick: dora/timer/millis/100outputs:- pointcloud- id: lidar_to_ros2operator:python: lidar_to_ros2.pyinputs:pointcloud: rslidar_driver/pointcloud

目录结构如下:
在这里插入图片描述

4 启动节点

新建一个终端启动dora节点

dora up 
dora start dataflow.yml --name test

再新建一个终端启动RVIZ2,选择 “/ros2_bridge/lidar_data” 话题进行可视化

DORA Show 3D lidar data

参考资料

[1] https://dora-rs.ai/docs/guides/dora-ros2-bridges/
[2] https://github.com/dora-rs/autoware.universe/tree/feature/autoware_dora/dora-hardware/vendors/lidar

dora-rs目前资料较少 欢迎大家在评论区交流讨论(cenruping@vip.qq.com) O(∩_∩)O
或者加群交流(1149897304)

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

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

相关文章

vscode 远程linux服务器 连接git

vscode 远程linux服务器 连接git 1. git 下载2. git 配置1)github 设置2)与github建立连接linux端:创建密钥github端:创建ssh key 3. 使用1)初始化repository2)commit 输入本次提交信息,提交到本…

【Pycharm】显示内存不足the IDE is running low on memory解决方法

Pycharm提示显示内存不足the IDE is running low on memory解决方法 在右上角找到Help,点击,找到change memory settings 修改数值如1024,2048 等,增大容量即可。最后点击save and Restart

【Android】Jetpack入门知识总结(LifeCycle,ViewModel,LiveData,DataBinding等)

文章目录 LifeCycle使用Lifecycle解耦页面与组件自定义控件实现LifecycleObserver接口注册生命周期监听器 使用LifecycleService解耦Service与组件使用ProcessLifecycleOwner监听应用程序生命周期 ViewModel用法在 Fragment 中使用 ViewModel LiveDataDataBinding导入依赖基本用…

2024_E_100_连续字母长度

连续字母长度 题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 输入描述 第一行有一个子串(1<长度<100)&#xff0c;只包含大写字母。 第二行为…

傅里叶分析之掐死教程(完整版)更新于2014.06.06

作 者&#xff1a;韩 昊 知 乎&#xff1a;Heinrich 微 博&#xff1a;花生油工人 知乎专栏&#xff1a;与时间无关的故事 谨以此文献给大连海事大学的吴楠老师&#xff0c;柳晓鸣老师&#xff0c;王新年老师以及张晶泊老师。 转载的同学请保留上面这句话&#xff0c;谢谢。如果…

stable diffusion WEBUI Brief summary

1&#xff0c;rembg(去除背景-》蒙版) import rembg from PIL import Image, ImageOps import numpy as np# 打开图像 input_path "./p_6258838.jpg" input_image Image.open(input_path)# 移除背景&#xff0c;得到带有透明背景的图像 output_image rembg.remove…

IO编程--两进程间的实时通信

一、使用有名管道实现两个进程之间的相互通信 代码如下&#xff1a; 创建有名管道文件 #include <myhead.h> int main(int argc, const char *argv[]) {if(mkfifo("myfifo",0664)-1){perror("create error");return -1;}if(mkfifo("myfifo_1&qu…

UDP/TCP协议详解

目录 一,自定义应用层协议: 1)xml 2),JSON 3),yml 4),google protobuffer 二,传输层UDP/TCP: UDP协议: TCP协议: TCP的核心机制一:确认应答 TCP核心机制二:超时重传 TCP核心机制三:连接管理 TCP核心机制四:滑动窗口 TCP核心机制五:流量控制 TCP核心机制六:拥塞控制…

基于springboot的网上服装购物商城系统

基于springboot的网上服装购物商城系统 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a; &#x…

Video-LLaMA论文解读和项目部署教程

Video-LLaMA: An Instruction-tuned Audio-Visual Language Model for Video Understanding 相关工作 大型语言模型: 本文的工作基于这些LLM,并提供即插即用插件,使其能够理解视频中的视觉和听觉内容。 多模态大型语言模型: 现有的方法可以分为两大类。 第一类包括使用LL…

【Word原件测试资料合集】软件系统功能测试方案,软件测试方案(整体方案),软件测试文档-测试计划模版(功能与性能),软件测试流程

一、 前言 &#xff08;一&#xff09; 背景 &#xff08;二&#xff09; 目的 &#xff08;三&#xff09; 测试目标 &#xff08;四&#xff09; 适用范围与读者对象 &#xff08;五&#xff09; 术语与缩写 二、 软件测试实施流程 &#xff08;一&#xff09; 测试工作总体流…

stm32驱动W2812

W2812简介 W2812 内置有控制电路和 RGB LED 灯珠&#xff0c;用户只需通过一条数据线进行控制 每一个LED的R、G、B分别由八位数据控制颜色浓度&#xff0c;&#xff08;每种颜色浓度有0~255档&#xff0c;理论上RGB就可以组成256的3次方中颜色组合&#xff09;即每个LED需要…

基于MATLAB的混沌序列图像加密程序

设计目的 图像信息生动形象&#xff0c;它已成为人类表达信息的重要手段之一&#xff0c;网络上的图像数据很多是要求发送方和接受都要进行加密通信&#xff0c;信息的安全与保密显得尤为重要&#xff0c;因此我想运用异或运算将数据进行隐藏&#xff0c;连续使用同一数据对图…

【Eclipse系列】解决Eclipse中xxx.properties文件中文乱码问题

问题描述&#xff1a;由于eclipse对Properties资源文件的编码的默认设置是ISO-8859-1&#xff0c;所以在打开.properties文件时&#xff0c;会发现中文乱码了&#xff0c;如图&#xff1a; 解决方法&#xff1a; 1、一次生效法 右击该properties文件–>properties–>Re…

力扣2653.滑动窗口的美丽值

给你一个长度为 n 的整数数组 nums &#xff0c;请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为&#xff1a;如果子数组中第 x 小整数 是 负数 &#xff0c;那么美丽值为第 x 小的数&#xff0c;否则美丽值为 0 。 请你返回一个包含 n - k 1 个整数…

__问题——进入启动文件_卡死在Default_Handler_死机

MCU&#xff1a;STM32F407VET6 先说结论&#xff0c;调试时跳转到启动文件里的死循环&#xff0c;只要不是硬件错误中断&#xff0c;那么多半是因为中断处理函数没有定义导致的。 【历程】 今天在测试最小单片机系统时&#xff0c;定义了一个按键处理&#xff0c;依赖的是外部中…

全网免费的文献调研方法以及获取外网最新论文、代码和翻译pdf论文的方法(适用于硕士、博士、科研)

1. 文献调研 学术搜索引擎(十分推荐前三个&#xff0c;超有用)&#xff1a;使用 Google Scholar(https://scholar.google.com/)(https://scholar.google.com.tw/)(巨人学术搜索‬‬)、&#xff08;三个都可以&#xff0c;镜像网站&#xff09; arXiv(https://arxiv.org/)、&am…

【python】OpenCV—Sort the Point Set from Top Left to Bottom Right

文章目录 1、功能描述2、代码实现3、效果展示4、更多例子5、参考 1、功能描述 给出一张图片&#xff0c;里面含有各种图形&#xff0c;取各种图形的中心点&#xff0c;从左到右从上到下排序 例如 2、代码实现 import cv2 import numpy as npdef process_img(img):img_gray c…

【计算机网络原理】GBN,SR,TCP区别以及案例介绍

概念介绍 GBN、SR和TCP协议的主要区别在于它们的重传机制、确认方式以及缓存机制的不同。‌ GBN&#xff08;Go-Back-N&#xff09;协议在数据传输中&#xff0c;如果某个报文段没有被正确接收&#xff0c;那么从这个报文段到后面的所有报文段都需要重新发送。GBN采用累计应答…