机器人足球仿真实验报告.docx
- 文档编号:29761040
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:17
- 大小:26.38KB
机器人足球仿真实验报告.docx
《机器人足球仿真实验报告.docx》由会员分享,可在线阅读,更多相关《机器人足球仿真实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
机器人足球仿真实验报告
机器人足球仿真实验报告
合肥工业大学计算机与信息学院机器人足球仿真实验报告
班级:
计算机科学与技术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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机器人 足球 仿真 实验 报告