十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MATLAB四旋翼PD轨迹跟踪控制工程实战拆解

MATLAB四旋翼PD轨迹跟踪控制工程实战拆解 简介基于MATLAB的四旋翼无人机PD轨迹跟踪算法源码包面向无人机控制方向的研究生、工程师及自动化专业学生用于控制算法仿真、课程设计与毕业设计参考。资源共16个文件主体为14个.m脚本另有Simulink仿真模型.mdl及r2011a格式文件压缩包仅28KB轻量易部署。脚本按控制器、动力学模型、轨迹生成与绘图评估等功能拆分模块边界清晰便于单独替换或修改参数。PD控制通过比例环节及时消除位置偏差微分环节预测误差变化趋势、抑制超调包内同时引入加速度控制与跟踪微分器TD等策略有助于提升系统响应速度与控制精度。压缩包源自本科论文仿真程序搭配Simulink模型可快速搭建仿真环境帮助读者从控制器设计、仿真运行到结果可视化理解完整控制闭环。目前已有61人学习浏览是学习四旋翼轨迹跟踪控制及MATLAB仿真实现不可多得的实用参考资料。1. 用PD把四旋翼轨迹跟踪做稳这套MATLAB工程拆给你看做四旋翼轨迹跟踪很多新人的第一反应是上LQR、滑模、反步法或MPC结果模型参数还没标定完就失了信心。这套基于MATLAB的PD轨迹跟踪算法工程给出了一个容易被低估的答案把误差比例项和微分项用好在工程上能解决大多数三维轨迹跟踪问题而且代码量小、调试直观。压缩包整理得很完整从P_ctrl系列控制器、A_ctrl加速度/姿态控制到chap10_1下的TD跟踪微分器、被控对象模型、Simulink仿真和绘图脚本一应俱全适合正在做本科毕设或入门无人机控制研究的读者也适合想快速拿一套可复现工程作为算法基线的工程师。下面按模型、控制律、仿真、调参的顺序把每个文件的用途和衔接关系讲透。2. 四旋翼模型与文件角色先从Pplant和Aplant看被控对象2.1 控制器的存在前提是模型Pplant和Aplant在数学上做了什么chap10_1Pplant.m和chap10_1Aplant.m对应位置环和姿态环或角度环的被控对象模型。这里的plant指被控系统不是控制器本身。四旋翼轨迹跟踪通常采用串级结构外环是位置环输入期望位置输出期望姿态角内环是姿态环输入期望姿态角输出电机指令。P_ctrl_*对应位置控制器A_ctrl_*对应姿态或加速度控制器两者闭环后形成完整的轨迹跟踪系统。位置环被控对象的简化形式通常是% chapel0_1Aplant.m 简化示意 function dot_x plant(x, u, g) % x [px, py, pz, vx, vy, vz] % u [phi_d, theta_d, T] 期望滚转角、俯仰角、总推力 dot_x zeros(6,1); dot_x(1) x(4); dot_x(2) x(5); dot_x(3) x(6); dot_x(4) (cos(x(1))*sin(x(2))*cos(u(2)) sin(x(1))*sin(u(2))) * u(3); dot_x(5) (cos(x(1))*sin(x(2))*sin(u(2)) - sin(x(1))*cos(u(2))) * u(3); dot_x(6) cos(x(1))*cos(x(2))*u(3) - g; end这段模型把四旋翼当作刚体推力沿机体Z轴方向姿态角通过旋转矩阵把推力分解到惯性系。力到加速度的传递是牛顿第二定律没有把电机响应延迟和空气阻力写进来——这在本科论文级的轨迹跟踪验证中足够但如果你要把它移植到真机上必须再补螺旋桨延迟模型。位置环的输出不是直接给电机而是作为内环姿态环的期望值。所以Pplant的输入输出维度要和Aplant能对上位置环输出期望的phi、theta姿态环再把角度误差转换成角加速度或力矩。2.2 双环串级结构为什么比单环PID更适合轨迹跟踪如果只用一组PID直接输出电机指令位置误差和姿态稳定性会互相干扰因为无人机是欠驱动系统水平位移必须通过倾斜姿态来实现。串级结构把「位置-姿态」解耦外环慢、内环快外环输出的姿态期望值不会剧烈跳变内环有足够带宽去跟踪。P_ctrl输出期望角A_ctrl把角度偏差转成力矩这正是文件列表中两组控制器并存的根本原因。调参时也遵循这个原则先内环后外环先让姿态环稳定再调位置环否则内外环交互振荡时你根本分不清是哪个环节的问题。3. PD控制律实现拆解P_ctrl和A_ctrl的设计与参数含义3.1 P_ctrl系列位置环PD控制器的输入输出设计P_ctrl_1.m、P_ctrl_2.m、P_ctrl_3.m看起来是三个不同的实现或通道——常见做法是分别对应x、y、z三个方向的位置控制。每个方向各取一组Kp和Kd因为不同轴的动态特性不同。z轴有重力和推力耦合x/y轴靠姿态倾斜产生水平加速度所以增益不能共用一套。典型的P_ctrl实现如下function [theta_d, phi_d, T] P_ctrl_1(pos_des, pos, vel_des, vel, Kp, Kd, g, mass) % pos_des 期望位置 [x,y,z] % pos 当前实际位置 % vel_des 期望速度 % vel 当前实际速度 e_pos pos_des - pos; e_vel vel_des - vel; % 加速度指令由PD误差构成 a_cmd_x Kp(1) * e_pos(1) Kd(1) * e_vel(1); a_cmd_y Kp(2) * e_pos(2) Kd(2) * e_vel(2); a_cmd_z Kp(3) * e_pos(3) Kd(3) * e_vel(3); % z通道直接解推力 T mass * (g - a_cmd_z); % x/y通道解期望姿态角小角度近似 theta_d a_cmd_x / g; phi_d -a_cmd_y / g; end这里的关键逻辑是位置误差经过PD增益变成期望加速度然后通过四旋翼独有的姿态-加速度耦合关系反解出期望姿态角。Kp把当前位置偏差折算成加速度Kd对速度偏差做阻尼防止位置在目标点附近来回穿越。参数单位的理解很重要。Kp的单位是1/s²加速度/米Kd的单位是1/s加速度/米每秒。如果Kp设成2意味着1米的位置误差会产生2m/s²的修正加速度Kd设成1则1m/s的速度误差再补1m/s²。理解单位比记住具体数值更有价值换到不同量纲的无人机上也不至于瞎试。3.2 A_ctrl系列姿态环PD与角速度阻尼A_ctrl_1.m等文件处理姿态跟踪。位置环给出期望的theta_d和phi_d姿态环需要把这些角度误差变成角加速度指令再映射为电机力矩差。function [tau_phi, tau_theta, tau_psi] A_ctrl_1(att_des, att, rate_des, rate, Kp_att, Kd_att) % att_des 期望姿态角 [phi_d, theta_d, psi_d] % att 当前姿态角 % rate_des 期望角速度通常为0 % rate 当前角速度 e_ang att_des - att; e_rate rate_des - rate; tau_phi Kp_att(1) * e_ang(1) Kd_att(1) * e_rate(1); tau_theta Kp_att(2) * e_ang(2) Kd_att(2) * e_rate(2); tau_psi Kp_att(3) * e_ang(3) Kd_att(3) * e_rate(3); end姿态环的Kp通常比位置环大一个数量级因为姿态角偏差到角加速度只隔一个转动惯量响应要快。Kd对应角速度反馈陀螺仪直接测得相当于在PD基础上引入了真实的阻尼量测。没有角速度反馈的纯角度PD在飞行器上几乎必炸微分项如果只用角度误差差分噪声会被放大器所以工程上姿态环的D项几乎都接在角速度传感器上。角速度用e_rate而不是对e_ang直接差分这个区别值得在代码注释里写清楚。3.3 PD vs PID为什么这套工程没有积分项压缩包里没有出现I_ctrl这符合PD轨迹跟踪的定位。积分项用于消除稳态误差但代价是积分饱和导致的超调和振荡。位置环形况下如果期望轨迹一直在变化而非停在固定目标点积分误差会不断积累反而拖慢响应。真机悬停时静摩擦和重心偏移会产生稳态误差此时恰当地加一点积分有好处但纯仿真环境下模型没有力矩偏置PD就能做到零稳态误差。先跑通PD确定模型可信度之后再按需往z通道加积分是更稳妥的路线。4. 仿真链路与TD跟踪微分器chap10_1系列文件的配合方式4.1 从TD到sim.mdl的完整信号流chap10_1TD1.m和chap10_1TD2.m实现的是跟踪微分器。TD的价值在于给控制器提供平滑的期望轨迹和期望速度而不是直接喂阶跃信号。如果期望位置直接跳变到目标点位置误差瞬间很大PD输出饱和飞机会猛冲过冲然后来回震荡。TD生成一条斜坡型过渡轨迹速度从零逐渐增加给PD一个「可追」的信号。TD的标准离散形式function [x1, x2] TD_Discrete(r, h, v, x1, x2) % r 跟踪速度因子决定过渡快慢 % h 仿真步长 % v 原始期望信号可能带跳变 % x1 平滑后的期望位置 % x2 平滑后的期望速度 % fst函数——最速控制综合函数 d r * h; d0 h * d; y x1 - v h * x2; a0 sqrt(d^2 8 * r * abs(y)); if abs(y) d0 a x2 y / h; else a x2 0.5 * (a0 - d) * sign(y); end if abs(a) d fst -r * a / d; else fst -r * sign(a); end x1 x1 h * x2; x2 x2 h * fst; endTD中r参数决定过渡过程的陡峭程度。r越大过渡越快接近原始信号r越小轨迹越平滑无人机飞得越「稳但慢」。实际仿真时我一般先把r设小确认系统稳定后逐步增大观察哪个值附近开始出现振荡那就是当前PD增益下的跟踪速度上限。位置环的期望速度来自TD输出而不是对期望位置直接用差分这一步能让速度指令不带高频噪声。chap_10_1sim.mdl把上述模块接成Simulink闭环期望轨迹含跳变先进TD输出平滑参考给P_ctrlP_ctrl输出期望姿态角给A_ctrlA_ctrl输出力矩给Pplant/Aplant模型模型状态再反馈回控制器计算误差。这个闭环结构和真机PX4/ArduPilot里的多级控制架构是同一个思路。4.2 sim.mdl的版本兼容与替代方案压缩包里的模型文件名带mdl.r2011a后缀表明这是较老的MATLAB版本格式。如果你用R2022b之后的版本sim命令仍然能打开旧模型但可能触发隐式类型转换警告open_system(chap10_1sim.mdl); out sim(chap10_1sim.mdl); t out.tout;如果打开报错优先查两个地方一是S-Function块的参数列表是否多了没填的场二是MATLAB Function模块里是否使用了旧版API。实在打不开的变通办法是根据m文件重新搭模型——这听起来繁琐但把每个模块的接口梳理一遍后你对控制链路的理解反而更扎实。模型运行后chap10_1plot.m负责画结果曲线。它通常输出三张图期望位置与真实位置对比、三个方向的位置误差曲线、速度及姿态角响应曲线。% chap10_1plot.m 关键逻辑示意 figure; subplot(3,1,1); plot(t, x_des(:,1), r--, t, x_act(:,1), b-, LineWidth, 1.2); legend(期望x, 实际x); xlabel(时间(s)); ylabel(x(m)); grid on;看误差曲线时重点关注收敛时间和稳态振荡幅值。PD控制下的稳态振荡如果存在通常来自微分项的噪声增益和仿真步长过大把Max Step Size调小一档再试比反复调Kd更有效。5. PD轨迹跟踪的调参顺序、数据观测与实战微调技巧5.1 标准调参顺序内环到外环一步只动一个增益拿到这套工程后第一个不要做的事就是直接改Kp跑完整轨迹。正确的做法是先解开外环冻结位置环输出单独验证姿态环。第一步固定期望姿态角为常值给定一个小角度阶跃如5度调Kp_att使响应快速且无超调超调控制在5%以内再加大Kd_att直到振荡消失。第二步解锁位置环给z轴一个0.5米的期望阶跃调z通道的Kp(3)和Kd(3)。z轴直接耦合推力对参数敏感度最高先在z轴找到感觉再处理x/y轴。第三步x/y通道通过倾斜产生加速度响应比z慢增益可比z通道小30-50%。最后把TD接入逐步加大r找到稳定边界。仿真中观察两个数据就足够判断PD参数是否合格观测量目标值超标时的表现位置误差峰值小于期望阶跃的20%比例增益不足或TD过渡太慢收敛时间进入5%误差带2s以内微分增益太大或期望速度受限稳态位置误差小于0.01m需要检查模型是否缺少重力补偿角速度峰值不超过飞行器限幅姿态增益过大5.2 增益数值范围参考不同模型下PD增益没有万能值但以下范围覆盖大多数本科论文级四旋翼模型% 常见初始增益范围单位为国际单位制 Kp_pos [2, 2, 4]; % x/y/z 位置环比例 Kd_pos [1.2, 1.2, 1.8]; % x/y/z 位置环微分 Kp_att [12, 12, 8]; % 姿态角比例 Kd_att [3, 3, 2]; % 姿态角速度阻尼这里给出的是「先能跑」的保守值不是「最优值」。调参时以0.5倍步长增减每个参数变化后至少跑完一次完整轨迹不要连续改多个参数。位置环Kp加大能让跟踪更紧到临界值就会出现高频抖动这个抖动用Kd压不住必须退回Kp。5.3 轨迹跟踪最容易出现的三个坑第一个坑是期望轨迹本身不连续。如果仿真里直接给方波形式的期望位置PD输出会瞬间饱和位置曲线出现明显超调这不是控制器的问题而是参考信号的问题。正确做法是始终把TD放在控制器之前或在外部用smooth或梯形速度规划预处理轨迹。第二个坑是仿真步长和微分项互相打架。定步长用0.01s时Kd超过某个阈值后反而会让系统发散此时先用变步长求解器如ode45确认模型本身稳定再换回定步长。MATLAB的sim命令支持set_param(chap10_1sim, Solver, ode45, MaxStep, 0.001); out sim(chap10_1sim);第三个坑是只盯位置误差不看角度响应。如果位置误差曲线不好看先看姿态角有没有超调再判断位置环增益是否合理。位置误差的滞后往往不是位置环的问题而是内环姿态跟踪速度不够快导致外环指令没有被及时执行。串级系统里这就是著名的「内环带宽不足」现象。5.4 把仿真程序迁移到其他平台的思路这套工程后期如果要迁移到真机或Gazebo中需要替换的是Pplant.m和Aplant.m中的模型参数而不是控制器结构。真机模型里要加的额外项包括电机一阶惯性环节、螺旋桨拉力系数随转速的非线性、陀螺仪噪声模型和滤波延迟。在MATLAB里可以自行构造这些函数来模拟graph TD A[期望轨迹] -- B[TD1] -- C[P_ctrl] B -- D[TD2] -- C C -- E[A_ctrl] -- F[动力学模型] F -- G[状态反馈] G -- C G -- E上面是控制回路的拓扑示意图——虽然正文规范不要求绘制但实际调试时我习惯于先画出这样的框图再对照sim.mdl里的每个模块确认信号流向和理解完全一致。当你做到这一步这套PD轨迹跟踪程序就不只是能跑通的一个工程包而是你理解四旋翼控制体系结构的一块稳固的跳板。本文还有配套的精品资源点击获取
返回列表