Lego-LOAM IMU坐标系变换的详细记录

本文详细记录了Lego-LOAM中IMU坐标系变换的过程,包括IMU重力加速度消除和从相机坐标系到初始坐标系的转换。通过解析欧拉角的旋转顺序和坐标轴关系,阐述了如何将IMU数据转换到相机坐标系并进一步转换到初始坐标系,以便于进行位移和速度的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看了Lego-LOAM 的IMU部分,没看懂IMU的坐标系变换。看其它的博客,看的让我更混淆了,因此决定抛开其他人的理解,故写下这篇博客。

0 基础知识

  1. IMU的数据欧拉角表示的时从当前时刻的坐标系初始坐标系的旋转关系(内旋变换),且旋转顺序为RPY( yaw(z) - > pitch(y) -> roll(x) ), 即:
    R = R(yaw)*R(pitch)*R(roll);
  2. IMU的欧拉角的值旋转顺时针(从负轴看向正轴)为,本人实测。这也解释了第一点为什么IMU的欧拉角表示的是从当前时刻的坐标系初始坐标系的原因。
  3. 旋转矩阵 R = R(yaw)*R(pitch)*R(roll) -----------------------------------------------------------------------(1)

    在这里插入图片描述

5 IMU坐标系方向:IMU RPY顺时针为正,加速度计


在这里插入图片描述

1. IMU 重力加速度消除

首先,一般重力加速度再Z轴为正,至少本人IMU测试重力加速度再Z轴为正。有了上面的基础,再来看IMU的重力加速度消除就简单,减去重力加速度在xyz轴的分量即可。
1.1 假设在初始坐标系下IMU的重力加速度在x,y,z方向的分量表示为ginit=[0; 0 ; 9.8]
1.2 Rinit_imu =R(yaw)R(pitch)R(roll)表示从当前时刻的IMU坐标系转换到初始坐标系
1.3 因此有,ginit = Rinit_imu * gimu,可得重力加速度在当前IMU坐标系下的xyz重力分量为:
               gimu = RTinit_imu * ginit
                 = [-9.8
sin(pitch); 9.8
sin(roll)cos(pitch); 9.8*cos(roll)cos(pitch)];
1.4 IMU数据减去重力分量,并且转换到相机坐标系下:

[accZ; accX; accY] = [imu_acc_x; imu_accy; imu_acc_z] - g imu

旋转到相机坐标系下,RPY和相机坐标系的关系:


在这里插入图片描述

2 相机坐标系(camera)到初始坐标系(camera_init)的转换

上面我们将IMU转换到相机坐标系下了。在Lego-LOAM 中计算位移和速度以初始相机坐标系(camera_init)为参考,因此需要转换到初始相机坐标系(camera_init)。
2.1 从当前时刻的相机坐标系转换到初始相机坐标系的旋转关系,应该和IMU的旋转关系一致,即

R init_camera = R init_imu

acc_wrold = R init_camera * [accZ; accX; accY] = R init_imu *( [imu_acc_x; imu_accy; imu_acc_z] - g imu );

  上面等式也描述了为什么两个旋转矩阵相等,右边是IMU的旋转到初始IMU坐标系位置,左边是相机坐标系旋转到初始坐标系位置。并且从相机坐标系变换会初始坐标系时不是:z(roll) --> y(yaw)–>x(pitch),而是(y_cam)yaw -> (x_cam)pitch -> (z_cam)roll,即:
    acc_wrold = R2init_camera * [accX; accY; accZ];
    R2init_camera = R(yaw)*R(pitch)*R(roll) = R(y_cam)*R(x_cam)*R(z_cam)

2.2 最后将上述等式乘起来就是Lego-LOAM中AccumulateIMUShiftAndRotation()的坐标系变换。
2.3 Lego-LOAM旋转变换都是遵循RPY(Y->P->R)顺序,只是Yaw 对应的到底是R(x),R(y),R(z)的哪个旋转矩阵,要根据IMU的RPY坐标系和待旋转坐标轴确定。例如在相机坐标系下yaw对应的就是y轴,因此对应R(y)的旋转矩阵。明白了这些,在Lego-LOAM中其他地方的IMU坐标变换便迎刃而解。

<think>好的,用户在使用LEGO-LOAM处理KITTI数据集时想保存点云数据为PCD文件。我需要根据提供的引用内容给出解决方案。首先,引用[2]提到在LIO-SAM中需要修改params.yaml文件中的SavePCD参数为true并设置保存路径。LEGO-LOAM可能也有类似的配置。我需要检查LEGO-LOAM的配置文件,通常在config文件夹下,比如params.yaml或者别的名称。找到对应的保存选项,设为true并指定路径。 然后,用户使用KITTI数据集,可能需要调整数据输入的topic名称。LEGO-LOAM默认订阅的可能是Velodyne的点云话题,而KITTI数据可能发布在不同的topic上,比如/kitti/velo/pointcloud。需要修改配置文件中的相应参数,确保LEGO-LOAM能正确接收数据。 另外,运行前需要创建保存路径,确保权限正确。运行结束后,检查指定目录是否有生成的PCD文件。如果遇到问题,可能需要查看日志或调整参数。引用[3]提到使用rosbag播放时调整频率,可能数据播放过快导致处理不完整,可以尝试降低播放速率,比如使用-r参数。 最后,验证生成的PCD文件是否正确,可以使用pcl_viewer命令查看,如引用[1]所述。综合这些步骤,整理出修改配置文件、调整话题名称、创建路径、运行处理程序以及验证结果的流程。</think>在使用LEGO-LOAM处理KITTI数据集时,保存PCD文件需要以下步骤: ### 1. 修改配置文件 进入LEGO-LOAM的配置文件目录(通常为`~/catkin_ws/src/LEGO-LOAM/config/`),找到参数文件`utility.h`或`params.yaml`: - 将参数`savePCD`设置为`true` - 修改`savePCDDirectory`为自定义存储路径(如`/home/user/pcd_data/`) ```cpp // 示例参数配置 bool savePCD = true; std::string savePCDDirectory = "/home/user/pcd_data/"; ``` ### 2. 适配KITTI数据集 由于KITTI数据格式与Velodyne不同: - 在`utility.h`中修改点云订阅话题名称为KITTI数据的话题(如`/kitti/velo/pointcloud`) ```cpp #define POINT_CLOUD_TOPIC "/kitti/velo/pointcloud" ``` - 确保时间戳同步参数`use_imu_as_input`设置为`false`(KITTI使用GPS/IMU联合标定) ### 3. 创建存储路径 在终端执行: ```bash mkdir -p /home/user/pcd_data/ chmod 777 /home/user/pcd_data/ ``` ### 4. 运行处理流程 ```bash roslaunch lego_loam run.launch rosbag play kitti_dataset.bag -r 0.5 # 降低播放速度避免丢帧 ``` ### 5. 验证结果 程序运行结束后,使用以下命令查看生成的PCD文件: ```bash pcl_viewer /home/user/pcd_data/*.pcd ``` [^1]: 引用自PCD文件查看方法 [^2]: 参数修改参考LIO-SAM配置经验 [^3]: 数据播放频率调整建议
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值