DORA 机器人中间件学习教程(6)——激光点云预处理
文章目录
- 1 移植思路
- 2 代码输入输出说明
- 3 编写CmakeList.txt文件
- 4 编写yml文件
- 5 编译并启动节点
- 参考资料
在DORA中通过驱动获取激光雷达数据后,激光点云预处理部分代码是参考了autoware官方代码并对其进行裁剪得到的,点云预处理主要包含三个节点:
- crop_box_point: 裁剪点云
- ring_outlier_fliter: 目的是去除昆虫、雨水等点云噪声。
- voxel_grid_downsample_filtre: 降采样
下图为 autoware官方的 ring_outlier_fliter 滤波器示意图

图片来源于 autoware官方
1 移植思路
Autoware 中基于ROS框架将多个节点组合成一个系统,因此移植算法只需要将找到ROS数据获取和发布函数部分的代码,将其替换为DORA中反序列化和序列化功能代码。
修改后的代码位于: https://github.com/dora-rs/autoware.universe/tree/feature/autoware_dora/localization/pointcloud_preprocessor
2 代码输入输出说明
DORA节点初始化函数:
extern "C"
{
#include "node_api.h"
#include "operator_api.h"
#include "operator_types.h"
}#include <vector>
#include <iostream>
#include <Eigen/Dense>
#include <cstdint>
#include <memory>
#include <string.h>
#include <cassert>
#include <pcl/point_types.h>int run(void *dora_context)
{while (true){void *event = dora_next_event(dora_context);if (event == NULL){printf("[c node] ERROR: unexpected end of event\n");return -1;}enum DoraEventType ty = read_dora_event_type(event);if (ty == DoraEventType_Input){//-------------------------------------------------------------------------------------------------------// 点云处理函数//---------------------------------------------------------------------------------------------------------char *output_data = (char *)point_data.ptr;size_t output_data_len = ((output_cloud.size() + 1) * 16);std::string out_id = "pointcloud";std::cout << "output_data_len: " << output_data_len << std::endl;int resultend = dora_send_output(dora_context, &out_id[0], out_id.length(), output_data, output_data_len);delete[] point_data.ptr;// int resultend = 0;if (resultend != 0){std::cerr << "failed to send output" << std::endl;return 1;}}else if (ty == DoraEventType_Stop){printf("[c node] received stop event\n");}else{printf("[c node] received unexpected event: %d\n", ty);}free_dora_event(event);}return 0;
}int main()
{std::cout << "crop_box_point node" << std::endl;auto dora_context = init_dora_context_from_env();auto ret = run(dora_context);free_dora_context(dora_context);return ret;
}
3 编写CmakeList.txt文件
DORA官方教程采用cargo编译器对代码进行编译,这里我们将其修改为cmake就行编译,在编译时需要指定DORA c/c++ API 接口目录,以及DORA源文件编译生成的 c/c++ 动态链接库。以下代码是CmakeList.txt文件中添加DORA目录和链接到DORA库的方法。
完整的文件位于:https://github.com/dora-rs/autoware.universe/blob/feature/autoware_dora/localization/pointcloud_preprocessor/CMakeLists.txt
include_directories(${PCL_INCLUDE_DIRS}${EIGEN3_INCLUDE_DIRS}${YAMLCPP_INCLUDE_DIRS}$ENV{HOME}/dora/apis/c/node #dora的头文件路径 node_api.h$ENV{HOME}/dora/apis/c/operator${CURRENT_DIR}/rs_driver/src #雷达的头文件路径$ENV{HOME}/dora/examples/c++-ros2-dataflow/build/ #C++ros的头文件路径)add_executable(ring_outlier_fliter ring_outlier_fliter.cc )
target_link_libraries(ring_outlier_fliter${PCL_LIBRARIES}${EIGEN_LIBRARIES}${YAMLCPP_LIBRARIES}# glog::glog$ENV{HOME}/dora/target/release/libdora_node_api_c.amrtdl pthreadpcap
)
4 编写yml文件
创建pointcloud_preprocessor.yml 文件,与上一篇激光雷达驱动的博客编写驱动文件位于同一级目录下,这里我们在一个yml文件中启动了lidr驱动节点和lidar2ROS2数据转发节点。
https://github.com/dora-rs/autoware.universe/blob/feature/autoware_dora/localization/pointcloud_preprocessor/pointcloud_preprocessor.yml
nodes:# rslidar driver node- id: rslidar_drivercustom:source: ../../dora-hardware/dora_to_ros2/lidar/build/rslidar_driver_pcapinputs:tick: dora/timer/millis/100outputs:- pointcloud# crop_box_point node- id: crop_box_pointcustom:source: build/crop_box_pointinputs:pointcloud: rslidar_driver/pointcloudoutputs: - pointcloud# ring_outlier_fliter node- id: ring_outlier_flitercustom:source: build/ring_outlier_fliterinputs:pointcloud: crop_box_point/pointcloudoutputs: - pointcloud# voxel_grid_downsample_filtre node- id: voxel_grid_downsample_filtrecustom:source: build/voxel_grid_downsample_filtreinputs:pointcloud: ring_outlier_fliter/pointcloudoutputs: - pointcloud- id: lidar_to_ros2operator:python: ../../dora-hardware/dora_to_ros2/lidar/lidar_to_ros2.pyinputs:pointcloud: ring_outlier_fliter/pointcloud
上述yml文件描述的测试程序还包含有驱动和上一篇博客中提到的可视化节点。

此处目录结构发生了变化,这里我们将点云预处理相关的节点放到了另一个文件夹,pointcloud_preprocessor.yml 与预处理节点位于同一级目录,但是该yml文件中调用了激光雷达驱动节点(该节点位于其他目录下),因此需要保证该yml文件下第5行代码中 source描述的目录下能找到激光雷达驱动节点**“source: …/…/dora-hardware/dora_to_ros2/lidar/build/rslidar_driver_pcap”**
5 编译并启动节点
通过cmake对c代码进行编译:
cd pointcloud_preprocessor #这条指令可以不执行,但一定要在pointcloud_preprocessor路径下
mkdir build && cd build
cmake ..
cmake --build .
新建一个终端启动dora节点
dora up
dora start pointcloud_preprocessor.yml --name test
再新建一个终端启动RVIZ2,选择 “/ros2_bridge/lidar_data” 话题进行可视化

参考资料
[1] https://github.com/RoboSense-LiDAR/rs_driver/tree/main
[2] https://github.com/dora-rs/dora-hardware/tree/main/vendors/lidar/Robosense
dora-rs目前资料较少 欢迎大家点赞在评论区交流讨论(cenruping@vip.qq.com) O(∩_∩)O
或者加群水一波(1149897304)
相关文章:
DORA 机器人中间件学习教程(6)——激光点云预处理
文章目录 1 移植思路2 代码输入输出说明3 编写CmakeList.txt文件4 编写yml文件5 编译并启动节点参考资料 在DORA中通过驱动获取激光雷达数据后,激光点云预处理部分代码是参考了autoware官方代码并对其进行裁剪得到的,点云预处理主要包含三个节点…...
搜维尔科技:TechViz将您的协同项目评审提升到一个全新的高度
TechViz将您的协同项目评审提升到一个全新的高度 搜维尔科技: TechViz将您的协同项目评审提升到一个全新的高度...
Dinky 字段模式演变 PIPELINE 同步MySQL到Doris
背景 用Dinky数据平台 FlinkCDC收集Mysql BinLog 至 Doris 搭建实时数仓 问题 用Dinky CDCSOURCE 字段模式演变 整库同步Mysql到Doris 字段新增删除不生效 组件信息 Flink 1.17 FlinkCDC 3.1 dinky 1.1 Doris 2.1.6 Mysql 8.0Dinky MySQLCDC 整库到 Doris需要的依赖 Flink/…...
【Docker】Harbor 私有仓库和管理
目录 一、搭建本地私有仓库 二、harbor简介(特性、构成、架构的数据流向) 2.1 什么是Harbor 2.2 Harbor的特性 2.3 Harbor的构成 2.4 Harbor的工作原理(运行流程) 三、harbor部署以及配置文件 1. 部署 Docker-Compose 服…...
《重置MobaXterm密码并连接Linux虚拟机的完整操作指南》
目录 引言 一、双击MobaXterm_Personal_24.2进入,但是忘记密码。 那么接下来请跟着我操作。 二、点击此链接,重设密码。 三、下载完成后,现在把这个exe文件解压。注意解压要与MobaXterm_Personal_24.2.exe在同一目录下哦,不然…...
每天五分钟深度学习:逻辑回归和神经网络
本文重点 我们要开启深度学习的基础神经网络的学习进程了,但是在开启之前,我们先来回忆一下逻辑回归算法 逻辑回归 逻辑回归的前向传播公式为: 求出预测值a之后,进而求损失 以上就是逻辑回归模型,相信大家已经不是很陌生了,现在我们要学习神经网络了 神经网络和逻辑回…...
深度学习——线性神经网络(五、图像分类数据集——Fashion-MNIST数据集)
目录 5.1 读取数据集5.2 读取小批量5.3 整合所有组件 MNIST数据集是图像分类中广泛使用的数据集之一,但是作为基准数据集过于简单,在本小节将使用类似但更复杂的Fashion-MNIST数据集。 import torch import torchvision from torch.utils import data fr…...
音频声音怎么调大?将音频声音调大的几个简单方法
音频声音怎么调大?在现代生活中,音频内容无处不在,从在线课程和播客到音乐和电影,音频已经成为我们获取信息和娱乐的重要方式。然而,许多人在使用音频时可能会遇到一个常见问题:音频声音太小,无…...
C#的委托
方法一 private void button1_Click(object sender, EventArgs e) {// 启动后台线程 Thread backgroundThread new Thread(new ThreadStart(DoWork));backgroundThread.Start(); }private void DoWork() {// 模拟后台工作 Thread.Sleep(2000); // 等待2秒以模拟工作 // 更…...
软考(网工)——局域网和城域网
文章目录 🕐局域网基础1️⃣局域网和城域网体系架构 IEEE(负责链路层)2️⃣局域网拓扑结构 🕑CSMA/CD1️⃣CSMA/CD2️⃣CSMA/CD三种监听算法3️⃣冲突检测原理 🕒二进制指数退避算法1️⃣ 二进制指数退避算法 …...
MySQL 9从入门到性能优化-通用查询日志
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...
解码专业术语——应用系统开发项目中的专业词汇解读
文章目录 引言站点设置管理具体要求包括: Footer管理基于URL的权限控制利用数据连接池优化数据库操作什么是数据连接池?优化的优势 利用反射改造后端代码,AJAX反射的作用及其在后端代码中的应用AJAX 实现前后端无刷新交互 引言 创新实践项目二…...
高级java每日一道面试题-2024年10月18日-JVM篇-说下你对G1垃圾收集器的理解?
如果有遗漏,评论区告诉我进行补充 面试官: 说下你对G1垃圾收集器的理解? 我回答: 在Java高级面试中,G1垃圾收集器是一个经常被提及的话题。以下是对G1垃圾收集器的详细解析: G1垃圾收集器的概述 G1(Garbage-First)垃圾收集器…...
2024系统架构师---湖仓一体架构论文知识点
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石 在当今数据驱动的时代,企业对于数据的管理与分析需求日益复杂。传统的数据仓库与数据湖架构虽各有优势,但单独使用时往往难以满足企业的全面需求。湖仓一体(Lakehouse&am…...
Unity性能优化
前言 当游戏开发使用传统的OPP(面向对象编程)面对大量的Game object时FPS会显著降低,而使用Dots(面向数据编程)性能依旧很好 计算机内存基础 CPU自身有三级高速缓存,L1,L2,L3,其中CPU访问(L1…...
MyHdfs代码分享
关于hdfs协议层相关的的解析已经比较全面,但是大多的分析停留在理论层面。为此笔者通过对hadoop源码的整理,完成了myhdfs项目。此项目有个特点是不依赖于任何hadoop的maven包,但却可以作为原生的hadoop客户端的server。项目暂时已经完成了rpc…...
Java网络编程-简单的API调用
Get请求 - 无参数 安装依赖库 首先需要安装一个库: Okhttp3,这是一个非常流行的 HTTP 库,可以简单、快速的实现 HTTP 调用。 安装 Okhttp3 的方式是在 pom.xml 文件中增加依赖: <!-- https://mvnrepository.com/artifact/c…...
论文笔记(五十)Segmentation-driven 6D Object Pose Estimation
Segmentation-driven 6D Object Pose Estimation 文章概括摘要1. 引言2. 相关工作3. 方法3.1 网络架构3.2 分割流3.3 回归流3.4 推理策略 4. 实验4.1 评估 Occluded-LINEMOD4.1.1 与最先进技术的比较4.1.2 不同融合策略的比较4.1.3 与人体姿态方法的比较 4.2 在YCB-Video上的评…...
微服务的一些基本概念
目录 1 概述1.1 微服务架构的特征1.2 微服务架构示例 2 微服务与单体式架构2.1 什么是单体式架构?2.2 单体式架构的优点2.3 单体式架构的缺点 3 什么是微服务?3.1 微服务的优点3.2 微服务的缺点 4 如何构建微服务4.1 从单体式开始4.2 以正确的方式组织团…...
el-table修改指定列字体颜色 ,覆盖划过行的高亮显示文字颜色
修改指定列字体颜色 ,覆盖划过行的高亮显示文字颜色 代码如下: <div class"c1"><el-table:data"tableData"striperow-class-name"custom-table-row"style"width:100%"cell-mouse-enter"lightFn"cell-…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
