Pixhawk之姿态解算篇(6)_Gradient Descent

2023-05-16

一、开篇

        在多旋翼进行姿态估计的过程中,最简单的就是直接使用gyro测量角速度进行积分求取欧拉角(RPY),但是由于gyro自身存在的bias和drift,导致直接测量过程随着时间的推荐变得越来越不精确。所以,许多研究者想到了使用加速度计和磁力计测量重力加速度和地球磁场强度对gyro的bias和drift进行补偿修正(不是eliminate gyro’s bias and drift,该叙述是错误的,加速度计和磁力计不可能排除gyro的bias和drift)。常用的方法就是CF、GD、EKF。

        但是由于磁力计测量地球磁场时极易被干扰(distortion),而且在补偿修正时磁场时无法修正RP的。所以,又有很多研究者想到了分开修正补偿求取欧拉角的方法,即通过加速度计和gyro一起求取RP,用磁力计和gyro一起修正补偿求取Yaw。该类解决方法中常见的就是two_stage EKF、two_stage GD、GD_EKF。

        写了那么多就是为了引出GD~~~


三、实验平台

Software Version:PX4Firmware

Hardware Version:pixhawk

IDE:eclipse Juno (Windows)

四、正文

1、写在前面

        该篇博文主要结合源代码介绍一下GD的实现过程,不再赘述理论的推导过程。说了那么多主要还是引出GD(gradient descent),关于该算法的介绍大家自行阅读madgwick的论文吧,该部分就不叙述算法推导过程的。  Madgwick论文:《An efficient orientation filter for inertial and inertial magneticsensor arrays》和《Estimation of IMU and MARG orientation using agradient descent algorithm》。梯度wiki:https://en.wikipedia.org/wiki/Gradient_descent。还有一个写的比较详细的关于GD介绍的blog,其中大部分都是论文翻译,英语不好的可以结合着看。链接:http://blog.csdn.net/nemol1990/article/details/23102643

2、源代码

IMUfilter::IMUfilter(double rate, double gyroscopeMeasurementError){
    firstUpdate = 0;
    //Estimated orientation quaternion elements with initial conditions.
    SEq_1 = 1;
    SEq_2 = 0;
    SEq_3 = 0;
    SEq_4 = 0;
    //Sampling period (typical value is ~0.1s).
    deltat = rate;
    //Gyroscope measurement error (in degrees per second).
    gyroMeasError = gyroscopeMeasurementError;
    //Compute beta.
    beta = sqrt(3.0 / 4.0) * (PI * (gyroMeasError / 180.0));
}
 
