一个基于 ROS 2 Jazzy 的轻量级 LiDAR-IMU 里程计/建图实验工程,当前面向 Livox Mid-360 数据流开发。
当前仓库包含:
OdomNode:IMU 预积分、点云去畸变、submap 构建、GICP 配准、状态发布MapNode:订阅 keyframe 点云、体素滤波、在线累积并发布全局地图,支持手动保存 PCD
目前工程重点仍是里程计主链路,建图部分已经具备基础在线建图能力,当前支持:
- 订阅
/keyframe - 对每帧 keyframe 做 voxel filter
- 累积 keyframe 点云
- 发布
/global_map - 通过
/save_mapservice 保存当前全局地图为 PCD - 使用保存下来的
global_map.pcd离线渲染地图图片
但还没有做完整的地图管理能力,例如:
- 全局地图的二次重采样或分层管理
- 地图加载与重发布
- 分块地图或局部地图裁剪
- 后台优化/回环
small_dlio/
├── src/dlio/
│ ├── config/config.yaml
│ ├── include/small_dlio/
│ ├── launch/full.launch.py
│ └── src/
│ ├── main.cpp
│ ├── odom_node.cpp
│ └── map_node.cpp
├── quick_source.sh
└── README.md
- Ubuntu 24.04
- ROS 2 Jazzy
livox_ros_driver2- PCL
- Eigen3
- OpenMP
small_gicp
构建前需要 source:
source /opt/ros/jazzy/setup.bash
source /home/goose/fastlio/livox_ws/install/setup.bash或者使用一键 source 脚本:
source quick_source.shcolcon build --packages-select dlio --event-handlers console_direct+启动节点:
source install/setup.bash
ros2 launch dlio full.launch.py rviz:=false回放当前测试 bag:
ros2 bag play /home/goose/fastlio/rosbag2_mid360_10hz --clock如果需要 RViz:
ros2 launch dlio full.launch.py rviz:=true/livox/imu/livox/lidar/keyframe
/odom/pose/path/tf/tf_static/deskewed/global_map
/save_map:保存当前global_map_到 PCD
配置文件位置:
当前较关键的参数包括:
kf_trans_thresh:关键帧平移阈值kf_rot_thresh:关键帧旋转阈值max_alignment_score:GICP 接受阈值gicp_leaf_size:配准前点云降采样体素大小gicp_num_threads:GICP 线程数map_leaf_size:MapNode对 keyframe 做体素滤波时使用的 leaf sizesave_map_service_name:地图保存 service 名称map_save_path:PCD 默认保存路径
运行过程中可以手动调用:
ros2 service call /save_map std_srvs/srv/Trigger {}默认会把地图保存到:
/home/goose/small_dlio/global_map.pcd
回放 bag 后,至少应能看到这些话题:
/odom/pose/path/tf/deskewed/global_map
建议固定坐标系使用 odom。
下面这张图由保存下来的 global_map.pcd 离线渲染得到,左侧是俯视图,右侧是斜视图。
- 对
global_map_增加全局重滤波或分块管理,控制地图规模 - 增加地图加载与重发布能力
- 将 odom / map 节点进一步解耦
- 为保存地图增加可配置输出格式或保存前重采样选项
- 评估是否引入回环或离线建图流程
