机器人足球仿真实验报告.docx

上传人:b****8 文档编号:29761040 上传时间:2023-07-26 格式:DOCX 页数:17 大小:26.38KB
下载 相关 举报
机器人足球仿真实验报告.docx_第1页
第1页 / 共17页
机器人足球仿真实验报告.docx_第2页
第2页 / 共17页
机器人足球仿真实验报告.docx_第3页
第3页 / 共17页
机器人足球仿真实验报告.docx_第4页
第4页 / 共17页
机器人足球仿真实验报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

机器人足球仿真实验报告.docx

《机器人足球仿真实验报告.docx》由会员分享,可在线阅读,更多相关《机器人足球仿真实验报告.docx(17页珍藏版)》请在冰豆网上搜索。

机器人足球仿真实验报告.docx

机器人足球仿真实验报告

机器人足球仿真实验报告

合肥工业大学计算机与信息学院机器人足球仿真实验报告

班级:

计算机科学与技术11-1班姓名:

魏慷学号:

201124252012年12月5日

1

实验一机器人足球比赛编程预备知识

1.实验目的

掌握RoboCup仿真机器人足球比赛相关知识点,具体内容如下:

(1)Linux操作系统的熟悉及了解其基本操作。

(2)掌握Linux下如何进行C++编程,了解gcc编译器以及一些简单编辑工具,如:

vi、emacs、gedit、Anjuta、Kdevelope等。

(3)启动RoboCup仿真(2D)足球队的比赛。

2.实验设备

硬件环境:

PC机软件环境:

操作系统linux3.实验内容

(1)掌握Linux一些常用的命令文件或目录处理格式:

ls[-atFlgR][name]第一项是一些语法加量。

第二项是文件名。

常用的方法有:

ls列出当前目录下的所有文件。

ls–a列出包括以.开始的隐藏文件的所有文件名。

ls–t依照文件最后修改时间的顺序列出文件名。

ls–F列出当前目录下的文件名及其类型。

以/结尾表示为目录名、以*结尾表示未可执行文件、以@结尾表示为符号连接。

ls–l列出目录下所有文件的权限、所有者、文件大小、修改时间及名称。

ls–lg同上,并显示出文件的所有者工作组名。

ls–R显示出目录下以及其所有子目录的文件名。

改变工作目录格式:

cd[name]name:

目录名、路径或目录缩写。

常用的方法有:

cd改变目录位置至用户登录时的工作目录。

cddirl改变目录位置至dirl目录下。

cd~user改变目录位置至用户的工作目录。

cd..改变目录位置至。

cd../user改变目录位置至相对路径user的目录下。

cd/../..改变目录位置至绝对路径的目录位置下。

复制文件格式:

cp[-r]源地址目的地址

2

常用的方法有:

cpfile1file2将文件file1复制成file2cpfile1dir1将文件file1复制到目录dir1下,文件名仍为file1。

cp/tmp/file1将目录/tmp下的文件file1复制到当前目录下,文件名仍为file1。

cp/tmp/file1file2将目录/tmp下的文件file1复制到当前目录下,文件名仍为file2。

cp-rdir1dir2复制整个目录。

移动或更改文件、目录名称格式:

mv源地址目的地址常用的方法有:

mvfile1file2将文件file1更名为file2。

mvfile1dir1将文件file1转移到目录dir1下,文件名仍为file1。

mvdir1dir2将目录dir1更改为目录dir2。

建立新目录格式:

mkdir目录名删除目录格式:

rmdir[目录名|文件名]常用的方法有:

rm–rdir1删除目录dir1及其子目录下的所有文件。

列出当前所在的目录位置格式:

pwd查看文件内容格式:

cat文件名文件权限的设定格式:

chmod[-R]modenamename:

文件名或目录名。

mode:

3个或8个数字或rwx的组合。

r-read(读权限)、w-write(写权限)、x-execute(执行)常用的方法有:

chmod777file1给所有用户file1全部的权限。

文件的打包和解压缩格式:

tar[option][file]gzip[option][file]tar主要来进行打包而不压缩,而gzip则进行压缩。

option主要有:

-c—创建一个新归档。

