激光雷达建图和定位方案-算法工具

激光雷达建图和定位方案-算法工具

附赠自动驾驶最全的学习资料和量产经验:链接

滤波器理论回顾

在此之前我先讲讲对多传感器融合的理解:

在运动感知和环境感知上,即定位和环境感知上都需要多传感器融合技术;

至于定位上,我们主要是要估计出机器人或车辆在环境中的位姿,那么它作为状态变量的其中一大部分,需要在多传感器融合技术参与下,更高精度和更具有鲁棒性地估计出来;多传感器中有作为状态预测也有作为状态观测的,通过设计一个状态估计模型(滤波或者优化),将预测和观测信息结合起来通过批量优化或滤波递归的方式不断更新机器人的状态,主要就是融合多传感器预测和观测信息的不确定性或协方差或置信度,对状态进行一个评估、融合,估计得到一个更加高确定性、协方差更小、置信度更高的一个状态。

SLAM通常由运动方程和观测方程组成:

非线性形式

image

线性形式

image

线性形式的最优估计由卡尔曼滤波器给出。

对于一个SLAM问题来说,有运动方程和观测方程,运动方程为k时刻的运动状态,由上一时刻的运动状态以及状态转移矩阵,加上输入和噪声组成;观测方程为k时刻的观测,由k时刻的观测矩阵以及k时刻的运动状态,加上观测噪声组成。

状态由高斯分布描述:

预测:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更新:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡尔曼滤波器的五个公式:

  1. 预测的状态= 状态转移矩阵乘上一时刻的状态(最优)+输入

  2. 预测的状态协方差 = 状态转移矩阵乘上一时刻的状态协方差(最优)+输入噪声 (因为有噪声的存在,所以在IMU预测过程中,状态协方差是不断增大的,即预测的状态信息是越来越不可信的)

P为状态协方差矩阵,R为输入噪声的协方差矩阵

3. 更新是更新卡尔曼增益K,K中包含观测矩阵和观测噪声协方差矩阵,以及预测的状态协方差矩阵

卡尔曼增益K,K中包含观测矩阵和观测噪声协方差矩阵,以及预测的下一时刻的状态协方差矩阵;即预测和观测的加权组合。

4. 下一时刻的状态包含观测和预测的加权组合。

下一时刻的状态X,包括卡尔曼增益、观测、观测矩阵、预测的下一时刻的状态矩阵,是观测和预测的加权组合(观测减去预测乘卡尔曼增益)。

5. 协方差矩阵P(也是下一时刻的),包括预测的协方差矩阵P,卡尔曼增益,观测矩阵(也是观测和预测的加权组合)

扩展卡尔曼滤波:

对非线性的运动方程或观测方程进行线性化,一阶泰勒展开。

迭代扩展卡尔曼滤波:

当非线性化程度比较强的时候,误差就会比较大;但是由于线性化的工作点离真值越近,线性化的误差就越小,就可以通过迭代来找到准确的线性化工作点,从而提高精度。

在这个情况下,后验协方差矩阵应该放到最后一步更新。

迭代的方法是重新做线性化;终止的条件是:两次的后验状态均值之间的差异小于一个阈值。

最优化和图优化

最简单的方法是梯度下降,即找一个初始值,沿着负梯度(非线性函数对求解参数进行求导)的方向逐步迭代,当迭代步长足够小时,即完成求解。

我们定义成数学问题,对于:

image

我们的思路:

image

ps:刚开始的时候,x1=x0 + ∆x0,k步后,xk + ∆xk

非线性优化问题的关键是如何确定∆x。

方法如下:

image

方法1(最速下降法):步长 不容易确定,容易陷入局部最优,根本原因是仅保留一阶项来近似求解。

方法2(牛顿法):求解Hessian矩阵的计算量比较大,且不容易求解。

方法3(高斯牛顿法):不是对lose-function进行泰勒展开,而是对非线性函数进行一阶泰勒展开,进行一阶线性化近似,然后构建目标函数,目标函数对∆x进行求导,最后求解线性方程组,用Jacobian来近似Hessian。这样的好处是收敛速度较快,特别适用于参数估计问题。然而,由于它基于二次函数的线性化,当目标函数存在较大的非线性特征时,可能会导致迭代过程中发散。

于是便引出LM法:

Levenberg-Marquardt方法:它是一种常用的非线性最小二乘优化算法,结合了最速下降法和高斯牛顿法的优点。它在高斯牛顿法的基础上引入了一个调整因子,以解决高斯牛顿法在目标函数具有较大非线性特征时可能出现的发散问题。

Levenberg-Marquardt法是在Gaussian-Newton法的基础上添加了阻尼因子λ,即求解线性方程:(H+λI)Ax=b

当λ较大时,相当于梯度下降法,而λ较小时,相当于G-N法。 当问题性质较好时,用高斯牛顿法,若问题接近病态,用LM法,稳定性更好,更容易收敛。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单线激光雷达建图是一种常见的SLAM(Simultaneous Localization and Mapping)算法,其主要思想是通过激光雷达扫描环境,获取环境中物体的位置信息,然后根据这些信息构建地图,并同时定位机器人自身的位置。下面是一个简单的单线激光雷达建图代码示例: ```python import numpy as np import matplotlib.pyplot as plt # 定义激光雷达参数 angle_min = -np.pi / 2 angle_max = np.pi / 2 angle_increment = np.pi / 180 range_min = 0.1 range_max = 10 # 定义地图参数 map_resolution = 0.1 map_size = 100 # 初始化地图 map_data = np.zeros((map_size, map_size)) # 模拟激光雷达扫描数据 ranges = np.random.uniform(range_min, range_max, int((angle_max - angle_min) / angle_increment)) # 将激光雷达数据转换为地图坐标系下的点 x = np.round(ranges * np.cos(np.arange(angle_min, angle_max, angle_increment)), 1) y = np.round(ranges * np.sin(np.arange(angle_min, angle_max, angle_increment)), 1) # 将点投影到地图上,并更新地图数据 for i in range(len(x)): if range_min <= ranges[i] <= range_max: map_x = int((x[i] + map_size / 2) / map_resolution) map_y = int((y[i] + map_size / 2) / map_resolution) if 0 <= map_x < map_size and 0 <= map_y < map_size: map_data[map_x, map_y] = 1 # 可视化地图 plt.imshow(map_data, cmap='gray') plt.show() ``` 这段代码实现了一个简单的单线激光雷达建图过程,包括定义激光雷达参数、地图参数,初始化地图,模拟激光雷达扫描数据,将数据转换为地图坐标系下的点,并将点投影到地图上并更新地图数据。最后通过可视化展示地图。当然,实际应用中还需要考虑很多其他因素,比如机器人的运动模型、传感器误差等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值