简介《Small Unmanned Aircraft: Theory and Practice》是普林斯顿大学出版社出版的无人机领域经典教材电子版面向无人机飞控算法学习者和相关专业高年级本科生、研究生系统讲解小型无人机从建模到自主飞行的完整理论体系。全书围绕系统架构、坐标系、运动学与动力学、力与矩、线性设计模型等核心内容展开并延伸至自动驾驶仪设计、MAV传感器、状态估计与制导等工程实践环节兼顾理论推导与实际设计项目。资源包为1个PDF文件大小约4.89MB内容完整、目录清晰便于按章节检索与系统研读。目前已有306人学习下载。读者可借此掌握无人机非线性运动方程的线性化方法、协调转弯与配平条件、PID串级回路设计思路以及卡尔曼滤波在姿态估计中的应用适合作为课程教材、科研参考或飞控入门到进阶的自学资料。1. 从一份 2012 年的 PDF 说起小型无人机控制到底该怎么入门很多人第一次接触小型固定翼无人机的控制是从一份流传很广的 PDF 开始的。文件名就叫《Small Unmanned Aircraft: Theory and Practice》普林斯顿大学出版社 2012 年出的作者是两位长期做无人机控制教学的教授。它不是那种翻两页就劝退的纯理论书也不是只贴一堆代码的工程手册而是把坐标系、运动学、动力学、气动力、线性化、自驾仪、状态估计、制导、路径规划、视觉导航这一整条链路按“先建模、再设计、最后仿真验证”的顺序串起来。对做飞控算法、做仿真验证、或者想从零搭一套固定翼自驾仪的人来说这份资源的价值在于它给了一个可以照着复现的完整框架而不是零散的知识点。它适合有反馈控制或机器人基础、但没系统学过气动和飞行动力学的工程师也适合想搞明白“为什么我的姿态环一加积分就振荡”的从业者。2. 坐标系与运动学把机体、气流、地面三套框架理清楚2.1 为什么坐标系是第一个绕不过去的坎小型无人机上几乎所有传感器和执行器都工作在机体坐标系里陀螺仪测的是机体角速度加速度计测的是机体系比力舵面产生的力和力矩也是在机体系里定义的。但任务层给的指令——比如“飞到某个航点”“绕某点盘旋”——是在惯性系地面系里描述的。如果你不把这两套框架之间的旋转关系搞明白后面写出来的控制器一定是错的而且错得很隐蔽仿真里看着能飞一上真机就发散。书里第 2 章把这件事讲得很细核心是旋转矩阵。从机体系到惯性系的变换通常用欧拉角序列滚转-俯仰-偏航即 Z-Y-X 顺序构造。这里有个新手常翻车的地方欧拉角在俯仰角接近 ±90° 时会出现万向节死锁姿态解算会跳变。书里在附录 B 专门补了四元数就是为了绕开这个问题。我一般建议姿态解算内部用四元数只在显示和外部接口处转成欧拉角。2.2 旋转矩阵与坐标变换的可执行写法下面这段 Python 代码把书里第 2 章的旋转矩阵落成了可直接调用的函数包含从欧拉角构造旋转矩阵、以及机体系到惯性系的向量变换。参数说明写在注释里。import numpy as np def rot_body_to_inertial(phi, theta, psi): 由欧拉角构造机体系到惯性系的旋转矩阵 R_I^B 的转置。 phi : 滚转角 roll (rad) theta : 俯仰角 pitch (rad) psi : 偏航角 yaw (rad) 返回 3x3 旋转矩阵满足 v_inertial R v_body c_phi, s_phi np.cos(phi), np.sin(phi) c_th, s_th np.cos(theta), np.sin(theta) c_ps, s_ps np.cos(psi), np.sin(psi) # Z-Y-X 欧拉角序列先偏航、再俯仰、最后滚转 R np.array([ [c_th * c_ps, s_phi * s_th * c_ps - c_phi * s_ps, c_phi * s_th * c_ps s_phi * s_ps], [c_th * s_ps, s_phi * s_th * s_ps c_phi * c_ps, c_phi * s_th * s_ps - s_phi * c_ps], [-s_th, s_phi * c_th, c_phi * c_th] ]) return R def body_velocity_to_inertial(v_body, phi, theta, psi): 把机体系速度向量转到惯性系v_body 为 [u, v, w] R rot_body_to_inertial(phi, theta, psi) return R np.asarray(v_body, dtypefloat)逻辑上rot_body_to_inertial返回的矩阵就是书里式 (2.5) 那一类旋转矩阵的显式展开。参数phi/theta/psi必须用弧度如果你从传感器拿到的是角度先转弧度再传进来否则矩阵数值会完全不对。body_velocity_to_inertial是给后面做位置积分用的机体速度 [u, v, w] 乘上旋转矩阵就得到惯性系下的速度分量。2.3 风速三角与地速、空速的区分书里第 2.4 节讲的“风速三角”是另一个容易被忽略但极其关键的点。空速airspeed是飞机相对于空气的速度地速ground speed是相对于地面的速度两者之间差一个风速向量。自驾仪的气动模型依赖空速而导航和航点跟踪依赖地速。如果你在仿真里把这两个混为一谈遇到有风的场景航迹跟踪会系统性偏移而且你调参数怎么调都调不回来。常见做法是气动力和力矩的计算全部用空速位置和航向的积分用地速。风速三角的关系写成向量形式就是地速等于空速加风速。书里给了二维和三维两种表达实际写仿真时我一般直接用三维向量做避免在爬升或俯冲时丢掉垂直分量。3. 六自由度模型与线性化从 12 状态非线性到可设计的传递函数3.1 12 状态非线性模型是怎么拼出来的书里第 3 章到第 5 章的推进逻辑非常清楚第 3 章先建立刚体运动学和动力学得到状态变量——位置3、姿态3、机体速度3、机体角速度3一共 12 个状态。第 4 章补上重力、气动力和气动力矩、推力第 5 章把这些合起来写成完整的六自由度非线性方程。这里有个设计上的取舍值得说完整的六自由度模型精度高但直接拿来做控制器设计非常不方便因为它是非线性的、耦合的。所以书里第 5 章后半部分做了两件事——配平trim和线性化。配平是找一组状态和输入让飞机受力平衡、做匀速直线飞行线性化是在配平点附近做小扰动展开得到线性状态空间模型和传递函数模型。3.2 配平与线性化的操作步骤配平和线性化在 Matlab/Simulink 里有现成的工具链书里附录 F 专门讲了怎么用trim和linmod命令。下面把典型流程列出来参数含义跟着步骤走。第一步准备好非线性模型。模型输入是四个舵面指令升降舵、副翼、方向舵、油门输出是 12 个状态。书里附录 E 给了两套气动参数一套是飞翼布局一套是常规布局的无人机可以直接拿来当起点。第二步设定配平条件。你要告诉求解器哪些状态是自由的、哪些是固定的。比如做定直平飞配平通常固定高度和速度让俯仰角和升降舵去满足力平衡。% 设定配平时的状态和输入初值 % 状态顺序: [pn pe pd u v w phi theta psi p q r] x0 [0 0 -100 20 0 0 0 0.1 0 0 0 0]; % 输入顺序: [elevator aileron rudder throttle] u0 [0 0 0 0.5]; % 指定哪些状态已知、哪些需要求解 % 这里固定位置和速度让姿态和舵面去配平 ix [1 2 3 4 5 6 10 11 12]; % 已知状态索引 iu []; % 已知输入索引 y0 [x0(ix); u0(iu)]; % 调用 trim目标是把导数置零 [x_trim, u_trim, y_trim, dx_trim] trim(mav_model, x0, u0, y0, ix, iu);ix里放的是你固定住的状态索引iu是固定住的输入索引。trim会调整剩下的自由变量让状态导数尽量接近零。跑完之后一定要检查dx_trim如果某些通道的导数还很大说明配平条件设得不合理或者初值离解太远。第三步在配平点做线性化。用linmod拿到 A、B、C、D 矩阵再转成传递函数看模态。% 在配平点线性化得到状态空间模型 [A, B, C, D] linmod(mav_model, x_trim, u_trim); % 提取纵向通道升降舵到俯仰角 sys_pitch ss(A, B, C, D); tf_pitch tf(sys_pitch(9, 1)); % 第9个状态是theta第1个输入是升降舵linmod返回的 A 矩阵特征值能告诉你纵向有哪几个模态——通常会出现短周期和长周期两个模态。短周期频率高、阻尼相对好调长周期频率低、阻尼很弱是后面自驾仪设计里需要特别照顾的对象。如果你发现长周期模态阻尼是负的别慌这在很多小型无人机上很正常靠自驾仪的俯仰阻尼环去补。3.3 降阶模型什么时候该用什么时候不该用书里第 5.6 节讲了降阶模态把纵向和横向解耦甚至进一步把短周期和长周期分开。降阶的好处是控制器设计简单、物理意义清楚。但边界也很明确当飞机做大机动、或者横向和纵向耦合很强的时候降阶模型会失真。我一般用降阶模型做初始参数整定最终验证一定回到全量非线性模型里跑一遍两边结果对不上就以非线性为准。4. 自驾仪与状态估计串级回路和卡尔曼滤波的落地细节4.1 逐次闭环回路的层级关系书里第 6 章讲的“逐次闭环”successive loop closure是小型无人机自驾仪最常用的结构。它的思路是按带宽从高到低一层层设计最内层是角速率环带宽最高外面是姿态环再外面是航向和高度环最外层是航迹跟踪。每一层设计的时候把内层已经闭合的回路当成一个已知的、近似线性的环节。这个结构的好处是每一层都可以单独调试出问题容易定位。坏处是层与层之间的带宽必须拉开足够距离一般要求外层带宽不超过内层带宽的三分之一到五分之一。如果你把航向环调得跟姿态环一样快两个回路会互相打架表现出来就是等幅振荡怎么改增益都压不下去。4.2 饱和约束与积分限幅书里第 6.2 节专门讲了饱和约束。真实舵机有物理限幅油门也有上下限。如果你的 PID 积分项在舵面饱和期间还在累积等误差反号的时候积分项要花很长时间才能退出去这就是积分饱和。现象是飞机在大偏差修正时反应迟钝或者过冲后长时间回不来。常见做法是加抗积分饱和逻辑当控制输出达到限幅值时停止积分累积或者把积分项反向回灌。书里给的是比较经典的条件积分方案。我一般还会给积分项单独设一个上限防止它在长时间小误差下慢慢爬到一个很大的值。4.3 传感器模型与状态估计的衔接第 7 章把加速度计、陀螺仪、气压计、磁力计、GPS 逐个讲了一遍重点是每个传感器的测量模型和噪声特性。第 8 章接着讲状态估计从低通滤波、传感器模型反解一路推到连续-离散卡尔曼滤波。这里有个实操上的关键点卡尔曼滤波的 Q 和 R 矩阵不是拍脑袋定的。R 来自传感器数据手册的噪声密度Q 来自你对模型不确定性的判断。书里附录 H 给了各类传感器的参数可以当作 R 的起点。如果你发现估计器收敛太慢先检查 R 是不是设得过大如果估计值抖得厉害先检查 Q 是不是设得过小。姿态估计部分书里给了一种用加速度计和磁力计做互补滤波的思路计算量小适合算力有限的平台。GPS 平滑那节讲的是如何把低频 GPS 位置和高频惯性数据融合得到平滑的轨迹估计。这部分在真机上做航迹跟踪时特别有用因为原始 GPS 的跳变会让航向指令跟着抖。5. 制导与路径管理直线跟踪、盘旋和 Dubins 路径的工程取舍5.1 直线路径跟踪的向量场方法书里第 10 章讲的直线路径跟踪用的是向量场方法。核心思想是在路径周围构造一个速度方向场飞机离路径远的时候场的方向指向路径离得近的时候场的方向沿着路径。这样飞机不需要精确地“对准”路径再切入而是自然地收敛过去。实现上你需要计算飞机到路径的横向距离然后根据这个距离查表或者用公式算出期望航向。书里给的公式里有一个关键参数是收敛距离它决定了飞机从远处切入路径的激进程度。这个参数设小了切入慢但平滑设大了切入快但可能过冲。我一般先按翼展的 3 到 5 倍给一个初值再根据试飞调整。5.2 盘旋跟踪与 Dubins 路径盘旋跟踪是在一个圆上飞书里给的控制律是让飞机的航向角速率与到圆心的距离误差成比例。这里要注意盘旋方向——顺时针和逆时针的符号不一样写反了飞机会往外飞。第 11 章的路径管理讲的是航点之间的过渡。两个航点之间如果只连直线飞机在航点处需要急转容易掉高或者失速。Dubins 路径用圆弧加直线的方式把航点连起来保证转弯半径不小于飞机的最小转弯半径。书里给了 Dubins 路径的构造方法实际用的时候要注意最小转弯半径跟空速和最大滚转角有关空速越大、滚转角越小转弯半径越大。如果你在仿真里设的最小转弯半径比实际能飞的小路径跟踪会一直有稳态误差。5.3 路径规划与视觉导航的边界第 12 章讲路径规划包括点到点算法和覆盖算法。点到点算法里比较实用的是基于采样的方法覆盖算法适合做区域扫描。这部分书里讲得偏理论实际工程中还要考虑风、禁飞区、通信距离这些约束。第 13 章的视觉导航涉及云台指向、地理定位、目标运动估计、碰撞时间、精确着陆。这部分对传感器和算力的要求比较高适合有视觉基础的团队。如果你只是想做基础的航迹跟踪这一章可以先跳过等前面几章跑通了再回来啃。6. 仿真验证与踩坑记录那些让我返工三次的细节6.1 仿真步长与积分器选择书里附录 C 和 D 讲了 Simulink 里的动画和 S-Function 建模。我踩过最深的坑是仿真步长。小型无人机的短周期模态频率可能在几赫兹到十几赫兹如果你用固定步长积分步长必须小于最短周期的十分之一否则数值积分本身就会引入虚假的阻尼或者发散。我一般先用变步长跑一遍看模态再用固定步长做实时性验证固定步长取 0.01 秒起步不够再往下压。6.2 常见问题排查清单现象配平跑不出来trim报错或者导数降不下去。 原因初值离配平点太远或者固定的状态和输入组合互相矛盾。 解决先把初值设成接近巡航的状态比如速度 20 米每秒、高度 100 米、俯仰角 0.1 弧度。如果还不行放宽固定条件让更多变量自由。现象线性化后某个模态阻尼为负但仿真里飞机没发散。 原因线性化是在配平点做的只在小扰动下有效。仿真里如果扰动大非线性效应会掩盖线性模型的不稳定。 解决以线性模型为参考设计控制器但验证必须回到非线性模型并且要加扰动测试。现象姿态环一加积分就振荡。 原因积分增益和姿态环带宽不匹配或者积分限幅没设。 解决先把积分增益设为零调好比例和微分再慢慢加积分同时给积分项设上限。现象航迹跟踪在有风时系统性偏移。 原因制导律里用了地速算期望航向但气动模型用的是空速两者没统一。 解决制导层用空速和风速估计算航向修正或者直接用地速做跟踪但把风估计加进前馈。现象卡尔曼滤波估计的姿态角有低频漂移。 原因陀螺零偏没有估计或者磁力计校准不准。 解决把陀螺零偏加进状态向量一起估计磁力计做椭球拟合校准。6.3 从仿真到真机的一个习惯书里的设计项目是让学生从零搭一套完整的仿真包括动力学、传感器、自驾仪、制导。这个过程的真正价值不在于仿真本身而在于你被迫把每个模块的输入输出和单位都理清楚。我后来养成了一个习惯每次改完控制器先在仿真里跑三组测试——无风悬航、有风航迹跟踪、大偏差切入。三组都过了才考虑上真机。这个习惯帮我省下了不少返工时间。6.4 参数整定的一个实用技巧书里第 6 章给的 PID 整定方法偏理论实际调的时候我一般用下面的顺序先把角速率环的比例增益加到刚好不振荡再加微分把相位裕度拉回来然后闭合角速率环调姿态环的比例最后闭合姿态环调航向和高度环。每闭合一层都回到非线性模型里跑一遍阶跃响应看超调量和调节时间。如果某一层怎么调都不满意大概率是内层带宽不够回去把内层调快一点。6.5 关于这份资源的用法这份 PDF 的章节顺序本身就是一条学习路径但不必从头读到尾。如果你已经有控制基础可以直接从第 5 章线性化切入遇到坐标系问题再回第 2 章补。如果你是要搭仿真第 3、4、5 章加附录 E、F 是核心。如果你是要做真机第 6、7、8 章要反复看。书里的设计项目建议至少完整做一遍哪怕只做纵向通道也比只看不练强得多。从那以后我每次拿到一个新的飞控项目都会先把配平点跑出来再确认线性模型的模态和预期一致然后才动控制器参数。这个顺序看起来慢实际上是最快的。希望帮到你。本文还有配套的精品资源点击获取