-f—当与-c选项一起使用时,创建的tar文件使用该选项指定的文件名;当与-x选项一起使用时,则解除该选项指定的归档。

-t—显示包括在tar文件中的文件列表。

-v—显示文件的归档进度。

-x—从归档中抽取文件。

-z—使用gzip来压缩tar文件。

如使用:

tar-cvffilename.tar/home/mine/work/home/mine/school上面的命令把/home/mine目录下的work和school子目录内的所有文件

3

都放入当前目录中一个叫做filename.tar的新文件里。

(2)完成以下操作:

1.如何找到用户主目录的绝对路径名?

在自己的系统上,用户主目录的绝对路径名是什么?

执行cd;执行pwd;即显示用户主目录的绝对路径名。

用户主目录的绝对路径名是”/home/username”2.将当前工作目录从/home/UVA转到/home/Tsinghua需要使用什么命令?

如何显示当前目录?

cd/home/Tsinghua或cd../Tsinghua3.如何在当前目录下建立子目录RoboCup?

mkdirRobcup4.如何删除子目录RoboCup?

rmdirRobcup5.如何查看当前目录下的内容?

ls6.如何将文件start.sh的权限设定为:

start.sh属于可读、可写、可执行?

可读:

chmodg+rrstart.sh可写:

chmodg+rwstart.sh可执行:

chmodg+rxstart.sh7.如何将当前目录包括所有子目录全部做备份文件,备份文件名为first.tar?

tarczvffirst.tardir18.如何将目录/home下每一个文件压缩成.gz文件?

tar-cvfstore.tardir19.如何把上例中每个压缩的文件解压,并列出详细的信息?

tarxvfstore.tarls-lg4.启动球队上场比赛

完成以下操作:

rcssserverrcsslogplayer在球队路径下:

./start.sh在本地启动第二个球队:

./start.shlocalhostaaa

实验二Demeer5基本动作1

1.实验目的

(1)了解Demeer5的工作原理

4

(2)学会对Demeer5进行简单的修改2.实验设备

硬件环境:

PC软件环境:

Linux3.实验内容

(1)Demeer5的工作原理:

Demeer5函数是整个球队的核心,它最终返回一个可以执行的动作,底层的模块负责将此动作发送给server,然后由server执行。

可以说,Demeer5就是我们想法的体现,是一支球队的大脑。

在Demeer5中有一系列的判断来决定每个周期的动作。

下面对Demeer5进行简要的分析.Demeer5()是一个决策函数,在策略上使用的是下面这个简单的策略:

如果球可踢,则用最大力量踢球;如果球不可踢且我是队友中最快到球的队员,则去截球;其他情况按战略点跑位。

我们现在只要看一下球可踢时的代码:

elseif(WM->isBallKickable())//如果球可踢

{

//确定踢向的点

VecPositionposGoal(PITCH_LENGTH/2.0,-1+2*(WM->getCurrentCycle()%2))*0.4*SS->getGoalWidth());

//调用踢球的动作

soc=kickTo(posGoal,SS->getBallSpeedMax());//kickmaximal

//将动作放入命令队列中

ACT->putCommandInQueue(soc);

//将脖子转向球

ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));

//记录调试信息

Log.log(100,"kickball");

}

这一小段函数决定了当球在球员Agent的可踢范围之内时应当做的动作,这里是一个简单的把球向前踢而不考虑任何其他情况的方法。

该程序段的条理是很清晰的。

5

(2)对Demeer5进行简单的修改:

现在我们对Demeer5进行简单的修改,让它在球可踢的时候进行带球的动作。

带球就是kick和dash动作序列的结合。

带球的函数在BasicPlayer中,函数为dribble().它接收两个参数,第一个参数为带球的方向,第二个参数为带球的类型。

带球类型解释如下:

DRIBBLE_FAST:

快速带球;DRIBBLE_SLOW:

慢速带球;DRIBBLE_WITHBALL:

安全带球;所以,对dribble的一种调用形式为:

dribble(ang,DRIBBLE_FAST)其中ang为AngDeg(是一个double)类型该函数的返回值是一个SoccerCommand类型。

知道了如何调用dribble,我们来对Demeer5进行替换:

