Fusion_PointClouds - 多激光雷达点云数据融合

1. 简介

fusion_pointclouds 主要目的为Ubuntu环境下无人车多激光雷达标定之后, 将多个激光雷达点云话题/坐标系 通过PCL (Point Cloud Library)融合为 一个ros点云话题,以便于后期点云地面分割与地面处理等等。

1.1 应用场景

图1:为了保证激光雷达的360°环境覆盖,我们需要用到多传感器的拼接图2:只单纯融合激光雷达的信息,多激光雷达会发生重叠,因此需要点云坐标变换

图3:激光雷达一定角度扫描车体本身,滤除车身周围干扰/遮挡点云,如图1白色区域,下图为pcl滤波效果图图4:雷达外参标定不一定十分精确,滤波需要估计车体大小也需调整。结合rqt_reconfigure 模块实现在线动态参数微调

图1-3均来源网络,只为表达场景需求,非商用。

 1.2 项目内容

             (1)点云的坐标变化;
             (2)通过PCL(Point Cloud Library)融合为一个点云话题;
             (3)通过条件滤波与直通滤波方式,可滤除车身周围干扰/遮挡点云与远处较弱点云;
             (4)结合ros系统中 rqt_reconfigure 模块实现在线动态参数微调。

2.依赖介绍-ROS

若需在ROS环境下使用雷达驱动,则需安装ROS相关依赖库

Ubuntu 16.04 - ROS kinetic desktop-full

Ubuntu 18.04 - ROS melodic desktop-full (自带pcl-1.8,无需安装)

安装方式: 参考 Documentation - ROS Wiki 如果安装了ROS kinetic desktop-full版或ROS melodic desktop-full版,那么兼容版本其他依赖库也应该同时被安装了,所以不需要重新安装它们以避免多个版本冲突引起的问题, 因此,强烈建议安装desktop-full版,这将节省大量的时间来逐个安装和配置库

 3. 编译 & 运行

        1.将 *fusion_pointclouds* 工程工作空间放入*src*文件夹内。

git clone https://github.com/Hliu0313/fusion_pointclouds.git

        2.根据实际情况修改fusion_pointclouds/config/params.yaml

样例:详细可下载程序,查看。
fusion_lidar_num: 3                                                      #融合 lidar 点云数量 2/3/4
topics:                                                                                 #订阅 lidar 点云话题
  parent_pc_topic: "/front/rslidar_points"
  child_pc_topic1: "/back/rslidar_points"
  child_pc_topic2: "/left/rslidar_points"
  child_pc_topic3: "/front/rslidar_points" 

  fusion_pc_topic: "/rslidar_points"                       #融合后发布点云话题名称
  fusion_pc_frame_id: "/front_rslidar"                 #融合后发布点云话题名称

#注意

        3.返回工作空间目录,执行以下命令即可编译&运行

catkin_make
source devel/setup.bash

          (1)注意:只做点云tf变换、融合与滤波,不启动rqt_reconfigure

roslaunch fusion_pointclouds fusion_pointclouds.launch 

         (2)启动rqt_reconfigure 动态调整参数,用于参数实时微调

roslaunch fusion_pointclouds fusion_pointclouds.launch  set_params:=true

4. 参数介绍

本工程只有一份参数文件 params.yaml, 储存于fusion_pointclouds/config文件夹内,配合load_params.h load_params.cpp 加载参数,方便随时修改。

(参数配置介绍在参数文件中已经描述较为详细,在此不做介绍)

5.改进方向

1.using PointCloud = pcl::PointCloud<pcl::PointXYZIR>;-点云包括带pcl::PointXYZIR,pcl::PointXYZI两种格式,设置自由切换入口,可参考rslidar_sdk
2.图像与激光雷达 动态可视化参数微调
3.初次写笔记请多多见谅,未来会积极的向前辈大佬们学习!

补充:

6. 功能包结构

主要程序为fusion_pointclouds.cpp fusion_pointclouds.h 其头文件。

