| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 多传感器融合定位 第八章 基于滤波的融合方法进阶 -> 正文阅读 |
|
[人工智能]多传感器融合定位 第八章 基于滤波的融合方法进阶 |
多传感器融合定位 第八章 基于滤波的融合方法进阶参考博客:深蓝学院-多传感器融合定位-第7章作业
|
max | mean | median | min | rmse | sse | std | |
---|---|---|---|---|---|---|---|
无运动约束 | 1.573173 | 0.929147 | 0.927948 | 0.144083 | 0.946438 | 3913.507531 | 0.180083 |
速度观测 | 1.580340 | 0.928019 | 0.923693 | 0.130854 | 0.945814 | 3916.404671 | 0.182607 |
运动约束 | 1.590144 | 0.928888 | 0.923275 | 0.122330 | 0.946373 | 3918.345359 | 0.181077 |
fused 为无运动约束, fused_vel 为加入惯导速度观测,fused_cons为加入运动约束(伪观测)
通过观察ape曲线,觉得并无太大差别
fused 无运动约束 | fused_cons 运动约束 |
---|---|
![]() | ![]() |
fused 为无运动约束, fused_vel 为加入惯导速度观测,fused_cons为加入运动约束(伪观测)
为了方便可视化v_x、v_z ,这里使用matplotlib 可视化数据
FILE: /home/kaho/shenlan_ws/visual/ main.py
# import necessary module
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
fused = np.loadtxt("fused_withoust_cons.txt")
fused_vel_data = np.loadtxt("fused_vel.txt")
fused_cons_data = np.loadtxt("fused_cons.txt")
# x = fused_vel_data[:,0]
y_fused = fused[:,1]
z_fused = fused[:,2]
y_fused_vel = fused_vel_data[:,1]
z_fused_vel = fused_vel_data[:,2]
y_fused_cons_data = fused_cons_data[:,1]
z_fused_cons_data = fused_cons_data[:,2]
plt.plot(y_fused, c='r', label ="y_fused")
plt.plot(y_fused_vel, c='g', label ="Y_fused_vel")
# plt.plot(y_fused_cons_data, c='b', label ="y_fused_cons")
plt.legend();
plt.title('y velocity ',fontsize=18,color='y')
plt.show()
plt.plot(z_fused, c='r', label ="z_fused")
# plt.plot(z_fused_vel, c='g', label ="z_fused_vel")
plt.plot(y_fused_cons_data, c='b', label ="y_fused_cons")
plt.legend();
plt.title('z velocity ',fontsize=18,color='y')
plt.show()
红色为无运动约束,绿色为fused 加入速度观测,蓝色为fused_cons为加入运动约束,可明显看出蓝色曲线大部分时间处于红色曲线之下,说明使用运动约束后,数据的波动性更小。
红色为无运动约束,绿色为fused 加入速度观测,蓝色为fused_cons为加入运动约束,可明显看出蓝色曲线大部分时间处于红色曲线之下,说明使用运动约束后,数据的波动性更小。
实验结果大致和理论的一致,添加了运动模型后,整体效果有了轻微的改善,但是速度的波动得到了大幅度的抑制!!!
参照 (Estimate: imu, Measurment: lidar、odom ) 模型,推导出(Estimate: imu, Measurment: gnss、odom ),观测方程中,gnss 提供position、odom
状态量
δ
x
=
[
δ
p
δ
v
δ
θ
δ
b
a
δ
b
ω
]
\delta \boldsymbol{x}=\left[\begin{array}{l} \delta \boldsymbol{p} \\ \delta \boldsymbol{v} \\ \delta \boldsymbol{\theta} \\ \delta \boldsymbol{b}_{a} \\ \delta \boldsymbol{b}_{\omega} \end{array}\right]
δx=???????δpδvδθδba?δbω?????????
观测量 GPS + Encoder 做观测, GPS 提供position, Encoder 提供velocity
y
=
[
δ
p
 ̄
δ
v
 ̄
b
]
\boldsymbol{y}=\left[\begin{array}{c} \delta \overline{\boldsymbol{p}} \\ \delta \overline{\boldsymbol{v}}^{b} \\ \end{array}\right]
y=[δp?δvb?]
观测值的获取
δ
v
 ̄
