我最近在做一个基于大疆无人机SDK的自动化飞行项目,遇到了严重的性能问题。

这个项目,需要无人机按照预设的航线,自动执行飞行任务,包括起飞、巡航、拍照、返航等。理想情况下,无人机应该能实时响应控制指令,飞行轨迹精准,拍照时机准确。但是实际情况是,指令响应延迟很高,有时候要等好几秒无人机才响应,飞行轨迹也不够精准,经常偏航,拍照时机也不准,导致很多照片拍废了。

经过一系列的性能调优,我把平均响应时间从1.2秒降到了200毫秒左右,降了80%,飞行精度也大幅提升,航线偏差从几米降到了几十厘米。

今天,我想分享我这次无人机性能调优的经历,包括问题定位、调优方法、具体措施、以及最终效果。

先说明一下:我目前用的测试机型是大疆御Pro(Mavic Pro),大疆御2(Mavic 2)预计今年下半年才会正式发布。但是我一直在关注御2的消息,也基于御Pro的调优经验,对御2的性能调优做了一些预判和准备。本文的调优方法,大部分是通用的,对御Pro和御2都适用。

一、项目背景和问题

先说说项目背景。

我们公司做的是一个工业巡检的解决方案,用无人机代替人工,对电力线路、管道、建筑等进行自动化巡检。无人机按照预设的航线飞行,沿途拍照或者录像,然后用AI算法分析图像,发现异常情况。

这个方案,对无人机的飞行精度和响应速度要求很高:

  • 航线偏差不能超过1米,否则可能拍不到目标
  • 拍照时机要准确,误差不能超过0.5秒
  • 遇到障碍物要能快速响应,及时避障
  • 控制指令的响应时间要短,否则整个巡检任务的效率很低

我们用的是大疆的Mobile SDK,通过手机或者遥控器,向无人机发送控制指令,包括飞行控制、相机控制、航线管理等。

最开始开发的时候,功能都能跑通,但是性能很差。主要问题有:

问题一:指令响应延迟高

从发送指令到无人机开始执行,平均要1.2秒,有时候甚至要3-5秒。比如发送"向前飞10米"的指令,无人机要等1秒多才开始动,这对于自动化飞行来说,延迟太高了。

问题二:飞行轨迹不精准

无人机按照预设的航点飞行,但是实际飞行轨迹和预设航线偏差很大,有时候偏差好几米。特别是在转弯的时候,无人机经常转不过来,或者转过了。

问题三:拍照时机不准

我们需要在特定的位置拍照,但是因为飞行延迟和轨迹偏差,拍照的位置经常不对,导致很多照片拍不到目标,需要重飞。

问题四:电量消耗快

因为飞行不精准,经常需要调整姿态,重飞,导致电量消耗比预期快很多,续航时间缩短了不少。

这些问题,严重影响了项目的进度和质量。我们必须解决性能问题,否则这个方案就没法落地。

二、性能分析和问题定位

遇到性能问题,第一步不是瞎优化,而是先做性能分析,定位瓶颈在哪里。

我们用了以下几种方法来做性能分析:

方法一:日志埋点,统计各环节耗时

我们在代码的关键环节加了日志,统计每个环节的耗时:

  • 从业务逻辑生成指令,到调用SDK接口的时间
  • SDK接口内部处理的时间
  • 从SDK发送指令到无人机接收到指令的时间
  • 无人机执行指令的时间
  • 无人机返回执行结果到SDK的时间
  • SDK返回结果到业务逻辑的时间

通过日志分析,我们发现,耗时主要在以下几个环节:

  1. SDK接口内部处理,平均耗时约300毫秒
  2. 指令从手机/遥控器传输到无人机,平均耗时约400毫秒
  3. 业务逻辑层的处理,平均耗时约200毫秒
  4. 无人机执行指令和返回结果,平均耗时约300毫秒

加起来,平均1.2秒,和我们观察到的一致。

方法二:监控SDK的状态回调

大疆的SDK有很多状态回调,比如飞行状态、电池状态、信号强度、GPS状态等。我们把这些状态都记录下来,分析性能问题和状态的关系。

通过分析,我们发现:

  • 当遥控器和无人机之间的信号弱的时候,指令延迟明显增加
  • 当GPS信号弱的时候,飞行轨迹偏差明显增大
  • 当无人机姿态不稳定的时候(比如有风),执行指令的时间变长
  • 当SD卡写入慢的时候,拍照的延迟增加

