PIXHAWK位置控制整体框架及期望推力向量转化成目标姿态旋转矩阵算法的深度解析

2023-05-16

        万事开头难,这是我的第一篇博客。谨以此将所学所悟记录下来,以防遗失,同时欢迎与大家进行技术交流,共同学习,共同进步,玩的开心!

   这里的位置控制主要看PX4的mc_pos_control_main.cpp,其中位置控制主要执行函数为MulticopterPositionControl::task_main()。

        首先位置控制的数据来源主要有三种:1、手动位置控制;2、offboard控制模式(由其他板载控制器提供控制指令);3、auto控制模式(由设置好的航迹自动计算)。其代码可追溯:

                        /* select control source */
if (_control_mode.flag_control_manual_enabled) {
/* manual control */
control_manual(dt);
_mode_auto = false;
} else if (_control_mode.flag_control_offboard_enabled) {
/* offboard control */
control_offboard(dt);
_mode_auto = false;
} else {
/* AUTO */
control_auto(dt);

}

        PX4的手动位置控制模式,手动打杆时采用速度控制模式,摇杆回中时采用位置控制模式。位置环采用P控制,即单纯比例控制,速度环采用PID控制,速度环的输出转换成期望推力。期望推力同位置、速度环一样都处于NED(北东地)坐标系。示例代码:

        /* thrust vector in NED frame */
        math::Vector<3> thrust_sp = vel_err.emult(_params.vel_p) + vel_err_d.emult(_params.vel_d) + thrust_int;

        PX4位置控制的思想是垂直推力优先于水平推力,即先保持高度上的稳定,其次满足水平上的移动。由于飞机倾斜水平飞行时,其垂直推力向量减少,故对垂直推力进行了倾角补偿,从而提高垂向维度控制效果,使飞机在倾转时不至于突然掉高。

可见代码:

     倾角补偿: /* thrust compensation for altitude only control mode */
float att_comp;
if (PX4_R(_att.R, 2, 2) > TILT_COS_MAX) {
att_comp = 1.0f / PX4_R(_att.R, 2, 2);
} else if (PX4_R(_att.R, 2, 2) > 0.0f) {
att_comp = ((1.0f / TILT_COS_MAX - 1.0f) / TILT_COS_MAX) * PX4_R(_att.R, 2, 2) + 1.0f;
saturation_z = true;
} else {
att_comp = 1.0f;
saturation_z = true;
}

thrust_sp(2) *= att_comp;

 

            推力优先满足于高度维度:

            /* preserve thrust Z component and lower XY, keeping altitude is more important than position */

float thrust_xy_max = sqrtf(_params.thr_max * _params.thr_max - thrust_sp(2) * thrust_sp(2));
float thrust_xy_abs = math::Vector<2>(thrust_sp(0), thrust_sp(1)).length();
float k = thrust_xy_max / thrust_xy_abs;
thrust_sp(0) *= k;
thrust_sp(1) *= k;

saturation_xy = true;

        计算出北东地期望推力(即期望加速度)输出,需要转化到机体坐标系(前右下)的期望角度。PX4的角度控制采用方向余弦矩阵控制,故需要将期望推力向量转化成目标余弦矩阵。关于方向余弦矩阵推荐看一下mahony的Direction Cosine Matrix IMU:Theory.(PX4的相关控制及姿态解算便是参考于此)。方向余弦矩阵见下图:

        其中方向余弦矩阵与欧拉角的关系如下:

        接下来对期望推力向量转化成目标姿态旋转矩阵算法进行一下深度解析。

 

        首先将期望推力向量单位化,转换到zb(由于北东低转换到zb(b 代表body)维度无需进行相应的分量转换),代码:

body_z = -thrust_sp / thrust_abs;

        然后将单位化后的期望推力向量根据当前航向角转换到xb维度,代码:

math::Vector<3> y_C(-sinf(_att_sp.yaw_body), cosf(_att_sp.yaw_body), 0.0f);

body_x = y_C % body_z;

其中%代表叉乘,该处是3*1的矩阵叉乘,矩阵叉乘方法在mahony中的讲解:

可根据此公式将北东地坐标系下的推力向量依据航向角(正北方向为0度)向前右下坐标系转换一下进行验证。转换之后将bx列向量进行单位化,代码:body_x.normalize();

        最后将单位化的北东地坐标系下的推力向量依据单位化后的xb向量转换到by维度。其方法是yb=bz%bx,代码:body_y = body_z % body_x;(可将含欧拉角的zb与xb进行叉乘计算,可得到yb,同时可类比得出方向余弦矩阵的相关性质:zb=xb%yb; yb=zb%xb; xb=(-sin(),cos(),0)%zb),将xb,yb,zb进行汇总即得机体系的期望R,代码:

                                        /* fill rotation matrix */
for (int i = 0; i < 3; i++) {
R(i, 0) = body_x(i);
R(i, 1) = body_y(i);
R(i, 2) = body_z(i);

}

         其中期望推力转化成期望姿态矩阵的执行细节和缜密证明请前往我的知乎专栏,就不直接搬过来了,否则行文太长了。

其中包括对于横滚为90度的特殊处理,很值得细细一看。

        至此,PIXHAWK位置控制整体框架及期望推力向量转化成目标姿态旋转矩阵算法的深度解析完,如有误,还望提出指正。下集进行PIXHAWK姿态控制整体框架及控制算法的深度解析大笑

更多资料可获取于知识星球--飞鸽传书(ID:4003539)

更多无人机知识分享,请关注微信公众号:欣飞鸽
开心飞翔,灵动如鸽。愿与无人机爱好者,共创一片蓝天梦!

 

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

