初学robocup3D,还不太了解。
首先我们安装好robocup3D的环境,先测试一下demo
1:在roboviz文件夹里打开终端,输入 ./roboviz.sh 打开仿真模拟器
2:在SIMSPARK_0.3.1_RELEASE文件夹打开终端,输入rcsss后tap键补全,打开足球场。
3:在代码文件夹打开终端,./ 编译运行代码
我的demo就是机器人转圈;
SkillType NaoBehavior::demoKickingCircle() {
// Parameters for circle
VecPosition center = VecPosition(-HALF_FIELD_X/2.0, 0, 0);
double circleRadius = 5.0;
double rotateRate = 2.5;
// Find closest player to ball
int playerClosestToBall = -1;
double closestDistanceToBall = 10000;
for(int i = WO_TEAMMATE1; i < WO_TEAMMATE1+NUM_AGENTS; ++i) {
VecPosition temp;
int playerNum = i - WO_TEAMMATE1 + 1;
if (worldModel->getUNum() == playerNum) {
// This is us
temp = worldModel->getMyPosition();
} else {
WorldObject* teammate = worldModel->getWorldObject( i );
if (teammate->validPosition) {
temp = teammate->pos;
} else {
continue;
}
}
temp.setZ(0);
double distanceToBall = temp.getDistanceTo(ball);
if (distanceToBall < closestDistanceToBall) {
playerClosestToBall = playerNum;
closestDistanceToBall = distanceToBall;
}
}
if (playerClosestToBall == worldModel->getUNum()) {
// Have closest player kick the ball toward the center
return kickBall(KICK_FORWARD, center);
} else {
// Move to circle position around center and face the center
VecPosition localCenter = worldModel->g2l(center);
SIM::AngDeg localCenterAngle = atan2Deg(localCenter.getY(), localCenter.getX());
// Our desired target position on the circle
// Compute target based on uniform number, rotate rate, and time
VecPosition target = center + VecPosition(circleRadius,0,0).rotateAboutZ(360.0/(NUM_AGENTS-1)*(worldModel->getUNum()-(worldModel->getUNum() > playerClosestToBall ? 1 : 0)) + worldModel->getTime()*rotateRate);
// Adjust target to not be too close to teammates or the ball
target = collisionAvoidance(true /*teammate*/, false/*opponent*/, true/*ball*/, 1/*proximity thresh*/, .5/*collision thresh*/, target, true/*keepDistance*/);
if (me.getDistanceTo(target) < .25 && abs(localCenterAngle) <= 10) {
// Close enough to desired position and orientation so just stand
return SKILL_STAND;
} else if (me.getDistanceTo(target) < .5) {
// Close to desired position so start turning to face center
return goToTargetRelative(worldModel->g2l(target), localCenterAngle);
} else {
// Move toward target location
return goToTarget(target);
}
}
}
然后就可以尝试着理解代码了
我首先看了worldmodel模块
class WorldModel {
private:
unsigned long cycle;
int scoreLeft;
int scoreRight;
double time;
double gameTime;
int playMode;
int lastPlayMode;
int lastDifferentPlayMode;
int uNum;
int side;
bool uNumSet;
bool sideSet;
WorldObject worldObjects[NUM_WORLD_OBJS];
VecPosition myPosition;
SIM::AngDeg myAngDegrees;
bool confident;
VecPosition myLastPosition;
SIM::AngDeg myLastAngDegrees;
RVSender *rvsend;
bool fUseGroundTruthDataForLocalization;
// TODO: comment it out if we don't want ground truth
#define GROUND_TRUTH_SERVER
#ifdef GROUND_TRUTH_SERVER
VecPosition myPositionGroundTruth;
SIM::AngDeg myAngGroundTruth;
VecPosition ballGroundTruth;
#endif
double lastBallSightingTime;
double lastLineSightingTime;
// This is where we actually saw the ball ourself
vector<VecPosition> lastBallSeenPosition;
vector<double> lastBallSeenTime;
// remember last two skills
vector<SkillType> lastSkills;
vector<SkillType> executedSkillsForOdometry;
// record last odometry from particle filter
SIM::Point2D lastOdometryPos;
double lastOdometryAngDeg;
bool fLocalized;
bool fFallen;
HCTMatrix localToGlobal, globalToLocal;
vector<bool> fallenTeammate;
vector<bool> fallenOpponent;
模块太长了所以没给完全
我们可以看到很多定义,重载来实现函数功能。
其中部分函数通过教程与摸索知道了其功能
getMyPosition(获取球员的位置)
getUNum() (判断球员的号码)
getPlayMode()(获取比赛模式)
getTime()(比赛时间)
setPlayMode()(设置比赛模式)
setUNum()(设置球员)
VecPosition(x,y,z)(初始化位置)
getOpponent()(获取敌方守门员的位置)
等等还有很多
比较懒就写了一个很简单的例子(11号就直接冲)
SkillType NaoBehavior::demokick(){
if(worldModel->getUNum()==11){
return kickBall(KICK_11M,VecPosition(HALF_FIELD_X,0,0));
}
else return SKILL_STAND;
}