四旋翼飞行器控制原理与设计

2023-05-16

一、相关理论知识

1.坐标系与欧拉角

进行动力学建模之前首先建立坐标系,在此建立地球坐标系和机体坐标系,如图所示,这里地球系z轴方向向下指向地心,机体系x轴为机头方向。

当描述一个三维空间内的刚体转动时,需要选用三个独立的角度来表示刚体的相对位置。即,刚体绕固定点的旋转可以看成是若干次旋转的合成,旋转方法不是唯一的,所以欧拉角有多种取法,不同的取法、不同的转动顺序都会对于不同的旋转矩阵。在研究四旋翼时,为了与四旋翼的滚转、俯仰、偏航相对应,可以取绕x旋转角度为φ(滚转,右滚为正),绕y轴旋转角度为θ(俯仰,仰头为正),绕z轴旋转为ψ(偏航,右偏为正)。

由地球坐标系转到机体坐标系为xyz旋转,又称卡尔丹角。实际上理论分析时,旋转顺序不是很重要,zyx、zxy都可以,虽然最后姿态解算时四元数与欧拉角的关系式不同,但是都可以进行解算。

2.旋转矩阵

绕x轴旋转的旋转矩阵为,

绕y轴旋转的旋转矩阵为,

绕z轴旋转的旋转矩阵为,

这样,xyz旋转时,一个向量由地球系的表示转为机体系的表示,可以写成,

由机体系转向地球系的姿态矩阵为,

3.四元数及其与欧拉角的关系

关于四元数的详细定义等参见秦永元的《惯性导航》,非常详细,这里不搬了。

以zyx旋转顺序为例,此时其旋转矩阵

此时由四元数表示的旋转为

这样一一对应,可以求得后面姿态解算时要用到的一些式子,

①重力在机体坐标系下的表示:

②四元数与欧拉角的关系:

四元数具体的推导和计算太多了,详见《捷联式惯性导航原理》。关于四元数与旋转矩阵我查阅了很多资料,比较官方的书呢,推导都是用的zyx旋转顺序,推出上式中四元数与欧拉角的关系。其他资料呢,有用不同的旋转顺序,但是对应旋转矩阵时很容易搞错。我觉得四元数与欧拉角的关系不是唯一的,只取决于使用的四元数,旋转顺序不同,对应的四元数自然不同。这主要影响的是解算过程中,q的值可能是不同的,但解算出的欧拉角都是一样的。

二、控制模型建立

首先,建模的目的是基于这个模型设计控制器。四旋翼是一个非线性的多输入系统,但是,为了简化处理,在小角度时,可以将模型简化为线性的,进而就可以使用线性控制的方法处理。

1.四旋翼动力学模型

①欧拉角表示为,

其中,

②四元数表示为,

(上面两个式子实际上是四元数运动学微分方程,后面姿态解算时会用到)

2.简化为控制模型

在这里研究给定期望姿态角,期望高度的控制模型,这样可以分为四个通道:高度通道、俯仰通道、滚转通道、偏航通道,俯仰通道、滚转通道、偏航通道模型是一样的,是姿态模型。

①先看高度通道(z方向)的化简,

变为,

(俯仰、滚转都很小时)

②再看姿态通道的化简,

变为,

(角度小,速度小时)

3.四旋翼控制分配模型

控制分配模型是建立伪控制量与实际控制量之间关系的模型,以X4型传统四旋翼为例,其伪控制量实际是几个通道经过pid之后的输出值pidout,高度通道的输出可以看做是总拉力,.姿态通道可以看成是力矩(具体分析就涉及到pid控制器的设计了);其实际控制量可以看成是电机转速的平方。这几个伪控制量与实际控制量的对应关系如下:

,其中是电机转速平方与拉力之间的关系系数,是电机转速平方与反扭力之间的关系系数,d是机臂长度。

控制分配模型在普通四旋翼上的分配基本是固定的,但是当伪控制量与实际控制量个数不一致时,控制分配就很重要。

三、控制算法及实现

全自主飞控的控制逻辑是从给定期望轨迹和期望偏航开始的,首先经过这一位置控制得到期望的拉力和期望的三个姿态角,在这里,我暂不考虑轨迹控制,即飞控的逻辑是从给定期望姿态角和期望高度开始。

