您的位置:首页 > 其它

Robocup3d

2015-11-13 21:41 190 查看
一、 比赛介绍

RoboCup 仿真比赛是一个能为多智能体系统和模拟智能进行研究、教育的工具。比赛是在一个标准的计算机环境中进行的,提供了一个完全分布式控制、实时异步多智能体环境。通过这个平台,可以测试各种理论、算法和Agent体系结构。在实时异步、有噪声的对抗环境中,研究多智能体的合作对抗问题。当然,仿真组的比赛使用的机器人并非是真的机器人。一个机器人是一个Agent, 它拥有自己的大脑,是一个独立的“主体”。而一个球队实际是由十一个程序组成的。服务器的工作就是计算并更新球场上所有物体的位置、运动和状态,发送视觉和听觉信息给球员,接收和执行球员的命令。

RoboCup仿真组是完全基于软件程序的开发而没有实际的机器人,这是不同与 RoboCup 其他组的重要方面。因此,研究人员可以把精力完全投入到机器人的高层决策中,而无需考虑硬件问题。同时,仿真组比赛所需的仿真平台的开发还可以促进计算机仿真技术的发展。

RoboCup3D是2005年才引入的新的仿真组别。比赛的环境是3D的,球场上各个物理状态的更新是依赖于物理引擎的,所以更逼近现实。05、06年的比赛都是球形环境的,每个Agent都是一个球体,机器人踢球其实就是球撞球的过程。自07年开始,每个球员都是一个仿人的机器人,它们有实实在在的实物机器人模型。这时的比赛就是仿人机器人之间的对抗。由于球员是仿人的,踢球也自然是用脚去踢,这时动作的实现成了一大难题。这是仿真2D组和之前的球形环境的仿真3D所不需要考虑的问题。不过这必然会促进机器人相关理论的研究和发展。

二、 国内国际比赛现状

国际比赛(robocup世界杯、伊朗公开赛、日本公开赛等等)中中国曾有多只队伍获得过世界冠军,东南大学SEU-3d、南京邮电大学Apollo(2013年代码开源)等等。比赛队伍主要还是集中在东亚、伊朗、美国、德国这几个地方(整个robocup比赛也是这样)。现在比较厉害的有:美国德州大学奥斯汀分校(二进制可执行文件开源)、德国maggfurburg什么的记不住(这个队伍是开源的)。

2015年国赛和世界杯东南大学都没有来,可是说国内比赛已经被南邮电称霸了,其他队伍基本都是被踢个x:0。强队还有cit、河海大学文天学院。

其实3d仿真比赛强队与弱队差距最大的还是底层,抢球抢不过,行走没别人快、射门精度和距离也不如别人,就像十一个c罗踢中国队一样,有没有战术无所谓,因为别人可以直接单刀进球。

三、 比赛机器人平台介绍

RoboCup 3D仿真平台中所用到的机器人,是对真实机器人的模拟。具有和实物机器人相同的构造参数,如身高、重量、自由度、各部分构件的具体参数等。利用这个仿真平台,我们可以零成本的研究双足机器人,因为仿真平台下机器人是没有磨损的。

目前RoboCup 3D仿真平台中所用的机器人模型分为两种:日本富士通公司的HOAP-2型机器人,以及法国Aldebaran公司的NAO机器人。

现阶段比赛几乎全部是以Nao为模型开发的。

Nao机器人:身高57厘米,体重约4.5kg,具有22个自由度。这个机器人模型广泛使用于RoboCup3D仿真组(Sim-3D)、标准平台组(SPL)、MSRS(微软机器人仿真环境)。

注:我们Sim-3D环境下的NAO机器人,和实物机器人还是略有区别的,比如手臂上的关节数目,实物的有6个,而仿真的目前只有4个。

从左至右分别为Simspark中的Nao、实体Nao、roboviz中的Nao

Nao关节图

Nao机器人的具体参数

相关解释:

机器人是由若干个body组成的,并且每个body都被理想化为质地均匀的规则几何体,如Cylinder(圆柱体)、Sphere(球体)、Box(长方体)。我们要考虑Cylinder的高度和底面半径,以及Sphere的半径,Box的长宽高。这些具体参数表中已经给出。

