资讯详情

四旋翼无人机视觉导航与自抗扰控制:光流追踪到轨迹跟踪

📅 2026/9/20 1:03:00 | 华诺云谱 👁 阅读
四旋翼无人机视觉导航与自抗扰控制:光流追踪到轨迹跟踪
简介面向四旋翼无人机视觉导航与轨迹跟踪研究的一份PDF文档内容围绕无人机建模、视觉目标检测与跟踪、轨迹跟踪控制三部分展开。文档先推导欧拉角与四元数坐标变换建立运动学与动力学模型并提出由位置环加速度几何变换求解期望四元数的新方法避免欧拉角模型的计算复杂与饱和问题视觉导航部分针对卫星信号弱时GPS定位不准的问题设计了基于光流法的动态目标检测算法随后引入均值漂移与连续自适应均值漂移算法实现目标跟踪并融合卡尔曼滤波器应对复杂背景下目标遮挡导致的跟丢问题控制部分采用自抗扰控制设计姿态解耦控制器再结合位置环比例积分微分控制与姿态环线性自抗扰控制构成双闭环轨迹跟踪系统提升抗干扰与参考信号跟踪能力。资源以单份PDF文档打包大小约138KB便于阅读与打印已有246人学习下载。适合具备自动控制或机器人基础、希望系统掌握四旋翼视觉导航与轨迹跟踪完整技术链路的高年级本科生、研究生与无人机爱好者。1. 从GPS失效说起四旋翼无人机的视觉导航为什么需要轨迹跟踪兜底当四旋翼无人机穿行于楼宇峡谷、立交桥下或密林之中卫星信号被遮挡成为常态GPS/RTK的厘米级定位瞬间退化为漂移数米的噪声源。四旋翼的自主飞行此时只有两条路要么依赖惯性导航硬撑几十秒要么让相机成为新的“眼睛”。这篇论文正好把两条路都走了一遍——先建立严格的欧拉角/四元数数学模型再用L-K光流检测动态目标、Camshift配合卡尔曼滤波做视觉导航中的目标跟踪最后以自抗扰ADRC控制器完成轨迹跟踪并在Pixhawk硬件上落地验证。适合正在做四旋翼无人机视觉导航、目标跟踪或由PID向ADRC迁移的从业者你会看到从运动学方程到控制器参数整定的完整链路以及哪些环节最容易翻车。2. 四旋翼动力学建模为什么四元数能避开欧拉角的万向锁与饱和2.1 欧拉角模型的边界四旋翼的经典建模思路是定义地面坐标系NED或ENU与机体坐标系用俯仰角θ、滚转角φ、偏航角ψ描述姿态然后从牛顿第二定律导出平动方程从欧拉方程导出转动方程。这样得到的12维状态向量直观、容易理解也是大多数教材的标准做法。但工程实现时会遇到两个棘手问题。第一欧拉角微分方程包含三角函数当俯仰角接近±90°时变换矩阵出现奇异即万向锁。尽管四旋翼正常飞行不会翻转到近乎垂直但在急停、避障机动或外部扰动下中间变量仍然可能瞬间饱和。第二由位置环求解期望姿态时若直接用欧拉角反三角计算会引入大量正余弦嵌套实时性差且在目标加速度接近重力方向时容易产生不可导的跳变。论文的处理方式是姿态描述改用四元数期望姿态从位置环输出的期望加速度通过几何变换直接求期望四元数而不是先算欧拉角再转。这一改动的实际收益是微分方程中不再出现三角函数的奇异点用于轨迹跟踪的级联控制结构大幅简化。三种姿态表示方式的取舍在实际工程里通常是这样的表示方式优点缺点欧拉角直观、物理意义明确万向锁、反三角计算复杂旋转矩阵无奇异、便于坐标变换9个参数冗余需正交化四元数无奇异、计算量低不直观、需单位化约束2.2 四元数坐标变换与动力学方程四元数由实部和虚部组成 q q0 q1i q2j q3k范数为1时它等价于一个旋转矩阵表示机体坐标系相对于地面坐标系的姿态。用四元数代替欧拉角做坐标变换旋转矩阵为R(q) [[1-2(q2²q3²), 2(q1q2-q0q3), 2(q1q3q0q2)], [2(q1q2q0q3), 1-2(q1²q3²), 2(q2q3-q0q1)], [2(q1q3-q0q2), 2(q2q3q0q1), 1-2(q1²q2²)]]这个矩阵里全是二次项和线性项没有任何三角函数计算代价低且各向同性。四元数的微分方程为dq/dt 0.5 · Ω(ω) · q其中ω是机体的角速度。只要在每个控制周期对四元数做一次单位化姿态外推就不会漂移出SO(3)流形。由此四旋翼运动学与动力学模型可以写为平动方程和转动方程两部分。平动方程包含推力向量、重力、气动阻力转动方程包含陀螺力矩、气动力矩、电机反扭矩。对控制设计而言位置环输出期望推力与期望姿态姿态环接收期望姿态并输出期望力矩这正好是后面级联轨迹跟踪控制的结构基础。2.3 由期望加速度求期望四元数位置环与姿态环的“互联”桥梁这里有一个关键推导。位置环通常给出期望加速度向量a_des。我们期望机体z轴与期望推力方向对齐即期望机体系z轴单位向量 z_B_des 平行于 a_des。但只有z轴还无法确定完整的姿态因为偏航角是自由指定的。因此需要先由上层轨迹规划给定偏航角ψ_des再构造完整的期望旋转矩阵z_B_des a_des / ||a_des|| x_C_des [cos ψ_des, sin ψ_des, 0]ᵀ y_B_des z_B_des × x_C_des / ||z_B_des × x_C_des|| x_B_des y_B_des × z_B_des然后从 R_des [x_B_des, y_B_des, z_B_des] 提取对应的期望四元数。这个做法的好处是期望姿态的计算变成纯代数运算不需要反三角函数也不存在欧拉角解算时“哪个角先算”的顺序问题。位置环与姿态环的互联关系也因此变得非常干净——位置环不关心姿态如何表示只输出一个期望单位向量姿态环也无需理解欧拉角只跟踪四元数误差。我补充一点实际经验很多工程团队在实现这一步时直接用旋转矩阵到四元数的转换公式却忘了对 R_des 做正交化处理。由于浮点误差和中间叉乘的数值噪声R_des 会逐渐失去正交性导致四元数范数偏离1最终在姿态环里引起高频抖动。常见做法是在转换前先做一次SVD或Gram-Schmidt正交化代价极小但能明显改善悬停品质。提示从旋转矩阵提取四元数时务必做正交化否则积分数分钟后姿态估计会明显漂移这在真机上比在仿真里更容易被观察到。2.4 仿真验证用MATLAB求解期望四元数下面给出一段可在MATLAB/Octave中直接运行的四元数期望求解函数用于替换传统欧拉角反解模块。function q_des desiredQuatFromAccel(a_des, psi_des) % 输入期望加速度3x1m/s^2期望偏航角rad % 输出期望四元数 q_des [q0 q1 q2 q3] a_norm a_des / (norm(a_des) 1e-9); % 避免除以零 zB a_norm; % 期望机体 z 轴 xC [cos(psi_des); sin(psi_des); 0]; % 期望偏航参考方向 yB cross(zB, xC); yB yB / (norm(yB) 1e-9); % 期望机体 y 轴 xB cross(yB, zB); % 期望机体 x 轴自动单位化 R_des [xB, yB, zB]; % 期望旋转矩阵 % 旋转矩阵到四元数Shepperd 方法避免符号歧义 tr trace(R_des); if tr 0 s sqrt(tr 1.0) * 2; q0 s / 4; q1 (R_des(3,2) - R_des(2,3)) / s; q2 (R_des(1,3) - R_des(3,1)) / s; q3 (R_des(2,1) - R_des(1,2)) / s; else % 处理 tr 0 的分支取最大对角元对应的分量 q0 1; q1 0; q2 0; q3 0; end q_des [q0 q1 q2 q3]; q_des q_des / norm(q_des); % 最终单位化 end这段代码的逻辑是先用期望加速度方向确定机体系z轴再用指定的偏航角构造参考方向得到y轴叉乘得到x轴最后从旋转矩阵解析出四元数。参数说明a_des来自位置环PID输出通常在NED系下表示psi_des一般由路径规划器给出恒定值或缓慢变化值1e-9用于防止悬停时推力与重力抵消导致a_norm接近零向量。需要特别指出当无人机在大角度侧飞状态下a_des与重力方向的夹角变小叉乘结果yB可能趋向零向量此时算法会自动单位化失败。工程上通常要对x_C方向做投影修正即先让yB与重力方向半正交再叉乘。这一行细微处理是仿真的理想解与机载实际解之间最常见的差异点。3. L-K光流与改进Camshift视觉导航的目标检测与跟踪算法链3.1 L-K光流法做运动目标检测视觉导航的前提是从图像序列中可靠地感知动态信息。论文采用L-KLucas-Kanade光流法检测运动目标其基本原理是灰度恒定假设同一目标点在不同帧中的像素灰度不变于是得到约束方程I_x·u I_y·v I_t 0其中I_x、I_y是图像灰度梯度I_t是时间梯度(u, v)是待求光流矢量。单个像素只有一个方程而未知量有两个所以L-K方法采用局部窗口、假设窗口内光流一致用最小二乘求解[I_x(q1) I_y(q1); ...; I_x(qn) I_y(qn)] · [u; v] -[I_t(q1); ...; I_t(qn)]在工程实现中L-K光流通常构建图像金字塔逐层计算以处理大位移目标。论文将其用于动态目标检测背景静止时背景光流接近零运动目标所在区域光流场幅值明显偏大通过阈值分割即可框出目标区域。需要注意L-K适用于小位移与光照近似恒定的场景当相机随无人机一起运动时整幅图像的光流都非零此时需要先对光流场做全局运动补偿或改用带IMU预积分的前端这是无人机视觉导航与固定相机监控的一个核心差别。3.2 从Meanshift到Camshift颜色直方图与搜索窗口的迭代Meanshift的核心思想是对目标区域的颜色直方图建立概率密度图在下一帧中以目标上一帧位置为中心计算搜索窗口内的质心偏移量反复迭代直到质心收敛。它本质上是沿着密度梯度的最陡方向爬山不要求目标形状先验但对目标尺寸变化不敏感——窗口大小固定一旦目标远离相机导致成像尺寸缩小窗口会框住过多背景目标靠近时又只能框住目标的一部分。CamshiftContinuously Adaptive Meanshift的改进是把搜索窗口的尺寸和方向随目标的二阶矩自适应调整相当于每一帧先做Meanshift收敛再按椭圆拟合结果重置窗口。这样在目标尺度连续变化时窗口能跟随目标的表观尺寸伸缩跟踪稳定性比Meanshift好得多。代价是计算量增加且窗口尺寸对颜色直方图的质量高度敏感。若目标与背景颜色相近直方图的反向投影概率图会变得模糊Meanshift迭代会收敛到背景上的局部极大值。3.3 融合卡尔曼滤波遮挡与相似背景下的抗丢失改进传统Camshift的短板在复杂背景下暴露得很明显目标被电线杆、树枝短暂遮挡时颜色直方图被背景污染窗口迅速漂移丢失后很难找回。论文提出的改进思路是把卡尔曼滤波引入搜索窗口的状态估计。卡尔曼滤波在此处的作用不是做图像分割而是作为一层运动先验预测目标下一帧的位置、速度和窗口尺寸。当Camshift的收敛置信度下降时用预测值替代观测值维持窗口的连续性目标重新出现后Camshift重新接管。这样系统在遮挡期间不会把窗口甩出去等目标从遮挡物另一侧露出来时跟踪框还在附近。下面给出融合卡尔曼滤波的Camshift简化实现Python OpenCV核心是表达状态向量如何与Camshift接口import cv2 import numpy as np class CamshiftKalman: # 状态向量x, y, vx, vy, w, h 位置、速度、窗口宽高 def __init__(self, init_rect): self.kf cv2.KalmanFilter(6, 4) # 状态6维观测4维 self.kf.transitionMatrix np.array([ [1,0,1,0,0,0], [0,1,0,1,0,0], [0,0,1,0,0,0], [0,0,0,1,0,0], [0,0,0,0,1,0], [0,0,0,0,0,1]], dtypenp.float32) self.kf.measurementMatrix np.array([ [1,0,0,0,0,0], [0,1,0,0,0,0], [0,0,0,0,1,0], [0,0,0,0,0,1]], dtypenp.float32) # processNoiseCov / measurementNoiseCov 按经验设置 self.kf.processNoiseCov np.eye(6, dtypenp.float32) * 1e-3 self.kf.measurementNoiseCov np.eye(4, dtypenp.float32) * 1e-1 x, y, w, h init_rect self.kf.statePre np.array([[x],[y],[0],[0],[w],[h]], dtypenp.float32) def predict_rect(self): # 卡尔曼预测下一帧窗口位置与尺寸 pred self.kf.predict() return (pred[0][0], pred[1][0], pred[4][0], pred[5][0]) def correct(self, camshift_rect, confidence): # 置信度低时跳过观测更新只用预测结果 if confidence 0.5: x, y, w, h camshift_rect meas np.array([[x],[y],[w],[h]], dtypenp.float32) self.kf.correct(meas)这段代码的逻辑与参数说明transitionMatrix让位置按速度线性递推窗口宽高保持不变measurementMatrix只观测位置和窗口尺寸。processNoiseCov取1e-3代表对恒速模型的信任度measurementNoiseCov取1e-1表征Camshift观测噪声较大需要平滑。confidence来自目标区域与原始直方图的Bhattacharyya距离——距离大说明跟踪结果可信度低此时不调用correct()由卡尔曼纯预测输出继续维护窗口目标暂时遮挡时不丢框。这里有一个实战细节当遮挡结束目标重新进入画面时纯预测窗口与真实目标之间往往有固定偏移应该重新计算目标直方图而不是沿用旧直方图否则Camshift会收敛到类似颜色的背景上。3.4 参数调试与视觉语言导航的横向参考在参数调试上我通常用下面这组经验值作为起点参数推荐范围影响金字塔层数2-3层层数越高可检测位移越大计算量越高光流阈值1.5-3.0 px阈值过低引入噪声过高漏检动态目标直方图bin数16-32bin数越多颜色分辨力越强对光照越敏感Kalman测量噪声0.05-0.2越大跟踪越平滑但对快速机动响应越慢Camshift迭代次数5-10次收敛精度与帧率之间的折中顺带一提近两年“视觉语言导航”成为热点多模态大模型可以直接把自然语言指令映射到导航目标但它依赖重型的视觉-语言特征提取难以在嵌入式飞控上实时运行。这种融合光流与目标跟踪的轻量视觉方案在算力受限的机载平台上仍有不可替代的工程价值。做实际项目时我一般会保留光流作为底层运动感知把视觉语言导航放在任务规划层让两者各司其职。4. 轨迹跟踪控制位置环PD与姿态环自抗扰的级联架构4.1 ADRC的组成与扩张状态观测器自抗扰控制ADRC把被控对象视为“积分串联型 总扰动”总扰动包括内扰未建模动态、通道耦合与外扰风、气流。ADRC三个部分各有明确分工跟踪微分器TD为参考输入安排过渡过程抑制超调扩张状态观测器ESO把总扰动扩张成新状态实时估计并补偿非线性状态误差反馈NLSEF对补偿后的积分串联型对象进行控制。对四旋翼姿态环而言最大价值在ESO的扰动估计能力。姿态动力学中三轴之间存在陀螺力矩耦合且模型参数转动惯量、力矩系数并不精确这些不确定性如果没有被ESO估计出来PID在做大幅度机动或带载飞行时就会出现稳态误差甚至发散。论文证明ESO稳定性的思路是把ESO的估计误差方程写成线性时不变系统选取合适的观测器带宽ωo误差状态矩阵的特征值都配置在-ωo处从而保证估计误差收敛。这个带宽概念在工程中就是一句话观测器带宽越高扰动估计越快但对测量噪声的放大也越剧烈。角速度环的测量噪声经微分后会直接进入力矩指令所以带宽并非越大越好。4.2 姿态环LADRC设计把三通道解耦成三个积分器线性自抗扰LADRC把ESO、误差反馈都线性化每个通道的控制器退化成“PD 扰动补偿”。以滚转通道为例系统方程可以写为J_x · φ τ_x d_x(t)其中d_x是所有未建模力矩和耦合项的总和。令 x1φ、x2φ、x3d_x/J_x则状态空间形式为x A x B τ_xy C x其中A[[0,1,0],[0,0,1],[0,0,0]]B[[0],[1],[0]]C[[1,0,0]]x3就是扩张状态。LESO按以下增益设计带宽ωo决定观测器增益L [3ωo, 3ωo², ωo³]ᵀ控制律为τ_x -k_p(φ-φ_des) - k_d(φ-φ_des) - x3_hat其中x3_hat是总扰动的实时估计。只要ESO能准确跟踪x3系统就等价于一个单位增益的双积分器直接用PD参数就能完成镇定。这就是“线性自抗扰”名字的由来不做非线性函数只用线性观测器加扰动补偿把姿态通道解耦成三个独立的双积分对象。相比非线性ADRCLADRC参数只有两个——观测器带宽ωo和控制器带宽ωc——整定工作量集中在带宽选机上。4.3 级联控制器与参数表位置环PD 姿态环LADRC论文最终的轨迹跟踪控制结构是位置环用PD控制器输出期望加速度再经第2章的几何变换得到期望四元数姿态环用三个LADRC分别控制滚转、俯仰、偏航。位置环带宽比姿态环带宽低3-5倍这是级联系统的常规设计准则保证内外环不互相激励。一套可仿真的初始参数经验值如下环路参数数值说明位置环PKp_x, Kp_y1.2-2.0越大位置响应越快过大引发振荡位置环PKp_z2.5-3.5z轴有推力补偿带宽可略高位置环DKd_x, Kd_y2.0-3.0提供阻尼抑制超调姿态环LADRCωo15-25 rad/s观测器带宽决定扰动估计速度姿态环LADRCωc4-8 rad/s控制器带宽决定姿态响应速度限幅姿态角指令±30°防止位置环出现局部极值实际整定时我一般先把姿态环的ωo、ωc调好让无人机能稳定悬停再逐步提高位置环Kp直到轨迹跟踪不出现“点头”现象。位置环Kp过高时期望加速度会频繁接近重力方向的边界期望四元数求解器中的归一化操作会变得不稳定。这是级联结构特有的问题与控制器本身的鲁棒性无关需要在指令限幅与期望四元数插值上做额外保护否则高速超调时容易触发奇异。4.4 数值仿真对比ADRC相对PID的优势来源论文的仿真对比针对的是姿态环加位置环的完整轨迹跟踪。相同参考螺旋轨迹下传统PID在角速度噪声和风扰叠加时出现相位滞后与稳态偏差加入LESO的LADRC则能在线补偿总扰动轨迹跟踪误差明显更小。下面的MATLAB代码用于说明滚转通道PID与LADRC在恒值扰动下的响应差异可直接运行% LADRC 滚转通道仿真骨架简化 dt 0.001; t 0:dt:5; N length(t); phi 0; phi_dot 0; z1 0; z2 0; z3 0; Jx 0.03; u 0; wo 20; wc 6; L [3*wo; 3*wo^2; wo^3]; % ESO 增益 kp wc^2; kd 2*wc; % 控制器带宽映射 for k 1:N phi_des sin(2*pi*0.5*t(k)); % 期望角度 d 0.05 * (t(k) 2); % 2s 后注入恒值扰动 % 真实对象双积分 扰动 phi_dot phi_dot (u / Jx d) * dt; phi phi phi_dot * dt; % ESO 观测基于测量 phi e phi - z1; z1 z1 (z2 L(1)*e) * dt; z2 z2 (z3 u / Jx L(2)*e) * dt; z3 z3 (L(3)*e) * dt; % 控制律PD 扰动补偿 u kp * (phi_des - z1) - kd * z2 - z3; end代码逻辑说明真实对象用两个积分器近似并在2秒后注入常值扰动ESO通过z1、z2、z3分别估计角度、角速度与总扰动。控制律中的“-z3”即扰动补偿项。参数说明wo20 rad/s决定扰动估计收敛速度wc6 rad/s决定闭环响应带宽。对比PID时会发现PID的稳态误差取决于积分增益而LADRC的z3会在几个观测器时间常数内逼近d的真实值从机理上消除稳态误差。这也解释了论文仿真中ADRC相对PID的结构性优势——ESO观测器是PID没有的冗余反馈通道。5. Pixhawk平台上的实测光流悬停与目标跟踪的验证5.1 硬件平台与软件架构论文的实测平台以开源Pixhawk飞控为核心配合机载相机和视觉计算单元。硬件组合的典型配置是Pixhawk 2.4.8或Pixhawk Cube作为飞控树莓派或Jetson系列作为视觉计算模块相机采用全局快门USB摄像头以避免卷帘快门在快速飞行时产生果冻效应。软件架构上飞控运行PX4或ArduPilot固件视觉算法在上位机上运行通过MAVLink协议把目标位置、光流速度等发送给飞控。常见做法是用MAVLink的VISION_POSITION_ESTIMATE消息把视觉位姿估计融合进EKF2或直接借助光流模块提供速度观测实现室内定点悬停。5.2 光流悬停实验室内无GPS环境下光流悬停依赖PX4的光流速度估计。使用PX4Flow或通用光流传感器时需要在地面站中正确设置以下参数参数推荐值作用SENS_FLOW_MINHGT0.3 m最低有效高度避免过低时噪声过大SENS_FLOW_MAXHGT3.0 m最高有效高度超出后光流像素位移过小SENS_FLOW_ROT自定义光流传感器相对机体的安装角度EKF2_AID_MASK启用 optical flow允许EKF2融合光流速度观测光流悬停首次试飞时我一般会先在1米高度解锁用手轻推机体确认姿态响应方向正确。如果光流融合方向反了无人机会出现“一推就跑、越跑越远”的正反馈发散现象这是最常见的危险故障模式务必在起飞前完成方向验证。5.3 目标跟踪与轨迹跟踪实测目标跟踪实验与第3章的算法直接对应相机采集图像Camshift卡尔曼输出目标像素坐标经透视变换转换为机体坐标系下的相对位置作为期望位置输入给轨迹跟踪控制器。由于视觉检测频率通常只有15-30Hz而姿态环跑400-1000Hz位置环需要做时间戳对齐和数据插值。延迟过大时无人机跟踪快速移动目标会出现“追过头”的振荡常见做法是在估计器里做时间延迟补偿。轨迹跟踪实测则验证第4章的LADRC控制器在真机上的表现给定一条圆形或方形参考航线观察实际飞行轨迹与参考的偏差。与仿真相比真机上最大的差异来自电机响应延迟和螺旋桨拉力变化这些在模型中被简化但在实机上必须靠ESO的扰动观测来兜底。从实验结果看融合卡尔曼的Camshift算法在目标短暂被遮挡时能维持跟踪光流悬停的漂移在可接受范围内轨迹跟踪的相对误差在该场景下优于传统PID。5.4 一条复现建议先做光流悬停再做视觉跟踪如果要从零复现这套系统我的建议路径是先让无人机在室内光流悬停做得足够稳再加载L-K光流检测观察输出的光流场是否干净然后单独测试Camshift在一段录制视频上的跟踪效果最后才上机联调。这样每一层都有独立的验证手段不会在最终联调时因为视觉与控制交互而难以定位问题。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。