Tello SDK 2.0使用指南(上)

这篇文章对SDK2.0的一些使用和命令做一些探索

我们第一页就可以看见官方给出了一个Python文件

我们下载下来简单的看一下

https://dl-cdn.ryzerobotics.com/downloads/tello/20180222/Tello3.py

我把地址放出来,方便大家复制和下载

程序不长,浅显易懂.

还是稍微做一下讲解

这个是程序含有的一些变量信息

## Tello Python3 Control Demo## http://www.ryzerobotics.com/#import threadingimport socketimport sysimport time
host = ''port = 9000locaddr = (host, port)
# Create a UDP socketsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # af_inet,sock_dgram
tello_address = ('192.168.10.1', 8889)
sock.bind(locaddr)

def recv(): count = 0 while True: try: data, server = sock.recvfrom(1518) print(data.decode(encoding="utf-8")) except Exception: print('\nExit . . .\n') break

print('\r\n\r\nTello Python3 Demo.\r\n')
print('Tello: command takeoff land flip forward back left right \r\n up down cw ccw speed speed?\r\n')
print('end -- quit demo.\r\n')

# recvThread createrecvThread = threading.Thread(target=recv)recvThread.start()
while True:
try: msg = input("")
if not msg: break
if 'end' in msg: print('...') sock.close() break
# Send data msg = msg.encode(encoding="utf-8") sent = sock.sendto(msg, tello_address) except KeyboardInterrupt: print('\n . . .\n') sock.close()        break

因为SDK是基于http中的UDP协议进行通讯的

所以有必要进行一点讲解

https://www.jianshu.com/p/054fe6632bee

创建套接字对象

要进行 Socket 通信,我们需要使用 socket 模块,首先需要创建一个 Socket 对象。下面是两种创建方式:

# 使用 UDP 进行通信udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 使用 TCP 进行通信tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

这个地方是对程序中的一些地方进行了截图

目标主机的 IP 和端口

如果我们需要向别的主机发送数据,我们需要改主机的 IP 地址和相应的端口号。在使用 Socket 进行通信时,需要将两个信息写在一元组中,元组的第一项为目标主机 IP 地址,第二项为接受数据的端口号:

targetAddr = ("192.168.0.1", 8080)

[(),()]

其中,IP 地址使用字符串类型,端口号使用数字类型.

绑定本机的端口

如果不绑定端口,每次使用 Socket 时都会由操作系统动态分配一个端口,我们也可以绑定为某个固定的端口。这样做的好处是:如果我们想要接受其他主机的信息,其他主机可以直接向这个端口发送数据,如果使用动态端口的话,发送方并不知道目标端口是什么,因此无法向接收方发送数据。
绑定端口需要使用 Socket 对象的 bind 方法:

selfBind = ( [IP], PORT )socketObj.bind( selfBind )

Python 提供了两个级别访问的网络服务:

  • 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。

  • 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。


什么是 Socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。


socket()函数

Python 中,我们用 socket()函数来创建套接字,语法格式如下:

socket.socket([family[, type[, proto]]])

参数

  • family: 套接字家族可以使 AF_UNIX 或者 AF_INET。

  • type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAMSOCK_DGRAM

  • protocol: 一般不填默认为 0。

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。

  • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

  • 程序的运行速度可能加快

  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

线程在执行过程中与进程还是有区别的。每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。

指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。

  • 线程可以被抢占(中断)。

  • 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。

线程模块

Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。

threading 模块提供的其他方法:

  • threading.currentThread(): 返回当前的线程变量。

  • threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

  • threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:

  • run(): 用以表示线程活动的方法。

  • start():启动线程活动。

  • join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。

  • isAlive(): 返回线程是否活动的。

  • getName(): 返回线程名。

  • setName(): 设置线程名。

关闭套接字

就像使用文件那样,在使用完套接字后,需要关闭它,调用 close 方法即可。

socketObj.close()

把信息进行一次编码

然后用套接字的方法发送出去(信息,目标地址)

下面是except的语句,有了错误该怎么办。

就是这个代码很简单,我重点语句都说出来了。

就是用了协议建立了通道,然后发送一些对目标主机来说有意义的信息。

(0)

相关推荐