void IMUfilter::updateFilter(double w_x, double w_y, double w_z, double a_x, double a_y, double a_z) {
 
    //Local system variables.
    //Vector norm.
    double norm;
    //Quaternion rate from gyroscope elements.
    double SEqDot_omega_1;
    double SEqDot_omega_2;
    double SEqDot_omega_3;
    double SEqDot_omega_4;
    //Objective function elements.
    double f_1;
    double f_2;
    double f_3;
    //Objective function Jacobian elements.
    double J_11or24;
    double J_12or23;
    double J_13or22;
    double J_14or21;
    double J_32;
    double J_33;
    //Objective function gradient elements.
    double nablaf_1;
    double nablaf_2;
    double nablaf_3;
    double nablaf_4;
 
    //Auxiliary variables to avoid reapeated calcualtions.
    double halfSEq_1 = 0.5 * SEq_1;
    double halfSEq_2 = 0.5 * SEq_2;
    double halfSEq_3 = 0.5 * SEq_3;
    double halfSEq_4 = 0.5 * SEq_4;
    double twoSEq_1 = 2.0 * SEq_1;
    double twoSEq_2 = 2.0 * SEq_2;
    double twoSEq_3 = 2.0 * SEq_3;
 
    //Compute the quaternion rate measured by gyroscopes.
    SEqDot_omega_1 = -halfSEq_2 * w_x - halfSEq_3 * w_y - halfSEq_4 * w_z;
    SEqDot_omega_2 = halfSEq_1 * w_x + halfSEq_3 * w_z - halfSEq_4 * w_y;
    SEqDot_omega_3 = halfSEq_1 * w_y - halfSEq_2 * w_z + halfSEq_4 * w_x;
    SEqDot_omega_4 = halfSEq_1 * w_z + halfSEq_2 * w_y - halfSEq_3 * w_x;
 
    //Normalise the accelerometer measurement.
    norm = sqrt(a_x * a_x + a_y * a_y + a_z * a_z);
    a_x /= norm;
    a_y /= norm;
    a_z /= norm;
 
    //Compute the objective function and Jacobian.
    f_1 = twoSEq_2 * SEq_4 - twoSEq_1 * SEq_3 - a_x;
    f_2 = twoSEq_1 * SEq_2 + twoSEq_3 * SEq_4 - a_y;
    f_3 = 1.0 - twoSEq_2 * SEq_2 - twoSEq_3 * SEq_3 - a_z;
    //J_11 negated in matrix multiplication.
    J_11or24 = twoSEq_3;
    J_12or23 = 2 * SEq_4;
    //J_12 negated in matrix multiplication
    J_13or22 = twoSEq_1;
    J_14or21 = twoSEq_2;
    //Negated in matrix multiplication.
    J_32 = 2 * J_14or21;
    //Negated in matrix multiplication.
    J_33 = 2 * J_11or24;
 
    //Compute the gradient (matrix multiplication).
    nablaf_1 = J_14or21 * f_2 - J_11or24 * f_1;
    nablaf_2 = J_12or23 * f_1 + J_13or22 * f_2 - J_32 * f_3;
    nablaf_3 = J_12or23 * f_2 - J_33 * f_3 - J_13or22 * f_1;
    nablaf_4 = J_14or21 * f_1 + J_11or24 * f_2;
 
    //Normalise the gradient.
    norm = sqrt(nablaf_1 * nablaf_1 + nablaf_2 * nablaf_2 + nablaf_3 * nablaf_3 + nablaf_4 * nablaf_4);
    nablaf_1 /= norm;
    nablaf_2 /= norm;
    nablaf_3 /= norm;
    nablaf_4 /= norm;
 
    //Compute then integrate the estimated quaternion rate.
    SEq_1 += (SEqDot_omega_1 - (beta * nablaf_1)) * deltat;
    SEq_2 += (SEqDot_omega_2 - (beta * nablaf_2)) * deltat;
    SEq_3 += (SEqDot_omega_3 - (beta * nablaf_3)) * deltat;
    SEq_4 += (SEqDot_omega_4 - (beta * nablaf_4)) * deltat;
 
    //Normalise quaternion
    norm = sqrt(SEq_1 * SEq_1 + SEq_2 * SEq_2 + SEq_3 * SEq_3 + SEq_4 * SEq_4);
    SEq_1 /= norm;
    SEq_2 /= norm;
    SEq_3 /= norm;
    SEq_4 /= norm;
  
}
void IMUfilter::reset(void) {
 
    firstUpdate = 0;
    //Estimated orientation quaternion elements with initial conditions.
    SEq_1 = 1;
    SEq_2 = 0;
    SEq_3 = 0;
    SEq_4 = 0;
}
3、重点来了

        3.1、首先就是初始化函数,包含四元数、采样周期、beta。源代码如下:

IMUfilter::IMUfilter(double rate, double gyroscopeMeasurementError){
    firstUpdate = 0;
    //Estimated orientation quaternion elements with initial conditions.
    SEq_1 = 1;
    SEq_2 = 0;
    SEq_3 = 0;
    SEq_4 = 0;
    //Sampling period (typical value is ~0.1s).
    deltat = rate;
    //Gyroscope measurement error (in degrees per second).
    gyroMeasError = gyroscopeMeasurementError;
    //Compute beta.
    beta = sqrt(3.0 / 4.0) * (PI * (gyroMeasError / 180.0));
}

        通过上述代码可以了解到,采样周期就是整体代码中该算法的执行频率的倒数。该部分比较重要的一点就是beta的计算,由上述可知beta = sqrt(3.0 / 4.0) * (PI * (gyroMeasError / 180.0)),主要就是通过gyro的芯片手册查找到gyroscopeMeasurementError,然后转换成弧度表示并乘一个权重Beta的由来可以参考madgwick的论文的3.6filter gain部分。论文中给出的介绍如下:Thefilter gainβ represents all mean zerogyroscope measurement errors, expressed as the magnitude of a quaternionderivative. The sources of error include: sensor noise, signal aliasing, quantisation errors, calibration errors, sensor miss-alignment,sensor axis nonorthogonality and frequency response characteristics.建议大家还是好好阅读madgwick的论文,吃透它。

        3.2、然后捏,一系列的参数变量,一个个自己去对吧,前提是需要了解整个过程是什么样的,梯度下降法使用的就是梯度下降的理论,所以了解梯度下降就理解了该算法的精髓(梯度的作用和求取过程)。