这样,飞控底层框架大致如下图,

图比较乱,硬件、算法、数据都在里面了,基本能看懂…可以看出,四旋翼的三个核心算法:姿态解算算法、pid控制算法、控制分配算法。

1.姿态解算

四旋翼姿态解算的方法有很多,有基于四元数,有基于旋转矩阵,有互补滤波,有卡尔曼滤波,其实不管是哪种滤波解算的算法,思想都是利用加速度计解算出得数据去修正陀螺仪积分产生偏差。在这里我主要研究了一下最常用的,四元数互补滤波,这个资料已经比较全了,每一个步骤我只记录一下我的理解。

(1)初始化四元数

static float q0 = 1.0f;
static float q1 = 0.0f;
static float q2 = 0.0f;
static float q3 = 0.0f;
(2)加速度计低通滤波,去除一部分高频噪声,获取加速度计、陀螺仪值

(3)加速度计测量值规范化

normalise = invSqrt(acc.x * acc.x + acc.y * acc.y + acc.z * acc.z);
acc.x *= normalise;
acc.y *= normalise;
acc.z *= normalise;
(4)提取四元数的等效余弦矩阵中的重力分量

vecxZ = 2 * (q1 * q3 - q0 * q2);
vecyZ = 2 * (q0 * q1 + q2 * q3);
veczZ = q0s - q1s - q2s + q3s;
(5)向量叉积得出姿态误差

exInt += Ki * ex * dt ;
eyInt += Ki * ey * dt ;
ezInt += Ki * ez * dt ;
(6)PI修正陀螺仪

exInt += Ki * ex * dt ;
eyInt += Ki * ey * dt ;
ezInt += Ki * ez * dt ;
gyro.x += Kp * ex + exInt;
gyro.y += Kp * ey + eyInt;
gyro.z += Kp * ez + ezInt;
解释一下(5)、(6),首先在(3)、(4)中保证了加速度计表示的重力分量和由四元数推算出的重力分量都是单位的,这样(5)中的偏差实际上可以理解为角度,且都是在机体坐标系中,我们知道,陀螺仪虽然噪音小,但是其值会有漂移,如果通过积分计算角度,随着时间,其值会累积,这样就得不到准确值了,越偏越多,而加速度计没有漂移,但是噪音很大(机体一直在震动),且测量值稳定后,即为实际的真值。这样就考虑用加速度计去修正陀螺仪的偏差。实际上,个人理解,这里的姿态误差就可以看成是输入pi控制器的ref-fdb,而通过pi修正之后,得出的out,就可以用了消除陀螺仪的漂移。那么,既然加计是参考值,为什么不能直接置信于加计呢?这里就扯到互补的思想了,加计并不是稳定的,是一直震荡的,不平滑,但值是没有漂移的,积分不会产生大的误差,这样也可以看做是,我们取了陀螺仪稳定的优点,又取了加计没有漂移的优点。

(7)更新四元数,并归一化

q0 += (-q1 * gyro.x - q2 * gyro.y - q3 * gyro.z) * halfT;
q1 += (q0 * gyro.x + q2 * gyro.z - q3 * gyro.y) * halfT;
q2 += (q0 * gyro.y - q1 * gyro.z + q3 * gyro.x) * halfT;
q3 += (q0 * gyro.z + q1 * gyro.y - q2 * gyro.x) * halfT;

normalise = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
q0 *= normalise;
q1 *= normalise;
q2 *= normalise;
q3 *= normalise;
这里在解释一下四元数更新的算法,这个实际上就是对四元数运动学方程套用龙格库塔方法,这里的计算过程就直接搬运了,没什么好说的。

(8)解算欧拉角

这里就是之前说的欧拉角与四元数的对应关系。

state->attitude.pitch = -asinf(vecxZ) * RAD2DEG;
state->attitude.roll = atan2f(vecyZ, veczZ) * RAD2DEG;
state->attitude.yaw = atan2f(2 * (q1 * q2 + q0 * q3),q0s + q1s - q2s - q3s) * RAD2DEG;
2.串级PID控制

PID控制器的设计是基于控制模型的,在前面说过,我们设计的PID控制如下,

①姿态环

