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

2021-03-30 17:03:06 浏览数 (6)

老规矩,时间库 一个统计大类

初始化一些关于时间的的类变量

这里插一个Python列表的使用技巧,[:1]就是将当前列表的第一个元素丢掉

这个是类里面的所有的函数

我们这个函数倒着看,就是先看应用的地方

再看它的定义

可以看到是一堆选择结构,就像一个路由器的作用,就是它用来汇聚上层接口的指令,然后再分发给子函数去处理

因为信息的回应有字符有数字,就需要来逐个字符来处理

这两个是对偶的操作函数,收到不同的数据类型。

都是统一给最上面的函数,这样做的好处就是条例清晰

这个就是得到机器的回复,然后处理即可

代码语言:javascript复制
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 人点赞