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

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.a
  m
  rt
  dl 
  pthread
  pcap
)

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_driver
    custom:
      source: ../../dora-hardware/dora_to_ros2/lidar/build/rslidar_driver_pcap
      inputs:
        tick: dora/timer/millis/100
      outputs:
        - pointcloud

  # crop_box_point node
  - id: crop_box_point
    custom:
      source: build/crop_box_point
      inputs:
        pointcloud: rslidar_driver/pointcloud
      outputs: 
       - pointcloud

  # ring_outlier_fliter node
  - id: ring_outlier_fliter
    custom:
      source: build/ring_outlier_fliter
      inputs:
        pointcloud: crop_box_point/pointcloud
      outputs: 
       - pointcloud
  # voxel_grid_downsample_filtre node
  - id: voxel_grid_downsample_filtre
    custom:
      source: build/voxel_grid_downsample_filtre
      inputs:
       pointcloud: ring_outlier_fliter/pointcloud
      outputs: 
       - pointcloud

  - id: lidar_to_ros2
    operator:
        python: ../../dora-hardware/dora_to_ros2/lidar/lidar_to_ros2.py
        inputs:
          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)


http://www.kler.cn/news/361578.html

相关文章:

  • 【从零开始的LeetCode-算法】3185. 构成整天的下标对数目 II
  • uniapp结合uview-ui创建项目
  • 基于知识图谱的美食推荐系统
  • 由云智慧发起的《数字政府统一运维 第1部分:运维平台建设指南》团标正式发布
  • Java可变参数
  • 清朝笔记()
  • 电脑输入账号密码后,屏幕黑屏只有鼠标解决办法
  • OBOO鸥柏:引领液晶拼接大屏kvm集中控制系统的技术革新
  • 基于SpringBoot的在线文档管理系统的设计与实现(论文+源码)_kaic
  • 【Python数据可视化】利用Matplotlib绘制美丽图表!
  • Sentinel 介绍
  • 攻防世界web引导模式 框架梳理
  • steam新品节!GameViewr远程随时随地手机平板玩主机游戏教程
  • 基于neo4j的周杰伦歌曲问答系统
  • 矩阵概念 和 性质
  • 构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像
  • python之爬取豆瓣排行与可视化
  • 软件分享丨豆包电脑端 AI 助手
  • MQTTnet 4.3.7.1207 (最新版)使用体验,做成在线客服聊天功能,实现Cefsharp的物联的功能(如远程打开新网址)
  • [linux]快速入门
  • 力扣——环形链表问题
  • 是管理员用户但总是提示需要管理员权限的问题。(win11、win10、win7)
  • 【运维心得】5G你肯定在用,5GC是什么?
  • 在MySQL中使用B+ 树索引如何查找连带表数据
  • Pr 视频效果:视频限制器
  • 2-2(补充) opencv实战进阶系列 最大多边形识别