无人机图传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

相关文章

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

python项目环境切换的几种实现方式

《python项目环境切换的几种实现方式》本文主要介绍了python项目环境切换的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 如何在不同python项目中,安装不同的依赖2. 如何切换到不同项目的工作空间3.创建项目

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A