怎样使用第二版player.docx
《怎样使用第二版player.docx》由会员分享,可在线阅读,更多相关《怎样使用第二版player.docx(92页珍藏版)》请在冰豆网上搜索。
怎样使用第二版player
怎样使用第二版player/stage
JenniferOwen
2010年4月16日
这篇文献意在给初学player/stage的人作为指导,讲述了设置新的仿真环境的步骤,和怎样在此环境下做仿真,边讲解边用示例加以说明。
虽然这部文献是为player/stage用户编写的,但那些希望在机器人上应用player的用户也可以在这里找到一些有用的段落(特别是为player编码那一部分)。
如果你使用player/stage还有什么问题可以从下面的player社区寻求帮助:
手册中的这个版本是Stageversion3.2.X,和以前的Stage版本有很大的差别,以前那版的手册已经被淘汰了。
目录
第一章序言5
1.1安装Player/Stage的方法5
第二章基本要素6
2.1重要的文件类型6
2.2接口,驱动和设备7
第三章建立一个World8
3.1建立一个空的World9
3.1.1模型10
3.1.2Player/Stage窗口的描述15
3.1.3基本world文件的建立15
3.2机器人的建立17
3.2.1传感器和设备17
3.2.2一个样例机器人21
第四章写一个配置文件(.cfg)38
4.1设备地址——密钥:
主机,机器人,接口,索引40
4.2把配置文件放在一起41
第五章在仿真器上运行程序44
5.1通过程序连接到服务器或代理服务器46
5.1.1建立连接:
一个例子48
5.2与代理器的相互作用49
5.2.1position2d代理器50
5.2.2声纳代理器52
5.2.3激光器代理器52
5.2.4ranger代理器54
5.2.5blob探测器代理器54
5.2.6爪代理器55
5.2.7仿真代理器56
5.2.8一般的有用的命令58
5.3使用代理器:
学习的例子58
5.3.1控制样式58
5.3.2创建程序59
5.3.3Wander60
5.3.4障碍躲避63
5.3.5移动到目标65
5.3.6收集目标67
5.4群体机器人仿真71
第六章有用的连接73
第七章附录74
7.1A.Bigbob的一般Stage模型74
7.2B.World中的World文件,包含的机器人和目标78
7.3C.BigbobWorld的配置文件80
7.4D.Bigbob机器人仿真的控制程序80
第一章序言
Player/stage是一个机器人仿真工具,是由硬件抽象层的程序player组成。
意思是它与机器人上的硬件部分对话(例如爪或相机),使你可以通过编码来控制它们,不必担心机器人的各部分是怎样工作的。
Stage是Player的一个插件,听从Player的吩咐,把指令传到机器人内部的仿真器内。
它同样能仿真传感器数据,将这些数据发送给Player,Player在编程时可以利用这些数据。
仿真由三部分组成:
●程序,用来和Player对话。
●Player,把你的程序和命令发送给机器人,然后从机器人那里得到传感数据再把它发送给程序。
●Stage,Stage和Player进行交流,就像是一个机器人硬件。
它从Player那里接受指示,把一个仿真机器人带入到仿真环境,从仿真机器人那里得到传感数据,然后把它发送给Player。
Player和Stage和在一起称为Player/Stage,它们一起来仿真机器人。
这个手册将侧重于怎样用Player/Stage来进行仿真,但也希望它对于只使用Player的用户(那些在真正的机器人上运行而不是用任何仿真软件的用户)有所帮助。
1.1安装Player/Stage的方法
关于怎样把Player/Stage安装到电脑上并不是本文献的侧重点,但安装起来却很困难。
如果你有幸第一次安装的话会有很多相关的东西需要同时安装。
对于电脑运行Ubuntu,这里有非常好的说明装置(包括一个手写板的关于下载所需的先决条件):
http:
//www.control.aau.dk/~tb/wiki/index.php/Installing_Player_
and_Stage_in_Ubuntu
对于MAC用户,你会发现下面的安装说明会很有用:
installing-playerstage-on-os-x-with.html
或者,你可以采纳Player页面上的“gettinghelp”里面的建议:
第二章基本要素
2.1重要的文件类型
在Player/Stage有三种用来运行Player/Stage的文件:
●a.worldfile
●a.cfg(configuration)file
●a.inc(include)file
world文件是告诉Player/Stage什么东西可以被输入到world里。
在这个文件对机器人进行了描述,包括所有组成这个world的词条和world的框架。
.inc文件和.world文件使用同样的语法和格式,而且它可以被其他文件包含。
所以,如果你的world里面的东西将在其他world里面被运用,例如一个机器人模型,把机器人的描述放在.inc文件里使它容易被复制,这意味着如果你想要改变你的说明书,你仅仅需要在一个地方进行改变,这样其他地方的也会被改变了。
.cfg文件里包含了你将要使用的机器人的所有信息,Player通过读取这个文件获得这些信息。
这个文件告诉Player它和机器人连接时使用哪些驱动。
如果你使用的是真实的机器人这些驱动是建在Player内部的;或者,若你想建立一个仿真,驱动就是Stage(这就是Player以他使用一个机器人的方式使用Stage;可以把它看做一个硬件驱动)。
.cfg文件告诉Player怎样与驱动进行对话、怎样从驱动那里获得数据,这样它就能被呈送给程序了。
如果你想让你的设备(例如一个机器人)能和其他的设备对话,那么.world文件中描述的设备在.cfg文件中也应被描述;如果你没这种想法,那就没必要了。
.cfg文件对于设备间的对话和驱动都做了说明,这将在下一节讨论。
2.2接口,驱动和设备
●驱动是直接与硬件进行对话的程序片段。
它们写在Player内部;所以,如果你是初学Player/Stage那就没必要知道怎样写入了。
驱动是一种特殊的硬件,就好比,激光驱动和照相机驱动不一样,和其他不同牌子的激光的驱动也不一样。
同样就好比图标卡片的驱动每一个卡片的制作和模型都不一样。
驱动设备的驱动和读取数据都要和界面相一致。
●接口是为驱动从Player发送或接受信息的固定同道。
就像是驱动一样,接口也建在Player内部,Player手册上有一个很大的接口列表。
它们说明了语法以及驱动和Player怎样相互交流的语法。
●设备是绑定到接口的驱动,这样Player就可以直接与它对话了。
这意味着如果你在一个实体机器人上工作你就可以与实体机器人上的真实设备(激光,相机等)进行交流,若是在一个仿真机器人里你就可以与仿真的机器人进行交流。
正式的文件实际上通过一个很好的例子描述了这三部分。
考虑一下激光接口,这种接口规定了一种模式,在这种模式下平面幅度传感器可以返回幅度读数(主要是一系列的幅度大小并带有mata数据)。
激光接口就是一种接口,仅仅用它你做不了任何事情。
现在考虑一下sicklms200驱动,这个驱动控制着一个SICKMS200,这个SICKMS200是一个特殊的在移动机器人设备中很流行的二维幅度传感器。
但是在一些SICK-specific模式中你不需要使用这些数据。
所以驱动器也知道怎样把返回的数据转化为与激光接口所定义的模式相一致。
sicklms200驱动器可以被绑定在激光接口上,用以创造一个拥有以下地址的设备:
localhost:
6665:
laser:
0
这个地址和player-devaddr-t结构中的词目相一致:
主机,机器人,接口,索引。
主机和机器人部分表明设备的位置。
接口部分指出设备支持哪个接口和怎样被运用。
由于你有可能拥有不止一个激光,索引部分是使你可以在设备中选择那些支持给定的接口且位于给定的主机上的设备。
最后一段有可能有点专业性,不用担心。
Player通过端口(系统默认的端口是6665)与机器人的各部分进行交流;如果你使用的是Stage,那么Player和Stage通过这些接口进行交流(尽管他们在同一台机器上运行)。
所有的这些都在告诉Player与那个接口相连接以及预料得到哪种数据。
例子中的激光数据在运行Player的电脑(localhost)的6665端口被转化。
你可以利用它的IP地址代替localhost来简单的和另一台电脑相连接。
用这种方式书写设备地址的方法将在第四章讲解。
第三章建立一个World
首先我们将运行一个world文件和一个configuration文件,这两个文件在Stage中被捆绑在一起。
点击开Stage文件夹通过系统默认(至少在Linux里是这样的)为/usr/local/share/stage/worlds.若曾经在相应的文件中键入过下面的命令来运行Player/Stage中的“simpleworld”:
playersimple.cfg
如果之前Player/Stage已被正确安装,你就应该打开一个窗口,参看图3.1。
图3.1运行后的simple.cfg文件
祝贺你,你现在可以用Player/Stage进行仿真了!
你会注意到simple.cfg仿真器中的机器人应该立刻就能移动了;现在不要着急,我们将会在3.2节中介绍怎样实现这些。
3.1建立一个空的World
正如你在第三章中所看到的,当我们告诉Player要建立一个world时我们只需给它一个.cfg文件作为输入。
这个.cfg文件需要告诉我们去哪里寻找包含所有仿真所需词条的.world文件。
用一个例子来解释怎样建立空的stage的world文件。
开始建立空的world时我们需要一个.cfg文件。
首先建立一个叫做empty.cfg的文件,然后把下面的程序输进去:
driver
(
name"stage"
plugin"stageplugin"
provides["simulation:
0"]
#loadthenamedfileintothesimulator
worldfile"empty.world"
)
Configuration文件的语法规则在第四章有讲解,但这里发生的是你的configurationw文件正在通知Player在Stage的插件库里面有一个叫做stage的驱动,它将给出与仿真接口相一致的Player数据。
为了建立一个仿真,Player需要查看和.cfg文件同在一个文件夹里的名为emoty.world的文件。
如果它存储在其他的地方你就需要输入一个文件路径,例如,./worlds/empty.world。
以拼凑的符号(#)开始的路径是注解。
当你在Stage中建立任何一个仿真时上面的部分的应当作为configuration文件所描述的第一件事情。
很明显,world文件的名字应该依据你对它的称呼进行改写。
现在一个基本的configuration文件已经写好了,接下来应该通知Player/Stage把什么东西输入到这个仿真器中。
这将在.world文件中完成。
3.1.1模型
.world文件是仿真器中描述各部分模型的资料列表。
其中包括基本的环境、机器人和其他部分。
基本的模型类型称为“model”,定义模型时使用下面的句法:
definemodel_namemodel
(
#parameters
)
这就告诉了Player/Stage你在定义一个称为model-name的模型,圆括号内是模型的参数。
为了一开始就理解Player/Stage模型参数,我们来看一下Stage里的map.inc文件,它包括用来描述基本仿真环境的floorplan模型
definefloorplanmodel
(
#sombre,sensible,artistic
color"gray30"
#mostmapswillneedaboundingbox
boundary1
gui_nose0
gui_grid0
gui_move0
gui_outline0
gripper_return0
fiducial_return0
laser_return1
)
从第一行可以看到这里在定义一个叫做floorplan的模型
●color:
告诉Player/Stage给模型设置什么颜色,本例中将会设成灰色的背景。
●boundary:
在模型外面是否围着一个封装的盒子。
这里有一个二进制参数的例子,就是说如果后面的数字是0就是错的,如果后面的数字是1或者显示结束就是对的。
所以在地图模型外的确有一个封装的盒子,这样机器人就不能走出我们设计的地图。
●gui_nose:
告知Player/Stage它应该指出模型所面对的是哪一条路。
图3.2显示了有探针的地图与没有探针的地图的差别。
●gui_grid:
这里将在模型上添加一个网格。
图3.3显示了一个有网格的模型。
●Gui-move:
这里指明了是否可以拖拽和放下模型。
在Gui-move是0的情况下,如果Player/Stage曾经运行过你就不能移动地图模型了。
在第三章中Player/Stage中的例子simple.cfg已经运行了,但拖拽或终止机器人是有可能的,因为它的gui_move变量已经设为1了。
●gui_outline:
指明模型外是否有轮廓。
这和map没差别,但是当在world内制作词条模块时将会有用。
●Fiducial_return:
传感器返回的任何表格参数描述了那种类型的传感器该对模型做出怎样的反应。
“fiducial”是一种类型的机器人传感器,这将在后面的3.2.1节描述。
设置基准返回值为0意味着map不能被基准传感器检测到。
●Gripper_return:
和Fiducial_return一样,Gripper_return告知Player/Stage你的模型能够被相关的传感器检测到,也就是它可以被一个gripper抓住。
这里支配返回值被设置成了0,所以map不能被gripper抓住。
为了利用map.inc文件我们把下面的程序输入到.world文件中:
include"map.inc"
把map.inc文件嵌入到了路径所在的world文件中。
这样可以假定world文件和map.int文件是在同一个文件夹中,如果它们不在一个文件夹中,你就需要在引用时输入文件路径。
一旦这么做了我们就可以修改map模型的定义以便于在仿真中应用。
例如:
floorplan
(
bitmap"bitmaps/helloworld.png"
size[1251]
)
图3.2左边的图片显示了一个没有探针的空的map。
右边的图片显示了一个带有指示方向的探针的map这个从map中心指向右边的水平直线表明这个map实际上是面向右边的。
图3.3:
带有可用gui-网格的空的map。
如果没有可用的网格,这里只是一片空白区域。
图3.4:
左边的图片的是“helloworld.png”位图。
右边的图片是Player/Stage中翻译出的位图。
有色区域是墙,机器人可以在墙以外的任何区域移动。
这意味着我们正在使用“floorplan”模型和做一些额外的定义;“size”和“bitmap”都是Player/Stage模型的参数。
这里我们告知Player/Stage我们为一个叫做“floorplan”的模型类型(包含在map.inc中)定义了一套参数,现在我们正在运用这个“floorplan”模型定义,还增加了一些额外的参数。
●bitmap:
一个位图的文件路径,这个位图可以被键入bmp,jpeg,giforpng。
位图中的黑色区域告知模型的形状,非黑色区域没有被使用,这将在图3.4中加以解释。
在map.inc文件中我们告知map它的颜色将是灰色的。
这些参数不影响位图的读取。
Player/Stage将会一直在位图中寻找黑色的区域。
颜色参数只是改变了仿真中map的所围绕的区域的颜色。
●size:
仿真器是以米为单位计算的。
World文件中你所给出的所有尺寸值都是以米来计量的,它们代表了物体的实际尺寸。
如果你有一个3mX4m(高2m)的机器人试验场地,你将会设置仿真尺寸为【342】。
第一个数据是x方向的尺寸,第二个数据是y方向的尺寸,第三个数据是z方向的尺寸。
模型参数以及对它们的说明的完整列表可以在官方Stage手册中查找到。
大部分有用的参数在这里已经介绍过了,只有一小部分其他的与建立机器人仿真器相关的模型的类型将会在3.2节介绍到。
3.1.2Player/Stage窗口的描述
World文件也可以用来描述Player/Stage所创建的仿真器窗口。
如果你没有在world文件中输入任何窗口详情Player/Stage将会自动为仿真器自动生成一个窗口,但是把这些信息输入到world文件中总是很有必要的。
这将会阻止一个相对窗口来说过大的仿真器的生成,或者是来增加或减少仿真器的尺寸。
和模型一样,窗口是内置的高标准的实体,并有很多参数。
与模型不同的是一个仿真器里只能有一个窗口并且只能用到很少的参数。
仿真窗口可以用如下的语法来描述:
window
(
#parameters...
)
窗口的两个最重要的参数是尺寸和比例。
●尺寸:
仿真器尺寸的大小将以像素为单位。
用下面的语法来定义窗口的宽度和高度:
size[widthheight]
●比例:
每像素所显示的仿真环境的米数。
数量越大,仿真器越小。
最佳比例是
,并且必须向下包围,这样仿真器会比它所在的窗口小一点,实验和错误才会有一定的空间。
窗口参数的完整列表可以在“WorldGUI”下的Stage手册中查到。
3.1.3基本world文件的建立
我们已经讨论了world文件建立的基础:
模型和窗口。
这里还有一些既不属于模型说明书也不属于窗口说明书的参数,这些事任选的,预设值也非常恰当。
●interval-sim:
在仿真窗口的两次更新之间所需的仿真毫秒数,预设值是100毫秒。
●intweval-real:
在仿真窗口的两次更新之间所需的实际毫秒数,平衡这个参数和间隔-sim参数就能控制仿真的速度。
此外,预设值是100毫秒,这两个预设值参数设置的都恰到好处,所以不需要再重新设置。
Stage手册包括高标准的world文件参数值的列表。
现在我们就可以写一个world文件了!
#configuretheGUIwindow
window
(
size[700.000700.000]
scale41
)
#loadanenvironmentbitmap
floorplan
(
bitmap"bitmaps/cave.png"
size[15151.5]
)
如果我们已经把上面的程序存为empty.world(如果有需要可以更改文件路径)就可以运行相应的empty.cfg文件(参考3.2节)以得到图3.5中的仿真。
图3.5空的world
3.2机器人的建立
Player/Stage中的机器人只是一个先进的模型,3.1.1节中提到的参数都可用。
3.2.1传感器和设备
有六个内置的模型可以用来建立一个机器人,它们用来定义机器人的传感器和制动器。
这与一套模型参数相联系,这套模型参数是由模型可检测到的传感器所定义的(就是前面所提到的返回值)。
每一个内置模型都可充当仿真器和Player之间的接口(参考2.2节)。
如果你的机器人里有过一个这样的传感器,那么你就需要使用相关的模型来描述这个传感器,否则Stage和Player之间不能够相互传递参数。
你可以自己写接口,但是Player/Stage中的资料必须足够充分来供给更多需要的人使用。
Player所支持的接口的全部列表可以在Player手册中查找到,而下面的这些仅仅被当前的Stage分配所支持(版本3.2.X)。
除非有其他的声明。
否则这些模型会利用Player接口来命名:
照相机
照相机模型给机器人模型增加了一个照相机,允许程序和仿真照相机相互影响。
照相机参数如下:
●分辨率[xy]:
相机的图像分辨率,以像素为单位。
●范围【minmax】:
照相机所能检测到的最大最小范围。
●fov【xy】:
照相机可视范围的领域,以度为单位。
●pantilt【pantilt】:
照相机摇动可以扫视的视野角度(pan),高度角(tilt)。
比如pantilt【9020】允许照相机左右移动45度,上下移动10度。
Blobfinder
这个仿真颜色探测软件可以在来自机器人照相机的图片上运行。
使用blobfinder时不需要在你的机器人说明书中写入照相机模型,Blobfinder会自动运行。
如果blob返回值参数是正确的,Blobfinder只能找到一个模型。
Blobfinder参数在Stage手册中描述了,但最有用的部分在这里:
●颜色数目:
blobfinder能检测到的不同的颜色的数目。
●颜色【】:
blobfinder能检测到的颜色的名称。
这些颜色以【["black""blue""cyan"】的形式传递给blobfinder。
这些颜色的名字来自于内置的X11颜色数据文件库rgb.txt。
这嵌入在Linux.
●图像【xy】:
照相机照出的图像的尺寸,以像素为单位。
●范围:
照相机能检测到的最大范围,以米为单位。
●fov:
blobfinder可视的范围,以弧度为单位。
fiducial
Fiducial是图像中的固定点,所以fiducial探测器用来仿真图像处理软件,软件中的图像中有固定点。
fiducial探测器能够指出fiducial返回参数值被设为真值的仿真中的目标的位置,Stage能利用模型的fiducial-key参数详细说明不同的类型的fiducial。
也就就是说你可以通过它们传输的键是机器人能够辨识不同fiducials。
Fiducials探测器和fiducial-key的概念在Stage手册中详细说明了。
Fiducial传感器参数是:
●最小范围:
fiducial能够检测到的最小范围,以米为单位。
●最大范围:
fiducial能够检测到的最大范围,以米为单位。
●range_max_id:
fiducial的密钥能实际辨识出的最大范围。
如果一个fiducial距离range_max很近但距离range_max_id很远,那么就可以检测出有一个fiducial在那,但不能识别出来。
●Fov:
fiducial探测器的视野范围,以弧度为单位。
Ranger
这个用来仿真任何类型的干扰探测器(例如声纳或者红外传感器)。
可以查找出返回值是真值的模型。
利用ranger模型