合肥工业大学机器人足球仿真robcup作业一(python实现)附代码有注释

《机器人技术》第一次作业
题目 : 在机器人足球比赛中, server 和球员 client 之间通过发送字符串来进行信息交互,其
server 要把某球员的听觉和视觉信息发送给该球员,信息的格式如下所示:
hear Time Sender Message
see Time ObjInfo ObjInfo …
其中
hear Time Sender Message )的具体含义如下:
Time :前的仿真周期。
Sender
如果是其他球员发送的消息,那么是发送者的相当方向( Direction
self :发送者是自己本人。
referee :裁判是发送者。
online_coach_left 或者 online_coach_ringt :发送者是在线教练。
Message :消息内容。
see Time ObjInfo ObjInfo … )的具体含义如下:
Time :当前时间。
ObjInfo 表示了可视对象的信息。其格式为:
ObjName Direction Distance DirChng DistChng BodyDir HeadDir
ObjName = player Teamname Unum
| goal Side
| ball
| flag c
| flag [ l | c | r] [ t | b ]
| flag p [ l | r] [ t | c | b ]
| flag [ t | b] [ l | r ] [10 | 20 | 30 | 40 |50 ]
| flag [ l | r] [ t | b ] [10 | 20 | 30 ]
| flag [ l | r | t | b ] 0
| line [ l | r | t | b ]
Direction Distance 表示目标的相对距离和相对方向
DirChng DistChng 分别表示目标距离和方向的相对变化,如果是固
定物体(球和球员以外的所有对象)则没有改项值
BodyDir HeadDir ,分别是被观察球员相对观察者的身体和头部的
相对角度,只有是球队对象才有这一项值。
要求:编写程序解析球员所看到和听到的信息。
示例: (hear 1022 -30 passto(23,24))(see 1022 ((ball) -20 20 1 -2) ((player hfut1 2) 45 23 0.5 1 22
40 ) ((goal r) 12 20) ((Line r) -30))
输出:
1022 周期 hear -30 方向 听到了 passto(23,24)
1022 周期 see Ball 距离我的 Direction -20, Distance 20 DistChng 1 DirChng
-2 player hfut 2 距离我的 Direction 45 Distance 23 DistChng 0.5 DirChng
1 ,它的 BodyDir 22 HeadDir 44 goal r 距离我的 Direction 12 Distance 20 Line r 和我的角度是 -30
一些参考建议:
场上对象 : (f r b 10) 表示场上某个点 , 具体见教材 28 页,教材上写的是( flag r b 10 ),
大家写程序的时候以 f 为准。
本示例中左右 2 边的名称分别为 hfut1 hfut2, 大家写程序的时候 hfut1 的球员信
息存储在在队友里面, hfut2 存储在对手里面。
这是我自己使用python程序编写的源代码。关键地方我都给了注释。应该不会看不懂,也就不需要我过多讲解了。
希望大家在借鉴的同时能有自己的思考,做到学以致用。祝大家都能在作业中取得好成绩。
import re # 导入正则表达式模块
# 更改这个元组内容的顺序即可给改变数据对应的顺序,不用改变封装好的函数
Position = ('Direction', 'Distance', 'DirChng', 'DistChng', 'BodyDir', 'HeadDir')   # 使用tuple元组不可修改其内容


def outPutInfo(info):
    """
    格式化输出解析出来的数据包
    :param info: 解析出来的信息包
    :return: 无
    """
    hear = info['hear'] # 获取听到的数据包
    see = info['see']   # 获取看到的数据包
    if hear != '':
        print("在 {} 周期 hear 从 {} 方向 听到了 {};".format(hear['time'], hear['Sender'], hear['Message']))
        pass
    if see != '':
        print('在 {} 周期 see'.format(see['time']), end=' ')
        see = see['obj_list']       # 去掉第一个时间
        for item in see:
            for key, value in item.items(): # 获取信息
                if 'ObjName'.__eq__(key):
                    print(item[key], end=' ')
                elif 'Direction'.__eq__(key):
                    print("距离我的 Direction 是 {},".format(item[key]), end=' ')
                elif 'Distance'.__eq__(key):
                    print("Distance 是 {},".format(item[key]), end=' ')
                elif 'DirChng'.__eq__(key):
                    print("DirChng 是 {},".format(item[key]), end=' ')
                elif 'DistChng'.__eq__(key):
                    print("DistChng 是 {},".format(item[key]), end=' ')
                elif 'BodyDir'.__eq__(key):
                    print("它的 BodyDir 是 {}".format(item[key]), end=' ')
                elif 'HeadDir'.__eq__(key):
                    print("和 HeadDir 是 {}".format(item[key]), end=';')
                pass
            print()         # 添加一个换行,使得输出更直观
            pass
        pass