//Local system variables.
    //Vector norm.
    double norm;
    //Quaternion rate from gyroscope elements.
    double SEqDot_omega_1;
    double SEqDot_omega_2;
    double SEqDot_omega_3;
    double SEqDot_omega_4;
    //Objective function elements.
    double f_1;
    double f_2;
    double f_3;
    //Objective function Jacobian elements.
    double J_11or24;
    double J_12or23;
    double J_13or22;
    double J_14or21;
    double J_32;
    double J_33;
    //Objective function gradient elements.
    double nablaf_1;
    double nablaf_2;
    double nablaf_3;
    double nablaf_4;
    //Auxiliary variables to avoid reapeated calcualtions.
    double halfSEq_1 = 0.5 * SEq_1;
    double halfSEq_2 = 0.5 * SEq_2;
    double halfSEq_3 = 0.5 * SEq_3;
    double halfSEq_4 = 0.5 * SEq_4;
    double twoSEq_1 = 2.0 * SEq_1;
    double twoSEq_2 = 2.0 * SEq_2;
    double twoSEq_3 = 2.0 * SEq_3;
        3.3、 然后捏,由 w 更新四元数,这个大家都很熟悉吧,一阶毕卡,不在赘述。
//Compute the quaternion rate measured by gyroscopes.
    SEqDot_omega_1 = -halfSEq_2 * w_x - halfSEq_3 * w_y - halfSEq_4 * w_z;
    SEqDot_omega_2 = halfSEq_1 * w_x + halfSEq_3 * w_z - halfSEq_4 * w_y;
    SEqDot_omega_3 = halfSEq_1 * w_y - halfSEq_2 * w_z + halfSEq_4 * w_x;
    SEqDot_omega_4 = halfSEq_1 * w_z + halfSEq_2 * w_y - halfSEq_3 * w_x;
        3.4、 然后捏,构造目标函数( objectivefunction )和雅克比矩阵,并用它们求取梯度。
//Compute the objective function and Jacobian.
    f_1 = twoSEq_2 * SEq_4 - twoSEq_1 * SEq_3 - a_x;
    f_2 = twoSEq_1 * SEq_2 + twoSEq_3 * SEq_4 - a_y;
    f_3 = 1.0 - twoSEq_2 * SEq_2 - twoSEq_3 * SEq_3 - a_z;
    //J_11 negated in matrix multiplication.
    J_11or24 = twoSEq_3;
    J_12or23 = 2 * SEq_4;
    //J_12 negated in matrix multiplication
    J_13or22 = twoSEq_1;
    J_14or21 = twoSEq_2;
    //Negated in matrix multiplication.
    J_32 = 2 * J_14or21;
    //Negated in matrix multiplication.
    J_33 = 2 * J_11or24;

        看着上面的是不是比较晕呢?不用怕,结合下面的整体部分看着就不晕了。


        3.5、 然后捏,求梯度:梯度公式为 f= transpose (J)*f
//Compute the gradient (matrix multiplication).
    nablaf_1 = J_14or21 * f_2 - J_11or24 * f_1;
    nablaf_2 = J_12or23 * f_1 + J_13or22 * f_2 - J_32 * f_3;
    nablaf_3 = J_12or23 * f_2 - J_33 * f_3 - J_13or22 * f_1;
    nablaf_4 = J_14or21 * f_1 + J_11or24 * f_2;
        3.6、 然后捏,归一化,不管用什么算法进行姿态估计,都别忘记归一化( DCM 还需要正交化)。
//Normalise the gradient.
    norm = sqrt(nablaf_1 * nablaf_1 + nablaf_2 * nablaf_2 + nablaf_3 * nablaf_3 + nablaf_4 * nablaf_4);
    nablaf_1 /= norm;
    nablaf_2 /= norm;
    nablaf_3 /= norm;
    nablaf_4 /= norm;
        3.7、 再然后捏,算法融合,即把一阶毕卡得到的姿态四元数和 GD 得到的姿态四元数融合,为什么这么做?为什么 beta 用作权重,移步 madgwick 的论文吧,里面有详细介绍,方法很巧妙。
//Compute then integrate the estimated quaternion rate.
    SEq_1 += (SEqDot_omega_1 - (beta * nablaf_1)) * deltat;
    SEq_2 += (SEqDot_omega_2 - (beta * nablaf_2)) * deltat;
    SEq_3 += (SEqDot_omega_3 - (beta * nablaf_3)) * deltat;
    SEq_4 += (SEqDot_omega_4 - (beta * nablaf_4)) * deltat;
    最后,还是归一化,不写了~~~
        完了,有感觉么?~~~这种算法感觉比CF还要简单。

