声明:以下内容是在Ubuntu18.04版本下搭建的比赛环境下的学习笔记。
这里写目录标题
比赛介绍
RoboCup 仿真比赛是一个能为多智能体系统和模拟智能进行研究、教育的工具。比赛是在一个标准的计算机环境中进行的,提供了一个完全分布式控制、实时异步多智能体环境。通过这个平台,可以测试各种理论、算法和Agent体系结构。在实时异步、有噪声的对抗环境中,研究多智能体的合作对抗问题。当然,仿真组的比赛使用的机器人并非是真的机器人。一个机器人是一个Agent, 它拥有自己的大脑,是一个独立的“主体”。而一个球队实际是由十一个程序组成的。服务器的工作就是计算并更新球场上所有物体的位置、运动和状态,发送视觉和听觉信息给球员,接收和执行球员的命令。
RoboCup仿真组是完全基于软件程序的开发而没有实际的机器人,这是不同与 RoboCup 其他组的重要方面。因此,研究人员可以把精力完全投入到机器人的高层决策中,而无需考虑硬件问题。同时,仿真组比赛所需的仿真平台的开发还可以促进计算机仿真技术的发展。
RoboCup3D是2005年才引入的新的仿真组别。比赛的环境是3D的,球场上各个物理状态的更新是依赖于物理引擎的,所以更逼近现实。05、06年的比赛都是球形环境的,每个Agent都是一个球体,机器人踢球其实就是球撞球的过程。自07年开始,每个球员都是一个仿人的机器人,它们有实实在在的实物机器人模型。这时的比赛就是仿人机器人之间的对抗。由于球员是仿人的,踢球也自然是用脚去踢,这时动作的实现成了一大难题。这是仿真2D组和之前的球形环境的仿真3D所不需要考虑的问题。不过这必然会促进机器人相关理论的研究和发展。
在Ubuntu18.04下打开robocup球场(开机)
1.在下载解包好的RoboViz/bin文件内开启终端输入./roboviz.sh开启赛场
2.在下载解包好的SIMSPARK_0.3.1_RELEASE/simspark-SIMSPARK_0.3.1_RELEASE文件夹内开启终端输入rcssserver3d
3.在下载解包好的源码文件master/utaustinvilla3d-master内开启终端输入./start.sh
4.在3处再次输入./kill.sh可以将机器人下场,注意:若机器人位置不合法右上角会报illegal defendence(在audio文件中将解释)
5.回到球场界面按下O可以选择开球
6.开始比赛的一些命令
gametime 比赛时间
playmode 当前比赛模式
beforekickoff 比赛未开始状态
killoff_left 左边开球
beam 球员上场的位置
虚拟环境球场
比赛的球场是一个30*20的绿茵场,以中心为坐标原点。满足x∈[-15,15],y∈[-10,10]
小贴士:
.h为头文件
.cc为源文件
audio.cc源文件中关于球场代码注释
//#define HALF_FIELD_X 15.0 field:田(球场)
//#define HALF_FIELD_Y 10.0
//#define NUM_AGENTS 11 agent:代理(机器人代理人)以下简称为球员
/*
These are x and y limits for the ball and the players.
这些是球和球员的x和y限制
*/
double minBallX = -HALF_FIELD_X - 2.0;//球的x坐标的最小值
double maxBallX = HALF_FIELD_X + 2.0;//球的x坐标的最大值
double minBallY = -HALF_FIELD_Y - 2.0;//球的y坐标的最小值
double maxBallY = HALF_FIELD_Y + 2.0;//球的y坐标的最大值
double minAgentX = -HALF_FIELD_X - 5.0;//球员的x坐标的最小值
double maxAgentX = HALF_FIELD_X + 5.0;//球员的x坐标的最大值
double minAgentY = -HALF_FIELD_Y - 5.0;//球员的y坐标的最小值
double maxAgentY = HALF_FIELD_Y + 5.0;//球员的y坐标的最大值
worldmodel.h中部分函数功能翻译(持续更新ing)
设置及坐标参数返回 VecPosition(x,y,0)
判断球员于目标距离 temp.getDistanceTo(VecPosition(x,y,0))
获取当前对象的指定坐标 temp.getX() (之前必须在前重新定义对象)
获取当前球员坐标 getMyPosition()
获取比赛时间 getGameTime()
获取球的位置 getBall()
获取比赛状态 getPlayMode()
获得上一次策略 getLastSkill()
获取摔倒队友的编号 getFallenTeammate()
获得对方球员的位置 worldModel->getOpponent(i)
获取球员编号 worldModel->getUNum()
获取指定球员坐标 worldModel->getTeammate(i) (i为我方球员编号)
指定当前球员行动方向 SkillType goToTargetRelative(相对球员方向,角度)
动作踢球 SkillType kickBall(kickTypeToUse,Vecposition &target)
设置及坐标参数返回 VecPosition(x,y,0)
尝试理解worldmodel.h头文件public83行到163行的中文注释
public:
WorldModel();//构造函数
~WorldModel();//析构函数
inline void setMyConfidence(bool confidence) {
confident = confidence;
}//?
inline bool getMyConfidence() const {
return confident;
}//?
inline WorldObject* getWorldObject( int index ) {
return &worldObjects[index];
}//?
void updateGoalPostsAndFlags();//更新球和旗的位置
void updateMatricesAndMovingObjs( VecPosition& fieldXPlusYPlus,
VecPosition& fieldXPlusYMinus,
VecPosition& fieldXMinusYPlus,
VecPosition& fieldXMinusYMinus );//更新矩阵和移动对象
inline void setMyPosition( const VecPosition& newPos ) {
myPosition = newPos;
}//更新自己的位置
inline void setMyPosition( const SIM::Point2D& newPos ) {
myPosition.setX( newPos.getX() );
myPosition.setY( newPos.getY() );
// Z is not changed, stays at the default
//Z 不更改,保持默认值 高是z
}
inline VecPosition getMyPosition() const {
return myPosition;
}
inline void setMyAngDeg( SIM::AngDeg newAng ) {
myAngDegrees = newAng;
}//更新角度
inline void setMyAngRad( SIM::AngRad newAng ) {
myAngDegrees = Rad2Deg( newAng );
}//更新弧度
inline SIM::AngDeg getMyAngDeg() const {
return myAngDegrees;
}
inline SIM::AngRad getMyAngRad() const {
return Deg2Rad( myAngDegrees );
}
inline void setMyLastPosition( const VecPosition& newPos ) {
myLastPosition = newPos;
}//更新自己最新的位置
inline VecPosition getMyLastPosition() const {
return myLastPosition;
}
inline void setMyLastAngDeg( SIM::AngDeg newAng ) {
myLastAngDegrees = newAng;
}//更新最新的角度
inline void setMyLastAngRad( SIM::AngRad newAng ) {
myLastAngDegrees = Rad2Deg( newAng );
}//更新最新的弧度
inline SIM::AngDeg getMyLastAngDeg() const {
return myLastAngDegrees;
}
inline SIM::AngRad getMyLastAngRad() const {
return Deg2Rad( myLastAngDegrees );
}
inline RVSender *getRVSender() const {
return rvsend;
}
inline void setUseGroundTruthDataForLocalization(bool fUseGroundTruthDataForLocalization) {
this->fUseGroundTruthDataForLocalization = fUseGroundTruthDataForLocalization;
}//更新球场地面实况本地化
inline bool useGroundTruthDataForLocalization() {
return fUseGroundTruthDataForLocalization;
}//返回球场地面实况本地化数据