航姿传感器——扩展卡尔曼滤波(EKF)初步(一)

C++下扩展卡尔曼类(EKF)的实现 最初的卡尔曼滤波用于解决离散系统的滤波问题,然而工程中常遇到的滤波问题是连续系统产生的滤波问题。 卡尔曼滤波器具有如下形式的离散的状态方程: Xk+1=Ψk+1,kXk+Wk(1)X_{k+1}=\Psi_{k+1,k} X_{k}+W_{k} \tag{1} 但这只是一个高度简化的方程,更多的时候我们能获得的是关于连续系统的如下形式的方程: X˙=f(X)+W(2)\dot X=f(X 阅读详情

背景

利用手头的MPU6050传感器中的三轴陀螺仪及三轴加速度计实现一个基础的航姿传感器。阶段目标,VC++上实现EKF算法。
主要参考的是A Double-Stage Kalman Filter for Orientation Tracking With an Integrated Processor in 9-D IMU这篇论文。

代码

1、结构体初始化
  • 卡尔曼滤波器结构体初始化。主要是几个变量的初始化,由于是EKF算法,所以多出了dH和Zkk_1这两个变量。EKF在进行kalman增益计算和协方差矩阵更新的时候,是近似看作普通的KF的,故这两个式子中的观测矩阵要求偏导数及原始观测阵的Jacobian Matrix,代码中用dH表示。而在残差(residual)或者说是新息的计算中应该是用 观测值-推测值,这里的推测值是用原始的观测阵推出的,代码中用Zkk_1表示。
  • 可能有几个变量不涉及后续的计算。
typedef struct testKF {
	Eigen::VectorXd X;	// 状态向量	
	Eigen::MatrixXd PHI;// 状态转移矩阵
	Eigen::MatrixXd H;	// 观测矩阵
	Eigen::MatrixXd dH;	// 观测矩阵Jacobian Matrix
	Eigen::MatrixXd P;	// 状态协方差矩阵
	Eigen::MatrixXd W;	// 过程噪声矩阵Q
	Eigen::MatrixXd V;	// 观测噪声矩阵R
	Eigen::VectorXd Z;	// 观测向量
	Eigen::VectorXd Zkk_1;// 先验观测估计
	Eigen::MatrixXd K;	// kalman增益矩阵
	testKF() {
		X.resize(4);
		PHI.resize(4, 4);
		H.resize(3, 4);
		dH.resize(3, 4);
		P.resize(4, 4);
		W.resize(4, 4);
		V.resize(3, 3);
		Z.resize(3);
		Zkk_1.resize(3);
		K.resize(4, 3);
	}
}testKF;
2、kalman变量初始化
  • 主要是 X,P,W,V这四个变量的初始赋值
  • 具体赋值的多少可以参考论文中最后给出的几个数值,这里我稍微调节了下
  • 后续会探究下P,W,V这三个矩阵该如何赋值,主要是背后的物理含义,数学含义到底是什么这是个关键!!
void ekf_init(testKF* kf)
{
	double q[4] = {1,0,0,0};
	//double w[3] = { 0, 0, 0};
	double acc[3] = { 0, 0, -1 };
	//初始化 X,P
	kf->X << q[0], q[1], q[2], q[3];
	//复制论文中的数值
	kf->P <<0.125, 0.0003, 0.0003, 0.0003,
			0.0003, 0.125, 0.0003, 0.0003,
			0.0003, 0.0003, 0.125, 0.0003,
			0.0003, 0.0003, 0.0003, 0.125;
	double DQ = 0.05*DEG2RAD*0.05*DEG2RAD;
	kf->W << DQ*Eigen::MatrixXd::Identity(4,4);
	kf->V << 0.05 * Eigen::MatrixXd::Identity(3, 3);
}
3、数值读取
  • 这部分主要是读取原始数据
  • 更新状态量X,观测矩阵dH,先验状态观测值Zkk_1
std::vector<std::vector<double>> ekf_test(std::vector<std::vector<double>>&data)
{
	std::vector<std::vector<double>> ekfout;
	testKF* kf = &QEKF;
	ekf_init(kf);
	size_t count = 0;
	for (auto line : data)
	{	
		double wx, wy, wz;
		wx = line[4]; wy = line[5]; wz = line[6];
		kf->Z << -line[7], -line[8], -line[9];
		// 状态转移阵
		double ts = S_IN_TIME;//采样间隔
		kf->PHI <<	0, -wx, -wy, -wz,
					wx, 0, wz, -wy,
					wy, -wz, 0, wx,
					wz, wy, -wx, 0;
		kf->PHI = Eigen::MatrixXd::Identity(4, 4) + kf->PHI*ts / 2;
		// 状态量
		Eigen::VectorXd Xkk_1(4);
		Xkk_1 = kf->PHI*kf->X;
		double q0, q1, q2, q3;
		q0 = Xkk_1[0]; q1 = Xkk_1[1]; q2 = Xkk_1[2]; q3 = Xkk_1[3];
		// 观测矩阵(Jabobain Matrix)
		kf->dH << -q2, q3, -q0, q1,
			q1, q0, q3, q2,
			q0, -q1, -q2, q3;
		kf->dH = 2 * kf->dH;
		// 先验观测估计
		kf->Zkk_1 << 2 * q1*q3 - 2 * q0*q2, 2 * q0*q1 + 2 * q2*q3, q0*q0 - q1 * q1 - q2 * q2 + q3 * q3;

		ekf_update(kf);

		double qx[4];
		qx[0] = kf->X[0]; qx[1] = kf->X[1]; qx[2] = kf->X[2]; qx[3] = kf->X[3];
		quaternions_norm(qx);
		kf->X[0] = qx[0]; kf->X[1] = qx[1]; kf->X[2] = qx[2]; kf->X[3] = qx[3];
		std::vector<double>vec = ekf_test_out(kf->X);
		double eul[3];
		Quaternions2Eular(qx,eul);
		vec.push_back(eul[0]);
		vec.push_back(eul[1]);
		vec.push_back(eul[2]);
		for (auto val : vec)
		{
			line.push_back(val);
			//std::cout << val;
		}
		ekfout.push_back(line);
	}
	return ekfout;
}
5、卡尔曼滤波更新
  • 套用公式运算,没啥好说的
void ekf_update(testKF* kf)
{
	Eigen::VectorXd Xkk_1 = kf->PHI*kf->X;
	Eigen::MatrixXd Pkk_1 = kf->PHI*kf->P*kf->PHI.transpose() + kf->W;
	//EKF kalman增益计算时用H阵的Jacobian matrix
	kf->K = Pkk_1 * kf->dH.transpose()*((kf->dH*Pkk_1*kf->dH.transpose() + kf->V).inverse());
	kf->X = Xkk_1 + kf->K*(kf->Z - kf->Zkk_1);//EKF X更新时残差用 原始观测阵
	kf->P = (Eigen::MatrixXd::Identity(kf->K.rows(), kf->K.rows())-kf->K*kf->dH)*Pkk_1;
}

试验结果

滚转角
滚转角:绿色加速度计计算,蓝色积分计算,红色EKF计算
俯仰角
俯仰角:绿色加速度计计算,蓝色积分计算,红色EKF计算

初步结论

  • 可以看到当俯仰角的积分计算出现发散时,ekf计算结果保持收敛
  • 相比加速度计得出的计算结果,EKF得出的结果要平滑许多。
  • 尝试调节初始化中的W,V矩阵,当W(过程噪声矩阵)保持不变时,减小V(观测噪声矩阵)时,ekf滤波结果更加靠近直接由加速度计计算出的结果,反之则更加靠近陀螺仪积分得出的结果。可以做一些定性的分析和感性的理解(不准确的理解)
    1. V其实是测量的误差的反应,V越大表明误差越大,在经过数次迭代后,滤波结果中对观测值的“参考”就不是那么多。
    2. W则是整个模型递推过程中建模误差的反应,W越大,说明模型得出的结论越不可信,在经过数次迭代后,滤波结果中对模型推导值的“参考”就会下降。

下一步计划

  • 理解PWV这三个量的含义,尝试给出定量的值。
  • 与一个精确的航姿传感器进行对比。
  • 加入磁力计进行计算
四.卡尔曼滤波器(EKF)开发实践之四: ROS系统位姿估计包robot_pose_ekf详解 本系列文章主要介绍如何在工程实践中使用卡尔曼滤波器,分五个小节介绍: 一.卡尔曼滤波器开发实践之一: 五大公式 二.卡尔曼滤波器开发实践之二: 一个简单的位置估计卡尔曼滤波器 三.卡尔曼滤波器(EKF)开发实践之三: 基于三个传感器的海拔高度数据融合 四.卡尔曼滤波器(EKF)开发实践之四: ROS系统位姿估计包robot_pose_ekf详解 也就是本文 五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器 ----... 阅读详情

相关推荐

KF、EKF、UKF在传感器融合当中的应用

“不必遗憾。若是美好,叫做精彩。若是糟糕,叫做经历。” 2018年的最后一天 希望今年所有的遗憾,都是明年惊喜的铺垫! 致所有努力的人~ 将KF、EKF、UKF在自动驾驶传感器融合当中的应用整理下吧: 卡尔曼滤波(KF)、扩展卡尔曼滤波(EKF)、无损卡尔曼滤波(UKF) 首先要搞清楚两个问题:1. 为什么要用KF、EKF、UKF? ...

I-am-Unique 5059

A Double-Stage Kalman Filter for Orientation Tracking With An Integrated Processor in 9-D IMU 论文精读

个人翻译仅供参考,如有不到位敬请谅解 卡尔曼: 卡尔曼滤波器: https://zhuanlan.zhihu.com/p/163431021 增益公式推导: https://zhuanlan.zhihu.com/p/165570020 基于EKF的姿态解算: https://zhuanlan.zhihu.com/p/103617763 MATLAB复现 https://github.com/waihekor/EKF_AHRS 用于9D IMU中集成处理器定向跟踪的....

蜗牛博客 5710

基于扩展卡尔曼滤波(EKF)和低成本传感器的AHRS实现

一种基于低成本传感器的无人机姿态计算方法 使用ekf模型

从零开始 4954

C++——EKF

在该实现中,EKF类将初始状态向量、状态协方差矩阵、系统模型矩阵、测量模型矩阵、过程噪声协方差矩阵和测量噪声协方差矩阵作为输入。predict()函数使用系统模型矩阵和过程噪声协方差矩阵更新状态和协方差预测。update()函数使用测量模型矩阵、测量噪声协方差矩阵和卡尔曼增益来更新状态和协方差。getState()和get协方差()函数分别返回当前状态向量和协方差矩阵。在C++中,有几个实现EKF算法的库和框架,比如机器人库(RoboLib)、Bayes++和机器人操作系统(ROS)。

m0_48748418的博客 963

EKF-SREKF-UKF-SRUKF代码(C++)

扩展卡尔曼滤波(EKF),平方根扩展卡尔曼滤波(SREKF, SR-EKF),无迹卡尔曼滤波(UKF),平方根无迹卡尔曼滤波代码(SR-UKF),还有example和test,使用cmake 编译,代码非常实用,

C++实现EKF的CTRV模型

C++实现CTRV模型的扩展卡尔曼滤波的代码,里面有详细解释和如何运行代码。具体的参考我的博客:https://blog.youkuaiyun.com/O_MMMM_O/article/details/106078679

ROS学习笔记之——EKF (Extended Kalman Filter) node 扩展卡尔曼滤波

最近正好准备想试试利用EKF实现多传感器的融合。但没想到本身ROS里面就已经有EKF的功能包了。这个包用于评估机器人的3D位姿,使用了来自不同源的位姿测量信息,它使用带有6D(3D position and 3D orientation)模型信息的扩展卡尔曼滤波器来整合来自轮子里程计,IMU传感器和视觉里程计的数据信息。 基本思路就是用松耦合方式融合不同传感器信息实现位姿估计。下面来学习一下 robot_pose_ekf 概要 Robot Pose EKF 包用于评估机器人的3D...

gwpscut的博客 1万+

扩展卡尔曼滤波项目C++代码

本资源提供了一个自动驾驶汽车程序启动扩展卡尔曼滤波项目C++代码。所谓扩展卡尔曼滤波器,就是适用于非线性系统的卡尔曼滤波器,可以更广泛的应用在项目中。

【Python仿真】基于EKF的传感器融合定位

卡尔曼滤波(Kalman Filtering)是一种用于估计系统状态的递归滤波方法,广泛应用于信号处理、控制系统、机器人技术等领域。扩展卡尔曼滤波(Extended Kalman Filtering)是卡尔曼滤波的一个扩展版本,用于非线性系统的状态估计。在扩展卡尔曼滤波中,系统被建模为非线性动态系统,其中状态由一个非线性函数描述,并且状态的观测值受到高斯噪声的影响。扩展卡尔曼滤波通过线性化非线性函数来近似系统的动态特性,并利用卡尔曼滤波的递归算法来估计系统的状态。

ZHW-鲜橙大AI课题组的博客 1982

MSF -基于扩展卡尔曼滤波器 (EKF) 的多传感器融合 模块化框架_C++_代码_相关文件_下载

描述 基于EKF的时延补偿单传感器和多传感器融合框架。 更多详情、使用方法,请下载后细读README.md文件

基于kf,ekf 的C++详细实现,尤其实用于传感器融合+源码(毕业设计&课程设计&项目开发)

基于kf,ekf 的C++详细实现,尤其实用于传感器融合+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于kf,ekf 的C++详细实现,尤其实用于传感器融合+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于kf,ekf 的C++详细实现,尤其实用于传感器融合+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于kf,ekf 的C++详细实现,尤其实用于传感器融合+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于kf,ekf 的C++详细实现,尤其实用于传感器融合+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于kf,ekf 的C++详细实现,尤其实用于传感器融合+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~

robot_pose_ekf——基于EKF的Odometry+IMU+VO+GPS融合定位

了解ROS的robot_pose_ekf软件包中扩展卡尔曼滤波器的用法: robot_pose_ekf软件包用于基于来自不同来源的(部分)位姿测量值来估计机器人的3D姿势。它使用带有6D模型(3D位置和3D方向)的扩展卡尔曼滤波器,将来自车轮里程计,IMU传感器和视觉里程计的测量结果结合起来。基本思想是提供与不同传感器的松散耦合集成,其中传感器信号以ROS消息的形式接收。 主页:http:/...

W_Tortoise的博客 1万+

扩展卡尔曼滤波——非线性EKF-C++

本篇为组合导航扩展卡尔曼滤波 C++ 代码实现。 注:本例所用传感器有激光雷达传感器,雷达传感器 /*扩展卡尔曼滤波器*/ #include #include #include #include #include #include #include #include #define ROWS 1224 #define COLS 8 using namespace std; using namespace Eigen; int main(){ // ******************************导入数据**************************************

扩展卡尔曼滤波EKF在目标跟踪中的应用—仿真部分

扩展卡尔曼滤波EKF在目标跟踪中的应用—仿真部分 算法部分见博客: 扩展卡尔曼滤波EKF在目标跟踪中的应用—算法部分 https://blog.youkuaiyun.com/weixin_44044161/article/details/115313573 作者:823618313@qq.com 备注: 扩展卡尔曼滤波算法; 目标跟踪matlab仿真实现; Case: 二维目标跟踪情况和三维目标跟踪情况 代码下载地址如下(分别为二维情形和三维情形) EKF仿真代码:二维目标跟踪 https://download.cs

主要从事定位、估计、滤波、多传感器融合等研究,主要应用于雷达、红外、声纳、传感器网络等的目标(如无人驾驶、智能终端、移动机器人、传感器节点、飞机等)跟踪、定位和导航 5987

python + QXDM5高通平台通过自动化截取log方法及代码

python + QXDM5高通平台通过自动化截取log方法及代码

dgzj2001的博客 1820

Mcgs 屏幕Modbus RTU通讯调试

昆仑通态屏幕作为Modbus Master 与 Modbus Slave通过RS485接口实现通信的调试记录

madao1234的博客 5572

【无人机】使用扩展卡尔曼滤波 (EKF) 算法来处理传感器测量,各传感器的参数设置,高度数据融合、不同传感器融合模式

使用扩展卡尔曼滤波 (EKF) 算法来处理传感器测量并提供状态的估计EKF使用哪些传感器测量?EKF 具有不同的作模式,允许不同的传感器测量组合。启动时,过滤器检查传感器的最小可行组合,在完成初始倾斜、偏航和高度对准后,进入提供旋转、垂直速度、垂直位置、IMU 角度偏差和 IMU 速度偏差估计的模式。此模式需要 IMU 数据、偏航源(磁力计或外部视觉)和高度数据源。所有 EKF作模式都需要这个最小数据集。然后,可以使用其他传感器数据来估计其他状态。1、IMU2、磁力计需要。

weixin_60324241的博客 2438

鸿蒙【ArkTS】使用TS装饰器封装网络请求HTTP

在HarmonyOS应用开发中,通过HTTP访问网络,可以使用官方提供的@ohos.net.http模块。但是官方提供的直接使用不太好使用,需要封装下才好。这里采用TS的装饰器实现AOP效果 完成前后端接口风格的统一

weixin_60376559的博客 5611

EKF

Extended Kalman Filter (EKF) EKF2 和 EKF3 的优缺点 EKF2被默认最稳定 EKF2能接收从Vicon系统或者ROS SLAM 中接受位置估计,EKF3目前是没有的,除非和EKF2一样。 EKF2仅仅估计加速度z轴补偿,EKF3估计三轴加速度补偿。 EKF3接收更新的传感器源,包括:Beacons、Wheel Encoders 以及Visual Odome...

笔记 8208

PLL锁相环性能上不去?可能是电荷泵的电流失配在捣鬼(附Jae-Shin Lee经典方案解析)

本文深入分析了PLL锁相环性能瓶颈的根源——电荷泵电流失配问题,详细解析了Current Mismatch和Current Deviation的区别及其对系统的影响。重点介绍了Jae-Shin Lee的多级电流镜技术,该方案通过运放构建虚拟短路和四级电流镜结构,显著降低了电流失配,使参考杂散改善15dB以上。文章还提供了从仿真到流片的完整优化流程,帮助工程师系统解决电荷泵性能问题。

weixin_30684743的博客 371

robot_pose_ekf学习

目录1 如何使用EKF1.1 配置1.2 编译并运行该包2 Nodes2.1 robot_pose_ekf2.1.1 Subscribed Topics2.1.2 Published Topics2.1.3 Provided tf Transforms3 EKF如何工作3.1 Pose interpretation3.2 Covariance interpretation3.3 Timing4 P...

ALEX_Z77的博客 3961

SAP 基于生产订单行项目外部加工创建采购申请时的一个增强需求

摘要 本文介绍在SAP系统中实现生产订单外协工序自动生成采购申请(PR)时,将指定文本写入PR抬头文本的技术方案。关键点包括: 业务背景:通过CO02事务码将工序标记为外部加工,系统自动生成PR,需在生成时自动写入抬头文本。 技术难点: PR抬头文本存储在STXH/STXL而非EBAN表 标准增强点ME_PROCESS_REQ_CUST在外协场景可能不触发 推荐方案: 使用BAdI ME_REQ_POSTED,在PR过账时点执行 通过Text Object EBANH和Text ID(如B01)写入文本 实

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 624

扩展卡尔曼滤波器(EKF)

扩展卡尔曼滤波器是一种强大的状态估计工具,尤其适用于非线性系统。在电机控制中,EKF 可以用来估算转子位置、速度和磁链等关键参数,从而实现高性能的无传感器控制。然而,由于其计算复杂性,在实际应用中需要仔细设计和优化,确保系统的实时性和精度。

Wxx_Combo的博客 6506

真随机数与伪随机数

前面我们学习了LFSR,这个玩意落地到具体的应用是什么呢?没错是寄存器,这里在网络找到了几个回答,这里做个记录,下面一起来学习一下吧。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1062

05GATK流程和找变异

05GATK流程和找变异 GATK 集合了一套功能全面的高通量测序数据基因组分析工具包,算是业界的权威,更新的速度非常快。需要注意的是,不同版本的 GATK 在工具应用上会有些许不同。这里我们使用是最新版本 GATK 4.1.4.1(截止2019年12月31日)。 数据准备 前面我们提到了,走GATK流程需要到官网下载很多数据库文件,比如下面这些: dbsnp_146.hg38.vcf.gz dbsnp_146.hg38.vcf.gz.tbi Mills_and_1000G_gold_standard.

qq_23435961的博客 1660
上一篇: MPU6050读取实验
下一篇: 阿兰方差Allan Deviation导出
Fulldata_Alchemist
博客等级 码龄12年 13粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值