>config

         >>params.yaml -- 将参数上传至ros参数空间,方便程序获取参数,且可让程序订阅不同雷达话题,自定义发布话题名称及frame_id,增加了程序适应性;

         >>set_params_bounds.cfg -- 生成 src/set_params_bounds.cpp头文件,调用动态参数程序—— rqt_reconfigure ;

         >>set_params_tf.cfg -- 同上;

>img -- readme.md 调用图片;

>include

★★>>fusion_pointclouds.h -- 定义FusionPcNode类,函数实现流程 “接口?”;

         >>load_params.h -- 配合 load_params.cpp 将ros参数空间参数加载至程序;

>launch

         >>fusion_pointclouds.launch -- 主launch文件,通过参数重载,包含静态融合与动态调参;

>src

★★ >>fusion_pointclouds.cpp -- 对应fusion_pointclouds.h,函数具体实现;

         >>load_params.cpp -- 同 load_params.h;

         >>set_params_bounds.cpp -- 同 set_params_bounds.cfg ;

         >>set_params_tf.cpp -- 同上;

>rviz -- 启动 launch 调参时可以启动默认 rviz 界面,减少时间。

  • 14
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 46
    评论
pcd雷达点云数据的处理和障碍物识别是计算机视觉领域的一个重要应用方向。下面我将为你介绍一种基于Python和PCL(Point Cloud Library)库的点云数据障碍物识别方法,并可视化并标出障碍物。 1. 安装PCL库 PCL是一个通用的点云数据处理库,使用它可以很方便地对点云数据进行处理和分析。安装PCL库可以参考官方文档:https://pointclouds.org/downloads/ 2. 读取pcd文件 在Python中,我们可以使用PCL库中的`pcl.io.loadPCDFile()`函数读取pcd文件。读取后的点云数据存储在`pcl.PointCloud`对象中,可以通过`to_array()`方法将其转换为NumPy数组。 ```python import pcl cloud = pcl.PointCloud() pcl.io.loadPCDFile("example.pcd", cloud) points = cloud.to_array() ``` 3. 点云滤波 点云滤波可以去除噪声和离群点,以提高后续障碍物识别的准确性。这里我们使用统计滤波器进行滤波,可以通过设置滤波器的均值、标准差等参数来控制滤波效果。 ```python # 创建统计滤波器 filter = cloud.make_statistical_outlier_filter() # 设置滤波器参数 filter.set_mean_k(50) # 设置每个点的邻居数量 filter.set_std_dev_mul_thresh(1.0) # 设置标准差倍数 # 执行滤波 cloud_filtered = filter.filter() points_filtered = cloud_filtered.to_array() ``` 4. 点云分割 点云分割可以将点云数据分成若干个部分,每个部分代表一个障碍物。这里我们使用基于平面模型的分割算法,将地面和障碍物分开。 ```python # 创建分割器 seg = cloud_filtered.make_segmenter() seg.set_optimize_coefficients(True) # 优化平面模型系数 seg.set_model_type(pcl.SACMODEL_PLANE) # 设置模型类型为平面 seg.set_method_type(pcl.SAC_RANSAC) # 设置随机采样一致性算法 seg.set_distance_threshold(0.01) # 设置距离阈值 # 执行分割 inliers, coefficients = seg.segment() ``` 5. 可视化障碍物 障碍物识别完成后,我们可以使用Matplotlib库将障碍物可视化,并标出各个障碍物的位置和大小。 ```python import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 绘制原始点云 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(points[:,0], points[:,1], points[:,2], s=0.1) # 绘制障碍物 for i in range(len(coefficients)): mask = inliers == i obstacle = points_filtered[mask] ax.scatter(obstacle[:,0], obstacle[:,1], obstacle[:,2], s=1) plt.show() ``` 至此,我们完成了基于Python和PCL库的pcd雷达点云数据障碍物识别、可视化并标出障碍物的过程。
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值