PIXHAWK位置控制整体框架及期望推力向量转化成目标姿态旋转矩阵算法的深度解析 的相关文章

  • PIXHAWK飞行模式

    PIXHAWK飞行模式 从mission planner中设置pixhawk的飞行模式时 xff0c 一共给出了多种飞行模式 xff0c 分别为 xff1a MANUAL STABILIZED ACRO RATTITUDE ALTCTL P
  • PX4/Pixhawk---uORB深入理解和应用(最新版)

    1 简介 ps 第1章简介是参考 uORB深入理解和应用 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c 这可以让我们更好的理解PX4 Pixhawk的软件架构和运作 xff
  • pixhawk无人机避障

    本人最近用树莓派结合PX4做无人机避障 xff0c 使用激光雷达 xff0c 有没有一起的小伙伴 xff0c 我们一起交流 xff01 私信我 xff0c
  • APM、PIXHAWK、PX4的关系

  • PIXHAWK飞机侧翻原因

    转载自 xff1a http pix 1yuav com wen ti ji jin fei ji ce fan yuan yin html 飞机侧翻原因 飞机侧翻有以下几个原因 xff0c 请认真检查 1 电机顺序 xff0c 电机转向
  • pixhawk调试过程中QGC报错显示问题及解决方案汇总

    1 室内环境下解锁无人机 xff0c 报错 xff1a Not arming geofence RTL requiers valid home 解决 xff1a 去掉安全设置里面的地理围栏 xff0c 否则只能在有GPS的环境下解锁
  • pixhawk飞控中添加uORB主题

    本说明针对 Firmware v1 2 0 参考 xff1a https pixhawk org start id 61 zh dev shared object communication 1 添加流程说明 在Firmware msg下新
  • pixhawk ulg转csv

    ulg是目前最新版px4固件生成的log格式 xff0c 下载最新版的flightplot即可对内部数据进行预览分析 xff0c flightplot中支持部分函数和运算符操作 xff0c 但对带 数据的操作不支持 xff0c 如需要对某些
  • Pixhawk飞行模式的讨论

    手动模式 offboard 地面站 操控的区别 使用遥控操纵的模式 Simple and Super Simple 选项 加了这个选项之后 xff0c 它的磁力计会记录飞机解锁时 xff0c 朝向就是无人机的前方 每个飞行模式的旁边都有一个
  • pixhawk commander.cpp的飞行模式切换解读

    commander cpp逻辑性太强了 xff0c 涉及整个系统的运作 xff0c 所以分别拆分成小块看 另此篇blog大部分是参考 xff08 Pixhawk原生固件解读 xff09 飞行模式 xff0c 控制模式的思路 xff0c 笔者
  • pixhawk px4 spi设备驱动

    此篇blog是以nuttx官网介绍为出发点 xff0c 先分析如何初始化的 xff0c 再分析如何读取传感器数据的 xff0c 最后对比了字符型设备操作和spi驱动的实现方式的差别 如有错误还请指正 6 字符型设备 所有的结构体和API都在
  • pixhawk: px4代码初学分析:追溯电机控制--pwm输出

    追溯电机控制 pwm输出 正常工作状态下pwm输出过程简述 xff1a 其他状态下pwm输出 xff1a 正常工作状态下pwm输出过程简述 xff1a 姿态解算部分得出姿态控制量通过px4io cpp把姿态控制量发送给IOIO串口读取姿态控
  • 【Pixhawk】注册一个字符型驱动设备

    最近学习Pixhawk的SPI xff0c 本以为PX4是STM32单片机而已 xff0c 写个SPI驱动应该很简单 但是当我看到mpu9250的那些cpp文件 xff0c 我一下就蒙了 由于PX4用的NUTTX系统 xff0c 类似Lin
  • pixhawk接口图以及引脚说明

    pixhawk接口图和引脚如下 pixhawk可以同时使用2个GPS xff0c 这只能使用其中一个罗盘 xff0c 实际中飞控挑选其中信号好的一个GPS进行定位 硬件部分 xff1a 第二个GPS插在serial 4 5接口上 xff0c
  • Pixhawk-信息流浅解析

    根深方能叶茂 在等待的日子里 xff0c 刻苦读书 xff0c 谦卑做人 xff0c 养得深根 xff0c 日后才能枝叶茂盛 Better 根爷 之前我们已经谈到系统框架 xff0c 之前谈到了定制自己功能的两部 xff1a 添加模块和修改
  • pixhawk串口读取传感器数据

    1 Pixhawk板上串口说明 xff1a 测试 使用Pixhawk板上TELEM2接口的USART2 xff0c 对应的Nuttx UART设备文件尾 dev ttyS2 xff1a 2 读取数据测试 步骤 xff1a 在Firmware
  • Pixhawk串口名称与硬件接口对应关系

    Pixhawk提供的串口较多 xff0c 通过ls dev 可以看到有如下7个tty设备 xff1a ttyACM0 ttyS0 ttyS1 ttyS2 ttyS3 ttyS4 ttyS5 ttyS6 但每个串口名称对应到Pixhawk硬件
  • Pixhawk指示灯和安全开关含义

    Pixhawk指示灯的含义 红灯和蓝灯闪 xff1a 初始化中 请稍等 黄灯双闪 xff1a 错误 系统拒绝解锁 蓝灯闪 xff1a 已加锁 xff0c GPS搜星中 自动导航 xff0c 悬停 xff0c 还有返回出发点模式需要GPS锁定
  • pixhawk 整体架构的认识

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • mission planner SITL仿真系统配置

    背景 主要参考ArduPilot的官网 作者还拥有个人公众号 会写一些感悟文章 知圈 二维码如下 欢迎扫描关注 关注后有作者微信 欢迎添加交流 链路图 图源 Cygwin 下载 去官网下载Cygwin 作者电脑windows 10 64位

随机推荐