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 的相关文章

  • jQuery 渐变插件?

    有没有什么好的jQuery渐变插件 我找到了一个 但它使用旧的 jQuery 当我使用最新版本时 所以它可能不适用于最新版本 我不知道你是否已经测试过这些插件 JQuery 渐变插件 http www ajaxupdates com jqu
  • IE10、IE11 中的跨浏览器 css 渐变

    我在所有浏览器中为深色按钮做了渐变 看起来不错 除了 IE10 IE11 版本 顶部和底部有浅色条纹 我通过 colorzilla 渐变编辑器生成渐变 链接到按钮 http buttons selcet com ua HTML div cl
  • 创建类似于 xCode 中的太阳天气应用程序的动画渐变背景

    尽管我之前已经问过这个问题 但我想再次联系以澄清我希望在您的帮助下完成什么 我想知道如何在 xCode 中创建一个 iOS 应用程序的背景 类似于 Solar 天气应用程序的背景 提供屏幕截图 随着时间的推移 在一个周期中 略有变化 正如你
  • 如何在WPF中制作多方向渐变?

    我目前在 XAML 中设置了一个渐变 如下所示
  • tf.gradients 如何管理复杂的函数?

    我正在研究复值神经网络 对于复值神经网络 通常使用 Wirtinger 微积分 那么导数的定义是 考虑到由于刘维尔定理 函数是非全纯的 如果你看广濑彰的书 复值神经网络 进展与应用 第 4 章方程 4 9 定义 当然 偏导数也是使用维廷格微
  • 圆形 LinearGradient 上的 ContextMenu 在 SwiftUI 中产生锐边

    我有以下观点 struct ContentView View var body some View LinearGradient gradient Gradient colors blue red startPoint topTrailin
  • 如何在 scipy.optimize 中使用 fmin_cg 获得正确的尺寸

    我一直在尝试使用 fmin cg 来最小化逻辑回归的成本函数 xopt fmin cg costFn fprime grad x0 initial theta args X y m maxiter 400 disp True full ou
  • 如何在CSS中制作具有透明度的径向渐变

    我想在透明度变化的地方制作一个径向渐变 我可以让它线性工作 但不是径向工作 background webkit gradient linear left top left bottom from rgba 50 50 50 0 8 to r
  • 通过嵌套 tf.map_fn 反向传播梯度

    我想在每个向量上映射一个 TensorFlow 函数 该向量对应于具有维度的矩阵中每个像素的深度通道 批量大小 H W n 通道 换句话说 对于每个尺寸的图像H x W我在批次中拥有 我提取一些特征图F k 其数量为n channels 具
  • 在透明背景上制作不透明文本渐变

    它应该看起来像http img190 imageshack us img190 1686 textgradient jpg http img190 imageshack us img190 1686 textgradient jpg 棘手的
  • 字段集中 HTML5 图例的 CSS3

    您能否建议 CSS 获得如下引用的效果 使用 CSS3 渐变和边框 当前 HTML 版本如下 section style margin 10px fieldset style padding 5px min height 150px leg
  • 在 OpenCV 中,cv2.filter2D() 需要什么数据类型?

    我正在自学边缘检测器 并且正在尝试使用 OpenCVfilter2D实现我自己的梯度计算器 类似于cv2 Sobel 在 OpenCV 的 Python 接口中 cv2 filter2D 允许用户使用自定义过滤器对图像进行卷积 在 Open
  • TensorFlow 中的梯度概念与梯度的数学定义有何关系?

    The TensorFlow 文档 https www tensorflow org api docs python tf gradients解释了 功能 tf gradients ys xs grad ys None name gradi
  • 色带仅适用于 Android 4.0+

    在运行 Android 4 0 或 4 0 3 的模拟器上 我看到可怕的色带 而且似乎无法摆脱 在我测试过的所有其他 Android 版本上 渐变看起来都很平滑 我有一个配置为 RGBX 8888 的 SurfaceView 并且渲染的画布
  • Android 创建类似 iphone 的渐变

    我需要在我的 Android 应用程序中创建类似黑色 iphone 的渐变 请查看下图中顶部的黑色渐变 怎么做 谢谢 也许是这样的
  • createRadialGradient 和透明度

    我正在玩createRadialGradient 在 HTML5 画布上 它就像一个魅力 除非我试图实现 半 透明 我制作了这个 jsFiddle 是为了让事情变得更清晰 http jsfiddle net rfLf6 1 http jsf
  • Matplotlib:如何有效地将大量线段着色为独立渐变

    Python 绘图库 如何有效地将大量线段着色为独立渐变 已经 阅读this https stackoverflow com questions 8500700 how to plot a gradient color line in ma
  • MATLAB 符号替换

    我知道在 MATLAB 中如果声明了 syms x y f x 2 y 2 grad gradient f 然后grad会存储值 2 x 2 y 如果我想评估梯度 2 2 I use subs f x y 2 2 这返回 4 4 我正在编写
  • WPF 3D - 在复杂几何体上映射渐变画笔

    我想问是否有人知道如何在 WPF 3D 中的复杂对象上映射渐变画笔 结果应该类似于 matlab 中的 3D 图像 例如 3D 函数 假设您有一些想要可视化的 3 维数据 并且想要通过颜色区分某些级别的值 给定一个 GradientBrus
  • PyTorch 如何计算二阶雅可比行列式?

    我有一个正在计算向量的神经网络u 我想计算关于输入的一阶和二阶雅可比矩阵x 单个元素 有人知道如何在 PyTorch 中做到这一点吗 下面是我项目中的代码片段 import torch import torch nn as nn class

随机推荐

  • 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 导致直接测量过程随着时间的