基于不变扩展卡尔曼滤波器RI-EKF的同时定位与地图构建SLAM算法的收敛性和一致性特性研究(Matlab代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

 ⛳️赠与读者

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码、数据、文章


 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥1 概述

摘要——本文探讨了基于不变扩展卡尔曼滤波器(RI-EKF)的同时定位与地图构建(SLAM)算法的收敛性和一致性特性。证明了该算法的基本收敛性质,这些证明不需要在运动和观测模型的雅可比矩阵处于地面真实值时进行限制性假设。同时指出,与仅在确定性刚体变换下不变的基于SO(3)的EKF SLAM算法(SO(3)-EKF)相比,RI-EKF的输出在任意随机刚体变换下均保持不变。还讨论了这些不变性质对估计器一致性的影响。蒙特卡罗仿真结果表明,RI-EKF在基于3D点特征的SLAM中优于SO(3)-EKF、Robocentric-EKF和“第一估计雅可比矩阵” EKF算法。

关键词——定位、地图构建、SLAM

扩展卡尔曼滤波器(EKF)在过去广泛应用于解决同时定位与地图构建(SLAM)问题。然而,传统基于EKF的点特征SLAM的一个局限性是可能的估计器不一致性。这里的不一致性指的是算法低估了估计的不确定性,导致结果过于自信。早在2001年[1]就已经意识到这个问题,并在后续的文献[2][3]中进行了详细讨论。文献中也有一些研究旨在增强EKF SLAM的一致性。例如,Robocentric EKF SLAM [4]在机器人局部坐标系中估计地标的位置。因此,尽管地标在固定的全局坐标系中是静止的,但它们的位置估计会不断变化。然而,研究表明,这种以机器人为中心的表述在估计器的一致性方面表现更好。Guerreiro等人[5]还报告了一个在机器人中心坐标系中制定的SLAM问题的卡尔曼滤波器。此外,在文献[6]中还指出,EKF SLAM中的不一致性与SLAM问题的部分可观测性[7][8]密切相关。这一见解促使开发了许多显著提高一致性的EKF SLAM算法,例如“第一估计雅可比矩阵” EKF SLAM [6]、可观测性约束的EKF SLAM [9][10]。

📚2 运行结果

部分代码:

[REKF_RMS_ave, REKF_NEES_ave] = compute_rms_nees_ave( REKF_RMS, REKF_NEES );
[FEKF_RMS_ave, FEKF_NEES_ave] = compute_rms_nees_ave( FEKF_RMS, FEKF_NEES );
[RocEKF_RMS_ave, RocEKF_NEES_ave] = compute_rms_nees_ave( RocEKF_RMS, RocEKF_NEES );
[EKF_RMS_ave, EKF_NEES_ave] = compute_rms_nees_ave( EKF_RMS, EKF_NEES );

figure;
%subplot(2,2,1);
plot(1:size(REKF_RMS_ave.position, 2), REKF_RMS_ave.position, 'r'); hold on;
plot(1:size(FEKF_RMS_ave.position, 2), FEKF_RMS_ave.position, 'g'); hold on;
plot(1:size(EKF_RMS_ave.position, 2), EKF_RMS_ave.position, 'k'); hold on;
plot(1:size(RocEKF_RMS_ave.position, 2), RocEKF_RMS_ave.position, 'b'); hold on;

legend('R-EKF', 'FEJ-EKF', 'EKF', 'Roc-EKF' ,'Location','northeast');
title('RMS:position(meter)');xlim([0,size(REKF_RMS_ave.position, 2)]);

figure;
plot(1:size(REKF_RMS_ave.orientation, 2), REKF_RMS_ave.orientation, 'r'); hold on;
plot(1:size(FEKF_RMS_ave.orientation, 2), FEKF_RMS_ave.orientation, 'g'); hold on;
plot(1:size(EKF_RMS_ave.orientation, 2), EKF_RMS_ave.orientation, 'k'); hold on;
plot(1:size(RocEKF_RMS_ave.orientation, 2), RocEKF_RMS_ave.orientation, 'b'); hold on;

legend('R-EKF', 'FEJ-EKF',  'EKF', 'Roc-EKF', 'Location','northeast');
title('RMS:orientation(rad)');xlim([0,size(REKF_RMS_ave.orientation, 2)]);

figure;
semilogy(1:size(REKF_NEES_ave.orientation, 2), REKF_NEES_ave.orientation, 'r'); hold on;
semilogy(1:size(FEKF_NEES_ave.orientation, 2), FEKF_NEES_ave.orientation, 'g'); hold on;
semilogy(1:size(EKF_NEES_ave.orientation, 2), EKF_NEES_ave.orientation, 'k'); hold on;
semilogy(1:size(RocEKF_NEES_ave.orientation, 2), RocEKF_NEES_ave.orientation, 'b'); hold on;

legend('R-EKF', 'FEJ-EKF', 'EKF', 'Roc-EKF', 'Location','northeast');
title('NEES:orientation');xlim([0,size(REKF_NEES_ave.orientation, 2)]);

figure;
% semilogy(1:size(REKF_NEES_ave.pose, 2), REKF_NEES_ave.pose, 'r'); hold on;
% semilogy(1:size(FEKF_NEES_ave.pose, 2), FEKF_NEES_ave.pose, 'g'); hold on;
% semilogy(1:size(EKF_NEES_ave.pose, 2), EKF_NEES_ave.pose, 'k'); hold on;
% semilogy(1:size(RocEKF_NEES_ave.pose, 2), RocEKF_NEES_ave.pose, 'b'); hold on;


plot(1:size(REKF_NEES_ave.pose, 2), REKF_NEES_ave.pose, 'r-'); hold on;
plot(1:size(FEKF_NEES_ave.pose, 2), FEKF_NEES_ave.pose, 'g+'); hold on;
plot(1:size(EKF_NEES_ave.pose, 2), EKF_NEES_ave.pose, 'ko'); hold on;
plot(1:size(RocEKF_NEES_ave.pose, 2), RocEKF_NEES_ave.pose, 'b'); hold on;
plot(1:size(RocEKF_NEES_ave.pose, 2), 1.12*ones( 1,size(RocEKF_NEES_ave.pose, 2)  ), 'r--'); hold on;
plot(1:size(RocEKF_NEES_ave.pose, 2), 0.89*ones( 1,size(RocEKF_NEES_ave.pose, 2)  ), 'r--'); hold on;
hleg=legend('R-EKF', 'FEJ-EKF', 'SO(3)-EKF', 'Robocentric-EKF', '95% confidence bound' , 'Location','northwest');
%hleg=legend('R-EKF', '95% confidence bound' , 'Location','northwest');
set(hleg,'FontSize',18)
ylabel('NEES of robot pose','fontsize',18);
xlabel('Time steps','fontsize',18);

xlim([0,size(REKF_NEES_ave.pose, 2)]);
title('NEES:pose');

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

🌈4 Matlab代码、数据、文章

资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

                                                           在这里插入图片描述

  • 32
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: EKF扩展卡尔曼滤波器)是一种在非线性系统中进行状态估计的滤波器,它通过使用线性近似来处理非线性的过程和测量模型。 在MATLAB实现EKF,您可以按照以下步骤进行: 1. 定义初始状态估计(均值和协方差矩阵),这是过程模型中的状态变量和其对应的噪声。 2. 编写系统模型函数,该函数应该返回系统转移矩阵、噪声协方差矩阵和状态转移函数。 3. 编写过程模型函数,该函数应该根据系统模型给定的状态转移函数和噪声协方差矩阵,计算状态估计的更新,并返回更新后的状态估计。 4. 定义观测模型函数,该函数应该返回测量模型的观测矩阵和噪声协方差矩阵。 5. 编写测量模型函数,该函数应该根据观测模型给定的观测矩阵和噪声协方差矩阵,计算观测估计的更新,并返回更新后的观测估计。 6. 在主程序中,按照以下步骤循环执行: a. 使用过程模型函数进行状态估计的更新。 b. 使用测量模型函数进行观测估计的更新。 c. 进行状态与观测的合并更新,得到最终的状态估计和协方差矩阵。 MATLAB中有一些优秀的开源库可以实现EKF,例如Robotics System Toolbox等。这些库提供了封装好的函数和示例,使您可以更轻松地实现EKF代码。 通过以上步骤和使用现有的开源库,您可以实现EKF滤波器的MATLAB代码。 ### 回答2: EKF是指扩展卡尔曼滤波器(Extended Kalman Filter),是将卡尔曼滤波器用于非线性系统的一种扩展EKF算法是基于卡尔曼滤波器的拓展,通过将非线性系统进行线性化来实现滤波。它使用非线性系统的近似线性模型,并通过不断迭代的线性近似来提高滤波效果。 在MATLAB实现EKF算法,需要以下几个步骤: 1. 构建系统模型:首先,需要定义状态方程和观测方程。状态方程描述了系统的动态行为,而观测方程描述了系统观测到的数据和状态之间的关系。 2. 初始化参数:设置初始状态向量、初始协方差矩阵和系统噪声和观测噪声的协方差矩阵。初始状态向量和协方差矩阵可以由先验知识或测量数据进行估计。 3. 迭代计算:利用EKF算法的迭代过程进行滤波。首先,使用状态方程对状态向量进行预测,并更新预测协方差矩阵。然后,利用观测方程进行状态修正,并更新修正后的状态向量和协方差矩阵。然后,将修正后的状态向量和协方差矩阵作为下一次迭代的初始值。 4. 循环迭代:根据所需的滤波周期,持续地进行迭代计算,直到达到所需的滤波效果。 MATLAB中有一些工具箱、函数和示例代码可供使用,如`ekf`函数和`ExtendedKalmanFilter`类等。这些工具可以简化EKF算法实现过程。 总之,通过在MATLAB实现EKF算法,我们可以利用该算法对非线性系统进行滤波,从而准确地估计系统的状态并提高预测效果。 ### 回答3: EKf(Extended Kalman Filter)是一种卡尔曼滤波器扩展版本,用于处理非线性系统模型。在MATLAB中,可以使用以下步骤来实现EKf代码: 1. 定义系统模型和观测模型的状态和观测变量。这些变量通常表示为向量或矩阵形式。 2. 初始化初始状态估计值和协方差矩阵。 3. 在每个时间步进行以下循环: a. 预测阶段:使用系统模型和上一个时间步的状态估计值进行预测,得到预测的状态估计值和协方差矩阵。 b. 更新阶段:使用预测的状态估计值和观测模型计算卡尔曼增益,并使用观测值来更新状态估计值和协方差矩阵。 4. 重复步骤3,直到达到预定的时间步数或收敛条件。 EKf代码实现过程中需要使用MATLAB的数值计算和矩阵运算函数,例如矩阵乘法、转置、逆矩阵等。 最后,需要注意的是EKf代码实现可能会因为不同的系统模型和观测模型而有所不同,因此具体的实现细节需要根据具体的应用进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值