Dji RoboMaster Tello SDK封装.3(回复指令解包类)
老规矩,时间库+一个统计大类
初始化一些关于时间的的类变量
这里插一个Python列表的使用技巧,[:1]就是将当前列表的第一个元素丢掉
这个是类里面的所有的函数
我们这个函数倒着看,就是先看应用的地方
再看它的定义
可以看到是一堆选择结构,就像一个路由器的作用,就是它用来汇聚上层接口的指令,然后再分发给子函数去处理
因为信息的回应有字符有数字,就需要来逐个字符来处理
这两个是对偶的操作函数,收到不同的数据类型。
都是统一给最上面的函数,这样做的好处就是条例清晰
这个就是得到机器的回复,然后处理即可
from datetime import datetime
class Stats:
# 统计运行时的一些数据
def __init__(self, command: str, id: int):
self.command = command
# 一个类
self.response = None # 回应信息的初始值
# 响应
self.id = id
# 两个类变量
self.start_time = datetime.now()
self.end_time = None # 结束时间
self.duration = None # 持续时间
def add_response(self, response: str):
# 添加一个回复
self.response = str(response)
# 将一个回复的字符串转换成str
# 计算执行命令所用的总时间
self.end_time = datetime.now()
self.duration = (self.end_time-self.start_time).total_seconds()
def got_response(self):
# 对一个回复进行判空
if self.response is None:
return False
else:
return True # 如果是收到了,返回真值
def get_raw_response(self):
return self.response
def numeric_response(self, data: str):
num_val = ''.join(i for i in data if i.isdigit()
or i == '-' or i == '.')
return num_val
def int_response(self, data: str):
return int(self.numeric_response(data))
def float_response(self, data: str):
return float(self.numeric_response(data))
def attitude_response(self):
raw_att = self.response.split(';')
att_data = (self.int_response(raw_att[0]), self.int_response(raw_att[1]), self.int_response(raw_att[2]))
return att_data
def acceleration_response(self):
raw_acc = self.response.split(';')
acc_data = (self.float_response(raw_acc[0]), self.float_response(
raw_acc[1]), self.float_response(raw_acc[2]))
return acc_data
def temp_response(self):
raw_temp = self.response.split('~')
temp = (self.int_response(
raw_temp[0]) + self.int_response(raw_temp[1]))/2
return temp
def get_response(self):
if 'attitude?' in self.command:
return self.attitude_response()
elif 'acceleration?' in self.command:
return self.acceleration_response()
elif 'temp?' in self.command:
return self.temp_response()
elif 'baro?' in self.command or 'speed?' in self.command:
return self.float_response(self.response)
elif '?' not in self.command:
return self.get_raw_response()
else:
return self.int_response(self.response)
完整的代码在这里
赞 (0)