运动状态估计之卡尔曼滤波详解

作者 | 佳浩  编辑 | 阿木实验室

链接地址:https://zhuanlan.zhihu.com/p/395738793

点击下方卡片,关注“自动驾驶与AI”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【目标跟踪】技术交流群

后台回复【领域综述】获取自动驾驶感知定位融合近80篇综述论文!

今天将主要记录一下自己对机器人运动状态估计的学习,粒子滤波与卡尔曼滤波的讲述顺序稍做调整,主要是考虑到学习理解的难度,应该循序渐进。

那么主要讲述纲要如下:

1、卡尔曼滤波(kalman Filter,KF)原理与公式

2、经典卡尔曼滤波应用与简易代码实现

3、扩展卡尔曼滤波(Extended kalman Filter EKF)原理

4、无迹卡尔曼滤波(Unscented Kalman Filter,UKF)原理

至于粒子滤波与蒙特卡罗定位方法,因为和无迹卡尔曼滤波的部分思想有重叠,但又算是另外一种方法。

1、卡尔曼滤波原理与公式

7bbc12c8e945182d06c4415d51d1dd62.png

15f4e725a168758ed9a93c3ec84379fb.png

15e488c228134f0bdb69bd7cd1443b7c.png

2de6f3cd61fd3c893432b6b406d72867.png

2、卡尔曼滤波的案例分析与简易代码实现

ab64b2347173e6a9c764828381352065.png

int main()
{
    //predict para
    double ori_gauss = 3;
    double pre_gauss = 4;//inherent deviation
    double step_gauss;
    double pre_data;
    //observation para
    double ob_gauss = 4;//inherent deviation
    double ob_data;
    //kalman filter para
    double gain_K;
    //pre & ob process data in 
    pre_data = 23;
    ob_data = 25;
    //kalman filter process
    step_gauss = pow((pow(ori_gauss,2)+pow(pre_gauss,2)),0.5);
    gain_K = pow(pow(step_gauss,2)/(pow(step_gauss,2)+pow(ob_gauss,2)),0.5);
    pre_data = pre_data + gain_K*(ob_data - pre_data);
    ori_gauss = pow((1 - gain_K) * pow(step_gauss,2),0.5);
    //data output
    std::cout << "Kalman gain is : " << gain_K <<std::endl;
    std::cout << "prediction is : " << pre_data <<std::endl;
    std::cout << "new gauss deviation is : " << ori_gauss <<std::endl;
    //data renew
    pre_data = pre_data;//if have new pre then replace, or use old one but easier diffuse
    ob_data = ob_data;//new ob replace
    return 0;
}

随手写了一个,验证过单帧推进,具体迭代和需求根据大家使用来Ctrl+C,Ctrl+V,很好理解,不多赘述。

如果应用于多维场景,例如机器人的姿态分析等,涉及到了更多的C++应用,经常使用诸如Eigen,Vector等库,具体应用后续跟进SLAM分析。

3、扩展卡尔曼滤波(Extended kalman Filter EKF)

4b80c52e336328933595b9fcc9142965.png

1c0c6a4ff20872b6e4c015812be36c62.png

0ba94e607487ef205b19b5a1e7c7f85e.png

4、无迹卡尔曼滤波(Unscented Kalman Filter,UKF)

8350b83efdaa414e69b48352dde59dff.png

5cf1a567f16e177955fe71ff00f348a3.png

639daa98aedebd7b3e4b8d8a8217452c.png

UKF总结

UKF的优点,在于①它本身不具备解析形式的导数和复杂的方程;②它的解算使用基本的线性代数,我们甚至不需要任何关于运动或观测模型的闭环形式,可以理解为黑盒运算。

其与EKF的泰勒一阶展开计算雅克比式计算不同,UKF计算到收敛的代价取决于sigmapoint的选取与初状态的情况。

以上便是关于KF,EKF,UKF的理论详解与部分几何化理解,并给出了KF的一个应用参考代码,当系统复杂时,引入更多的约束来参加运算,效果会更好,相关代码可以依据不同需求尝试编写解决。

学无止境,精益求精,在算法工程师的路上越走越远,越挖越深。

本文仅做学术分享,如有侵权,请联系删文。

视频课程来了!

自动驾驶之心为大家汇集了毫米波雷达视觉融合、高精地图、BEV感知、传感器标定、自动驾驶协同感知、语义分割、自动驾驶仿真、L4感知等多个方向学习视频,欢迎大家自取(扫码进入学习)

a77eed9551df8133ada56dd56f73f988.png

(扫码学习最新视频)

国内首个自动驾驶学习社区

近1000人的交流社区,和20+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、Occpuancy、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

d8f0a3133452f211183507ca42405a22.jpeg

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向;

0e4234ce8fa9fe66b4e0110ba07fb77f.jpeg

添加汽车人助理微信邀请入群

备注:学校/公司+方向+昵称

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值