elseif(WM->isBallKickable()){AngDegang=0.0;

soc=dribble(ang,DRIBBLE_FAST);//进行带球

//将动作放入命令队列中

ACT->putCommandInQueue(soc);

//将脖子转向球

ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));

//记录调试信息

Log.log(100,"kickball");}这样,在球可踢的时候,球员智能体将把球带向前方,这里取的是0度角,即沿x轴一直向前快速带球。

我们再次对Demeer5函数进行修改,这次是让球员Agent将球踢向各个不同的地方。

这将调用kickTo()函数来完成。

下面简要说明一下kickTo()函数的使用方法:

这个函数有两个参数,第一个参数是目标点的坐标,第二个参数是球到达目标点是的速度,返回一个踢球的动作。

可以使用下面的形式来调用:

VecPositionpos(x,y);doublespeed=1.0;kickTo(pos,speed);kickTo()函数在其内部将会决定踢球时所用力量的大小,并且会判断是否能够将球踢到该点,并作出相应的调整。

比如,将球一直踢向(0,0)点,1.0的末速度:

elseif(WM->isBallKickable()){soc=kickTo(VecPosition(0,0),1.0);

6

//将动作放入命令队列中

ACT->putCommandInQueue(soc);

//将脖子转向球

ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));

//记录调试信息

Log.log(100,"kickball");

}

(3)根据上述操作,完成以下踢球操作:

将球踢向对方的球门。

VecPositionpos=WM->getPosOpponentGoal;soc=kickTo(pos,1.0);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));将球踢向距离自己最近的队友。

ObjectTo=WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent);soc=kickTo(WM->getGlobalPosition(o),1.0);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));尝试不同的踢球点。

(略)(4)根据上述内容,完成以下带球的操作:

用不同的带球模式进行带球,并观察效果,比较异同。

AngDegang=0.0;

soc=dribble(ang,DRIBBLE_SLOW);

ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));将球向对方的球门方向带。

doubleang=(VecPosition(52.5,0)-posAgent).getDirection();//求与球门间角度

soc=dribble(ang,DRIBBLE_SLOW);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));尝试不同的带球组合。

(略)(5)根据上述内容,完成以下综合练习:

带球与踢球的结合:

让agent一直向对方球门的方向带球,在进入对方禁区后以最大力量踢向球

7

门(末速度最大为2.7)。

涉及到的具体函数请查看教材。

VecPositionposGoal(52.5,0);

if(WM->isInTheirPenaltyArea(WM->getBallPos()))//判断是否在对方禁区

{

soc=kickTo(posGoal,2.7);

}else{

doubleang=(posGoal-posAgent).getDirection();//求与球门间角度

soc=dribble(ang,DRIBBLE_FAST);}ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));

实验三Demeer5基本动作2

1.实验目的

熟悉demeer5并学会demeer5的基本使用方法,具体内容如下:

(1)能理解UVA程序中原来的demeer5中的内容

(2)能通过修改demeer5中的具体函数内容实现对场上球员的控制(3)能通过底层动作的简单组合控制场上队员做出一些复杂动作2.实验设备:

硬件设备:

pc机软件设备:

操作系统linux3.实验内容

(1)在球队程序中找到playerTeams.cpp;

(2)在player.cpp中找到demmer5函数;

(3)阅读此段程序,并结合Monitor观察球员的具体行为(你将发

现可以踢到球的球员会将球朝球门的方向踢去,而不能踢到球的

队员中如果是离球最近的队员就去截球,否者则按阵型跑位);

(4)修改demmer5函数改变队员的行为具体步骤如下:

①在demeer5函数中找到

8

if(WM->isBallKickable())

//isBallKickable()函数用来判断球是否可踢

{

VecPositionposGoal(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCycle()%2))*0.4*SS->getGoalWidth());

//设定射门位置坐标

soc=kickTo(posGoal,SS->getBallSpeedMax());//朝球门方向将球以最大

力度踢出

ACT->putCommandInQueue(soc);//只有把命令放入命令队列动作才会执行

ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));

//做动作的同时改变脖子的方向

}

②『控球』将此函数修改为if(WM->isBallKickable()){

soc=kickBallCloseToBody(45);//45是踢球的方向

ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));

}