void attitudeRatePID(Axis3f *actualRate,attitude_t *desiredRate,control_t *output)
{
output->roll = pidOutLimit(pidUpdate(&pidRateRoll, desiredRate->roll - actualRate->x));
output->pitch = pidOutLimit(pidUpdate(&pidRatePitch, desiredRate->pitch - actualRate->y));
output->yaw = pidOutLimit(pidUpdate(&pidRateYaw, desiredRate->yaw - actualRate->z));
}

void attitudeAnglePID(attitude_t *actualAngle,attitude_t *desiredAngle,attitude_t *outDesiredRate)
{
outDesiredRate->roll = pidUpdate(&pidAngleRoll, desiredAngle->roll - actualAngle->roll);
outDesiredRate->pitch = pidUpdate(&pidAnglePitch, desiredAngle->pitch - actualAngle->pitch);

float yawError = desiredAngle->yaw - actualAngle->yaw ;
if (yawError > 180.0f) 
	yawError -= 360.0f;
else if (yawError < -180.0) 
	yawError += 360.0f;
outDesiredRate->yaw = pidUpdate(&pidAngleYaw, yawError);

}
姿态环,代码实现的时候还要加入饱和,另外,遥控器模式时,实际是控制yaw的的角速率,直接用单环速率控制。

②高度环

void altholdPID(float* thrust, const state_t *state, const setpoint_t *setpoint)
{
float newThrust = 0.0;

newThrust = THRUST_SCALE * runPidZ(&posPid.pidVZ, state->position.z, setpoint, POS_UPDATE_DT);

if(getCommanderKeyFlight())
	detecWeight(*thrust, newThrust, state->velocity.z);

*thrust = newThrust + posPid.thrustBase;

if (*thrust > 60000) 
{
	*thrust = 60000;
}	

}

static float runPidZ(pidAxis_t *axis, float input, const setpoint_t *setpoint, float dt)
{
float out = 0.f;
if (axis->preMode == false && setpoint->isAltHold == true)
{
positionResetAllPID();
axis->setpoint = input + START_HIRHT;
posPid.thrustBase = limitThrustBase(configParam.thrustBase);
}
axis->preMode = setpoint->isAltHold;

if(setpoint->isAltHold == true)
{
	axis->setpoint += setpoint->velocity.z * dt;
	out = pidUpdate(&axis->pid, axis->setpoint - input);
}
return out;

}
这里minifly高度环实际也是单环。

pid更新的代码,

float pidUpdate(PidObject* pid, const float error)
{
float output;

pid->error = error;   

pid->integ += pid->error * pid->dt;
if (pid->integ > pid->iLimit)
{
	pid->integ = pid->iLimit;
}
else if (pid->integ < pid->iLimitLow)
{
	pid->integ = pid->iLimitLow;
}

pid->deriv = (pid->error - pid->prevError) / pid->dt;

pid->outP = pid->kp * pid->error;
pid->outI = pid->ki * pid->integ;
pid->outD = pid->kd * pid->deriv;

output = pid->outP + pid->outI + pid->outD;

pid->prevError = pid->error;

return output;

}
pid算法虽然都是一样的,但是基于pid控制器,不同飞控实现的方式也不太一样,这里不过多解读minifly的飞控了,后面好好学学px4的源码。

3.控制分配

传统四旋翼中,控制分配算法很简单,因为伪控制量和实际控制量的个数是相同的,编号好电机之后,相应正负,分配给电机即可。

void powerControl(control_t *control)
{
s16 r = control->roll / 2.0f;
s16 p = control->pitch / 2.0f;

motorPWM.m1 = limitThrust(control->thrust - r - p + control->yaw);
motorPWM.m2 = limitThrust(control->thrust - r + p - control->yaw);
motorPWM.m3 = limitThrust(control->thrust + r + p + control->yaw);
motorPWM.m4 = limitThrust(control->thrust + r - p - control->yaw);	

}
传统四旋翼的控制量是四个,在一个三维控制内,自由度有六个,这样的控制就是欠驱动的。如果我的伪控制量有六个,实际控制量也有六个,那我可以实现三维空间内的解耦控制。如果我的伪控制量有六个,实际控制量大于六个,且这六个控制量可以实现对,六个伪控制量做的事情。后面两个种情况控制分配就很重要了,包括六轴啊这种,四个伪控制量,六个实际控制量,也需要合理的控制分配。关于控制分配呢,需要思考的还很多,在这里不多说了。

