Dji RoboMaster Tello SDK封装.1(对视频接口使用cv2.VideoCapture接收))

首先导入一些编写SDK的一些必要的库

因为是无线的连接所以要加一个网络的线程库,用来连接TT

接着导入时间库,因为会有一些资源的监控函数

导入cv库,这里是cv2,因为底层是C++的实现

最后一个是另外一个资源的监控类

因为是打包SDK的指令,所以就写一个类就好

这里是已经封装好的一些指令

这里有的计算机是端口打开失败,这里的电脑是win10

这个是版本号

点击高级设置

新建一个入站的规则

选择端口

因为TT的通信方式都是UDP,所以这里UDP

允许所有,其实就8889就可以

都打开

写一些info,日后好看好改

重新打开可以设置更多的东西

def __init__(self, tello_ip: str = '192.168.10.2', debug: bool = True): # 在初始化的函数里面就是传入一个ip以及是否要打开调试功能 # 打开本地的UDP端口在8889为了和Tello通信 self.local_ip = '' self.local_port = 8889 self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 开启新的插口,我这里是喜欢这么叫 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 通常使用这个设置来加强网络程序的健壮性,后面的参数是断开重新绑定时间,Win系统最多可以留5分钟 self.socket.bind((self.local_ip, self.local_port)) # bind的意义是将已经建立的“空白的”socket绑定在网络上让大家在需要时能够找得到 # 设置Tello的ip和端口信息 self.tello_ip = tello_ip # 在类定义里面定义Tellode IP self.tello_port = 8889 # tello的端口是8889 self.tello_address = (self.tello_ip, self.tello_port) # 在将ip和端口打包成一个合成的地址 self.log = [] # 对于日志的记录是写用一个空列表来放 # 初始化接收线程 self.receive_thread = threading.Thread(target=self._receive_thread) # 这个是新建立一个线程的时候要执行的语句,target的参数是最重要的,要给一个callback对象才可以运行 # 后面的参数是一个函数,在后面有写 self.receive_thread.daemon = True # 子线程daemon默认跟随主线程 # 设置daemon=True会标记其为守护线程,如果剩下的线程只有守护线程时,整个python程序都会退出 self.receive_thread.start() # 开启线程 # Tello 运行时选项 self.stream_state = False # 检查视频流的情况 self.last_frame = None # 最后一帧 self.MAX_TIME_OUT = 15.0 # 最长的超时时间 self.debug = debug # 将Tello设置为命令模式 self.command()

首先写一个初始化的函数,我每一个变量都写了注释

日志功能的设计很简单,日志就是记录用的。

所以就是一个list,相关方法可用

发送命令的函数,比较健壮

是元组,就是sendto函数的地址参数

以及命令就是一个字符串

这个回复函数在另外一个文件里面,判断response是不是空

没错,就是判空

接着是线程函数,要不停的运行

这个是开关

这个函数,是我写整个SDK的初衷

官方的视频接口,我能力不够。一些操作来不了

def send_command(self, command: str, query: bool = False): # 后面的参数是查询,前面是一个字符串,发送给TT用 # 为发出的命令创建的新日志 self.log.append(Stats(command, len(self.log))) # 发送命令给TT self.socket.sendto(command.encode('utf-8'), self.tello_address) # 将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。 # 返回值是发送的字节数,函数主要用于UDP协议。 # 显示确认信息 (如果debug开) if self.debug is True: print('Sending command: {}'.format(command)) # 用Python的字符串方法打印 # 这两个语句就是日志 # 检查命令是否超时(基于“MAX_out_TINE”中的值) start = time.time() # 在日志中未接收到repsonse时运行 while not self.log[-1].got_response(): # 这got_response是以一个函数,在另外一个命令里面 now = time.time() # 现在的时间 difference = now - start # 计算完上面的函数,就是从log里面读取最后一个元素。是一个bool回复 if difference > self.MAX_TIME_OUT: # 如果超时, print('Connection timed out!') # 打印连接超时 break # 接着出去 # 打印Tello响应(如果“debug”为真) if self.debug is True and query is False: print('Response: {}'.format(self.log[-1].get_response()))def _receive_thread(self): # 记得我上面那个多线程函数的参数吗?,就是这个函数,注意写法。带下划线,就就不想用户用 # 回调函数把 while True: # 死循环检查Tello响应,抛出套接字错误(就是一直要保持连接) try: # 这里是错误处理 self.response, ip = self.socket.recvfrom(1024) # recvfrom的功能,以接收从所述设备发送数据的数据和源地址。 # 和参数response,ip相配合 # 返回值是一对(字符串,地址),其中字符串是表示接收数据的字符串, # 地址是发送数据的套接字的地址。 self.log[-1].add_response(self.response) # 接着把这个回复再添加到这个log里面 except socket.error as exc: print('Socket error: {}'.format(exc)) # 最后是抛出一个错误,打印一下def _video_thread(self): # 啊啊啊啊啊,我写这么多的程序就是为了这个接口,嘤嘤嘤 # cv2.VideoCapture这个接口我一定要写出来 cap = cv2.VideoCapture('udp://'+self.tello_ip+':11111') # 在“stream state”为真时运行 while self.stream_state: # 因为是真,下面的语句执行 ret, self.last_frame = cap.read() # 对于参数ret 为True 或者False,代表有没有读取到图片 # 第二个参数frame表示截取到一帧的图片 cv2.imshow('DJI Tello', self.last_frame) # 接着是打印这个照片 # 如果按escape键,视频流将关闭 k = cv2.waitKey(1) & 0xFF if k == 27: break cap.release() cv2.destroyAllWindows()