方法三:对比测试,排除变量

我们做了一系列对比测试,排除变量,定位问题:

  • 用不同的手机测试,发现性能差异不大,排除手机性能的问题
  • 用不同的遥控器测试,发现性能差异不大,排除遥控器的问题
  • 在不同的环境测试(室内/室外、空旷/遮挡),发现环境对性能影响很大
  • 用不同的SDK版本测试,发现新版本的SDK性能有提升

通过这些分析,我们对性能问题有了比较清晰的认识,然后开始针对性地调优。

三、性能调优措施

下面说说我们具体做了哪些调优措施。

措施一:优化业务逻辑层,减少不必要的处理

业务逻辑层的耗时,虽然不是最大的,但是优化起来最简单,效果也很明显。

我们做了以下优化:

  1. 减少不必要的对象创建:原来的代码,每次发送指令都要创建很多临时对象,导致频繁GC,影响性能。我们改成了对象池,复用对象,减少GC。
  2. 避免在主线程做耗时操作:原来的代码,有些耗时操作(比如数据解析、文件读写)在主线程做,导致主线程卡顿,指令发送延迟。我们把这些操作移到了后台线程。
  3. 批量处理指令:原来的代码,每个指令都单独发送,频繁调用SDK接口。我们改成了批量处理,把多个指令合并成一次调用,减少SDK接口的调用次数。
  4. 缓存状态数据:原来的代码,每次需要无人机状态的时候,都去调用SDK接口获取,其实很多状态变化不频繁。我们加了缓存,定期更新状态,减少SDK接口的调用。

通过这些优化,业务逻辑层的耗时从200毫秒降到了50毫秒左右。

措施二:优化SDK调用方式,减少内部处理耗时

SDK接口内部处理的耗时,占了很大一部分。我们研究了大疆SDK的文档和最佳实践,做了以下优化:

  1. 使用异步接口,避免同步阻塞:大疆SDK有同步和异步两种接口。原来的代码,很多地方用了同步接口,导致调用线程阻塞。我们改成了异步接口,用回调的方式处理结果,避免阻塞。
  2. 合理设置超时时间:原来的代码,超时时间设置得很长(30秒),导致指令失败的时候,要等很久才返回。我们根据不同的指令类型,设置了合理的超时时间(比如飞行控制指令5秒,拍照指令10秒),失败快速返回,然后重试。
  3. 避免频繁调用高频接口:有些SDK接口(比如获取飞行状态)调用频率太高的话,会占用大量资源,影响其他接口的性能。我们降低了这些接口的调用频率,从100ms一次改成了500ms一次,对性能影响不大,但是整体性能提升了很多。
  4. 使用最新版本的SDK:大疆SDK的新版本,通常会有性能优化和bug修复。我们把SDK从3.x升级到了最新的4.x版本,性能有明显提升,特别是指令传输的效率。

通过这些优化,SDK接口内部处理的耗时从300毫秒降到了100毫秒左右。

措施三:优化指令传输,减少传输延迟

指令从手机/遥控器传输到无人机的耗时,是最大的一部分。这部分的优化,相对来说比较难,因为涉及到硬件和通信协议。

我们做了以下优化:

  1. 确保信号良好:信号强度对传输延迟影响很大。我们在飞行前,都会检查遥控器和无人机之间的信号强度,确保信号良好。如果信号弱,就调整位置,或者使用信号增强器。
  2. 使用合适的通信信道:大疆的遥控器支持2.4GHz和5.8GHz两个频段。2.4GHz穿透能力强,但是干扰多;5.8GHz干扰少,但是穿透能力弱。我们根据不同的环境,选择合适的频段。在空旷的环境用5.8GHz,在有遮挡的环境用2.4GHz。
  3. 减少指令的数据量:指令的数据量越大,传输时间越长。我们优化了指令的数据格式,去掉了不必要的字段,压缩了数据,减少了每次传输的数据量。
  4. 使用指令队列,避免拥塞:原来的代码,有时候会短时间内发送大量指令,导致通信拥塞,延迟增加。我们加了指令队列,控制指令发送的速率,避免拥塞。同时,对指令做优先级处理,高优先级的指令(比如避障、紧急停止)优先发送。
  5. 预加载航线数据:对于预设航线的飞行,我们把整个航线数据一次性上传到无人机,而不是飞一个航点上传一个。这样,无人机可以在本地执行航线,不需要频繁和遥控器通信,大幅减少了传输延迟,也提高了飞行的稳定性。