Name: 身体部位的名称

Parent: 指示该部位是连接在身体的哪个部位之上的。如shank(小腿)连接在thigh(大腿)上,则thigh是shank的Parent。

Translation: 该部位相对于其Parent的位置。由于每个body是一个质地均匀的几何体,可以认为其几何中心就是它的质心。这里Translation可以理解为body的几何中心相对于其Parent的质心的位置。

Mass: body的质量

Geometry: body的几何参数

Joint Name: 该body上所安置的关节的名称。如shank上安置的关节名为LJ4。

Anchor: 每个关节的固定点相对于所在body中心的位置。以shank和LJ4为例,LJ4这个关节固定在shank上,以LJ4的固定点为原点建立局部坐标系,那么Anchor就是一个三维向量,起点是shank的中心,终点是局部坐标系的原点(即LJ4的固定点),是一个指向上方的向量,但未必垂直于地面。

Axis: 关节轴矢量,是一个单位向量。全局坐标系的定义如图所示。以LJ4为例,它的转动轴与x轴平行,转动的正方向(给某关节加上正的角速度,此时关节的转动方向就是它的正方向)是逆时针的。用右手握住转动轴,四指指向转动的正方向,大拇指所指的方向就是关节轴矢量的方向,即为(1,0,0)。

Min: 关节所能达到的最小角度值。

Max: 关节所能达到的最大角度值。

我们还定义了其他的量:

质心位置c: 这个body的质心在连杆局部坐标系中的位置。以shank为例,质心就在其中心,这个连杆的局部坐标系就是LJ4上的局部坐标系。我们做一个三维向量,起点是局部坐标系的原点,终点是body的质心,这个向量就是c,换句话说Anchor的负向量 = c,即c = -Anchor。

四、 仿真比赛架构

Robocup3d比赛实质上是一个互相通信的程序,二十二个客户端CLient(双方各11个)与一个服务端(server)作通信。服务端以20毫秒为周期向各个客户端以字符串的形式发送 机器人的相关信息(例如向机器人1号发送比赛时间、机器人1号看到的情况、球的位置、自身传感器数据等等),各个Client(也就是仿真机器人Agent)先将这些信息解析,计算出自身的坐标、球的坐标、敌方及队友的位置等等,决策下一步所进行的动作,并将其以字符串的形式发送给服务端(例如1号发送自身各个电机的值),服务端通过这二十个agent发送的字符串(即机器人下一步要进行的动作),通过ode(开放动力学引擎)计算出这些机器人执行这些动作之后的世界模型的物理参数,并继续发送给各个agent,如此循环。

• 附:机器人收到的一条完整的消息

(time (now 29.66))(GS (t 0.00) (pm BeforeKickOff))(hear 0.00 76.05 abcdefghijk)(GYR (n torso) (rt 0.35 0.36 -0.03))(HJ (n hj1) (ax -0.00))(HJ (n hj2) (ax 45.06))(See (G2R (pol 7.03 -7.30 -42.94)) (G1R (pol 7.05 8.64 -42.49)) (F1R (pol 8.11 42.35 -40.65)) (F2R (pol 8.09 -40.32 -41.39)) (P (team NaoRobot) (id 1) (head (pol 6.98 36.91 -39.38)) (rlowerarm (pol 7.02 39.48 -40.04)) (llowerarm (pol 6.88 36.72 -41.11)) (rfoot (pol 7.01 40.07 -42.19)) (lfoot (pol 6.94 38.73 -42.90))))(HJ (n raj1) (ax -0.00))(HJ (n raj2) (ax -0.00))(HJ (n raj3) (ax 0.00))(HJ (n raj4) (ax -0.00))(HJ (n laj1) (ax -0.00))(HJ (n laj2) (ax -0.00))(HJ (n laj3) (ax 0.00))(HJ (n laj4) (ax -0.00))(HJ (n rlj1) (ax -0.00))(HJ (n rlj2) (ax 0.00))(HJ (n rlj3) (ax 0.00))(HJ (n rlj4) (ax 0.00))(HJ (n rlj5) (ax 0.00))(FRP (n rf) (c -0.01 -0.00 -0.01) (f 0.20 -0.19 26.12))(HJ (n rlj6) (ax 0.00))(HJ (n llj1) (ax -0.00))(HJ (n llj2) (ax -0.00))(HJ (n llj3) (ax 0.00))(HJ (n llj4) (ax 0.00))(HJ (n llj5) (ax 0.00))(FRP (n lf) (c -0.01 -0.01 -0.02) (f 0.20 -0.22 19.04))(HJ (n llj6) (ax -0.00))