def decode(msg):
    """
    对消息进行解析
    :param msg: 要解析的字符串
    :return: 解析完的数据包
    """
    package = packMsg(msg)  # 首先将整个消息分块打包,分出大的数据包
    worked_msg = {'hear': '', 'see': ''}
    if not package:         # 如果分离出的数据包是空的,说明传入的字符串没有数据
        print('未检测到数据包!')
    else:
        for item in package:        # 循环最外层的大数据包
            msg_type = re.findall('[(](.*?) ',item)[0]  # 拿到数据包的类型
            if 'see'.__eq__(msg_type):  # 如果数据包是see类型
                see = {'type': 'see', 'time': re.findall(r'\d+', item)[0]}
                obj_info = packMsg(item, 1)  # 跳过第一个左括号
                # print(obj_info)
                obj_list = []   # 创建一个对象列表,用于存储对象
                for obj in obj_info:    # 循环所有对象信息
                    tmp = dict()
                    tmp['ObjName'] = re.findall('[(]{2}(.*?)[)]', obj)[0]   # 拿到名字信息
                    # print(tmp)
                    position_info = re.findall('[)](.*?)[)]',obj)[0]    # 拿到位置信息
                    position_info = position_info.split(' ')        # 将位置信息分割出来
                    # print(position_info)
                    i = 0
                    for pos in position_info:  # 循环每个对象的位置信息
                        if pos != '':
                            tmp[Position[i]] = pos
                            # print(pos)
                            i += 1
                            pass
                        pass
                    obj_list.append(tmp)    # 将对象加入到对象列表中
                    pass
                see['obj_list'] = obj_list
                # print(see)
                worked_msg['see'] = see
                pass  # 处理完看到的信息
            elif 'hear'.__eq__(msg_type):
                item = item[1:len(item)-1]   # 去掉最外面的左右括号
                hear = {'type': 'hear', 'time': item.split(' ')[1], 'Sender': item.split(' ')[2]
                        , 'Message': item.split(' ')[3]}
                worked_msg['hear'] = hear
                pass    # 处理完听到的信息
            pass    # 最外层循环的大数据包,
        pass  # 数据处理完成
    return worked_msg


def packMsg(msg,start=0):
    """
    匹配一对括号里面所有内容惊醒打包
    :param msg:    要打包的信息
    :param start:  检查的起始位置,默认是0从头来开始
    :return: 打包完成的信息包组成的列表,若没有消息包就返回空列表
    """
    num = 0
    index = 0
    tmp = []
    msg = msg[start:]
    for s in msg:
        if s == '(':
            num += 1
            if num == 1:
                start = index
        elif s == ')':
            num -= 1
            if num == 0:
                tmp.append(msg[start:index+1])
                start = index+1
        index += 1
    return tmp


if __name__ == '__main__':
    msg = input("请输入你需要解析的字符串信息:")
    # msg = '(hear 1022 -30 passto(23,24))(see 1022 ((ball) -20 20 1 -2) ((player hfut1 2) 45 23 0.5 1 22 40 ) ((goal r) 12 20) ((Line r) -30))'
    # msg = '(see 2022  ((player hfut2 8) 40 23 1  6 21  33 ) ((goal r) 15 30)  ((f r t 20)5   24 ))(hear 2022 -10 “passball”)'
    # msg = '(hear 2022 -10 “passball”)'
    print('\033[1;31m程序是按照作业PPT参数的顺序进行解包和输出的!\033[0m')
    worked_info = decode(msg)       # 对接受的数据进行解析
    outPutInfo(worked_info)         # 格式化输出
    # print(worked_info)            # 可以查看解析后的数据包

"""
样例输入:
(hear 1022 -30 passto(23,24))(see 1022 ((ball) -20 20 1 -2) ((player hfut1 2) 45 23 0.5 1 22 40 ) ((goal r) 12 20) ((Line r) -30))
样例输出:
在 1022 周期 hear 从 -30 方向 听到了 passto(23,24);
在 1022 周期 see   ball 距离我的 Distance 是 -20, Direction 是 20, DirChng 是 1, DistChng 是 -2,
player hfut1 2 距离我的 Distance 是 45, Direction 是 23, DirChng 是 0.5, DistChng 是 1, 它的 BodyDir 是 22 和 HeadDir 是 40;
goal r 距离我的 Distance 是 12, Direction 是 20,
Line r 距离我的 Distance 是 -30,
"""

合肥工业大学机器人足球仿真robcup作业一(python实现)附代码有注释_第1张图片

 

你可能感兴趣的:(机器人,python,学习方法)