简介《Small Unmanned Aircraft: Theory and Practice》是一份面向无人机飞控方向的高阶教材型PDF适合航空航天、自动化与控制工程专业学生、研究人员及工程实践者系统学习小型无人机的建模、控制与制导。内容从系统架构、坐标系与旋转矩阵讲起依次展开运动学与刚体动力学、气动力与力矩、配平条件、传递函数及线性状态空间模型并延伸到连续闭环自动驾驶仪设计、机载传感器、状态估计与卡尔曼滤波、制导设计等主题兼顾理论推导与设计项目。压缩包内为1个PDF文件约4.89MB单文件结构便于检索和离线阅读。已有309人学习说明其在无人机控制领域具有一定参考价值。读者可据此建立从动力学建模到飞控实现的完整知识链路并结合各章设计项目加深对坐标转换、线性化建模、PID回路与姿态估计等关键环节的理解。1. 小型无人机到底是什么从“会飞的手机”说起很多人第一次见到小型无人机会把它当成“装了螺旋桨的遥控飞机”。这个理解不算错但漏掉了最关键的部分遥控飞机是人在下面扳摇杆飞机只负责执行小型无人机是自己决定往哪飞、飞多高、拐多大弯。两者的差别不在有没有螺旋桨而在于飞机上有没有一整套“感知—决策—执行”的闭环。用一句话说小型无人机是一类翼展不大、载荷有限却能依靠机载传感器和算法完成自主飞行的小型固定翼飞行器。它值得搞懂是因为它把空气动力学、控制理论、传感器融合和路径规划压缩进了几十厘米到几米的空间里任何一个环节没想清楚飞机就会用一次失控来提醒你。2. 无人机凭什么自己飞感知、决策、执行的三层架构2.1 三层架构各自在忙什么把小型无人机拆开看它的系统架构可以粗暴地分成三层感知器、控制器、执行器。感知器负责回答“我现在在哪、姿态是什么、速度多少”控制器负责回答“下一步舵面该怎么偏、油门该给多少”执行器负责把控制器的电信号变成舵面的机械转动和电机的转速变化。这个过程和开车很像。眼睛和耳朵是传感器大脑是控制器手脚是执行器。你开车时不会每秒钟都想“我要不要往左打半度方向”大脑把这件事交给了肌肉记忆和条件反射。无人机的自动驾驶仪干的就是这个活它不关心你从哪来、到哪去只负责把滚转角、俯仰角、空速、高度、航向这几个量稳在指令值附近。高一级的路径规划模块再告诉它“下一个航点在哪、沿着哪条线飞”。三层之间是有严格分工的。感知层输出的是带噪声的原始测量控制层需要的是干净的状态估计执行层需要的是限幅后的舵面指令。任何一层越界整个回路就会出问题。比如把未经滤波的陀螺仪信号直接送给舵机舵机会跟着噪声高频抖动几分钟内就能把舵机齿轮磨平。提示感知、控制、执行三层不是并列关系而是串联关系。上游一层的噪声和延迟会沿着链条往下游放大所以越靠前的环节越值得花时间。2.2 小尺寸反而更难载荷限制带来的连锁反应固定翼无人机按翼展大致能分成两档。小型无人机一般指翼展在 5 到 10 英尺之间的固定翼多数烧汽油起降需要跑道续航能到 10 到 12 小时载荷在 10 到 50 磅。再往下是翼展小于 5 英尺的微型飞行器电池驱动手抛起飞、腹部着陆续航从 20 分钟到几个小时不等载荷只有几盎司到几磅。类别翼展动力起降方式续航载荷小型无人机510 英尺汽油为主跑道起降1012 小时1050 磅微型飞行器小于 5 英尺电池为主手抛、腹部着陆20 分钟数小时几盎司几磅这张表最值得看的是最后一列。载荷越小能装的传感器越少能带的计算机越弱但自主飞行的难度并没有同步降低。一架 5 英尺翼展的飞机遇到阵风照样会被吹偏一架 3 英尺翼展的飞机遇到同样的阵风偏得更快、修正窗口更短。载荷限制和扰动强度之间的这个剪刀差才是小尺寸无人机真正的难点。所以这本书从头到尾都在处理同一个矛盾用有限的传感器和有限的计算资源去应对一个并不因为飞机小而变简单的飞行控制问题。理解了这一点后面所有的坐标系、模型、滤波器、路径算法都是在给这个矛盾找工程解。2.3 为什么需要“设计模型”而不是直接写代码试很多人第一反应是既然要飞那就写代码、烧进飞控、扔上天试。这条路不是不能走但试错成本极高。一次摔机损失的不仅是机身还有传感器、电池、以及你花了几周调出来的参数——这些参数在摔机后没有任何参考价值因为你不知道是参数错了、模型错了还是当天风太大。设计模型的作用是把“试飞”这件事从物理世界搬到计算机里先跑一遍。模型不需要和真机一模一样它只需要在关键频段上足够准。什么是关键频段就是你控制器带宽附近的频段。你的滚转角回路带宽大概在 2 到 5 赫兹那么模型在 1 到 10 赫兹范围内的幅频和相频特性就必须靠谱至于 50 赫兹以上的细节差一点没关系。这本书给出的设计模型覆盖了从坐标系、运动学、动力学、气动力、配平、线性化到自动驾驶仪、传感器、状态估计、制导、路径跟踪的完整链条。每一章后面都配了设计项目让你把这一章的概念实现成一个可以跑的模块。把这些模块串起来就是一个端到端的飞行仿真器给定航点飞机能自己起飞、爬升、转弯、跟踪直线、绕圈、降落。这个仿真器本身不是目的目的是让你在摔第一架真机之前已经知道每一个参数在系统里起什么作用。3. 坐标系与运动学无人机怎么知道“我在哪、朝哪飞”3.1 三套坐标系惯性系、机体系、气流系小型无人机身上同时跑着三套坐标系初学者最容易在这里翻车。第一套叫惯性坐标系原点固定在地面某处x 轴指北、y 轴指东、z 轴指地。GPS 给出的经纬度和高度本质上就是在这个系里描述位置。第二套叫机体坐标系原点在飞机重心x 轴指机头、y 轴指右翼、z 轴指机腹。陀螺仪测的角速度、加速度计测的比力都是在这个系里。第三套叫气流坐标系x 轴沿着空速方向z 轴在飞机对称面内垂直于空速。升力和阻力就是在这个系里定义的。为什么非要搞三套因为不同来源的信息天然属于不同的系。GPS 不知道你的机头朝哪它只知道你在惯性系里的坐标陀螺仪不知道你在世界里的绝对位置它只知道机体相对惯性空间的转动角速度气动数据表里的升力系数是按气流系的角度定义的。控制器要做的第一件事就是把这些不同系里的量统一到同一个系里比较。把机体系转到惯性系靠的是旋转矩阵。绕 z 轴转偏航角、绕 y 轴转俯仰角、绕 x 轴转滚转角三个基本旋转矩阵乘起来就得到一个 3×3 的方向余弦矩阵。这个矩阵的每一列就是机体系的三个轴在惯性系里的方向。import numpy as np def rotation_body_to_inertial(roll, pitch, yaw): # 三个基本旋转矩阵顺序为 Z-Y-X偏航-俯仰-滚转 cr, sr np.cos(roll), np.sin(roll) cp, sp np.cos(pitch), np.sin(pitch) cy, sy np.cos(yaw), np.sin(yaw) Rz np.array([[cy, -sy, 0], [sy, cy, 0], [0, 0, 1]]) Ry np.array([[ cp, 0, sp], [ 0, 1, 0], [-sp, 0, cp]]) Rx np.array([[1, 0, 0], [0, cr, -sr], [0, sr, cr]]) # 先滚转、再俯仰、最后偏航 return Rz Ry Rx R rotation_body_to_inertial(0.1, 0.05, 1.2) print(R)这段代码里的roll、pitch、yaw是欧拉角单位是弧度。Rz Ry Rx的乘法顺序不能随便换换完之后得到的是另一套旋转约定和传感器输出对不上。实际工程里更常见的做法是用四元数做姿态传播因为欧拉角在俯仰角接近 ±90 度时会出现万向节锁旋转矩阵在这个点附近数值上也会变得病态。四元数没有这个问题代价是多了一层“从四元数反解欧拉角”的换算。3.2 旋转矩阵与风三角空速、地速、风速的关系飞机相对空气运动的速度叫空速相对地面运动的速度叫地速两者之间的差就是风速。这三个量构成一个向量三角形地速 空速 风速。逆风飞行时空速不变的情况下地速会变小顺风时地速会变大。这个关系听起来像常识但在控制器设计里非常关键。姿态控制器关心的是空速因为升力正比于空速的平方。空速掉到失速速度以下飞机就会掉高度这时候你盯着地速看是看不出问题的——地速可能因为顺风还很漂亮但机翼已经快不产生升力了。路径跟踪控制器关心的是地速因为航点是在地面坐标系里定义的你实际飞过的轨迹由地速决定。风三角还有一个隐藏作用它把“风”从一个扰动变成了一个可观测的量。如果你同时知道空速向量和地速向量两者相减就得到风速向量。这就是为什么很多飞控在 GPS 和空速管同时可用的条件下能在线估计出风的大小和方向并把估计结果送给路径跟踪器做前馈补偿。没有这个补偿飞机在侧风里跟踪直线会一直偏在航线的一侧控制器拼命修修出来的效果就是航迹画出一条弧线。3.3 十二个状态把一架飞机的姿态和运动装进一个向量描述一架刚体飞机在空间里的完整运动需要十二个状态三个位置、三个速度、三个姿态角、三个角速度。位置和速度描述质心运动姿态角和角速度描述绕质心的转动。这十二个量不是随便凑的它们两两成对位置求导得速度姿态角求导得角速度中间差一个旋转矩阵的变换。运动学和动力学在这里分家了。运动学只关心几何关系位置怎么随速度变化姿态角怎么随角速度变化。它不关心力也不关心质量。动力学关心的是另一件事速度怎么随受力变化角速度怎么随力矩变化。牛顿第二定律管的是动力学运动学只管“你动成什么样”不管“你为什么这么动”。把这两组方程合在一起就是六自由度十二状态非线性模型。这个模型不假设小角度、不假设线性、不忽略耦合它能描述大机动、大迎角、快速滚转这些线性模型覆盖不了的情况。代价是它太复杂了复杂到没法直接拿来做控制器设计。你没法对一个十二状态的非线性方程组画伯德图也没法直接读它的相位裕度。所以工程上的标准做法是非线性模型用来做仿真验证线性模型用来做控制器设计。两者各司其职缺一不可。4. 力与力矩升力、阻力和配平4.1 四种力重力、气动力、推进力、大气扰动作用在小型无人机上的力可以归成四类。第一类是重力方向永远指向地心大小等于质量乘以重力加速度。重力在惯性系里是个常数向量但一旦转到机体系它就会随着滚转角和俯仰角的变化而重新分配。飞机倾斜的时候重力在机体 z 轴上的分量变小在 y 轴上的分量变大这就是为什么转弯需要额外拉杆。第二类是气动力包括升力、阻力和侧力。升力垂直于空速方向阻力平行于空速方向且反向侧力在对称面内垂直于升力和阻力。升力和阻力都可以写成动压乘以参考面积再乘以无量纲系数的形式。阻力系数里有一项叫诱导阻力正比于升力系数的平方——升力越大诱导阻力越大。这个平方关系是固定翼飞机的一个基本约束你不能既要大升力又要低阻力只能在效率和机动性之间找平衡点。第三类是推进力沿机头方向简化模型里这么假设由电机或发动机提供。第四类是大气扰动包括阵风、湍流、风切变。扰动不是直接作用在舵面上的它是通过改变来流速度和来流角间接改变气动力和力矩。所以在模型里扰动通常以附加速度分量的形式进入气动力计算而不是单独加一个力。力矩这边对应着三组滚转力矩、俯仰力矩、偏航力矩。滚转力矩主要由副翼差动产生俯仰力矩由升降舵产生偏航力矩由方向舵产生。三者之间有耦合滚转的时候会诱导偏航偏航的时候也会诱导滚转。这个耦合在转弯的时候特别明显也是横侧向控制器设计比纵向控制器麻烦的原因之一。4.2 配平巡航时舵面为什么几乎不动配平是飞行控制里一个特别朴素但特别重要的概念。所谓配平就是找到一组状态和输入使得合力为零、合力矩为零。飞机在这个状态下不需要任何额外的控制 effort 就能保持匀速直线飞行。你坐客机巡航的时候机翼几乎不抖、舵面几乎不动飞机稳稳地往前飞那就是配平状态。配平点不是唯一的。给定一个高度和一个空速可以解出一组对应的迎角、俯仰角、油门和升降舵偏角。换个空速配平点就变了。空速越大需要的迎角越小油门越大空速越小需要的迎角越大油门越小。当空速低到某个临界值以下需要的迎角超过失速迎角就配不出平了——这就是失速边界。配平在工程上的意义是给线性化提供一个工作点。你不可能在整個飞行包线里用一个线性模型但你可以把包线切成若干段每一段围绕一个配平点做线性化。控制器在哪个配平点附近工作就用哪个线性模型来设计。这也是为什么这本书花了一整章讲配平条件而不是直接跳到传递函数。注意配平点算错后面所有线性模型都会跟着错。配平是线性化的地基地基歪了上面的控制器设计得再漂亮也是白搭。4.3 线性化工程师为什么偏爱“小偏差”模型十二状态非线性模型没法直接拿来做频域分析但飞机在实际飞行中大部分时间都在配平点附近小幅波动。滚转角不会无缘无故从 0 度跳到 60 度空速不会在一秒内变化 10 米每秒。这个“小幅波动”就是线性化的物理依据。线性化的数学操作是在配平点附近对非线性方程做泰勒展开只保留一阶项扔掉二阶及以上。展开完得到四个矩阵A 是状态雅可比B 是输入雅可比C 是输出雅可比D 是直接传递矩阵。这四个矩阵一出来非线性系统就变成了一个线性时不变系统伯德图、根轨迹、奈奎斯特判据、LQR、H∞全套工具都能上了。线性模型的另一个好处是它能拆。十二状态模型可以拆成纵向和横侧向两组纵向管空速、迎角、俯仰角、高度横侧向管滚转角、偏航角、侧滑角。两组之间的耦合项在小扰动假设下可以忽略于是两个六状态模型可以分开设计控制器。这就是为什么自动驾驶仪通常分成纵向自动驾驶仪和横侧向自动驾驶仪两套各调各的调完再合起来验。线性化也不是没有代价。它只在配平点附近有效一旦飞机进入大迎角、大侧滑、快速滚转这些非线性区域线性模型的预测就会偏得离谱。所以工程上的标准流程是线性模型设计控制器非线性模型验证控制器真机试飞确认控制器。三步缺一不可跳步的代价通常是一次摔机。5. 常见误区与易混概念这五组词最容易把人带沟里5.1 坐标系搞混同一个“位置”在不同系里不是同一个数易混点GPS 给出的位置、陀螺仪测的角速度、气动系数用的角度很多人以为它们都在同一个坐标系里。为什么混这三组量在数值上都是三个数形式上看起来一样初学者很容易直接拿来做加减。怎么区分先问一句“这个量是相对谁定义的”。GPS 位置是相对地面定义的属于惯性系陀螺仪角速度是相对惯性空间定义的但表达在机体系里气动系数里的迎角和侧滑角是相对来流定义的属于气流系。三个系之间的转换靠旋转矩阵不转换就直接运算得到的数在物理上没有意义。5.2 空速、地速、风速有风时它们差得很远易混点把空速当成地速或者反过来。为什么混无风的时候两者数值相等平时看飞控地面站上的数字不刮风的日子里两个数一模一样很容易形成“它们本来就是一回事”的错觉。怎么区分看有没有风。逆风时空速大于地速顺风时空速小于地速侧风时两者方向都不一样。判断失速看空速判断到没到航点看地速。这两件事搞反了轻则航点跟踪画弧线重则失速坠机。5.3 六自由度模型与线性模型不是越复杂越适合调参易混点觉得十二状态非线性模型更“真实”所以直接拿它来调 PID。为什么混“真实”这个词有迷惑性越真实的模型听起来越靠谱。怎么区分看用途。非线性模型是用来做仿真验证的它回答“这套控制器在真实动力学下会不会出问题”线性模型是用来做控制器设计的它回答“这套控制器的带宽、相位裕度、阻尼比是多少”。调参需要的是频域指标频域指标只在线性模型上有定义。拿非线性模型调参等于拿一把没有刻度的尺子量长度。5.4 滤波与估计低通滤波和卡尔曼滤波不是一回事易混点把卡尔曼滤波当成“更高级的低通滤波”。为什么混两者都能让曲线变平滑输出看起来都是“去噪后的信号”。怎么区分低通滤波只用了当前和过去的测量它不知道系统是怎么动的卡尔曼滤波同时用了测量和系统模型它一边预测“下一时刻状态应该在哪”一边用测量修正预测。低通滤波的滞后是固定的卡尔曼滤波的滞后取决于模型准不准和噪声参数调得好不好。传感器融合场景下卡尔曼滤波能融合加速度计和陀螺仪低通滤波只能各自滤波再拼起来。5.5 路径跟踪与轨迹跟踪跟一条线和一个点不是同一件事易混点把路径跟踪和轨迹跟踪当成同义词。为什么混中文里“跟踪”这个词覆盖了太多含义英文里 path following 和 trajectory tracking 也是近亲。怎么区分看有没有时间约束。路径跟踪只要求飞机收敛到一条几何路径上不要求它在某个时刻到达某个特定位置轨迹跟踪要求飞机在每个时刻都处于轨迹上对应的位置。路径跟踪允许你飞得快一点或慢一点轨迹跟踪不允许。固定翼无人机常用的是路径跟踪因为风一吹精确的时间同步非常难做到硬做只会让控制器频繁饱和。6. 什么时候该信模型、什么时候该信试飞一个直线跟踪的例子假设你要让一架小型无人机沿着一条直线飞从 A 点飞到 B 点航线方向正北侧风从东往西吹。你有两个选择直接在真机上试 PID或者先在仿真里把模型跑通再上真机。直接试 PID 的流程是给一个滚转角指令看飞机往哪偏改比例增益再试再改。侧风一吹飞机往西偏你把比例增益调大飞机修正得更快但开始来回摆你把微分增益调大摆动压下去了但遇到阵风又开始抖。你在真机上反复迭代每次迭代都要起降一次每次起降都有风险。更麻烦的是你不知道摆动是增益太大引起的还是传感器延迟引起的还是舵机饱和引起的。三个原因在时域波形上长得差不多。先跑模型的流程是在仿真里把配平点算出来在配平点附近线性化拿到横侧向的传递函数看它的幅频特性。你会发现滚转角回路的带宽大概在 3 赫兹左右相位裕度在 45 度附近。然后你设计一个滚转角控制器让内环带宽落在 2 到 3 赫兹外环航迹跟踪带宽落在外环的十分之一左右也就是 0.2 到 0.3 赫兹。内外环带宽差一个数量级这是逐次回路闭合的基本要求目的是让内外环的动态解耦。调完之后在非线性模型里跑一遍加侧风、加传感器噪声、加舵机限幅看航迹误差有没有收敛。做法优点风险直接真机试 PID不用建模型上手快摔机成本高多因素耦合难定位先仿真后真机参数有频域依据风险前置建模花时间模型不准会误导两种做法不是对立的。真机试飞永远需要模型再准也代替不了真实的气动和真实的阵风。但试飞应该发生在“我已经知道这套参数为什么应该work”之后而不是“我试试这套参数行不行”之前。# 横侧向航迹跟踪的简化伪代码只表达结构不代表完整实现 Kp_cross 0.8 # 横向误差到滚转角指令的比例增益 Kd_cross 0.15 # 横向误差变化率的微分增益 phi_limit 0.5 # 滚转角指令限幅单位弧度约 28 度 def lateral_tracking(cross_track_error, cross_track_rate, course_error): # 外环横向误差转滚转角指令 phi_cmd Kp_cross * cross_track_error Kd_cross * cross_track_rate # 航向误差前馈减小稳态偏差 phi_cmd 0.3 * course_error # 限幅防止内环被大指令打饱和 phi_cmd max(-phi_limit, min(phi_limit, phi_cmd)) return phi_cmd这段伪代码里cross_track_error是飞机到航线的垂直距离cross_track_rate是它的变化率course_error是机头方向和航线方向的夹角。三个量分别对应比例、微分和前馈。phi_limit是硬限幅作用不是“保护飞机”而是“保护内环”——外环给出一个 60 度的滚转指令内环根本跟不动跟不动的结果就是积分项累积、退饱和时过冲最后航迹画出一条大弧线。限幅放在外环输出端比放在内环输入端更早生效这是逐次回路闭合里的一个常规操作。我自己的习惯是每次上真机之前强制在仿真里把配平点、线性模型、内外环带宽、限幅值这四样东西过一遍。有一次偷懒跳过了配平检查直接拿上一架飞机的参数套到新机身上结果新机的重心偏后配平升降舵偏角比预期大了 4 度起飞后俯仰回路一直在慢速振荡落地检查才发现是配平点错了。从那以后我每次换机身都强制走一遍配平不管时间多紧。希望帮到你。本文还有配套的精品资源点击获取