PX4利用matlab推导生成 EKF中雅可比矩阵的方法

2023-05-16

文章目录

    • 一、Matlab的Symbolic Maths Toolbox是什么
    • 二、PX4 EKF中需要的雅可比矩阵
    • 三、 Matlab脚本解析
    • 参考来源

PX4实际使用了Matlab的Symbolic Maths Toolbox来进行雅可比矩阵的推导,看完matlab脚本之后,感觉打开了新世界的大门,确实是相见恨晚。Matlab还有多少惊喜是我不知道的。可见这个世界上有很多知识都已经存在,只是由于自己孤陋寡闻,所以一直在用笨方法——手动推导。由此也可知,多看看优秀的人是怎么做的,站在巨人的肩膀上,让我们可以少走很多弯路。

一、Matlab的Symbolic Maths Toolbox是什么

Symbolic Math Toolbox支持以解析方式执行微分、积分、化简、变换和方程求解。具体可参见官方文档,下面列出了几个主要功能。

微积分
计算定积分和不定积分的精确解析解,计算符号表达式或函数的导数,并使用级数展开式逼近函数。

求解、化简和代换
使用解析法求解线性和非线性代数方程与微分方程,化简并重写符号表达式,同时使用代换法计算符号表达式。

线性代数
对符号矩阵进行分析、变换和分解,研究线性方程的属性,进行线性代数运算,并求解矩阵或方程形式的线性方程组。

代码生成
直接从符号表达式生成 MATLAB 函数、Simulink 函数模块、基于方程的自定义 Simscape 组件以及 C 或 Fortran 代码。

二、PX4 EKF中需要的雅可比矩阵

参考博客PX4 的 ECL EKF 公式推导及代码解析,在讨论状态向量的协方差传播时,我们首先需要知道状态量的转移矩阵,如下式。我们根据第 k+1 时刻的状态向量方程,对第k时刻的状态量求Jacobian得到状态转移矩阵 F 和 G。
在这里插入图片描述
然后得到状态误差矩阵:
在这里插入图片描述
则协方差的传播公式为:
在这里插入图片描述
在进行各种传感器数据融合时,我们需要得到传感器观测值对状态量x的观测矩阵H,这里也需要求Jacobian矩阵。如对于GPS的位置、速度融合来说,量测矩阵如下。位置、速度融合的量测矩阵还是比较直观的。如果是航向融合,观测矩阵就会复杂得多,毕竟航向和四元数状态量之间关系就不是那么直接了,如果手动推导就比较费功夫。

在这里插入图片描述

三、 Matlab脚本解析

PX4 推导EKF中的雅可比矩阵的matlab脚本为GenerateEquations24.m,该脚本可以生成EKF中的状态转移矩阵F,状态误差矩阵Q,以及各传感器融合的观测矩阵H。

(1)脚本的1~18行主要是定义一堆符号变量,包括状态量等。 syms定义符号变量默认是复数,添加“real”可以使一个变量变为实数。

在这里插入图片描述
(2)脚本的第19~85主要是定义状态预测(传播)方程
在这里插入图片描述
在这里插入图片描述
(3)脚本第86~105行:生成计算状态转移矩阵F和状态误差矩阵Q的matlab函数,写入calcF24.m和calcQ24.m
在这里插入图片描述
(4)脚本第106~121行:生成计算三轴磁融合的观测矩阵的matlab函数
在这里插入图片描述

剩下的脚本也都是计算各种Jacobian矩阵,不再一一列举。

由于这个脚本中没有GPS航向融合的Jacobian计算,因此我自己也尝试写了一段matlab代码,用来生成计算航向融合时观测矩阵的matlab函数,该函数计算结果与C代码一致。我自己也进行了手动推导,计算公式与matlab生成的函数一致,因此也验证matlab生成的函数是正确的,但是显然比手动推导省时省力。

参考来源

[1] 推荐一个相见恨晚的Matlab Toolbox - Symbolic Maths(数学难度-50%)
[2] PX4 的 ECL EKF 公式推导及代码解析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4利用matlab推导生成 EKF中雅可比矩阵的方法 的相关文章

  • 如何选择部分密集数据集的均匀分布子集?

    P是一个 n d 矩阵 持有nd 维样本 P某些地区的密度是其他地区的几倍 我想选择一个子集P其中任意样本对之间的距离大于d0 并且我需要将其传播到整个区域 所有样本都具有相同的优先级 无需优化任何内容 例如覆盖面积或成对距离之和 这是执行
  • 查找数组中元素之间的平均差异的有效方法

    希望标题不会让人困惑 通过例子来展示很简单 我有一个像这样的行向量 1 5 6 我想找到每个元素之间的平均差异 此示例中的差异为 4 和 1 因此平均值为 2 5 这是一个小例子 我的行向量可能非常大 我是 MatLab 新手 那么有没有一
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • 将 3d 矩阵重塑为 2d 矩阵

    我有一个 3d 矩阵 n by m by t 在 MATLAB 中表示n by m一段时间内网格中的测量值 我想要一个二维矩阵 其中空间信息消失了 只有n m随着时间的推移测量t剩下 即 n m by t 我怎样才能做到这一点 你需要命令r
  • 在 C/C++ 中调用 MATLAB API

    我刚刚从某处听说 对于数值计算 MATLAB 确实提供了一些用户友好的 API 如果你在 C C 代码中调用这些 API 你可以显着加快计算速度 但我在MATLAB文档中没有找到这样的信息 例如http www mathworks com
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 类方法的自定义代码完成?

    在 MATLAB 中 可以定义代码建议和完成 如标题为 的文档页面中所述 自定义代码建议和完成 https www mathworks com help matlab matlab prog customize code suggestio
  • 整数的十进制表示形式中的分隔数字

    例如 我想将用户输入作为整数输入 45697 并将前两位数字存储在数组 向量或其他内容中 例如 4 5 6 9 7 这样我就可以使用一些函数调用来检查前两个值 4 5 并对它们进行计算 问题 我不知道如何存储恢复前两个值 有没有简单的函数调
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R
  • 在 Matlab 的命令窗口中获取旧式帮助

    问题的简短版本 在最新版本的 Matlab 中 我在 Windows 上的 R2014b 和 R2015a 中看到过 当您键入help foo你得到一个简要描述 简介函数及其签名 例如 输入help bsxfun产生类似这样的东西 只有更好
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • 如何在Matlab中打印带有千位分隔符的整数?

    我想使用逗号作为千位分隔符将数字转换为字符串 就像是 x 120501231 21 str sprintf 0 0f x 但随着效果 str 120 501 231 21 如果内置fprintf sprintf做不到 我想可以使用正则表达式
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • Matlab的导入函数的范围是什么?

    我正在尝试将一些用 Matlab 编写的代码转换为独立的 编译的 Matlab 应用程序 然而 在出现一些奇怪的错误之后 我意识到代码大量使用了从路径中添加和删除的操作 以避免多次使用多个具有相同名称 但结果 计算不同 的函数这一事实 环顾
  • matlab中更快的插值方法

    我正在使用 interp1 来插值一些数据 temp 4 30 4 rand 365 10 depth 1 10 dz 0 5 define new depth interval bthD min depth dz max depth ne
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看

随机推荐