深蓝学院-多传感器融合定位-第7章作业
深蓝学院-多传感器融合定位-第7章作业
- 1. 及格题
- 2. 良好题
- Parameter - verison 1
- Parameter - verison 2
- Parameter - verison 3
- Parameter - verison 4
- Parameter - verison 5
- 3. 优秀题
- Parameter - verison 6 (without Rand-Walk Bias)
Github: https://github.com/WeihengXia0123/LiDar-SLAM
1. 及格题
(大概整了一两天,终于可以编译了…关键问题在于,docker的环境可能被很多次作业打乱了。在助教葛大佬的提示下,新创建了一个
assignments/
来放第七章作业的代码,神奇地解决了初始代码的编译问题)
及格部分的代码就是按照深蓝07章课件中的Error-State Kalman Filter的公式来。
注意: 和EKF有点区别。
//
// TODO: perform Kalman prediction
//
X_ = F * X_; // fix this
P_ = F * P_ * F.transpose() + B * Q_ * B.transpose(); // fix this//
// TODO: set measurement:
// 误差:预测值 - 观测值
//
Eigen::Vector3d P_nn_obs = pose_.block<3,1>(0,3) - T_nb.block<3,1>(0,3); // fix this
Eigen::Matrix3d R_nn_obs = T_nb.block<3,3>(0,0).transpose() * pose_.block<3,3>(0,0); // fix thisYPose_.block<3, 1>(0, 0) = P_nn_obs;
YPose_.block<3, 1>(3, 0) = Sophus::SO3d::vee(R_nn_obs - Eigen::Matrix3d::Identity());Y = YPose_;// set measurement equation:
G = GPose_;//
// TODO: set Kalman gain:
//
MatrixRPose R = RPose_; // fix this
MatrixCPose C = Eigen::MatrixXd::Identity(6,6);
K = P_ * G.transpose() * (G*P_*G.transpose() + C*R*C.transpose()).inverse(); // fix this //
// TODO: set measurement:
// 误差:预测值 - 观测值
//
Eigen::Vector3d P_nn_obs = pose_.block<3,1>(0,3) - T_nb.block<3,1>(0,3); // fix this
Eigen::Matrix3d R_nn_obs = T_nb.block<3,3>(0,0).transpose() * pose_.block<3,3>(0,0); // fix thisYPose_.block<3, 1>(0, 0) = P_nn_obs;
YPose_.block<3, 1>(3, 0) = Sophus::SO3d::vee(R_nn_obs - Eigen::Matrix3d::Identity());Y = YPose_;// set measurement equation:
G = GPose_;//
// TODO: set Kalman gain:
//
MatrixRPose R = RPose_; // fix this
MatrixCPose C = Eigen::MatrixXd::Identity(6,6);
K = P_ * G.transpose() * (G*P_*G.transpose() + C*R*C.transpose()).inverse(); //
// TODO: perform Kalman correct:
//P_ = (MatrixP::Identity() - K*G) * P_; // fix this
X_ = X_ + K * (Y - G*X_); // fix thisvoid ErrorStateKalmanFilter::EliminateError(void) {//// TODO: correct state estimation using the state of ESKF//// a. position:pose_.block<3, 1>(0, 3) =pose_.block<3, 1>(0, 3) - X_.block<3,1>(INDEX_ERROR_POS, 0); // fix this// b. velocity:vel_ = vel_ - X_.block<3,1>(INDEX_ERROR_VEL, 0); // fix this// c. orientation:Eigen::Matrix3d R_nn =Sophus::SO3d::hat(X_.block<3, 1>(INDEX_ERROR_ORI, 0)).matrix();pose_.block<3, 3>(0, 0) = pose_.block<3, 3>(0, 0) * (Eigen::MatrixXd::Identity(3,3) - R_nn); // fix this// d. gyro bias:if (COV.PROCESS.BIAS_FLAG && IsCovStable(INDEX_ERROR_GYRO)) {gyro_bias_ += X_.block<3, 1>(INDEX_ERROR_GYRO, 0);}// e. accel bias:if (COV.PROCESS.BIAS_FLAG && IsCovStable(INDEX_ERROR_ACCEL)) {accl_bias_ += X_.block<3, 1>(INDEX_ERROR_ACCEL, 0);}
}
滤波功能基本正常。
2. 良好题
Parameter - verison 1
process:
gyro: 1.0e-4
accel: 2.5e-3
bias_accel: 2.5e-3
bias_gyro: 1.0e-4
bias_flag: True
measurement:
pose:
pos: 1.0e-3
ori: 1.0e-4
pos: 1.0e-4
vel: 2.5e-3
Result - laser
APE w.r.t. full transformation (unit-less)
max 1.500344mean 0.902466
median 0.894143min 0.161967rmse 0.917469sse 3696.964333std 0.165240
Result - fused
APE w.r.t. full transformation (unit-less)
max 1.549884mean 0.898618
median 0.898169min 0.034132rmse 0.916721sse 3690.936975std 0.181281
Parameter - verison 2
process:gyro: 1.0e-3accel: 2.5e-2bias_accel: 2.5e-3bias_gyro: 1.0e-4bias_flag: Truemeasurement:pose:pos: 1.0e-3ori: 1.0e-4pos: 1.0e-4vel: 2.5e-3
Result - laser
APE w.r.t. full transformation (unit-less)
max 1.500344mean 0.901874
median 0.893900min 0.161967rmse 0.916922sse 3690.876634std 0.165440
Result - fused
APE w.r.t. full transformation (unit-less)
max 1.539430mean 0.898373
median 0.897470min 0.058437rmse 0.916334sse 3686.143600std 0.180540
Parameter - verison 3
process:gyro: 1.0e-5accel: 2.5e-6bias_accel: 2.5e-3bias_gyro: 1.0e-4bias_flag: Truemeasurement:pose:pos: 1.0e-3ori: 1.0e-4pos: 1.0e-4vel: 2.5e-3
Result - laser
APE w.r.t. full transformation (unit-less)
(not aligned)
max 1.136680mean 0.231626
median 0.164014min 0.017465rmse 0.289811sse 368.550415std 0.174183
Result - fused
APE w.r.t. full transformation (unit-less)
(not aligned)
max 1.013023mean 0.258347
median 0.200838min 0.019931rmse 0.309749sse 421.004733std 0.170884
Parameter - verison 4
process:gyro: 1.0e-5accel: 2.5e-6bias_accel: 2.5e-3bias_gyro: 1.0e-4bias_flag: Truemeasurement:pose:pos: 1.0e-4ori: 1.0e-5pos: 1.0e-4vel: 2.5e-3
Result - laser
APE w.r.t. full transformation (unit-less)
max 1.500344mean 0.901922
median 0.893900min 0.161967rmse 0.916961sse 3691.186379std 0.165389
Result - fused
APE w.r.t. full transformation (unit-less)
max 1.530646mean 0.900078
median 0.896358min 0.033429rmse 0.917532sse 3695.785994std 0.178115
Parameter - verison 5
process:gyro: 1.0e-6accel: 2.5e-7bias_accel: 2.5e-3bias_gyro: 1.0e-4bias_flag: Truemeasurement:pose:pos: 1.0e-3ori: 1.0e-4pos: 1.0e-4vel: 2.5e-3
Result - laser
APE w.r.t. full transformation (unit-less)
max 1.500344mean 0.902180
median 0.894120min 0.161967rmse 0.917157sse 3692.766704std 0.165068
Result - fused
APE w.r.t. full transformation (unit-less)
max 1.554055mean 0.898355
median 0.896839min 0.058776rmse 0.916404sse 3686.702189std 0.180979
3. 优秀题
我加了个bias_flag,只要设为Flase就可以不考虑随即游走的bias。
// d. gyro bias:if (COV.PROCESS.BIAS_FLAG && IsCovStable(INDEX_ERROR_GYRO)) {gyro_bias_ += X_.block<3, 1>(INDEX_ERROR_GYRO, 0);}// e. accel bias:if (COV.PROCESS.BIAS_FLAG && IsCovStable(INDEX_ERROR_ACCEL)) {accl_bias_ += X_.block<3, 1>(INDEX_ERROR_ACCEL, 0);}
由于跑出来太花时间,这里直只放了一组数据:
Parameter - verison 6 (without Rand-Walk Bias)
process:gyro: 1.0e-5accel: 2.5e-6bias_accel: 2.5e-3bias_gyro: 1.0e-4bias_flag: Falsemeasurement:pose:pos: 1.0e-3ori: 1.0e-4pos: 1.0e-4vel: 2.5e-3
Result - laser
APE w.r.t. full transformation (unit-less)
max 1.136680mean 0.231211
median 0.164014min 0.017465rmse 0.289257sse 367.644384std 0.173813
Result - fused
APE w.r.t. full transformation (unit-less)
max 1.012434mean 0.257726
median 0.201350min 0.008808rmse 0.309306sse 420.375118std 0.171020
下面是KITTI数据集跑出来的效果图。
黄色线表示ground-truth,蓝色和红色分别是LiDar单独和LiDar/IMU融合的轨迹。(这里几乎重合,原因是这个参数调得很好,红红火火哈哈哈哈)
深蓝学院-多传感器融合定位-第7章作业相关推荐
- 深蓝学院-多传感器融合定位课程-第2章-3D激光里程计I
专栏文章: 深蓝学院-多传感器融合定位课程-第1章-概述_goldqiu的博客-CSDN博客 github保存了相关代码和学习笔记: Shenlan-Course-Multi-Sensor-Fusio ...
- 深蓝学院-多传感器融合定位课程-第5章-惯性导航原理及误差分析
专栏文章: 深蓝学院-多传感器融合定位课程-第1章-概述_goldqiu的博客-CSDN博客 深蓝学院-多传感器融合定位课程-第2章-3D激光里程计I_goldqiu的博客-CSDN博客 深蓝学院-多 ...
- 多传感器融合定位 第四章 点云地图构建及基于点云地图定位
多传感器融合定位 第四章 点云地图构建及基于点云地图定位 代码下载 https://github.com/kahowang/sensor-fusion-for-localization-and-map ...
- 多传感器融合定位 第六章 惯性导航结算及误差模型
多传感器融合定位 第六章 惯性导航结算及误差模型 参考博客:深蓝学院-多传感器融合定位-第6章作业 代码下载:https://github.com/kahowang/sensor-fusion-for ...
- 看深蓝学院多传感器融合课程的笔记
贝叶斯推断和贝叶斯公式是整个卡尔曼的核心. 贝叶斯滤波比卡尔曼滤波比卡尔曼滤波更宽泛. 误差作为状态量 融合工程师很多时候是调参工程师,卡尔曼滤波的Q R,需要调参  掌握观测方程的推导.13章第一 ...
- 多传感器融合定位 第八章 基于滤波的融合方法进阶
多传感器融合定位 第八章 基于滤波的融合方法进阶 参考博客:深蓝学院-多传感器融合定位-第8章作业 代码下载:https://github.com/kahowang/sensor-fusion-for ...
- 多传感器融合定位ch1
多传感器融合定位ch1 目录 多传感器融合定位ch1 1 数据集下载 2 数据集测试 深蓝学院多传感器融合定位课程笔记, 采用的软硬件环境如下 硬件: 华擎DeskMini X300W迷你主机 软件: ...
- 多传感器融合定位三-3D激光里程计其三:点云畸变补偿
多传感器融合定位三-3D激光里程计其三:点云畸变补偿 1. 产生原因 2. 补偿方法 Reference: 深蓝学院-多传感器融合 多传感器融合定位理论基础 文章跳转: 多传感器融合定位一-3D激光里 ...
- 多传感器融合定位五-点云地图构建及定位
多传感器融合定位五-点云地图构建及定位 1. 回环检测 1.1 基于Scan Context 1.2 基于直方图 2. 后端优化 2.1 后端优化基本原理 2.2 李群.李代数基本知识 2.3 李群. ...
最新文章
- 美研究揭示大脑如何学习语言
- 《转》java URL重写
- 做企业网站为什么要服务器呢,企业为什么要建站?
- python基础之元组定义进阶操作、字典定义进阶操作
- 未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。
- 天梯—打印沙漏以及剩余个数(C语言)
- HCIE-Security Day9:5个实验理解NAT Server
- Springboot项目中static文件和templates文件的区别
- 怎么把文件传到虚拟机里
- [python]python生成md5
- eplan2.5安装教程
- 如何阅读源码,阅读源码的难点和方法分析
- nc工具测试tcp/udp协议
- html与js的相互转化,JS和HTML互转
- apex老是显示匹配服务器失败,Apex英雄与服务器不同步怎么办-服务器连接超时怎么办 - Iefans...
- php服务器监控系统,91 Monitor
- 神经网络有哪些基本功能,常见的神经网络有哪些
- Keil MDK 选中相同变量 高亮突出显示
- python淘宝爬虫登陆功能和下单功能_Python 爬虫实战5 模拟登录淘宝并获取所有订单...
- 01: tornado基础篇