Pixhawk原生固件PX4之位姿控制算法解读

经典论文翻译--Minimum Snap Trajectory Generation and Control for Quadrotors 这篇论文是无人机路径规划和控制领域的经典文章,这里给出中文译文,翻译是逐渐进行的,不保证正确率,如有错误请指出。 四旋翼最小加加加速度轨迹生成和控制 摘要:我们解决了四旋翼在一个三维空间内的室内紧密约束环境下的控制设计和轨迹生成问题。在这样的设置中,很有必要允许显著的探索从悬停状态和小角度假设对横滚和俯仰角的控制是不够的。我们开发了一种算法,允许通过一组x、y、z、yaw序列实时生成三维最优路径,... 阅读详情

参考文献:Minimum Snap Trajectory Generation and Control for Quadrotors

PX4中多旋翼无人机的控制分为姿态控制和位置控制两个部分。

大致解读如下

姿态控制 mc_att_control

attc

角度控制(外环 P)

/**
 * Attitude controller.
 * 姿态角控制    外环 P
 * Input: 'vehicle_attitude_setpoint' topics (depending on mode)
 * 输入: 姿态设定值'vehicle_attitude_setpoint'
 * Output: '_rates_sp' vector, '_thrust_sp'
 * 输出: 角速度设定值  '_rates_sp'  油门设定值   '_thrust_sp'
 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

由于偏航轴的响应比横滚俯仰慢,这里采用的是倾转分离的解耦合进行姿态角控制:

先进行一个倾斜(对齐Z轴),然后旋转(对齐X轴),这样以保证能够将当前机体坐标系迅速地旋转到目标坐标系,通过这种方式求解旋转向量(详见《视觉SLAM十四讲》)仅适用于小角度情形;

small

对于旋转角度大于90度的情况(cos(z,Z)<0

)时,直接将目标姿态确定的四元数虚部(旋转瞬轴)作为现在旋转向量。

进而计算角速度设定值

_rates_sp = _params.att_p.emult(e_R);  // P控制
  • 1

由于偏航响应较慢,加入前馈控制

_rates_sp(2) += _v_att_sp.yaw_sp_move_rate * yaw_w * _params.yaw_ff; // 偏航前馈
  • 1

其中主要是旋转向量e_R的求取


/* try to move thrust vector shortest way, because yaw response is slower than roll/pitch */
// 以最短距离移动推力向量
math::Vector<3> R_z(R(0, 2), R(1, 2), R(2, 2));
math::Vector<3> R_sp_z(R_sp(0, 2), R_sp(1, 2), R_sp(2, 2));

/* axis and sin(angle) of desired rotation */
// 旋转向量(轴  角)
math::Vector<3> e_R = R.transposed() * (R_z % R_sp_z); // 向量叉乘即误差

/* calculate angle error */
float e_R_z_sin = e_R.length(); // R_z 和 R_sp_z皆为单位向量, |x|=1
float e_R_z_cos = R_z * R_sp_z;

/* calculate weight for yaw control */
float yaw_w = R_sp(2, 2) * R_sp(2, 2);

/* calculate rotation matrix after roll/pitch only rotation */
math::Matrix<3, 3> R_rp;

if (e_R_z_sin > 0.0f) {
    /* get axis-angle representation */
    float e_R_z_angle = atan2f(e_R_z_sin, e_R_z_cos);
    math::Vector<3> e_R_z_axis = e_R / e_R_z_sin;

    e_R = e_R_z_axis * e_R_z_angle; // 旋转向量: 长度为 theta角大小

    /* cross product matrix for e_R_axis */
    math::Matrix<3, 3> e_R_cp;
    e_R_cp.zero();
    e_R_cp(0, 1) = -e_R_z_axis(2);
    e_R_cp(0, 2) = e_R_z_axis(1);
    e_R_cp(1, 0) = e_R_z_axis(2);
    e_R_cp(1, 2) = -e_R_z_axis(0);
    e_R_cp(2, 0) = -e_R_z_axis(1);
    e_R_cp(2, 1) = e_R_z_axis(0);

    /* rotation matrix for roll/pitch only rotation */
    // 罗德里格斯公式
    // R = cos(theta) * I + (1 - cos(theta)) * n * n^T + sin(theta) * skewmatrix(n)
    R_rp = R * (_I + e_R_cp * e_R_z_sin + e_R_cp * e_R_cp * (1.0f - e_R_z_cos));

} else {
    /* zero roll/pitch rotation */
    R_rp = R;
}