b
=
v
~
b
?
v
b
=
R
~
b
w
v
~
w
?
[
v
m
0
0
]
\delta \overline{\boldsymbol{v}}_{b}=\tilde{\boldsymbol{v}}^{b}-\boldsymbol{v}^{b}=\tilde{\boldsymbol{R}}_{b w} \tilde{\boldsymbol{v}}^{w}-\left[\begin{array}{c} \boldsymbol{v}_{m} \\ 0 \\ 0 \end{array}\right]
δvb?=v~b?vb=R~bw?v~w????vm?00????
观测方程
y
=
G
t
δ
x
+
C
t
n
\boldsymbol{y}=\boldsymbol{G}_{t} \delta \boldsymbol{x}+\boldsymbol{C}_{t} \boldsymbol{n}
y=Gt?δx+Ct?n
G t = [ I 3 0 0 0 0 0 R b w [ v b ] × 0 0 ] C t = [ I 3 0 0 I 3 ] \begin{aligned} \boldsymbol{G}_{t} &=\left[\begin{array}{ccccc} \boldsymbol{I}_{3} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \boldsymbol{R}_{b w} & {\left[\boldsymbol{v}^{b}\right]_{\times}} & \mathbf{0} & \mathbf{0} \\ \end{array}\right] \\\\\\ \boldsymbol{C}_{t} &=\left[\begin{array}{ccc} \boldsymbol{I}_{3} & \mathbf{0} \\ \mathbf{0} & \boldsymbol{I}_{3} \\ \end{array}\right] \end{aligned} Gt?Ct??=[I3?0?0Rbw??0[vb]×??00?00?]=[I3?0?0I3??]?
n = [ n δ p ˉ x n δ p ˉ y n δ p ˉ z n δ v ˉ x b n δ v ˉ y b n δ v ˉ z b ] T \boldsymbol{n}=\left[\begin{array}{lllllllll} n_{\delta \bar{p}_{x}} & n_{\delta \bar{p}_{y}} & n_{\delta \bar{p}_{z}} & n_{\delta \bar{v}_{x}^{b}} & n_{\delta \bar{v}_{y}^{b}} & n_{\delta \bar{v}_{z}^{b}} \end{array}\right]^{T} n=[nδpˉ?x???nδpˉ?y???nδpˉ?z???nδvˉxb???nδvˉyb???nδvˉzb???]T
void ErrorStateKalmanFilter::CorrectErrorEstimationPosiVel( // position + velocity
const Eigen::Matrix4d &T_nb, const Eigen::Vector3d &v_b, const Eigen::Vector3d &w_b,
Eigen::VectorXd &Y, Eigen::MatrixXd &G, Eigen::MatrixXd &K
) {
//
// TODO: set measurement: 计算观测 delta pos 、 delta velocity
//
Eigen::Vector3d v_b_ = {v_b[0], 0, 0}; // measurment velocity (body 系) , 伪观测 (vy 、vz = 0)
Eigen::Vector3d dp = pose_.block<3, 1>(0, 3) - T_nb.block<3, 1>(0, 3);
Eigen::Vector3d dv = pose_.block<3, 3>(0, 0).transpose() *vel_ - v_b ; // delta v , v_x 来自轮速里程计
// TODO: set measurement equation:
YPosiVel_.block<3, 1>(0, 0) = dp; // delta position
YPosiVel_.block<3, 1>(3, 0) = dv; // delta velocity
Y = YPosiVel_;
// set measurement G
GPosiVel_.setZero();
GPosiVel_.block<3, 3>(0, kIndexErrorPos) = Eigen::Matrix3d::Identity();
GPosiVel_.block<3, 3>(3, kIndexErrorVel) = pose_.block<3, 3>(0, 0).transpose();
GPosiVel_.block<3, 3>(3, kIndexErrorOri) = Sophus::SO3d::hat( pose_.block<3, 3>(0, 0).transpose() *vel_ ) ;
G = GPosiVel_;
// set measurement C
CPosiVel_.setIdentity();
Eigen::MatrixXd C = CPosiVel_;
// TODO: set Kalman gain:
Eigen::MatrixXd R = RPosiVel_; // 观测噪声
K = P_ * G.transpose() * ( G * P_ * G.transpose( ) + C * R* C.transpose() ).inverse() ;
}
FILE: catkin_ws/src/lidar_localization/config/filtering/gnss_ins_sim_filtering.yaml
按照GeYao 助教所说,
最后这里在运行的时候需要提醒一下大家, 左边的两张图是gnss-ins-sim生成测量数据时候的误差等级, 课程中默认使用的都是中等精度, 也就是说gps位置的协方差应该在2.5e-1左右, 而编码器应该在2.5e-3左右, 而右边是我们的作业使用的默认配置文件中的误差等级. 可以看出gps的实际误差与我们给的先验值的差距比较巨大, 这就是为什么有些同学在程序正确的情况下rviz中显示的姿态抖动非常厉害的原因. 建议大家在左边这两个值的基础上进行调参.
所以,我们把 pos 和 vel 的measurment cov 调整为
measurement:
pose:
pos: 1.0e-4
ori: 1.0e-4
pos: 2.5e-1 # 1.0-4
vel: 2.5e-3
这里生成的仿真数据的重力加速度和kitti的重力加速度方向不太一致,原因,仿真的数据集中传感器的Z轴正方向是朝上的,所以imu_sim_ins accel_z 读出来的数值是 -g。通过 指令rqt_bag 查看传感器读取的重力加速度,写到yaml中。
FILE: catkin_ws/src/lidar_localization/config/filtering/gnss_ins_sim_filtering.yaml
gravity_magnitude: -9.794216
# set up session:
source devel/setup.bash
# save odometry:
rosservice call /save_odometry "{}"
# run evo evaluation:
# a. fused 没有输入运动模型 输出评估结果,并以zip的格式存储:
evo_ape kitti ground_truth.txt fused.txt -r full --plot --plot_mode xyz --save_results ./fused.zip
# b. fused_vel 速度观测 输出评估结果,并以zip的格式存储:
evo_ape kitti ground_truth.txt gnss.txt -r full --plot --plot_mode xyz --save_results ./gnss.zip
#e. 比较 laser fused 一并比较评估
evo_res *.zip --use_filenames -p
GNSS + Odom | GNSS Only |
---|---|
![]() | ![]() |
![]() | ![]() |
max | mean | median | min | rmse | sse | std | |
---|---|---|---|---|---|---|---|
gnss+odom | 1.25794 | 0.31052 | 0.263991 | 0.0234911 | 0.374327 | 218.028 | 0.209041 |
gnss only | 3.473 | 2.32244 | 2.37926 | 0.103637 | 2.43563 | 9230.62 | 0.733851 |
可得知,融合了odom轮速里程计后,数据波动得到大幅度抑制。
? edit by kaho 2021.10.22
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/19 8:41:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |