传感器融合|基于C++完成一个简单的线性卡尔曼滤波器进行传感器融合

在机器人定位中,KF或者EKF是常用的传感器融合算法,之前也总结过很多关于EKF的用法:
如何理解卡尔曼滤波(Kalman Filter)实现数据融合
通俗易懂理解扩展卡尔曼滤波EKF用于多源传感器融合
大部分都是基于MATLAB写的,所以正好有空简单的写一下基于C++的计算方法,并且和 bfl 进行对比。
简单的来说,EKF 分为两个过程,预测和更新,预测的部分一般使用的是数据频率比较高的传感器,例如IMU或者Odom数据,这里为了对比效果,使用了 bfl 例子中的仿真传感器数据,首先先对bfl中的例子,做一个简单的解析:

for (time_step = 0; time_step < NUM_TIME_STEPS-1; time_step++) { auto start = std::chrono::steady_clock::now(); // DO ONE STEP WITH MOBILE ROBOT mobile_robot.Move(input); // DO ONE MEASUREMEN ColumnVector measurement = mobile_robot.Measure(); // UPDATE FILTER // filter.Update(&sys_model,input,&meas_model,measurement); filter.Update(&sys_model,input); filter.Update(&meas_model,measurement); measurement = mobile_robot.Measure(); x = filter.PostGet()->ExpectedValueGet(); covarLabelMeas = filter.PostGet()->CovarianceGet(); cout << " ExpectedValueGet = " <

具体的代码如上,后面会继续更新基于C++的非线性卡尔曼滤波,也就是考虑了转向角的融合。

    推荐阅读