结语:总之呢,关于四旋翼涉及的面太广了,这里只是把大致框架整理了一下,其实实现四旋翼控制的方法有很多,这里都是最简单的,像水平环的控制,解算时其他一些传感器的融合啊等等都还没说,一些更深入的东西也还没太研究明白,后面继续研究……

作者:GWH_98
来源:CSDN
原文:https://blog.csdn.net/GWH_98/article/details/86811091
版权声明:本文为博主原创文章,转载请附上博文链接!

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

四旋翼飞行器控制原理与设计 的相关文章

  • Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换)

    在前几篇的文章中带大家完成了基于TCP的物联网安卓应用开发 xff0c 教程内容是创建了一个TCP客户端并连接服务器完成数据通信的过程 xff0c 后不久又发布了一个ESP8266创建TCP 服务器与安卓的客户端进行通信的一个文章 xff0
  • 【FreeRTOS】中断管理

    在介绍本文之前 xff0c 向大家推荐个非常容易入门的人工智能学习网站 xff0c 建议点击收藏 目录 xff1a 1 前言2 内核提供两套API2 1 优点2 2 缺点2 3 常用API函数列表2 4 pxHigherPriorityTa
  • 【嵌入式基础】内存(Cache,RAM,ROM,Flash)

    1 前言 最近在看赛普拉斯的一款芯片CYW8019规格书 xff0c 里面有好几个内存的关键字 xff08 如下图的右上方 xff09 xff0c 本文将聊它们的含义和作用 2 Cache Cache是集成在CPU内部的极高速缓存 一般来讲
  • 使用Promise解决多个请求数据并发问题

    首先引用一下阮一峰大佬的一段话 xff1a Promise xff0c 简单说就是一个容器 xff0c 里面保存着某个未来才会结束的事件 xff08 通常是一个异步操作 xff09 的结果 从语法上说 xff0c Promise是一个对象
  • 1. KVM虚拟化学习

    1 什么是虚拟化 虚拟化 xff0c 通过模拟计算机的硬件 xff0c 来实现同一台计算机上运行多个不同的操作系统的既技术 2 为什么要使用虚拟化 为了充分利于资源 xff0c 软件运行环境的隔离 xff0c 只要有虚拟化才能实现 虚拟化提
  • 二次再散列法

    散列表 设所有可能出现的关键字集合记为U 简称全集 实际发生 即实际存储 的关键字集合记为K xff08 K 比 U 小得多 xff09 散列方法是使用函数h将U映射到表T 0 m 1 的下标上 xff08 m 61 O U xff09 这
  • CICD中clang-tidy静态语义检查

    教程 xff1b https hokein github io clang tools tutorial 要用clang tidy首先要在电脑上安装clang tools Linux Ubuntu系统 span class token fu
  • Vscode 设置clang-format

    用户设置与工作空间设置 VS Code提供了两种设置方式 xff1a 用户设置 xff1a 这种方式进行的设置 xff0c 会应用于该用户打开的所有工程 xff1b 工作空间设置 xff1a 工作空间是指使用VS Code打开的某个文件夹
  • 同步异步电机ADRC控制系统仿真

    之前一直使用PI控制器做异步电机矢量控制 xff0c 最近想把ADRC控制也放到异步电机矢量控制上去 xff0c 所以对其进了仿真 xff0c 可遇到了一个一直没有解决掉的问题 xff0c 现记录下来 xff0c 请各位先辈进行指教以及为遇
  • 大疆A型板使用经验分享(八)——FreeRTOS操作系统的使用

    一 freeRTOS操作系统 操作系统 operating system 本质上是一个帮助用户进行功能管理的软件 操作系统运行在硬件之上 为其他工作的软件执行资源分配等管理工作 一般称呼不使用操作系统的单片机开发方式为 裸机开发 当进行裸机
  • MySQL锁篇

    文章目录 说明 xff1a 锁篇一 MySQL有那些锁 xff1f 二 MySQL 是怎么加锁的 xff1f 三 update 没加索引会锁全表 xff1f 四 MySQL 记录锁 43 间隙锁可以防止删除操作而导致的幻读吗 xff1f 五
  • C++学习笔记

    文章目录 一 基础入门1 常量2 关键字3 数据类型3 1 整型3 2 浮点型3 3 字符型3 4 字符串类型3 5 布尔类型 4 数据的输入与输出5 运算符6 数组6 1 一维数组6 2 二维数组 7 函数8 指针9 结构体 二 核心编程
  • JS实现继承的几种方式

    JS继承的实现方式 堪称最全最详细 前沿看js继承这块时我看的几个教程都是说的很简单或者是没有说全就自行百度看了好多总结了下有 xff1a 1 构造函数继承 2 原型链继承 3 组合继承 4 class继承 5 实例继承 6 拷贝继承 7
  • 51单片机入门之点亮发光二极管

    1 任务书 用51单片机控制一个发光二极管 xff0c 打开单片机后LED亮 2 分析 首先是考虑电路连接问题 单片机所有1 O 口都可以驱动发光二极管 设选用P2 0 来接发光二极管 xff0c 所谓 闪亮 xff0c 就是点亮发光管后
  • 51单片机入门之开关控制

    1 任务书 使用拨扭开关控制led xff0c 用微动开关控制led 2 分析 拨钮开关无非就是 打开 跟 关闭 两个状态 xff0c 也就是0跟1 xff0c 打开无非就是接通关闭无非就是断开 那我们应该怎么接入单片机了 xff0c 其实
  • 51单片机静态动态数码管显示

    51单片机静态动态数码管显示 通过此实训了解动态数码管的显示原理 xff0c 掌握编码方法 共阴极和其阴极数码管的不同之处及常用设计方法 实训设备 这里使用的377锁存器模块控制的数码管下面就是电路图 显示内容 在显示模块的八位 LED 数
  • 51单片机矩阵键盘控制数码管

    51单片机矩阵键盘控制数码管 我们先了解矩阵键盘的工作原理 xff0c 掌握编码方法并能够编写出扫描程序 xff0c 使用矩阵键盘控制数码管输出矩阵键值 显示内容 在显示模块的八位 LED 数码的个位显示当前使用矩阵键盘所按下的值 键阵键盘
  • 51单片机继电器控制直流电机正反转

    51单片机继电器控制直流电机正反转 用继电器控制 24V 直流电机的转动与停止 继电器是常用的电气隔离器件 简单的驱动电路是用三极管直接驱动 该电路驱动简单 成本低廉 当控制电路为高电平时 xff0c NPN 型三极管就会饱和导通 xff0
  • 51单片机定时器流水灯控制

    51单片机定时器控制led流水灯数码管进行计数 51单片机根据不同的型号有不同数量的定时器的 xff0c 而这些定时器的大概用法是差不多的我们今天就使用定时器来控制led流水灯 实训要求 使用单片机定时器对led灯进行控制 xff0c 数码
  • esp8266单片机使用MAX7219芯片驱动点阵屏幕

    esp8266单片机使用MAX7219芯片驱动点阵屏幕 我们这里使用的单片机是一块esp8266 xff0c 点阵屏幕的话就是买的普通16脚红色的 xff0c 驱动芯片就是MAX7219芯片 xff0c 只需要依次把芯片的clk xff0c

