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 threading
import socket
import sys
import time
host = ''
port = 9000
locaddr = (host, port)
# Create a UDP socket
sock = 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 create
recvThread = 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_STREAM
或SOCK_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的语句,有了错误该怎么办。
就是这个代码很简单,我重点语句都说出来了。
就是用了协议建立了通道,然后发送一些对目标主机来说有意义的信息。