Roban虚拟仿真培训
1.环境搭建
1.1环境组成
三个部分server,RoboViz,agent
server即服务器,在该平台中包括两部分:SimSpark和rcssserver3d
RoboViz即监视器用于查看球场的情况,相比于server自带的监视器功能更全面,显示效果更好
agent即智能体,也指球队,一个球队在运行时会产生多个进程,每一个进程是一个单独的智能体,通过通讯进行交流
1.2环境搭建演示
为便于演示,在本次培训中采用虚拟机进行演示,为加快速度,一些必要的依赖包已进行安装。
Linux发行版本:ubuntu16.04
安装依赖包:
sudo apt-get install g++ git cmake libfreetype6-dev libode-dev libsdl-dev ruby ruby-dev libdevil-dev libboost-dev libboost-thread-dev libboost-regex-dev libboost-system-dev qt4-default安装java:
sudo apt-get install openjdk-8-jdk
java -version修改监视器:
sudo apt-get install vim
sudo vim /usr/local/bin/rcsoccersim3d关于球场的常用命令:
#同时开启server与roboviz
rcsoccersim3d
#仅开启server
rcssserver3d
#杀死server
pkill -9 rcssserver3d1.3仿真比赛规则
在运行server时,可以在终端中查看相关版本信息,Roban比赛采用的rcssserver3d版本为0.7.2,相关比赛规则如下:
(1)开球规则:开球直接进球不算,开球的队员在开球的过程中不能连续两次触球,如果违反这个规则,开球权将转移到对手球队。 开球直接进球不得分,对手方将获得一次球门发球的机会。
(2)守门员:守门员的球衣号码必须是 1号。
(3)手球:手球是指的球员用手或者胳膊拿触碰球,手球将由裁判员裁定,如果一方出现手球犯规,将由另一方开任意球。守门员在自己的禁区内可以用手碰球。
(4)阻碍:阻碍指的是球员用自己的身体、手臂或者腿来阻碍比赛的正常进行,比如球员趴在球上、球员抱起球、球员用脚夹住球或者是躺在对方球员进攻的路线上。故意阻碍的情况由裁判员进行裁定,如果阻碍时间超过10 秒,则对方球队获得任意球机会。非故意阻碍的情况如果超过 10 秒,将由裁判员进行抛球。
(5)非法防守:在比赛的任何阶段,禁区内不允许超过3名防守球员,如果禁区内出现第 4 名防守球员,则该球员会被弹出场外。如果第4名防守球员是守门员,则禁区里离球最远的另一名防守队员将被弹出场外。
(6)不移动:不移动的球员,或者是倒在地上长时间不站起来 的球员将被弹出。守门员如果不移动的时间超过30秒或者倒下后60秒内不站起来,则将被弹出;其他球员如果不移动的时间超过15秒,或者倒下后 30 秒内不站起来,则将被弹出。
(7)违规冲撞:球员必须避免接触其他球员,如产生犯规情况 将被自动罚出场外。
(8)球员碰撞:要求避免球员之间的碰撞,如果有 3 个或者3个以上的球员发生碰撞,则碰撞球员数多的队伍的一名球员将被移出 撞击点。例如三个球员倒在一起时,该规则将被自动执行。
(9)自碰撞犯规:当球员的身体部位产生自碰撞而违规正常物 理规则时,该规则将被自动触发。SelfCollisionsTolerance m 是对机器 人身体部位侵入同一机器人的另一个身体部位的容忍度。当机器人因自碰 撞 犯 规 而 被惩 罚 时 , 其 参 与 自 碰 撞 的 关 节 将 在 SelfCollisionJointFrozenTime s内被冻结。冻结关节意味着将其速度设 置为零,并忽略代理发送的所有移动该关节的命令。冻结时间过后, 关节将不能在SelfCollisionJointThawTime s内被再次冻结。模拟器目前使用的自碰撞参数为:
• SelfCollisionsTolerance = 0.04 • SelfCollisionJointFrozenTime = 1.0 • SelfCollisionJointThawTime = 2.0
(10)传球命令:传球命令可被球员在比赛期间使用以启动其团队的传球模式。要使用此命令,代理应向模拟器发送“(PASS)” 消息。当一个球员成功使用传球命令启动传球模式后,在传球模式的持续时间内,所有的对手都不 能 靠 近 球 超 过 1.0 米 。 传 球 模 式 将 在 球 队 成 员 触 球 或 开 启 该 模 PassModeDuration s 后结束。一旦某方球队的PASS 模式结束,该球队的成员必须至少等待 PassModeRetryWaitTime s 才能再次启动该球队的PASS 模式。
在球队的传球模式启动后,该球队只有在至少满足以下条件之一的情况下进球才会得分,违规进球将不会被计入比分,并判给对方球队一个门球:传球模式结束时间达到 PassModeScoreWaitTime s;传球模式结束后的比赛模式由PlayOn 转换为其他模式(例如, 当球出界时);球队中两名球员触碰球,且至少有一人在传球模式启动的区域(当传球模式开始时,围绕球的位置半径为 1.0m 的圆)外触球。球员想要成功使用PASS 命令为其团队启动PASS模式,需要满足一些要求。首先,球的最大速度应该不超过 PassModeMaxBallSpeed m/s。其次,球应该在调用Pass命令的球员的 PassModeMaxBallDist m 内 。第三,任何对方球员都不能在球周围半径为 PassModeMinOppBallDist m 的圆形区域内。只有满足这三个条件,服务器才会接受 Pass 命令。否则,服务 器会忽略该命令,并且不会启动传递模式。目前技术委员会定义的参数有:
• PassModeMaxBallSpeed = 0.05 • PassModeMaxBallDist = 0.5 • PassModeMinOppBallDist = 1.0 • PassModeDuration = 4.0 • PassModeScoreWaitTime = 10.0 • PassModeRetryWaitTime = 3.0
(11)消极比赛:使用球员故意蹲在地上,腿张开,可能绊倒对手而不踢球的球队,将被罚对手一个任意球。该犯规情况将由人类裁判判定。
(12)点球比赛:在点球比赛阶段,每个队伍都只有一名球员在球场上:防守队的守门员和进攻队的点球球员。每次罚球都是从场地中央开始。点球比赛开球后,进攻队球员有40秒的时间来完成射门,防守队的守门员必须待在禁区内,如果守门员出现在禁区外将被视作进攻队的进球。如果是因为两队打平而进行点球大战,则每个队伍都有5次进行点球的机会。如果5次点球后,两队仍然是平局,则进行突然死亡的点球阶段,即一轮点球中,某一队取得进球而另一队没有取得进球,则进球队获胜。如果10轮点球后,仍然是平局,则进 行抛硬币决胜阶段。
(13)输出:每名球员都允许将一些数据输出到文件中,文件名 应该命名为 stdout 和 stderr 后面加上球员编号。这些只可写的文件 将存放在球队主文件夹的 log 子文件夹下。除了这些文件,球队主 目录下的文件在比赛过程中都是只读的,所以球员不能打开其他文件 进行写数据操作。
(12)公平:比赛应该公平公正,遵循大家普遍了解的足球规则,遵守3D仿真的规则。比赛中不允许有作弊行为,比如:使用其他队伍的可执行程序(普通模式与点球模式)。通过控制球员发送过度的指令来干扰服务器。不使用服务器提供的球员通信方式,而让球员进程之间直接进行通信。有意控制比赛机器甚至重启机器等行为。
2.技术讲解
2.1底层流程解读