////////////// 对齐X轴
/* R_rp and R_sp has the same Z axis, calculate yaw error */
math::Vector<3> R_sp_x(R_sp(0, 0), R_sp(1, 0), R_sp(2, 0));
math::Vector<3> R_rp_x(R_rp(0, 0), R_rp(1, 0), R_rp(2, 0));
e_R(2) = atan2f((R_rp_x % R_sp_x) * R_sp_z, R_rp_x * R_sp_x) * yaw_w; //tan = sin / cos

////////////////////////  大角度旋转 ///////////////////////
if (e_R_z_cos < 0.0f) {
    /* for large thrust vector rotations use another rotation method:
     * calculate angle and axis for R -> R_sp rotation directly */
     // 大的推力向量:直接计算 R->R_sp 的旋转向量(轴、角)
    math::Quaternion q_error;
    // 四元数组成为旋转轴 转过的角度  
    q_error.from_dcm(R.transposed() * R_sp);
    // 四元数实部为 cos(theta)  虚部为 u_x*sin(theta) u_y*sin  u_z*sin
    math::Vector<3> e_R_d = q_error(0) >= 0.0f ? q_error.imag()  * 2.0f : -q_error.imag() * 2.0f;

    /* use fusion of Z axis based rotation and direct rotation */
    // 使用基于Z轴的旋转和直接旋转的融合
    float direct_w = e_R_z_cos * e_R_z_cos * yaw_w;
    e_R = e_R * (1.0f - direct_w) + e_R_d * direct_w;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

角速度控制(内环PID)

/*
 * Attitude rates controller.
 * 角速度控制环     内环 PID
 * Input: '_rates_sp' vector, '_thrust_sp'
 * 输入: 角速度设定值'_rates_sp'   推力设定值 '_thrust_sp'
 * Output: '_att_control' vector
 * 输出: 姿态控制量  '_att_control'
 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

角速度控制过程比较直观,需要注意的是一个系数tpa(Throttle PID Attenuation,油门PID衰减)。

/* throttle pid attenuation factor */
float tpa =  fmaxf(0.0f, fminf(1.0f, 1.0f - _params.tpa_slope * (fabsf(_v_rates_sp.thrust) - _params.tpa_breakpoint)));
// 衰减因子范围在 0 ~ 1 之间
  • 1
  • 2
  • 3

在得到角速度误差后

/* angular rates error */
// 角速度误差
math::Vector<3> rates_err = _rates_sp - rates;
  • 1
  • 2
  • 3

进行角速度PID控制(加前馈)

_att_control = _params.rate_p.emult(rates_err * tpa) + _params.rate_d.emult(_rates_prev - rates) / dt + _rates_int +
               _params.rate_ff.emult(_rates_sp);
  • 1
  • 2

这里有几点需要注意的:

  1. 微分控制环节的误差量选取

    标准的PID微分项D=Kd×(e(k)−e(k−1))

,但是这里因为角度的微分就是角速度,而陀螺仪可以直接测出角速度。此处没有将微分项作为偏差的差可能是有此考虑,直接使用 D=kd×ΔGyro/t
  1. 可以增强稳定性。

    问:串级PID外环可以只用PI吗?

    答:可以,因为内环相当于外环的D。

  2. TPA的作用

    TPA在此处使用是考虑到了抗积分饱和。

    当系统存在一个方向的误差时,由于积分的累加作用会使控制量一直增大,可能会使控制量达到执行器的执行阈值,如果此时误差的方向发生改变,控制量会逐渐减小,控制量也会退出饱和区,执行器也会在阈值内执行;如果此时误差方向还是没有改变,控制量会继续增大但是执行器会一直保持在阈值,此时控制量就进入了饱和区。进入饱和区越深,退出饱和区时间就会越长,在饱和区时执行器会一直在阈值位置,如果误差发生反向,执行器不会立刻有反应,控制量会慢慢减小,等执行器推出饱和区才会有反应。这样就会使控制的动态响应变差,控制性能变差。
    抗积分饱和算法
    若 u(k-1)>Umax,只累加负的误差;若u(k-1)

位置控制mc_pos_control

位置控制同样采用的是串级PID控制。外环为位置P控制,内环为速度PID控制。

整体控制流程入下。

mc_pos_ctrl

保方向饱和

四轴轨迹规划-Minimum snap总结 理论知识 微分平坦:系统状态可以被平坦空间的状态以及他们的导数所组成的代数组合所表示。 系统状态12维,首先可以看出 x,y,z 和 dot_x, dot_y, dot_z, 以及 \phi , \theta, \psi和 \omega_x \omega_y \omega_z之间的导数关系,所以整个系统可以先规划成6个,然后无人机的角度和\dot\dot_x相关,所以,最终可以缩减为4个输入,x,y,z和\psi Minimum jerk: minimize angular velocity, good 阅读详情

相关推荐

【轨迹规划论文整理(1)】UAV轨迹规划的开山之作Minimum Snap Trajectory

【轨迹规划论文整理(1)】UAV轨迹规划的开山之作Minimum Snap Trajectory Generation and Control for Quadrotors 本系列主要是对精读的一些关于无人机、无人车的轨迹搜索论文的整理,包括了论文所拓展的其他一些算法的改进思路。 这是本系列的第一篇文章,也是UAV轨迹规划的开山之作,是所有学习无人机方向的需要精读的第一篇文章,两个作者来自于宾夕法尼亚大学的GRASP Lab,是全球顶尖的机器人团队,也是UAV方向研究的开山鼻祖之一。 Mellinger D

weixin_45534376的博客 2866

详解四元数

小人只能理解实数范围内的运算,只是将i当作自身平方为-1的特殊符号。几何意义上,复数范围内的乘,把前一个复数看作是作用在第二个复数上的函数固定原点,将(1,0)这个点拉到z点位置,变换之后的w点就是乘积结果,在二维空间中有且仅有一个变换能得到这个结果这个过程中涉及到拉伸和旋转,拉伸十分好理解,因为一维数轴也能进行。那么旋转呢?这不本就是一个二维平面才有的概念吗?所有旋转都对应着唯一的旋转度数,我们可以将其投影到一维数轴上想象一个点在单位圆上移动,该点与(-1,0)的连线与复数轴产生交点,一维小人观察复数轴这

jkkk_的博客 7228

PX4固件源码深度解析:从文件夹结构到模块化设计

本文深度解析了PX4固件的源码结构与模块化设计。文章从PX4作为无人机专用实时操作系统生态的定位入手,系统阐述了其三层总体架构:底层的NuttX RTOS、核心的中间件(含驱动与uORB通信机制)以及上层的飞行控制栈。通过详细解读src、boards、ROMFS等核心文件夹的功能,揭示了PX4如何通过uORB实现模块间解耦,并梳理了从源码编译到飞控启动的完整流程,为开发者理解与定制PX4提供了清晰的路线图。

weixin_29290379的博客 537

Pixhawk之姿态控制篇(1)_源码算法分析(超级有料)

摘自:https://blog.youkuaiyun.com/qq_21842557/article/details/51439171 Pixhawk之姿态控制篇(1)_源码算法分析(超级有料) 2016年05月17日 21:39:44 _Summer__ 阅读数:43335 标签: UAV 源码 算法 个人分类: UAV 版权声明:. https://blog.youkuaiyun.com/qq_21842557/article/details/51439171 一、开篇 姿态控制篇终于来了、来了...

自主无人机 PX4 ROS SLAM 路径规划 MVS等技术分享 1997

PX4固件源码结构解析:从零开始理解飞控代码的组织逻辑

本文深入解析PX4固件源码结构,从分层架构设计到核心目录组织,帮助开发者快速理解飞控代码的组织逻辑。重点介绍了硬件相关目录、编译系统配置、关键功能模块以及模块化设计与uORB通信机制,为二次开发提供实用建议。

weixin_29233333的博客 137

Pixhawk振动测量:飞控稳定性的底层诊断方法

振动级别是无人机飞控系统健康状态的关键指标,本质为加速度计信号在特定频段内的RMS有效值(单位m/s²),反映机械振动能量密度。其原理源于嵌入式实时信号处理,通过滑动窗口对原始加速度数据进行均方根计算,并经低通滤波剔除真实机动分量,专捕机械扰动噪声。该技术具有低成本、高灵敏、无需外设等工程优势,直接关联结构刚性、电机动平衡、减震有效性及滤波策略可靠性。典型应用场景包括多旋翼悬停诊断、行业巡检机长期健康管理、故障预警与寿命预测。PX4固件原生支持的vehicle_vibration模块与VIBE日志,使振动分

weixin_34377919的博客 476

PX4——mc_att_control(姿态控制)

         本文转载自  博主: summer   博客:《Pixhawk之姿态控制篇(1)_源码算法分析(超级有料)》         原博客地址:http://blog.youkuaiyun.com/qq_21842557/article/details/51439171   1、写在前面             无人机控制部分主要分为两个部分,姿态控制部分和位置控制部分;位置控制可用远程...

慕离巷的博客 7812

别再死磕调参了!从PX4源码结构看PID参数到底在哪改(以Pixhawk 4为例)

本文详细解析了PX4源码中PID参数的定位与修改方法,以Pixhawk 4为例,从QGC参数名反向追踪到具体的C文件和代码行。通过解析PX4源码目录结构和参数命名规则,提供了一套高效的参数定位四步法,并实战演示了姿态控制和位置控制关键PID参数的源码位置。文章还介绍了参数修改的安全流程和调试技巧,帮助开发者深入理解PX4控制算法框架。

weixin_42525632的博客 95

Pixhawk之姿态控制篇

一、开篇        姿态控制篇终于来了、来了、来了~~~        心情爽不爽?愉悦不愉悦?开心不开心?        喜欢的话就请我吃顿饭吧,哈哈。        其实这篇blog一周前就应该写的,可惜被上一篇blog霸占了。但是也不算晚,整理了很多算法基础知识,使得本篇blog更充实。一人之力总是有限的,难免有不足之处,大家见谅,有写的不好的地方劳烦指正。看到标题了吧,属于连载篇,所以...

csshuke的专栏 4924

新手避坑指南:用Pixhawk 2.4.8和Mission Planner搞定差速无人车底盘(保姆级图文)

本文提供了一份详细的Pixhawk 2.4.8差速无人车底盘搭建指南,涵盖硬件准备、固件刷写、遥控器配置及高级参数调优等关键步骤。特别针对新手开发者,提供了避免常见问题的实用技巧和故障排除方法,帮助快速实现精准控制。

weixin_28736355的博客 197

Minimum Snap轨迹规划详解(1)轨迹规划入门

1. 轨迹规划是什么?在机器人导航过程中,如何控制机器人从A点移动到B点,通常称之为运动规划。运动规划一般又分为两步: 路径规划:在地图(栅格地图、四\八叉树、RRT地图等)中搜索一条从A点到B点的路径,由一系列离散的空间点(waypoint)组成。 轨迹规划:由于路径点可能比较稀疏、而且不平滑,为了能更好的控制机器人运动,需要将稀疏的路径点变成平滑的曲线或稠密的轨迹点,也就是轨迹。 2. 轨迹是什

roboto 5万+

PX4姿态解算源码原理理解

PX4源码原理理解一.主要参考资料链接:1.1 取PX4源码一小部分姿态解算来进行讲解姿态解算源码中文注释:https://blog.youkuaiyun.com/zouxu634866/article/details/79806948(但是并不全面,下面有我添加注释的较为完整的版本1.2 姿态解算文件层级 Cmakelists是编译脚本为之后使用命令刷入固件提供方便 attitude_est...

weixin_44210896的博客 2303

Pixhawk飞控板PCB设计与技术资料大全

Pixhawk PCB资料包是开发者和工程师在进行自主飞行器设计时不可或缺的工具集。该资料包包括硬件设计文件、固件源码、开发文档以及用于调试和测试的工具。它为技术人员提供了一个起点,以深入理解Pixhawk硬件平台及其与PX4开源飞行堆栈的集成方式。数据融合是结合来自多个传感器的数据,以获得比单一传感器更加准确、可靠信息的过程。在无人机中,这通常涉及姿态估计、速度和位置的计算。数据融合的几种常见技术包括:加权平均法:对来自不同传感器的数据赋予不同的权重,然后计算加权平均值。

weixin_33363025的博客 1436

Pixhawk代码分析-姿态解算篇A

姿态解算篇A基本知识1、如何实现控制一个无人机系统的算法主要有两类:姿态检测算法、姿态控制算法。姿态控制、被控对象、姿态检测三个部分构成一个闭环控制系统。被控对象的模型是由其物理系统决定,设计无人机的算法就是设计姿态控制算法、姿态检测算法。1)姿态检测算法:姿态的表示可以用欧拉角,也可以用四元数。姿态检测算法的作用就是将加速度计、陀螺仪等传感器的测量值解算成姿态,进而作为系...