五、总结

        GD没什么东西,看懂理解了就OK了,主要是学习这样思想。就像开篇里面介绍的,现在大部分研究者都是集中精力实现各种姿态估计算法的解算算法(即杂交)。论文看的多了,感觉都一样,百分之50~60的内容都是在阐述一样古老的东西,在最后的最后才引出作者改变的一点东西,比如自适应算法,就是想一种方式实现对步长的取优变化(动态即自适应)。

        一部大部分时间还是在学习EKF,说简单它也简单就是五步法;说难也难,PQR的确定问题。还没有看五步法的由来,都是直接看应用案列,感觉这样理解的更快。I think the easiest way to understand the EKF is to start off with an example~~~~

    最近一直在晕晕晕。盲目,不想学,不想看论文,只想玩玩玩。肿么办~~~

    缅怀一下卡尔曼先生~~~看完一起默哀三分钟~~~

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

Pixhawk之姿态解算篇(6)_Gradient Descent 的相关文章

  • 在 CSS 中创建渐变线

    问题 如果我想创建在顶部和底部淡出的渐变线 类似于 AT T 下拉菜单中分隔菜单项的线条 我该怎么做 我想在我正在编码的菜单上创建类似的效果 并且我不想使用图像 有没有办法在 CSS 中实现这一点 非常感谢帮助 谢谢 微软CSS渐变是您可以
  • IE10、IE11 中的跨浏览器 css 渐变

    我在所有浏览器中为深色按钮做了渐变 看起来不错 除了 IE10 IE11 版本 顶部和底部有浅色条纹 我通过 colorzilla 渐变编辑器生成渐变 链接到按钮 http buttons selcet com ua HTML div cl
  • 如何为具有可变停止次数的梯度制作 LESS mixin?

    我发现的所有渐变混合都只有固定数量的停止点 less 和 css 在使用逗号时的冲突使得变量停止不可能以同样的方式完成 我当前用于 2 路渐变的 mixin gradient origin left step 1 white step 2
  • 如何在WPF中制作多方向渐变?

    我目前在 XAML 中设置了一个渐变 如下所示
  • Chrome 中 SVG 线性渐变的舍入误差?

    我最近在 Chrome 渲染 SVG 线性渐变时发现了一些问题 看看下面这个 SVG
  • 反应图标应用线性渐变

    我想使用线性渐变动态地部分填充来自反应图标的 Font Awesome Star 我已经尝试过以下方法 具有内联样式的 React 组件 将父跨度的背景设置为渐变并使 SVG 透明 似乎无法将 SVG 星形周围的边框设置为 FFFFFF 因
  • 生成颜色渐变

    我有一个想法以编程方式生成匹配的配色方案 但是我需要能够在给定一组两种颜色 十六进制或 RGB 值 的情况下生成线性渐变 任何人都可以向我提供 伪 代码或为我指明完成此任务的正确方向吗 EDIT 我忘了提及 但我还需要指定 或知道 从颜色
  • 张量流梯度 - 获取所有 nan 值

    我正在使用带有 anaconda 的 python 3 以及带有 eager eval 的tensorflow 1 12 我正在使用它为暹罗网络创建三元组损失函数 并且需要计算不同数据样本之间的距离 我创建了一个函数来创建距离计算 但无论我
  • Android:在canvas api中使用渐变填充颜色绘制圆弧

    我想使用渐变填充使用画布绘制圆弧 如何才能实现这一点呢 嘿 我从这里偷了这个 在 Android 中使用 SweepGradient 绘制圆弧 https stackoverflow com questions 4786318 draw a
  • 如何删除默认的 Bootstrap 3 轮播控件背景渐变?

    我很确定这是我需要修改的代码 但由于某种原因我无法让渐变在 IE 中消失 我要他们彻底消失 carousel control text shadow none opacity 1 filter alpha opacity 100 carou
  • 带有渐变的CSS3动画[重复]

    这个问题在这里已经有答案了 难道真的没有办法用 CSS 来制作渐变背景的动画吗 就像是 webkit keyframes pulse 0 background webkit gradient linear left top left bot
  • CSS3 渐变背景,底部有不需要的空白

    当我应用 CSS3 渐变并且内容的高度不足以容纳滚动条时 我很难摆脱底部的空白 比如这里 http womancareolympia webs com http womancareolympia webs com 我尝试过将 html 和
  • 是否可以在 TensorFlow 中仅在一次图形运行中高效地计算每个示例的梯度?

    TD DR 有没有一种方法可以在一次图形运行中以矢量化形式评估 f x1 f x2 f xn 其中 f x 是 f x 的导数 就像是 x tf placeholder tf float32 shape 100 f tf square x
  • Julia 中的并行梯度计算

    不久前我被说服放弃我舒适的 matlab 编程并开始使用 Julia 编程 我已经在神经网络方面工作了很长时间 我认为现在有了 Julia 我可以通过并行计算梯度来更快地完成工作 不需要一次性对整个数据集计算梯度 相反 我们可以拆分计算 例
  • facet_wrap() + ggplot2() 中每个面的独立颜色渐变

    我正在努力为每个方面绘制渐变色标facet wrap 独立 数据太大 无法在这里发布 但这是我的代码 ggplot stack aes hour day geom tile aes fill percent colour white fac
  • 如何在MatLab中求曲线上一点的法向量

    我有一条曲线 我想找到该曲线上给定点的法线向量 稍后我必须找到该法线向量与另一个向量的点积 我尝试了MatLab的梯度函数 但我想当我们需要在特定点找到梯度时它不起作用 但我不确定我是否错了 请指导我如何在 MatLab 中实现这一目标 提
  • 如何组合两个css3渐变?

    我有两个用于 HTML BODY 背景的 CSS 我使用这个 css 作为我页面的背景 我想将这两个重叠并获得组合效果 IE10 Consumer Preview background image ms linear gradient to
  • 如何在R中制作渐变颜色填充时间序列图

    How to 填充区域 sp 线下方和上方渐变色 这个例子是在 Inkscape 中绘制的 但我需要垂直渐变 不是水平的 间隔从zero to positive 来自white to red 间隔从zero to negative 来自wh
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • 以编程方式生成渐变?

    给定 2 个 RGB 颜色和一个矩形区域 我想在颜色之间生成基本的线性渐变 我进行了快速搜索 我唯一能找到的是这个博客条目 http jtauber com blog 2008 05 18 creating gradients progra