此时是两个函数的代码

这个是延时得函数

这个是打印日志列表

关闭得函数,就是把端口得资源释放。比较简单得实现

这个函数,记得初始化完毕就调用

分别是起飞和降落,以及最后得下视得摄像头得开启要用最新的测试的固件来打开

(0)

相关推荐

  • Python进阶——OpenCV之GUI

    文章目录 图像处理(Getting Started with Images) 读取图像 显示图像 保存图像 使用Matplotlib 视频处理(Getting Started with Videos) ...

  • 使用OpenCV进行直播(附代码)

    重磅干货,第一时间送达 生活中我们不止一次地使用过直播,但从未想过如何通过编程实现.大家好,我们在这里向大家介绍如何使用OpenCV和python的套接字编程.今天,我们将借助OpenCV和socke ...

  • 如何使用OpenCV在Python中访问IP摄像头

    重磅干货,第一时间送达 capture = cv2.VideoCapture('rtsp://192.168.1.64/1') capture = cv2.VideoCapture('rtsp://[ ...

  • 使用Python OpenCV实现姿态估计

    什么是OpenCV? 计算机视觉是一个能够理解图像和视频如何存储和操作的过程,它还有助于从图像或视频中检索数据.计算机视觉是人工智能的一部分. 计算机视觉在自动驾驶汽车,物体检测,机器人技术,物体跟踪 ...

  • 【精品博文】EDK之路(4)——自定义IP(SDK部分)

    SDK部分(BSP的创建) 由于我们存在一个自定义IP,这导致在建立BSP时,会增加一点操作.如果我们什么都不做,直接建立BSP,那么该BSP将不会包括自定义IP的驱动.其实,不用该驱动也行,我们直接 ...

  • 检测三维物体?一篇文章认识《双目立体视觉》

    来源:https://blog.csdn.net/qq_41204464/article/details/115387812 作者:一颗小树X@CSDN(已授权) 编辑:3D视觉开发者社区 前言 双目 ...

  • 如何使用OpenCV和Socket进行视频聊天?

    重磅干货,第一时间送达 一.简介 在本文中,我们要构建的是视频聊天,但话音通道使用的OpenCV和Python中的Socket.流程: 创建用于一对一通信的 TCP 套接字. 从相机中获取实时流. 对 ...

  • 基于4G Cat.1的内网穿透实践

    这一篇继续BearPi-4G开发板实践:内网穿透实践. 基本TCP的socket通信测试 之前我们学习WiFi模块时,与PC进行TCP协议的socket通信测试我们只要在我们的PC上通过网络助手建立一 ...

  • Python 手把手实现远程控制桌面

    本项目旨在让大家理解远控软件的原理,通过远控桌面可以实现远程控制我们的电脑,更好更方便的管理电脑.文末将给出初始版的完整代码,需要使用到的其他工具也会有所说明.最终实现的效果就是只要用户点击了客户端的 ...

  • Dji RoboMaster Tello SDK封装.4(打包,安装)

    最后安装格式,你得写一个init得文件来完成SDK最后得编写 分别是包名,作者名字,授权方式,版权,版本,以及库中包含得文件 import setuptoolswith open('README.md ...

  • Dji RoboMaster Tello SDK封装.3(回复指令解包类)

    老规矩,时间库+一个统计大类 初始化一些关于时间的的类变量 这里插一个Python列表的使用技巧,[:1]就是将当前列表的第一个元素丢掉 这个是类里面的所有的函数 我们这个函数倒着看,就是先看应用的地 ...

  • Dji RoboMaster Tello SDK封装.2

    显示视频流的功能,可能用了线程会好一些 其实可以用队列来实现,后面可能会写相关的一些实现 这个就是我们万事第一步,连接.具体可以看上面的初始化 和SDK里面的说法是对应的 对偶操作,关闭视频流 而且更 ...

  • Tello SDK 2.0使用指南(上)

    这篇文章对SDK2.0的一些使用和命令做一些探索 我们第一页就可以看见官方给出了一个Python文件 我们下载下来简单的看一下 https://dl-cdn.ryzerobotics.com/down ...

  • 傻傻分不清楚 启底各种奇怪的视频接口

    这个世界上最幸福的事就是买来一张新显卡然后给老电脑换上,老电脑瞬间就能畅玩各类游戏.但是最不幸福的事就是装上显卡以后才发现视频接口对不上.像电脑上我们常用的接口就是USB,手机上最多的也就Typc-C ...

  • 电脑显示器连接线哪种接口好|VGA、HDMI视频接口选哪个好-系统城

    电脑显示器和主机之间需要专用线路来连接,显示器和主机箱通常会同时配置多种视频接口,比较常见的视频接口有VGA.DVI.HDMI和DP,其中VGA和HDMI比较常用.视频接口这么多种,要选择哪一种比较好 ...

  • Tello无人机SDK使用Python封装+简单示例

    import socketimport threadingimport timeimport tracebackclass Tello: """Wrapper to si ...

  • [视频]MOSFET驱动设计和创新封装分享

    [视频]MOSFET驱动设计和创新封装分享

  • 视频编码与视频封装

    如果想在剪辑或调色时更加高效,或者,想导出体积小并且质量高的视频,就得先搞清视频编码与视频封装的概念. ◆  ◆  ◆ 建议 在剪辑或调色时的建议 1.采用帧内压缩的视频编码格式. Mac 系统:Pr ...