基于大疆 MSDK 实现的无人机视觉引导自适应降落功能
概述
项目初期需求很明确:无人机执行完航线任务后,需要一键降落到指定位置(如汽车顶部),减少人工干预。为了实现这一目标,我们设计了一套完整的自主降落流程:先通过虚拟摇杆控制无人机飞向目标区域,再利用视觉识别系统引导其精确对准落点。
核心策略在于自适应降落——根据当前高度动态调整下降速度和位置对齐精度。高空阶段允许较大偏差以快速接近,低空阶段则严格限制偏移量以确保安全。
关键特性
- 使用虚拟摇杆导航替代受限的 FlyTo 功能
- 双轴 (X/Y) 位置偏移实时修正
- 高度分段式自适应降落策略
- 视觉识别辅助定位
- 智能避障管理(低空自动关闭下视避障)
系统架构与逻辑流程
整个降落过程可以划分为几个关键状态,系统会根据高度和距离在不同状态间切换:
- 远程导航阶段:当距离目标超过 10 米时,无人机以 5m/s 的速度飞向目标上方。
- 进入降落准备:距离小于 10 米后,停止水平导航,启动视觉识别系统。
- 自适应下降循环:
- 高空模式 (>50m):允许 1 米偏移误差,快速下降。
- 中空模式 (20-50m):允许 0.5 米偏移误差,中速下降。
- 低空模式 (5-20m):允许 0.3 米偏移误差,慢速下降。
- 极低空模式 (<5m):要求 0.2 米精度,极慢速下降或悬停调整。
- 着陆清理:高度低于 0.1 米时,触发停桨指令并释放资源。
技术实现细节
第一步:解决导航兼容性问题
最初计划直接使用 DJI SDK 的 FlyTo 功能让无人机飞往目标 GPS 坐标。但在实际测试中发现,部分机型(如 M3E)并不支持该功能。
解决方案:虚拟摇杆模拟
既然无法直接飞过去,我们就用虚拟摇杆模拟飞行指令。核心思路是计算当前位置到目标位置的方位角,将其分解为速度分量持续发送。
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)
var bearing = Math.toDegrees(Math.atan2(y, x))
bearing = (bearing + ) %
bearing
}