五、 agent设计

仿真Server和球员程序之间以TCP的方式进行连接。在启动simspark后,Server会创建一个TCP的套接字,并等待球员进程与之相连接。一个球队的可执行文件往往只有一个,但是却可以扮演一个队所有球员的角色。因为同一个可执行文件执行多次,会产生多个进程,每个进程都会和Server连接,充当一个球员的角色,,体现了多智能体和分布式控制。并且同一个队的球员进程所具有的球员编号是互不相同的,这可以认为是区分它们的标示符。球员进程和Server建立连接后,仿真环境体现不出任何变化,需要球员进程和Server交互,向Server发送指定的命令,球场上才会产生机器人,并对各个因素进行仿真。

比赛进行时,Server搜集该机器人感应器的信息,组织成消息字符串,发送给球员进程。球员进程在收到消息之后,进行思考和分析,生成命令和动作,并发送给Server。Server在收到球员发送的命令之后,执行请求的命令,同时对仿真环境进行模拟和更新。

网络连接:基于TCP通讯的Client端,具有连接到指定IP地址和端口,数据的收发,连接和断开连接的功能。这里收发的数据都是经过简单打包的数据包。从数据包的第5个字节开始到结束,才是真正的消息/命令字符串。前4个字节存放的是字符串的长度(不包括这4个字节),但这个长度是经htonl()转化的。当Server或球员进程收到一个数据包之后,首先要根据数据包前4个字节的内容和整个数据包的字节数,来进行一个简单的校验。将前4个字节的内容经ntohl()转化,得到后面字符串应有的长度,再加4,结果应该等于这个数据包的字节数。如果不等于,表示这条消息有误,应当将其抛弃。当Server断开和球员进程的连接时,网络连接模块应该能主动监测到这一状况,并使整个程序退出。并且要求可以通过main()函数的参数来便捷地设置连接到哪个主机的IP地址。

这个模块的设计可以参考rcssserver3d源代码包中的rcssagent3d\main.cpp。

消息解析:用于解析Server发送给球员进程的消息。在感应器和效应器一节中,我们已经提过了消息字符串的格式。这里要根据不同感应器在消息中的标示符,将数据从字符串中提取出来。由于消息字符串的长度较长(往往有近千个字符),而且进行消息解析的频率较高(20ms解析一次),所以要尽可能的优化解析的算法,以免给程序带负担,同时也可以留更多的时间用于其它模块的运算,提高程序的响应速度。

这个模块的设计可以参考rcssserver3d源代码包中的rcssagent3d\naobehavior.cpp。

世界模型(World Model):用于描述球员自身以及环境的信息。其中的某些信息是静态不变的,而有些信息则是不断更新变化的。

保持不变的信息有:球场的长和宽,球门的宽度和高度,球的半径、质量,机器人模型的参数,敌我双方的队名,我方在左边还是右边,球员自身的球员号码,以及和比赛规则相关的参数等。

变化更新的信息有:球的位置,我方队员的人数以及队友的球员号码,对方队员的人数以及各自的球员号码,各个球员的位置,比赛的比分,球员自身的位置和身体面向角度,球员自身所有感应器捕获的信息等等。

