ROBOMASTER TT巡线.1
这就是我们的小主角了
不加扩展件的样子,也可以完成所有的功能
http://www.opdown.com/soft/219172.htm
http://02.down.xindazheng.cn:9705/pcrj/XMind10.rar
这里附上一个思维导图软件的破解版(xmind)~。~
因为是记录过程,所以先不放成品上来,先来写之前的思路和一些中间使用的代码。
先要说明一点目前的飞行器还单独开不了这个摄像头,需要更新固件去开启。
,具体的升级过程后文有。
这个是测试下视摄像头的一段代码,因为是有了'__main__'所以是可以作为一个可执行的脚本去运行的
你收到的py文件会是这个样子的,如果双击的话会一闪而过
所以你需要一个Python的IDE或者是自带的编辑器
第一次打开会让你选择打开方式,我个人推荐VScode和Pycharm
这里为了演示方便使用了IDLE
如果找不到可以使用WIN+S搜索IDLE,注意选择自己的Python解释器
以为每一个版本的库都是在特定的版本下就是不可以混合使用的意思
用IDLE打开以后,运行这个模块
会出现后面的界面,注意。这个是由于没有连接飞机的WIFI造成的
这段代码是我在后面又加入了一个关于时间戳的功能
注意的是,先要选择对TT的IP地址,否则后面的都是空谈。你可以像上文中这样很明确的指定地址,也可以不用写。因为看源码来说,SDK是有自动获取IP的代码区域的。这个看自己的实际情况去写。
之后记得初始化机体,内部完成“command指令的发送。然后设置有没有直接的去播放捕获的视频。
在SDK内部,写到了相关的注释,这个IP仅供参考,具体去看你连接的飞机的IP地址
在WIN10系统下,先点击wifi图标,选择飞行器的连接名字
注意是IPv4的地址就是我们要的ip地址,在有多个网卡的情况下需要这样去做,一般情况下。SDK可以很智能的连接到你的设置设备。
继续看代码因为是对下视摄像头的捕获,所以发送了“dowmvision 1”的指令
以上的demo中用到了这个发送函数,其实是一个类,拥有很多的类方法
(可以考虑是函数一样提供特定功能的代码快)
这个是类的初始化的代码,具体的可以自己去研究
这个是上面下视demo里面的读取帧的SDK实例
这个是读取视频流的函数
这个是读取一帧的函数,可以看到是读的流视频
然后一帧一帧的分出来
里面的类都是在这里被定义,离实现已经很靠近了
具体的视频流的处理与输出看这个media的类
在初始化里面就完成了对机器视频流的获取
可以看到视频的编码是H.264的格式
可以看到,用到了多线程。有解码线程,显示线程,以及视频流的帧线程等
后面是关于声音相关的线程,TT没有扬声器,所以不读了
这些是它的一些优点
这个是conn的py文件里面的函数,主要是处理接收的各种流数据
主要是对各种线程的处理
以及析构函数,销毁对象时调用
这个地方我们就看这个UDP的参数的对应的代码段
如果是UDP的话就调用两条函数,关于网络的,不解释了
接着最后是开启新的线程来处理
以及对应还有断开的功能,就是先关闭线程
然后把队列弹出,把端口释放,队列清空,打印日志
这个是接收线程
先把标志位变为真,打印日志
接着因为上面标志位的原因,这个循环开始运行
接着是一个错误捕获,没有用if来实现,很有python味道。如果连接线程为空,直接跳出。真就继续,其实写代码就是在管理和维护各种标志位的状态。
如果是正常就按照4096的最佳接收数据来接收,如果标志位为假就断开,可以看到是不停的保证数据的直接传输的。失败重连会导致计数器+1,之后会去判断队列的情况,后面的队列的相关的函数,我不熟悉,不分析了。
如果队列没有满的话,而且是debug开启的话,就打印连接的次数,数据的长度,以及具体的数据。
最后是考虑其超时的问题,超时会打印日志,接着就抛出错误,然后将标志位重置~~~~
最后一个函数啦!就是读取缓存区的函数,超时的时间是2(我不知道单位)
可以看到这个函数的核心就是这个队列的get()方法
这个开启的视频流的方法,里面有三个参数,一个是要不要开始预览,一个是地址(元组传递),以及连接的方式(TCP和UDP二选一)
一开始的日志会打印,连接的地址和协议
接着调用连接线程,上面我写过
标志位更新,
然后进入下面的解码的线程
接着是这个解码线程,从队列里面读取一帧数据,将它送入
_h264_decode这个方法内解码,接着是一个循环来进行单帧的处理,包括单帧计数,%30以后得到一帧,接着将完整的一帧存入队列,即使队列满了也没有关系,只是打日志。解码一帧完成,大部分功能是进行帧计数,具体的运算过程看不上。
视频流显示线程,在同时满足视频显示打开和有视频流的情况下,继续执行,从上面的解码队列里面得到一帧画面。下面是一个判断,不分析了。
如果没有什么错误的话,就将这一帧画面就用numpy的array来存放,再赋值给img,接着用cv2去打印~~~
后面的代码实现也是用了这个官方的SDK,官方好在是将解码直接集成了
上面的是对于官方SDK从连接设备到获取视频,到屏幕出现动态画面的完整流程做了简单的分析。
这个也是一个小demo,来验证TT的基本功能,以及连接情况。
https://robomaster-dev.readthedocs.io/zh_CN/latest/python_sdk/beginner_drone.html
对于SDK的使用,可以去看官方的文档
也可以看我写过的一些文章Robomaster SDK安装(Win10+Py3.8)
Dji RoboMaster Tello SDK封装.1(对视频接口使用cv2.VideoCapture接收))
Dji RoboMaster Tello SDK封装.3(回复指令解包类)
Dji RoboMaster Tello SDK封装.4(打包,安装)
openmv(opencv)无人机巡线代码(参考用,还没有上机)
虽然上面我这些自己写的东西没有什么技术含量,但是胜在关于Dji SDK的文章比较少,我这些个文章算是先河。大家可以参考用。