无人机图传SDK项目总结(APP)

2023-10-09 22:10

本文主要是介绍无人机图传SDK项目总结(APP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

无人机很火,无论是国外国内,以后就不知道了,说到这个无人机玩具(跟大疆没的比),让我想起了小时候遥控赛车,刚刚出来时候也是非常火,俺一直以来都是穷B所以都是跑再别人的背后看人家玩,即使是很想拥(题外话)。
说说我主要负责的任务,就是封装好android 端app,以sdk的方式提供给客户二次开发。简单点就是直播

这里写图片描述
整个app是以mpv+EventBus框架进行开发,这里主要是说native层
native层主要由三个板块组成
1. 飞控指令模块
2.设备命令交互模块
3. 图传模块

1>.飞控指令模块走的是私有协议,所谓的私有协议是指,指令传输过程中,指令的校验方式,传输的位数都是由自己定义,这个是要跟设备【图传板子】端一起配合起来的用的,飞控指令主要是控制飞机的基本命令,比如控制前后左右,上下飞行,翻转等等,简单来说就是将市场上看到的遥控手柄上面的功能搬迁到app端,说到这个,我先普及一下无人机硬件的基本组成部分,市场上的无人机主要分为两种,一种是不带图传的,最主要的硬件组成就是飞控板,飞控板类似于电脑的cpu,接受各种指令,保存飞控平衡等等,马达啥的,就不说了,一种是带图传的,最主要的硬件组成是飞控板,跟图传板,他们之间是通过串口进行传输,不带图传的就是仅仅通过手柄遥控飞控,带图传的就是通过手柄遥控飞机的过程,可以通过手机连接飞机的wifi即图传板,看飞机上面拍摄到的图像,我负责的app端的命令交互就是跟图传板进行交互。

2>.设备命令交互模块,是指app端向图传板发送一些规定好的指令,让设备端去执行指定的任务,比如录像,拍照等….,交互方式主要有两种,一种是cgi格式,一种是json格式,其中都是通过使用socket来发送,一个是udp,一个是tcp,这个主要是由飞控板上面的程序决定的,app端只需要发送即可

3>图传模块,是最难,问题最多的模块,也是最重要的模块,图传走的是rtsp标准协议,传输过程是h264数据流,实时播放过程,最难解决的问题是图像卡顿,图像花瓶问题,图像在各个手机表现不一样,在性能好的手机上面,会出现图像抖动厉害的情况等等。

要解决图像卡顿的问题,先要知道卡顿的原因:
1.由数据在传输过程中丢失,没有数据,造成的卡顿
2.app端接收不及时,造成数据丢失而引起的卡顿
3.为了减少花屏,而造成的卡顿,比如说刚好丢失了i帧,为了后面显示不花屏,会对后面的p帧进行抛掉,直到下一个i帧才开始显示

我们都知道花屏的原因是因为丢帧造成的,比如说丢失了 i帧,关键帧,后面的p帧送去给ffmpeg解码得到的图像是花屏,或者马赛克等等(也有一种是大p,小p的说法,这里就不详细说了),【注意,这个传输过程没有用到b帧,整个传输过程只有两种帧 i帧,个p帧】,多一点花屏,可以减少卡顿,客户更能接受的是卡顿,而不是花屏。

解决方案:
第一个问题:由数据在传输过程中丢失,没有数据,造成的卡顿,有外部环境的影响,也有图传板信号的稳定性影响等等,app端没有很好的解决方法,无非就两个选择,一个是tcp传输,一个是udp传输。根据实测,tcp效果更好一点。
tcp :数据传输过程,能保正数据的完整,所以花屏少点,距离相对upd会近一点,
udp:传输过程不保证数据的完整性,容易花屏,距离比较远

第二个问题:app端接收不及时,造成数据丢失而引起的卡顿,我这里遇到的情况是这样的,之前的接收数据跟解码同一个线程,显示另外一个线程,这样就有一种情况就是解码不及时,会造成接收线程阻塞,从而影响了数据的接收(udp),解决方案是接收数据自己一个线程,解码跟显示一个线程,中间通过缓存队列来进行数据的共享,即增加缓存,基本所有的在线播放都是用这个方式。

第三个问题:就客户需求而定,我这里为了不花屏,会直接丢掉

项目使用mpv+EventBus的方式非常灵活,模块的替换,复用,重写都很灵活,而且java层没有特殊必要,一般都不会动,优化各个方面都是在jni层,也主要是图传的优化,这样也方便版本的迭代,要不客户版本升级要多痛苦。

上面的几个问题,说起来解决方法简单,真正做起来非常不容易,很多坑,要做到方便ios移植,稳定性好,兼容性强(再手机牌子众多的中国,深有体会),非常不容易,其中的苦于乐也只有自己知道(现在想想也不是很难啦,很多事过了,想想也就那么一回事),下面附上底源码结构图,源码就不共享了。总的来说学到了很多东西。

这里写图片描述

这篇关于无人机图传SDK项目总结(APP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175903

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/