基于大疆 MSDK 实现的无人机视觉引导自适应降落功能
概述
最初需求:想要无人机在执行完航线任务后,一键落到一个指定的位置,简化人工控制。
实现一套完整的无人机自主降落功能,通过虚拟摇杆控制使无人机飞向指定位置,再利用视觉识别引导无人机精确降落到具体位置。本文中采用自适应降落策略,根据高度动态调整精度要求和下降速度,以实现安全、精确的降落。
核心点:
- 虚拟摇杆导航替代 FlyTo 功能
- 双轴 (X/Y) 位置偏移实时调整
- 高度自适应降落策略
- 视觉识别引导定位
- 智能避障管理
系统架构
整体流程
- 用户触发返航: 获取无人机 GPS 位置,计算与目标点距离。
- 虚拟摇杆导航: 启动虚拟摇杆导航,以 5m/s 速度飞向目标位置。
- 到达判断: 当距离小于 10m 时,停止导航,开始自适应降落。
- 视觉识别: 计算 X/Y 偏移量,更新到 ViewModel。
- 高度分段控制:
- 高空 (>50m): 允许较大偏移,快速下降。
- 中空 (20-50m): 中等偏移阈值,中速下降。
- 低空 (5-20m): 较小偏移阈值,慢速下降。
- 极低空 (<5m): 严格对齐,关闭下视避障,极慢速下降。
- 着陆完成: 高度小于等于 0.1m 时,清理资源并停桨。
技术实现思路
第一步:让无人机飞到目标位置
问题分析
遥控器控制的无人机在执行完航线任务之后,飞到给定降落点(汽车或其他载具上)。最初的想法是使用 DJI SDK 提供的 FlyTo 功能,直接指定目标 GPS 坐标让无人机飞过去。但在实际测试中,发现部分机型(如 M3E)并不支持 FlyTo 功能。
解决方案:虚拟摇杆导航
既然 FlyTo 功能不可用,那就用虚拟摇杆功能进行模拟。
思路:
- 计算当前位置到目标位置的方位角(bearing)
- 将方位角转换为速度分量(南北/东西)
- 持续发送虚拟摇杆指令,让无人机朝目标飞行
- 实时监测距离,接近目标时停止
方位角计算:
private fun calculateBearing(latA: Double, lonA: Double, latB: Double, lonB: Double): Double {
val lat1 = Math.toRadians(latA)
val lat2 = Math.toRadians(latB)
dLon = Math.toRadians(lonB - lonA)
y = Math.sin(dLon) * Math.cos(lat2)
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
}