通过这些优化,指令传输的耗时从400毫秒降到了100毫秒左右。这是优化效果最明显的一部分。

措施四:优化飞行控制算法,提高飞行精度

飞行轨迹不精准的问题,主要是飞行控制算法的问题。我们做了以下优化:

  1. 使用航点飞行模式,而不是实时控制:原来的代码,是实时控制无人机飞行,不断发送"向前飞""向左转"这样的指令。这种方式,延迟高,精度差。我们改成了航点飞行模式,把航点上传到无人机,无人机自动按照航点飞行,精度高很多。
  2. 合理设置航点的飞行参数:大疆的航点飞行,支持设置每个航点的飞行速度、转向模式、停留时间等参数。我们根据不同的场景,合理设置这些参数。比如,在需要精准拍照的航点,降低飞行速度,设置停留时间;在长距离巡航的航点,提高飞行速度。
  3. 使用曲线飞行模式,减少转弯偏差:原来的航线,转弯的时候是直角转弯,无人机经常转不过来或者转过了。我们改成了曲线飞行模式,设置合适的转弯半径,无人机可以平滑地转弯,轨迹偏差大幅减小。
  4. 优化起飞和降落的流程:起飞和降落的时候,无人机的姿态不稳定,容易受环境影响。我们优化了起飞和降落的流程,比如起飞后先悬停几秒,等姿态稳定了再开始巡航;降落的时候先降低高度,等稳定了再降落。
  5. 结合视觉定位,提高室内和低空的精度:在GPS信号弱的地方(比如室内、低空、高楼之间),无人机的定位精度会下降。我们开启了无人机的视觉定位功能,结合视觉和超声波,提高在这些场景下的定位精度。

通过这些优化,飞行轨迹的偏差从几米降到了几十厘米,拍照的准确率也大幅提升。

措施五:优化拍照流程,提高拍照效率和准确率

拍照是我们项目的核心功能,拍照的效率和准确率直接影响项目的质量。我们做了以下优化:

  1. 预对焦和预曝光:原来的代码,每次拍照的时候才对焦和设置曝光,导致拍照延迟高。我们改成了在飞行过程中持续对焦和曝光,拍照的时候直接拍摄,减少了拍照延迟。
  2. 使用定时拍照,而不是指令拍照:对于需要连续拍照的场景,我们使用无人机的定时拍照功能,设置好拍照间隔,无人机会自动拍照,不需要每次都发送拍照指令,减少了延迟,也提高了稳定性。
  3. 优化SD卡写入:SD卡的写入速度,会影响拍照的间隔。我们使用了高速SD卡(U3级别),并且在飞行前格式化SD卡,确保写入速度。同时,合理设置照片的分辨率和格式,在满足需求的前提下,减少每张照片的大小,提高写入速度。
  4. 拍照位置预判:因为飞行有延迟,我们根据无人机的飞行速度和方向,预判到达拍照位置的时间,提前发送拍照指令,补偿延迟,提高拍照位置的准确率。

通过这些优化,拍照的延迟从500毫秒降到了100毫秒以内,拍照的准确率也从70%提升到了95%以上。

措施六:优化电量管理,延长续航

电量消耗快的问题,虽然不是核心性能问题,但是也影响项目的效率。我们做了以下优化:

  1. 合理规划航线,减少无效飞行:原来的航线规划不合理,有很多重复飞行和绕路。我们用算法优化了航线规划,用最短的路径覆盖所有巡检点,减少了无效飞行,节省了电量。
  2. 优化飞行速度:飞行速度太快,风阻大,耗电快;飞行速度太慢,单位距离的时间长,耗电也多。我们根据无人机的性能曲线,选择了最优的巡航速度(大约5-8m/s),在这个速度下,单位距离的耗电量最低。
  3. 减少不必要的悬停:悬停的时候,无人机也要消耗电量来维持姿态。我们减少了不必要的悬停时间,比如在航点之间不需要停留的地方,直接飞过,不停留。
  4. 合理使用云台和相机:云台和相机也是耗电大户。我们在不需要拍照的时候,把云台转到待机位置,关闭相机的显示屏,减少耗电。
  5. 监控电量,及时返航:我们设置了合理的低电量报警阈值,当电量低于阈值的时候,及时返航,避免因为电量不足导致坠机。