这些信息中,一些是Server配置文件中的固定参数(具体请参看:/usr/local/share/rcssserver3d/naosoccersim.rb),一些是通过球员进程收到的消息字符串可以直接解析得到的,而另外的则是要自行设计更新方案的。其中的定位算法最为重要,在全局视觉模式下,采用全景摄像头,并且数据也没有加噪音,定位算法相对简单。而在局部视觉下,数据又被加了噪音,能否实现自身定位、能否计算出球和其他球员的位置、计算结果的准确性都是待考虑的因素。比赛比分的获取要根据比赛模式的切换来累计,消息字符串中也是没有的。机器人是否快倒下了,是否已经倒在地上,是向前倒还是向后倒,这要根据陀螺仪和脚部压力传感器来监测。

在每次从Server获得新的消息字符串,并进行解析之后,都要更新World Model中的内容,保证球员知道球场上和自身的最新状况,以便于思考和决策。World Model中应该有大量的函数用于实现更新的算法,以及大量变量和数据结构来存放信息。为了给机器人的思考提供支持,World Model还应在对所有的数据和信息进行有效组织的基础上提供一些基本函数,如判断Agent自身是否离球最近,寻找距Agent自身最近的我方和对方球员,球员是否在某个区域内,截球点的计算等。我们称之为WorldModel_HighLevel。

基本动作的实现:常用的基本动作包括:走路、转身、踢球、倒下之后的爬起等。机器人的所有动作都可以由这些基本动作组织而成。对于动作的生成方法,可以大致归为两种:第一种,规划好一个动作的各个阶段,每个阶段各个关节的关节角,使用什么类型的舵机函数,每个细节都要详细的规划好,然后在仿真环境下观看实际的效果,调整参数使动作能达到较好的效果。这个方法比较简单,但是动作的鲁棒性比较差,在比赛中的实际表现不是很好,可能和平时的调试有一定的出入,而且要花费很多的时间在参数的调试上,可以认为是没有多少技术含量的体力劳动。第二种,基于步态规划和运动学建模的方法。在设计走路动作时往往只需要规划机器人的臀部和脚在某几个特殊时刻的位姿,通过运动学就可以得到各个关节应有的角度。可以通过参数设置在身体前后方向、侧身方向的位移,每走一步的转角,使得动作的灵活性较好。由于动作命令的生成是根据当前的机器人状态和行走参数在线生成的,动作的鲁棒性相对较好。走路、转身、踢球都可以基于这种方法来做。倒下之后的爬起往往还是基于第一种方法,因为这个动作比较简单,各个阶段也是固定不变的,完全可以事先设计好,有较好的可再现性。由于步态规划和运动学部分有一定的难度,3D仿真组初期的开发可以先基于第一种方法设计动作。

高级技能(skill):相对基本动作而言,skill将实现更高级的功能,如向前走到某一点,向后走到某一点,转身多少度,转到某个方向,把球踢向某个方向,身体倒后的爬起等等,需要基本动作结合世界模型。

以走到某一固定点这个功能来简要分析:走路可以有向前走、向后走、向左走、向右走。向左向右走的速度较慢。所以在和目标点超过一定距离时优先考虑向前向后走。首先考虑是否要先转身然后再走路。当距离较远时,分别计算向前和向后走到目标点要转多少度,假设向前走需要转身的角度较小,选择向前走。如果转角够小,可能就不需要单独的先进行转身了,可以在走路的过程中边走边转。否则,先转身到面向目标点的方向,再走过去。即将到达目标点时,要停下来。要尽量的缩短总体所耗的时间。

关于倒下爬起:由于有向前倒下和向后倒下,所以要先判断是向前倒还是向后倒,这依赖于世界模型的更新。然后根据倒下的类型选择相匹配的动作。动作做完之后,可能机器人并没有成功爬起,导致的原因可能有:倒下的方向判断错、和球或其他球员产生了碰撞、动作本身的问题等。所以动作做完之后还要判断是否成功。如果判断出已经成功爬起,则爬起结束;没有成功,继续爬。若连续爬起几次都失败,就要考虑世界模型在判断倒下方向这部分有没有问题。

高层决策(decision):决定球员自身在现在的状况下应该干什么。在世界模型更新之后,球员必须要根据现有状况作出反应。这部分相当于球员的脑子。由于skill部分已经对基本动作进行了封装。这里的高层决策往往就只和世界模型和skill关系紧密了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: