Point-LIO
Point-LIO:鲁棒的高带宽激光雷达-惯性里程计
1. 引言
Point-LIO 是一种鲁棒的高带宽激光雷达-惯性里程计(LIO),能够估计极端剧烈的机器人运动。Point-LIO包含两大创新点以实现高带宽LIO:
- 逐点更新的LIO框架:在每个激光雷达点测量时更新状态,无需累积成帧。这种逐点更新机制可实现极高频率的里程计输出(4-8kHz),显著提升带宽,并从根本上消除剧烈运动导致的人为帧内运动畸变。
- 随机过程增强的运动学模型:将IMU测量值建模为模型的输出(而非传统滤波里程计/SLAM系统中的输入)。这种新型建模方法即使在IMU测量饱和时,也能实现剧烈运动下的精确定位和可靠建图。
实验证明,Point-LIO能在超出IMU量程的高角速度(75 rad/s)、剧烈振动和运动场景下提供高精度、高频率的里程计和可靠地图,且计算高效、鲁棒性强,在常规运动的公开数据集上表现优异。作为里程计,Point-LIO可广泛应用于自主轨迹规划、控制和感知任务,特别适用于极快本体运动(如剧烈振动、高角/线速度场景)或需高频率里程计输出和建图的场景(如高速反馈控制和感知)。
1.1. 开发者
代码贡献者:
贺东娇 (Dongjiao He) 和 徐威 (Wei Xu)
1.2. 相关论文
论文已被《Advanced Intelligent Systems》(AIS)接收,预印本:Point-LIO_preprint.pdf
1.3. 演示视频
YouTube演示视频:https://youtu.be/oS83xUs42Uw
2. Point-LIO的功能
2.1 无运动畸变的同步定位与建图(SLAM)
2.2 生成高频率、高带宽的里程计输出
2.3 在IMU饱和时仍能处理剧烈运动的SLAM
3. 环境配置
3.1 Ubuntu与ROS
支持Ubuntu18.04(ROS Melodic)和Ubuntu20.04(ROS Noetic)。需安装额外ROS包:
sudo apt-get install ros-xxx-pcl-conversions # 替换xxx为对应ROS版本
3.2 Eigen
官方安装指南:Eigen installation,或直接安装:
sudo apt-get install libeigen3-dev
3.3 livox_ros_driver2
重要提示:
- Point-LIO支持Livox系列雷达,必须在运行前安装并激活此驱动。
- 激活方法:在
~/.bashrc
末尾添加source $Livox_ros_driver2_dir$/install/setup.sh
,其中$Livox_ros_driver2_dir$
为驱动工作空间路径(按Livox官方文档默认为ws_livox
目录)。
4. 编译
克隆仓库并使用colcon构建:
cd ~/$ROS_WORKSPACE$/src
git clone https://github.com/hku-mars/Point-LIO.git
cd ..
colcon build --symlink-install
source install/setup.sh
- 编译前请确保已激活livox_ros_driver2(见3.3节)
- 若使用自定义PCL版本,在
~/.bashrc
中添加:export PCL_ROOT={CUSTOM_PCL_PATH}
5. 直接运行
关键注意事项:
A. 确保IMU与激光雷达时间同步,否则将严重影响性能。
B. 必须获取所用IMU的饱和值(加速度计/陀螺仪)和加速度单位,据此修改.yaml配置文件。
C. 错误提示"Failed to find match for field ‘time’"表示点云数据缺失时间戳,将导致Point-LIO无法运行(因其依赖每个点的时间戳)。
D. 若已知外参,建议设置extrinsic_est_en: false
。外参初始化方法请参考:激光雷达-IMU在线标定工具。
E. 如需无降采样的高频率里程计输出,设置publish_odometry_without_downsample: true
。此时可能因TF发布间隔过小触发"TF_REPEATED_DATA"警告,可通过以下方式抑制:
git clone --branch throttle-tf-repeated-data-error git@github.com:BadgerTechnologies/geometry2.git
重新编译后,警告频率将降至10秒/次(可自行调整时间间隔)。
5.1 Mid360设备
按Livox-ros-driver2指南连接Mid360后运行:
cd ~/$Point_LIO_ROS_DIR$
source devel/setup.sh
ros2 launch point_lio mapping_mid360.launch.py
ros2 launch livox_ros_driver2 msg_MID360_launch.py
注意:
- 仅支持
msg_MID360_launch.py
(因其提供关键的点级时间戳) - 修改帧率需调整
msg_MID360_launch.py
中的publish_freq
参数并重新编译驱动
5.2 Avia设备
需调整代码适配livox_ros2_driver
:
- 安装livox_ros2_driver
- 在代码中全局替换:
livox_ros_driver2::msg::CustomMsg
→livox_ros2_driver::msg::CustomMsg
<livox_ros_driver2/msg/custom_msg.hpp>
→<livox_ros2_driver/msg/custom_msg.hpp>
连接Avia设备后运行:
cd ~/$Point_LIO_ROS_DIR$
source install/setup.sh
ros2 launch point_lio mapping_avia.launch.py
ros2 launch livox_ros2_driver livox_lidar_msg_launch.py
5.3 外接IMU的Livox设备
理论上支持Mid-70/Mid-40等Livox雷达,需在运行前配置config/avia.yaml
:
- 雷达点云话题:
lid_topic
- IMU话题:
imu_topic
- 平移外参:
extrinsic_T
- 旋转外参:
extrinsic_R
(仅支持旋转矩阵)- 外参定义为:雷达在IMU坐标系中的位姿(IMU为基准坐标系)
- IMU饱和值:
satu_acc
,satu_gyro
- 加速度模值:
acc_norm
(与IMU消息单位一致)
5.4 Velodyne/Ouster设备(以Velodyne为例)
步骤A:运行前配置
编辑config/velodyne.yaml
:
- 点云话题:
lid_topic
- IMU话题:
imu_topic
(支持内置/外接,6轴/9轴) - 时间戳单位:
timestamp_unit
(根据PointCloud2中"time"/"t"字段设置) - 雷达线数:
scan_line
(支持16/32/64线) - 平移外参:
extrinsic_T
- 旋转外参:
extrinsic_R
(仅支持旋转矩阵) - IMU饱和值:
satu_acc
,satu_gyro
- 加速度模值:
acc_norm
步骤B:运行命令
cd ~/$Point_LIO_ROS_DIR$
source install/setup.sh
ros2 launch point_lio mapping_velody16.launch.py
步骤C:启动雷达驱动或播放rosbag
5.5 PCD文件保存
在launch文件中设置pcd_save_enable: 1
。终止Point-LIO时,所有全局坐标系下的点云将保存至Point-LIO/PCD/scans.pcd
。使用pcl_viewer scans.pcd
可视化点云。
PCL查看器快捷键:
1 - 随机着色
2 - X坐标值渲染
3 - Y坐标值渲染
4 - Z坐标值渲染
5 - 强度值渲染
6. 应用案例
6.1. 案例1:IMU饱和的剧烈运动场景SLAM
6.2. 案例2:FPV无人机与PULSAR系统应用
PULSAR为单电机驱动自旋平台,项目地址