随机推荐

  • vscode下cmake工程环境配置以及调试配置(c++)

    1 准备工作 1 1MinGW的下载 MinGW将其托管到sourceforge上了 xff0c 也可以前往sourceforge下载 xff1a https sourceforge net projects mingw w64 files
  • 真香!腾讯竟然又偷偷开源了一套Android原生UI框架!

    今天在浏览技术新闻的时候 xff0c 发现腾讯就在今天开源了一套 Android 原生的 UI 框架 你们有没有发现 xff0c 腾讯特别喜欢干这种事 xff0c 哪一种事呢 xff1f 喜欢开源 UI 框架 xff0c 小程序也是这样的
  • STM32 Keil5报错-Target uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available-安装编译器解决

    现象 Keil MDK 5 3 6 编译代码报错 xff1a Target uses ARM Compiler Default Compiler Version 5 which is not available Rebuild starte
  • prometheus编译安装

    prometheus是搜集应用程序所使用的CPU 内存 以及磁盘使用大小的神器 xff0c 它可以根据用户所配置的性能阀值给出相应的处理 xff0c 比如 邮件告警等 xff0c 在这里就不啰嗦了 xff0c 由于本人也是刚刚学习 所以能说
  • 不同硬件传感器数据之间的时间同步问题

    主要分为硬同步和软同步 硬同步就是用一个硬件触发器 xff0c 直接通过物理信号 xff0c 触发相机和LIDAR记录一个data frame 软同步提供一个相同的时间源 xff08 一般都是主控电脑utc时间 xff09 给相机和LIDA
  • 多传感器融合定位开源工程与论文

    目录 1 LIC Fusion xff1a 基于激光雷达 惯性导航和相机结合的里程计 2 使用点线特征配合激光雷达辅助的单目视觉里程计 3 间歇的GPS辅助VIO xff1a 在线初始化和标定 4 强大的高精度视觉惯性激光SLAM系统 5
  • [BLE]CC2640之定时器(Clock)事件

    一 定时器 xff08 Clock xff09 所谓定时器本质上递减计数器 xff0c 当计数器减到零时可以触发某种动作的执行 这种动作可以通过回调函数来实现 xff0c 当定时器计时完成后 xff0c 自定义的回调函数会立即被调用 回调函
  • [BLE]低功耗蓝牙介绍

    一 BLE的协议栈框架 BLE协议栈包括两个部分 xff0c 主机 Host 和控制器 Controller 二者通过HCI Host Controller Interface 标准接口相互通信 常用的单芯片单模BLE芯片有TI的CC254
  • [BLE]低功耗蓝牙之GAP、GATT

    一 开篇 本篇主要介绍一下关于BLE开发过程中必须了解的两个协议 xff1a GAP xff08 通用访问协议 xff09 GATT xff08 通用属性协议 xff09 两个协议都隶属于Host层 xff0c 直接关系到应用层开发 xff
  • [memory]虚拟地址空间分布

    一 开篇 踏入嵌入式软件行业也接近2年了 xff0c 从研一开学起懵懵懂懂的开始学习C语言 xff0c 由于本科时对这方面了解的少之又少 xff0c 所以学起来比较困难 xff0c 但是有一群无私奉献的小伙伴 xff0c 慢慢的 xff0c
  • Pixhawk之UAV控制理论、ardupilot源码框架介绍

    一 开篇 您有无人机么 xff1f 没有 那赶紧去某宝买一套 昨天 开会开到接近下午一点钟 xff0c 收获相当大 xff0c 原本不太清楚的ardupilot框架现在也大致熟悉了 xff0c 接下来主要就是结合源码了解其控制过程了 xff
  • RT-Thread学习笔记(11):互斥量

    目录 互斥量的优先级继承机制互斥量和二值信号量的区别 互斥量的运作机制互斥量控制块 互斥量的优先级继承机制 在RT Thread操作系统中为了降低优先级翻转问题利用了优先级继承算法 优先级继承算法是指 xff0c 暂时提高某个占有某种资源的
  • [BLE]CC2640之ADC功能实现和供电电压的采集

    一 开篇 Write programs that do one thing and do it well 发现很多人关于使用CC2640 CC2650的过程中比较难以应对的问题就是实现ADC xff0c 为了方便大家 xff0c 所以有了本
  • [Index]博文索引

    为了方便查看需要的博文 xff0c 在此给出所有博文的索引链接地址 UAV Software Version xff1a ArduCopter xff08 Ver 3 3 xff09 Hardware Version xff1a pixha
  • Pixhawk之姿态解算篇(1)_入门篇(DCM Nomalize)

    一 开篇 慢慢的 慢慢的 慢慢的就快要到飞控的主要部分了 xff0c 飞控飞控就是所谓的飞行控制呗 xff0c 一个是姿态解算一个是姿态控制 xff0c 解算是解算 xff0c 控制是控制 xff0c 各自负责各自的任务 xff0c 我也不
  • Pixhawk之姿态解算篇(4)_补充篇

    一 开篇 大家期待已久的第四篇来了 xff0c 但是本篇可能比较水啊 见谅 首先 xff0c 上一周没有什么收获 xff0c 虽然看了不少的论文 xff0c 但是却没有什么质的飞越 看的论文都是关于姿态解算的 xff0c 用的算法大部分也都
  • Pixhawk之学习杂谈

    一 开篇 距离上一篇博文已经很久了 xff0c 最近主要就是参加了几家公司的电话面试 xff0c 思考了一些问题 xff0c 本身就是半路杀进无人机领域的门外汉 对整个飞行控制部分理解的也是皮毛的皮毛 xff0c 经过几家面试之后 xff0
  • Pixhawk之姿态控制篇(2)_控制策略

    一 开篇 写在前面 xff1a 先占坑 现在关于该部分内部还在完善 xff0c 后续不上 三 实验平台 Software Version xff1a PX4Firmware Hardware Version xff1a pixhawk ID
  • Pixhawk之姿态解算篇(5)_ECF/EKF/GD介绍

    一 开篇 很久没更新blog了 xff0c 最近研究的东西比较杂乱 xff0c 也整理了很多东西 xff0c 没有来的及更新 xff0c 最近发现很多小伙伴都开始写blog了 xff0c 在不更新就要 被落后了 兄弟们 xff0c 等等我啊
  • Pixhawk之姿态解算篇(6)_Gradient Descent

    一 开篇 在多旋翼进行姿态估计的过程中 xff0c 最简单的就是直接使用gyro测量角速度进行积分求取欧拉角 xff08 RPY xff09 xff0c 但是由于gyro自身存在的bias和drift xff0c 导致直接测量过程随着时间的