用Python实现nao机器人与RoboCup裁判盒间的通信

       本人现在是一名大三能源化工专业的学生,出于兴趣,大二时进入我校人形机器人实验室,做nao也将近一年了,期间也代表学校参加了2013年中国RoboCup大赛Spl的比赛。现在觉得很有必要把我的一些学习经验和想法写出来,供交流参考之用。因为本人并非计算机,软件相关专业,水平有限,如有错误,还望批评指正。

        当我开始写13年的比赛程序时,我决定先把机器人和裁判盒之间的通信程序写出来。通信的数据格式在RoboCupGameControlData.h文件里定义了,开始我是用C++写的通信程序,做成远程模块运行时,没有问题,但是做成本地模块时出了点问题,也没有解决。最后便改为用python在choregraphe里实现,发现效果还不错,而且代码量少了很多。

        源代码见下方;

import socket
import struct
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)
        self.memory = ALProxy("ALMemory")
    def onLoad(self):
        self.bstart = True
        self.bChangtoSend = False
    def onUnload(self):
        self.bstart = False
    def onInput_onStart(self):
        self.GameController_IP = self.getParameter("GameController_IP")
        self.GameController_Port = self.getParameter("GameController_Port")
        self.teamNumber = self.getParameter("teamNumber")
        self.playerNumber = self.getParameter("playerNumber")
        self.threadtime = self.getParameter("threadtime")
        self.msg_pack()
        self.sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
        self.sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#允许地址立即被重用
        self.sock.bind( ('',self.GameController_Port) )
        #####################################################
        while(self.bstart):
            self.msg,(self.addr, self.port) = self.sock.recvfrom( 200 )
            if(self.addr == self.GameController_IP):
                if(not self.bChangtoSend):
                    self.msg_unpack()
                    time.sleep(self.threadtime)
                    self.bChangtoSend = True
                else:
                    self.send()
                    time.sleep(self.threadtime)
                    self.bChangtoSend = False
        #######################################################
    def onInput_onStop(self):
        self.onUnload() 
        self.sock.close()
    def msg_unpack(self):
        header,version,playersPerTeam,state,firstHalf,kickOffTeam,secondaryState,dropInTeam,dropInTime,secsRemaining,team1_teamNumber,team1_teamColour,team1_goalColour,team1_score,team1_players1_penalty,team1_players1_secsTillUnpenalised,team1_players2_penalty,team1_players2_secsTillUnpenalised,team1_players3_penalty,team1_players3_secsTillUnpenalised,team1_players4_penalty,team1_players4_secsTillUnpenalised,team1_players5_penalty,team1_players5_secsTillUnpenalised,team1_players6_penalty,team1_players6_secsTillUnpenalised,team1_players7_penalty,team1_players7_secsTillUnpenalised,team1_players8_penalty,team1_players8_secsTillUnpenalised,team1_players9_penalty,team1_players9_secsTillUnpenalised,team1_players10_penalty,team1_players10_secsTillUnpenalised,team1_players11_penalty,team1_players11_secsTillUnpenalised,team2_teamNumber,team2_teamColour,team2_goalColour,team2_score,team2_players1_penalty,team2_players1_secsTillUnpenalised,team2_players2_penalty,team2_players2_secsTillUnpenalised,team2_players3_penalty,team2_players3_secsTillUnpenalised,team2_players4_penalty,team2_players4_secsTillUnpenalised,team2_players5_penalty,team2_players5_secsTillUnpenalised,team2_players6_penalty,team2_players6_secsTillUnpenalised,team2_players7_penalty,team2_players7_secsTillUnpenalised,team2_players8_penalty,team2_players8_secsTillUnpenalised,team2_players9_penalty,team2_players9_secsTillUnpenalised,team2_players10_penalty,team2_players10_secsTillUnpenalised,team2_players11_penalty,team2_players11_secsTillUnpenalised = struct.unpack("!4sI6BHI4B22H4B22H",self.msg)
        ###############################################
        #在这里对数据进行处理
        #############################################
    def msg_pack(self):
        header = "RGrt"
        version = 1
        team = self.teamNumber
        player = self.playerNumber
        message = 2
        self.ReturnData = struct.pack('4sIHHI',header,version,team,player,message)
    def send(self):
        if(self.bstart):
            self.sock.sendto( self.ReturnData, (self.GameController_IP, self.GameController_Port) )


从代码我们可以看出,主要调用了python的socket库,调用了socket库unpack(拆包)和pack(封包)函数。
这个程序的主要功能就是接受裁判盒发来的消息,并返回消息给裁判盒。其实,对于接收消息和发送消息,应该用多线程写的,但当时还没有接触多线程,所以用一个bool变量
self.bChangtoSend来控制,把接受数据和发送数据组成“一个整体”,进行循环控制。









  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值