csshuke的专栏 2583

【免费】最新区块链钱包和私钥的助记词碰撞器,使用python开发

最新钱包私钥助记词碰撞器,搏一搏单车变摩托!

weixin_48529185的博客 1万+

新手必看:SMIC 0.18um PDK安装保姆级教程(附Cadence IC617环境配置)

本文提供SMIC 0.18um PDK在Cadence IC617环境下的详细安装教程,涵盖环境准备、文件解压、安装脚本运行、环境变量配置及Cadence集成验证等关键步骤,特别针对初学者常见问题提供解决方案,助力快速掌握芯片设计工具配置。

weixin_30522183的博客 490

28元国产飞控板实战:从零搭建扑翼机,解析STM32替代方案

嵌入式系统开发中,微控制器(MCU)是核心组件,负责执行控制算法、处理传感器数据并驱动执行机构。其工作原理基于实时读取传感器信息,通过姿态解算算法(如互补滤波)融合数据,再利用PID控制理论计算修正量,最终输出PWM信号驱动电机。这项技术的价值在于为机器人、无人机等自主运动平台提供稳定可靠的控制基础,广泛应用于消费级无人机、教育机器人、智能硬件等领域。近期,一款售价仅28元的国产扑翼机飞控板引发关注,它采用国产ARM Cortex-M芯片替代传统STM32,通过极简硬件设计和开源固件,大幅降低了飞行控制技术

weixin_30607659的博客 390

kali虚拟机-----破解wifi密码(WiFi渗透)

文章目录一、将无线网卡挂载到 虚拟机上二、查看是否挂载成功三、查看网卡是否支持监听模式四、检查文件监听影响并杀死影响五、开启无线监听模式六、开始监听七、开始抓包(新建一个命令窗口)八、对已连接的终端进行攻击,使它掉线重连,以此来获取数据包。(新建一个命令窗口)九、开始解密 一、将无线网卡挂载到 虚拟机上 可能出现的问题:在可移动设备处无法连接无线网卡; 解决:在虚拟机设置中将usb控制器设置成如图所示。 注意要先关闭虚拟机在设置。 二、查看是否挂载成功 使用ifconfig命令查看 三、查看网卡是

weixin_46471800的博客 1万+
上一篇: Pixhawk---超声波模块添加说明(I2C方式)
下一篇: 和菜鸟一起学linux内核源码之基础准备篇
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值