[激光SLAM]运行LIO-SAM时存在的一些问题

简介

LIO-SAM是基于因子图构建的激光雷达惯性里程计,可以将大量的相对测量值、绝对测量值、回环等多种不同数据作为因子融入激光雷达惯性里程计系统中。IMU预积分的运动估计被用来去处激光雷达运动畸变,并为激光雷达惯性里程计的优化提供初值。获得的激光惯性里程计的结果反过来用作估计IMU的偏差。为了确保实时性与高性能,进行位姿优化时边缘化掉了一些旧的激光雷达数据,而不是将激光雷达点云与整个地图进行匹配。在局部范围而不是全局范围进行扫描匹配可以有效提高系统的实时性,选择性地引入关键帧和高效的滑动窗口也能提高实时性能。


与其他算法的对比

LOAM:LOAM使用一个激光雷达和一个imu能实现了最好的性能,自它在KITTI odometry benchmark site发布以来就一直排在最前面。虽然LOAM算法很成功,但依然存在一些限制。首先是它保存地图是在一个全局体素地图中,其次它无法进行回环检测,也无法融入其它的像GPS这样的绝对测量数据进行位姿矫正,而且LOAM也存在在大场景测试中偏移问题,原因是因为它核心还是一个基于scan-matching的方法。


系统框架

在这里插入图片描述


运行时存在的问题

  • 之字形或跳动
    如果激光雷达和IMU数据格式与LIO-SAM的要求一致,则可能是由于激光雷达和IMU数据的时间戳不同步而导致此问题。

  • 上下跳跃
    测试bag数据集时base_link上下跳跃,可能是你的IMU外参标定错误。例如,重力加速度具有负值或者方向标定错误。
    请修改params.yaml的外部参数:

  extrinsicTrans: [0.0, 0.0, 0.0]
  extrinsicRot: [1, 0, 0,
                  0, 1, 0,
                  0, 0, 1]
  extrinsicRPY: [1,  0, 0,
                 0, 1, 0,
                  0, 0, 1]
  • mapOptimization崩溃
    通常是由GTSAM引起的。请安装在README.md中指定的GTSAM。更多类似的问题可以在这里找到。

  • gps里程表不可用
    通常是由于消息frame_ids和本体frame_id之间的转换不可用引起的(例如:应该可以从“imu_frame_id”和“ gps_frame_id”转换为“ base_link”框架。

  • 如何保存地图
    修改params.yaml

savePCD:true
  • 与Robosense兼容性
    由于Robosense点云与Velodyne点云格式不同需要进行转换,可以尝试使用转换工具rs_to_velodyne

  • 与livox兼容性
    目前不行。

  • 如何修改IMU的内部参数
    可以尝试使用内参标定的工具https://github.com/gaowenliang/imu_utils

  • 机器人静止时坐标缓慢上下跳动
    可能是因为没有足够的关键帧用于生成扫描匹配图,也可能是imu没进行校准,建议使用imu_utils进行校准。

  • 长走廊上无法使用
    长走廊属于SLAM中的退化问题,LIO-SAM无法使用。

  • 使用9轴IMU
    原因是9轴IMU给出了用于LIO-SAM初始化的横滚、俯仰和偏航角。系统的性能在很大程度上取决于IMU测量的质量。IMU数据速率越高,系统精度越好。建议使用至少提供200Hz输出频率的IMU。LIO-SAM当前仅适用于9轴IMU。

  • 20
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。通过系统性的规划和执行,方案能够分析问题的根本原因,提供可行的解决方案,并引导实施过程,确保问题得到合理解决。 目标达成: 方案通常与明确的目标相关联,它提供了一种达成这些目标的计划。无论是企业战略、项目管理还是个人发展,方案的制定都有助于明确目标并提供达成目标的路径。 资源优化: 方案在设计考虑了可用资源,以最大化其效用。通过明智的资源分配,方案可以在有限的资源条件下实现最大的效益,提高效率并减少浪费。 风险管理: 方案通常会对潜在的风险进行评估,并制定相应的风险管理策略。这有助于减轻潜在问题的影响,提高方案的可行性和可持续性。 决策支持: 方案提供了决策者所需的信息和数据,以便做出明智的决策。这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的目标努力。 监控与评估: 方案通常包括监控和评估的机制,以确保实施的有效性。通过定期的评估,可以及调整方案,以适应变化的环境或新的挑战。 总体而言,方案的作用在于提供一种有序、有计划的方法,以解决问题、实现目标,并在实施过程中最大化资源利用和风险管理。
好的,关于在激光SLAM框架LIO-SAM中加入地平面约束,构造地平面因子,用C++代码实现的问题,我可以为您提供一些思路。 首先,需要明确的是,在LIO-SAM中加入地平面约束的主要目的是为了提高定位和建图的精度。地平面信息可以帮助我们更好地估计机器人的高度,并且可以过滤掉一些误差比较大的点云数据,从而提高建图的质量。 其次,在LIO-SAM中构造地平面因子的过程可以分为以下几个步骤: 1. 首先需要对点云数据进行初步的处理,将点云数据转换到机器人坐标系下,并对点云进行滤波和分割,得到地面和非地面点云数据。 2. 接着,需要对地面点云数据进行平面拟合,得到地面的法向量和距离参数。 3. 然后,可以根据地面的法向量和距离参数,构造地平面因子。具体而言,可以采用高斯-牛顿法或者LM算法等优化方法,将地面因子加入到目标函数中,从而实现地平面约束。 最后,关于用C++代码实现地平面因子的构造,可以参考以下的代码: ``` // 定义地平面因子 class GroundFactor: public ceres::SizedCostFunction<1, 6> { public: GroundFactor(const Eigen::Vector3d& n, const double d) : n_(n), d_(d) {} virtual ~GroundFactor() {} virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const { const double* p = parameters[0]; Eigen::Map<const Eigen::Vector3d> T(p); residuals[0] = n_.dot(T) + d_; if (jacobians != NULL && jacobians[0] != NULL) { Eigen::Map<Eigen::Matrix<double, 1, 6, Eigen::RowMajor>> jacobian(jacobians[0]); jacobian.setZero(); jacobian.block<1, 3>(0, 0) = n_.transpose(); } return true; } static ceres::CostFunction* Create(const Eigen::Vector3d& n, const double d) { return (new ceres::AutoDiffCostFunction<GroundFactor, 1, 6>(new GroundFactor(n, d))); } private: Eigen::Vector3d n_; double d_; }; ``` 以上就是关于在激光SLAM框架LIO-SAM中加入地平面约束,构造地平面因子,用C++代码实现的一些思路和代码实现。希望对您有所帮助!
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Travis.X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值