ROS2 3D雷达导航系统实现详解
ROS 2 3D雷达导航系统实现详解
1 实现路径
本文使用的开发板是鲁班猫(ubuntu22.04),通过USB连接鲁班猫并启动ROS 2对应的雷达驱动节点后,系统会产生以下核心数据:
核心数据输出
(1) sensor_msgs/PointCloud2 (3D点云数据)
- 数据来源:雷达驱动底层输出的极其稠密的3D点云
- 数据特性:
- 包含精确的X、Y、Z三维坐标信息
- 包含物理反射强度(Intensity)数据
- 不包含RGB颜色信息
- 数据特点:高密度、高精度,为环境建模提供基础数据支持
(2) sensor_msgs/Imu (惯性数据)
- 数据来源:部分高端3D雷达内置IMU模块
- 数据特性:
- 高频输出姿态数据(欧拉角或四元数)
- 高频输出加速度数据
- 应用目的:为导航算法提供运动状态校准,提高定位精度
Cartographer处理流程
系统采用Cartographer算法进行数据处理和地图构建:
输入数据:
- sensor_msgs/PointCloud2点云数据
- 小车基础阶段的位移数据(里程计信息)
处理过程:
- 实时接收传感器数据
- 进行点云配准和闭环检测
- 生成增量式子图
- 融合子图构建全局地图
输出结果:
- 2D栅格地图
- 小车实时坐标信息(位姿估计)
2 Nav2导航实现
实施步骤
步骤1:前期准备
- 获取移动数据(机器移动时候产生的速度,角度数据,发布到/odom中)
步骤2:激光雷达启动
1 | |
此时雷达会产生周围环境的高精度3维点云信息。
步骤3:启动Cartographer建图算法
在建图之前需要修改cartographer.lua配置文件,使其可以读取3d数据
1 | |
注意:imu数据需为sensor_msgs/msg/Imu格式,移动数据需为nav_msgs/msg/Odometry格式,cartographer会监听/imu和/odom来得到这两个数据。如果数据默认不是发布到/imu和/odom,可以在cartographer.launch.py中设置重映射 Remap。
1 | |
然后开启cartographer建图
1 | |
算法内部处理机制:
- Cartographer自动对3D点云进行高度切片处理
- 将3D点云投影生成2D数据
- 生成供Nav2使用的2D全局栅格地图
技术优势:
- 无需在外部ROS架构中额外串联pointcloud_to_laserscan降维节点
- 内部处理提高系统效率和实时性
- 保持数据处理的连续性和准确性
步骤4:地图保存
1 | |
Nav配置
由于Nav2默认是2D导航,需要配置Nav2以支持处理3D点云数据作为障碍物源。主要配置文件包括:
1 | |
1 | |
2.2.2 启动导航系统
1 | |
此时,系统具备了实时避障能力,小车可以根据地图进行自主导航。
3. 自动导航实现机制
3.1 导航指令发送
服务器需要发送巡检的位置坐标和角度信息给小车端。数据格式如下:
1 | |
3.2 导航流程
- 数据打包:将位置信息打包为
nav2_msgs/action/NavigateToPose数据类型 - 消息发送:将数据包在本地发送到Nav2算法自动监听的动作接口
/navigate_to_pose - 路径规划:Nav2收到目标后,自动进行全局路径规划和局部路径规划
- 实时导航:小车根据规划路径自动向目标方向进行导航,同时实时避障
步骤4:后续导航设置
执行2.1.4节中的步骤6,启动Nav2导航系统。
关键技术要点
3D到2D转换策略
- 内部转换:Cartographer内部自动完成3D到2D的转换
- 保持精度:在转换过程中保持关键的空间信息
- 实时处理:避免外部节点引入的延迟
系统架构优化
- 数据流:传感器→驱动→Cartographer→Nav2
- 节点管理:按需启动,节约系统资源
- 误差控制:通过IMU数据进行运动状态校准
实时性保障
- 高频处理:确保点云数据的实时处理
- 并行计算:利用多线程提高处理效率
- 内存优化:合理管理点云数据的存储和释放
总结
1 | |
ROS2 3D雷达导航系统实现详解
https://codechangeworld.pages.dev/2026/07/08/ROS2雷达自动循环/