随机推荐

  • 使用自己开发的app远程控制MAX7219点阵屏幕

    使用自己开发的app远程控制MAX7219点阵屏幕 一 功能介绍 xff1a 二 芯片介绍 xff1a 三 实现原理 xff1a 四 代码部分 xff1a 其它资料 xff1a 一 功能介绍 xff1a 1 可以固定显示想显示的内容 2 点
  • go发送http请求

    说明 xff1a 写项目时候用到的 xff0c go发送http请求用到的一个方法 span class token keyword func span 函数名 span class token punctuation span body
  • js事件流

    事件流指的是事件完整执行过程中的流动路径 事件流分为捕获阶段和冒泡阶段 捕获阶段是从父到子 xff1b 冒泡阶段是从子到父 事件冒泡 xff1a 事件冒泡概念 xff1a 当一个元素的事件被触发的时候 xff0c 同样的事件将会在该元素的祖
  • 树莓派安装python3.7.3

    一 安装依赖包 sudo apt get install y make build essential libssl dev zlib1g dev sudo apt get install y libbz2 dev libreadline
  • vscode中调试webpack构建的项目

    在webpack的配置中 xff1a devtool span class token punctuation span span class token string 39 source map 39 span span class to
  • mac下proxychains4的配置文件位置

    mac下proxychains4的配置文件位置 xff1a usr local etc proxychains conf span class token function vim span usr local etc proxychain
  • 1. 驱动开发--基础知识

    文章目录 1 驱动的概念2 linux体系架构3 模块化设计3 1 微内核和宏内核 4 linux设备驱动分类4 1 驱动分类4 2 三类驱动程序详细对比分析4 3 为什么字符设备驱动最重要 5 驱动程序的安全性要求5 1 驱动是内核的一部
  • 【论文笔记】Ensemble Augmented-Shot Y-shaped Learning

    论文笔记 EASY Ensemble Augmented Shot Y shaped Learning State Of The Art Few Shot Classification with Simple Ingredients Int
  • Ubuntu下的文件保存及退出

    这篇文章是写给我自己的 xff0c 怕自己以后忘了 我很多时候会在ubuntu下发现键盘并不那么好使 输入 vim test cpp 然后输入i o a xff0c 输入以上三种 xff0c 进入编辑状态 输入完成 xff0c 按esc退出
  • 机会总是留给有准备的人

    qqq
  • 1.karto-slam涉及的类-雷达以及雷达数据相关

    首先是最简单的 1 sensor msgs LaserScan 主要包括header 还有激光参数 xff08 扫射范围距离 xff0c 步长 xff0c 时间等 xff0c 不包含位姿信息 xff0c header里面含有frame id
  • catkin build 和 catkin_make

    首先安装 xff1a sudo apt get install python catkin tools 编译过程中你可能会遇到以下错误 xff0c 那是因为以前使用了catkin make进行编译 xff0c 需要把build和devel删
  • 使用Haar特征进行人脸识别

    这篇博客对2001年那篇划时代的paper xff1a Rapid Objection Using a Boosted Cascade of Simple Features进行一个简要的解析 这篇文章之后人脸识别的效果有了很大的提升 后来还
  • MySQL基础课程三件套,年前轻松带你带你入门数据库管理系统~

    今天已经2022年1月11日了 xff0c 相信大部分的宝子们已经进入快乐的寒假了 xff0c 今天给对数据库感兴趣的童鞋们推荐B站上的一系列数据库管理入门课 该系列课程分为三个部分 xff0c 第一部分为MySQL新手入门教程详解 xff
  • 【kazam】linux下截屏、录屏软件kazam的简单使用

    安装 xff1a sudo apt get install kazam 或者使用 ppa 安装 sudo add apt repository ppa kazam stable series sudo apt get update sudo
  • LCD24064显示程序,此工程直接运行。

    T6963C C51 Source Code240X64MCU W78E516D 12MHZLCM Controller T6963C RA6963 24064A B 1 FG GND 2 GND GND
  • 四旋翼无人机飞行器基本知识(四旋翼无人机结构和原理+四轴飞行diy全套入门教程)

    第一篇 四旋翼飞行器结构和原理 第二篇 四旋翼飞行diy全套入门教程 四旋翼飞行器结构和原理 1 结构形式 旋翼对称分布在机体的前后 左右四个方向 xff0c 四个旋翼处于同一高度平面 xff0c 且四个旋翼的结构和半径都相同 xff0c
  • 四旋翼飞控原理

    以前 xff0c 搞无人机的十个人有八个是航空 气动 机械出身 xff0c 更多考虑的是如何让飞机稳定飞起来 飞得更快 飞得更高 如今 xff0c 随着芯片 人工智能 大数据技术的发展 xff0c 无人机开始了智能化 终端化 集群化的趋势
  • 四旋翼飞控原理

    以前 xff0c 搞无人机的十个人有八个是航空 气动 机械出身 xff0c 更多考虑的是如何让飞机稳定飞起来 飞得更快 飞得更高 如今 xff0c 随着芯片 人工智能 大数据技术的发展 xff0c 无人机开始了智能化 终端化 集群化的趋势
  • 四旋翼飞行器控制原理与设计

    一 相关理论知识 1 坐标系与欧拉角 进行动力学建模之前首先建立坐标系 xff0c 在此建立地球坐标系和机体坐标系 xff0c 如图所示 xff0c 这里地球系z轴方向向下指向地心 xff0c 机体系x轴为机头方向 当描述一个三维空间内的刚