大疆 MSDK 实现无人机视觉引导自适应降落
概述
在航线任务结束后,让无人机自动降落到指定位置(如汽车顶部)是常见的自动化需求。虽然 DJI SDK 提供了 FlyTo 功能,但部分机型(如 M3E)并不支持直接通过 GPS 坐标飞行。此外,GPS 精度有限且受风力影响,单纯依靠坐标无法实现精准着陆。
本方案采用虚拟摇杆导航替代 FlyTo,结合视觉识别系统进行末端微调,并引入高度自适应策略动态调整下降速度与对齐精度,确保从高空巡航到低空定点的安全着陆。
核心思路
- 虚拟摇杆导航:模拟遥控器指令,解决不支持
FlyTo的机型问题。 - 双轴偏移修正:实时计算 X/Y 轴偏差,控制无人机对准目标。
- 高度分段策略:不同高度区间设定不同的允许误差和下降速度。
- 避障管理:低空自动关闭下视避障,防止误判地面为障碍物。
系统架构与流程
整体逻辑分为三个阶段:远程导航、接近判断、精细降落。流程图如下:
graph TD
A[用户触发返航] --> B[获取当前 GPS]
B --> C{距离 > 10m?}
C -- 是 --> D[虚拟摇杆导航飞向目标]
D --> C
C -- 否 --> E[启动自适应降落]
E --> F{高度判断}
F -->|>50m| G[高空模式:快降]
F -->|20-50m| H[中空模式:中速]
F -->|5-20m| I[低空模式:慢速]
F -->|<5m| J[极低空模式:极慢/停]
G --> K[视觉识别计算偏移]
H --> K
I --> K
J --> K
K --> L{偏移量检查}
L -- 超出阈值*2 --> M[停止下降,仅水平调整]
L -- 超出阈值 --> N[慢速下降 + 调整]
L -- 正常范围内 --> O[按高度速度下降]
M --> P{高度<=0.1m?}
N --> P
O --> P
P -- 是 --> Q[着陆完成,停桨]
P -- 否 --> F
技术实现细节
1. 虚拟摇杆导航替代 FlyTo
由于部分机型不支持 FlyTo,我们通过计算方位角,将目标方向分解为虚拟摇杆的速度分量(Pitch/Roll),持续发送指令使无人机朝目标飞行。
方位角计算
private fun calculateBearing(latA: Double, lonA: Double, latB: Double, lonB: Double): Double {
val lat1 = Math.toRadians(latA)
val lat2 = Math.toRadians(latB)
val dLon = Math.toRadians(lonB - lonA)
val y = Math.sin(dLon) * Math.cos(lat2)
val x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon)
bearing = Math.toDegrees(Math.atan2(y, x))
bearing = (bearing + ) %
bearing
}