球队的底层流程如上图,可见构建一个可以上场的球队的代码量是十分庞大的,因此在比赛时采用开源的底层球队代码可以大大减少开发的难度,Roban采用的是UTAustinVilla RoboCup 3D 仿真比赛团队所公开的球队低层代码,并在此基础上进行修改以适应Roban机器人模型。
球队运行流程:
从main.cc开始:
main()→Run()→Think()→act()→selectskill()
尽管前面的流程很多,我们只需要在selectskill()中返回相应的动作即可
2.2策略编写
在底层代码中给出了一个Demo示例,效果为球员绕着一点转圈,并不断地将球踢向圆心。
代码示例:Roban_base
非常有用的工具—RoboVizDraw
而对于策略的编写不应仅停留在if else中,更应该去结合实际人类比赛,例如在人类比赛中不同球员有不同的分工,前锋后卫等,在仿真比赛中也可以参考这种方式,不过由于仿真平台中不存在球员能力的偏好,分工不应是固定球员号,而是在区域进行分工更加合理。在UTAustinVilla官网中有关于动态角色分配的论文,大家可以去尝试复现。
2.3优化思路
针对优化部分,即如何让机器人走得更快,踢得更远,是机器人领域中广泛存在的问题,任何人形型或仿人型机器人最先解决的是如何行走。在底层代码中很对walk行为有相关模块进行控制,并由相关参数来决定,而如何对这些参数进行优化便是仿真平台比赛的另一大内容。
optimization模块以及paramfiles模块
当然想人工去调整这些参数是不现实的,所以利用机器学习来对参数进行优化是一个比较好的选择。不过具体采用什么方法还需要自己去了解以及试验。一个比较简单并且已经被很多学校验证效果比较好的方法是协方差自适应进化策略CMA-ES,当然如何去使用还需要大家去了解。不过目前也有很多封装好的库,所以使用它并不是很难。当然知道如何使用是远远不够的,还需要与Roban这个比赛平台相结合,去搭建出属于自己的优化框架,并得到一个比较好的效果才是一个完整的优化流程。
2.4一些建议
1.阅读一些论文,尝试复现或给你一些思路
2.编写一些脚本来提高开发效率
3.尝试新的东西