通过这些优化,续航时间从原来的15分钟提升到了20分钟左右,提升了约30%。

四、调优效果

经过以上这些调优措施,我们的项目性能有了大幅提升。下面是调优前后的对比数据:

指标调优前调优后提升幅度
平均指令响应时间1.2秒200毫秒降低83%
最大指令响应时间5秒800毫秒降低84%
航线偏差3-5米20-50厘米提升约90%
拍照准确率70%95%以上提升约36%
拍照延迟500毫秒100毫秒以内降低80%
续航时间15分钟20分钟提升33%
任务完成率60%95%以上提升约58%

可以看到,各项指标都有了大幅提升,特别是指令响应时间,降了80%以上,完全满足了项目的需求。

现在,我们的无人机自动化巡检方案,已经可以稳定运行了,飞行精度高,响应速度快,拍照准确率高,续航也够用。客户对效果很满意,我们也开始在更多的场景推广这个方案。

五、对大疆御2的期待和预判

最后,说说我对大疆御2的期待和预判。

虽然御2还没正式发布,但是根据目前的消息和传闻,御2可能会有以下升级:

  • 更先进的飞控系统,飞行稳定性和精度更高
  • 更好的图传系统,传输距离更远,延迟更低
  • 更强的处理器,SDK的性能更好
  • 更多的避障传感器,全向避障
  • 更好的相机,支持变焦或者哈苏镜头
  • 更长的续航时间

如果这些升级属实,那么御2的性能会比御Pro强很多,特别是在飞行精度、图传延迟、处理器性能方面。对于我们做无人机开发的人来说,这是好事,因为很多在御Pro上需要软件优化的性能问题,在御2上可能硬件就解决了。

但是,不管硬件怎么升级,软件层面的优化还是很重要的。好的硬件 + 好的软件,才能发挥出最好的性能。本文提到的这些调优方法,大部分是通用的,对御2也适用。

我已经开始准备御2的适配工作了,等御2正式发布之后,第一时间做适配和测试,把我们的方案迁移到御2上,相信性能会有更大的提升。

六、经验总结

最后,总结一下这次无人机性能调优的经验。

经验一:先分析,再优化

遇到性能问题,不要上来就瞎优化,先做性能分析,定位瓶颈在哪里,然后针对性地优化。这样才能事半功倍,避免做无用功。

经验二:从易到难,分层优化

性能优化,可以从易到难,分层进行。先优化业务逻辑层(最简单),再优化SDK调用层,然后优化传输层,最后优化飞行控制算法(最难)。这样,每一步都能看到效果,也能增强信心。

经验三:硬件和软件结合优化

无人机的性能,不仅取决于软件,也取决于硬件。要结合硬件和软件一起优化,比如选择合适的频段、使用高速SD卡、确保信号良好等。硬件的优化,有时候比软件的优化效果更明显。

经验四:充分利用无人机的原生功能

大疆的无人机,有很多原生的高级功能,比如航点飞行、定时拍照、视觉定位、智能返航等。这些功能,是大疆经过大量测试和优化的,性能和稳定性都很好。要充分利用这些原生功能,而不是自己用底层指令去实现。自己实现的,通常不如原生的好。

经验五:持续监控和优化

性能优化不是一次性的,而是持续的。上线之后,要持续监控性能指标,发现问题及时优化。而且,随着业务的发展和场景的变化,性能瓶颈也会变化,需要持续调整优化策略。

结语

无人机开发,是一个很有趣的领域,既有软件的挑战,也有硬件的挑战。性能调优,是无人机开发中非常重要的一环,直接影响产品的体验和质量。

这次性能调优,让我对无人机的飞行控制和通信机制有了更深入的理解,也积累了很多宝贵的经验。希望我的分享,能给做无人机开发的朋友一些参考和启发。

如果你也在做无人机开发,遇到了性能问题,欢迎交流讨论。也期待大疆御2的正式发布,看看它能给我们带来什么样的惊喜。

最后,用一句话总结:"性能优化,没有最好,只有更好。持续分析,持续优化,才能让产品越来越好用。"

愿每一个无人机开发者,都能开发出性能优异、体验良好的无人机应用。