然后编译运行程序,观察球员的行为我们会发现当球可踢时,球员不再朝着球门的方向踢了,而是将球绕自己身体转动(uva的这个底层动作经常把球转丢!

)③『带球』将此函数修改为if(WM->isBallKickable()){

soc=dribble(0.0,DRIBBLE_SLOW);//其中dribble函数中第一个参数表示带球的

方向-180~180之间,不一定是0.0

ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));

}

后编译运行程序,观察球员的行为我们会发现当球可踢时,球员不再朝着球门的方向踢了,而是朝我们指定的方向执行带球

9

④『传球』将此函数修改为if(WM->isBallKickable()){

soc=leadingPass(OBJECT_TEAMMATE_9,1);//9是接球的人,1是指球与接球人

之间的距离

//其中leadingPass中第一个参数表示传球的对象,本实验中我们将球直接传给指定

号码(1~11)的球员,不一定是OBJECT_TEAMMATE_9

ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));

}

然后编译运行程序,观察球员的行为我们会发现当球可踢时,球员不再朝着球门的方向踢了,而是将球传给我们指定号码的队员。

⑤『配合』将此函数修改为if(WM->isBallKickable()){if(WM->getAgentObjectType()==OBJECT_TEAMMATE_9)

soc=dribble(0.0,DRIBBLE_SLOW);//带球

}else

soc=leadingPass(OBJECT_TEAMMATE_9,1);//传球

ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}编译程序,观察球员行为,我们会发现,当9号队员得到球后会朝前方带球,其他队员得到球后会将球传给9号(不管9号是不是越位).(5)根据以上描述完成以下实验内容:

如果在对方禁区内就射门,否则,如果是7,8,9号队员就朝前带球,其他队员将球传给9号(用WM->isInTheirPenaltyArea(WM->getBallPos())来判断球是否在对方禁区)如果队员的位置在自己半场就将球朝对方球门踢去,否者就朝前方带球(用WM->getBallPos().getX()来得到球的x坐标)当有人来抢球时(离自己很近),就将球传给离自己最近的队员,否则就自己带球(调用WM->getClosestRelativeInSet函数来得到离自己最近的己方或对方球员,通过pos1.getDistanceTo(pos2)来得到两位置之间的距离)。

Circlecir(posAgent,2.0);//定义这样一个圆形区域,以我为圆心,2.0为半径

10

intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);//判断2.0

范围内有多少人

if(num>0){soc=leadingPass(WM->getClosestRelativeInSet(OBJECT_SET_TEAMMATES),1);}elseif(WM->getBallPos().getX()>0){if(WM->isInTheirPenaltyArea(WM->getBallPos())){VecPositionposGoal(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCycle()%2))*0.4*SS->getGoalWidth());soc=kickTo(posGoal,SS->getBallSpeedMax());}elseif(WM->getAgentObjectType()==OBJECT_TEAMMATE_7||WM->getAgentObjectType()==OBJECT_TEAMMATE_8||WM->getAgentObjectType()==OBJECT_TEAMMATE_9){soc=dribble(0.0,DRIBBLE_SLOW);}else{soc=leadingPass(OBJECT_TEAMMATE_9,1);}}else{VecPositionpos=(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCycle()%2))*0.4*SS->getGoalWidth());soc=kickTo(pos,SS->getBallSpeedMax());}

ACT->putCommandInQueue(soc);//放入命令队列

ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));

11

实验四复杂的动作决策

1.实验目的

进一步了解demeer5并能熟悉的修改demeer5的内容以达到对场上的球员的控制

(1)能理解UVA程序中原来的demeer5中的全部内容

(2)能通过修改demeer5中的具体函数内容实现对场上球员的控制(3)能通过底层动作的简单组合控制场上队员做出一些复杂动作决策(4)对WorldModel有初步的认识,学会在WorldModel,basicplayer里添加新函数2.实验设备

硬件环境:

PC软件环境:

操作系统linux3.实验内容

(1)在球队程序中找到player.c并打开;

(2)在player.c中找到demmer5函数;

(3)阅读此段程序,并结合monitor观察球员的具体行为(你将发

现可以踢到球的球员会将球朝球门的方向踢去,而不能踢到球的

队员中如果是离球最近的队员就去截球,否者则按阵型跑位);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1