《智能机器人技术》实验报告.docx
- 文档编号:11086517
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:14
- 大小:324.50KB
《智能机器人技术》实验报告.docx
《《智能机器人技术》实验报告.docx》由会员分享,可在线阅读,更多相关《《智能机器人技术》实验报告.docx(14页珍藏版)》请在冰点文库上搜索。
《智能机器人技术》实验报告
华南理工大学本科生课程报告
课程类别:
专业选修课
课程名称:
智能机器人技术
课程代码:
145030
任课教师:
张平李方
《机器人避障》
姓名
学号
院系计算机科学与工程学院
班级计算机科学与技术1班
成绩
课程报告提交时间:
2013年1月3日
1.实验目的
熟悉机器人仿真软件(例如Simbad、Webots、TeamBots、Player/Stage/Gazebo、MotionPlaner等)的使用方法;掌握若干机器人路径规划算法。
2.实验任务说明
2.1.实验任务描述
在机器人软件平台上建立一个包含若干个静止障碍物和运动障碍物的仿真环境,设定机器人的起始点和终点后,机器人能够规划出一条从起始点到目标点的安全路径。
查阅相关路径规划算法,实现一种以上算法并相互比较。
要求给出源代码、试验结果并且进行演示。
2.2.人员分工
姓名
工作内容
林钊翔
负责势场法的实现与一些共用方法的实现
陈伟彬
负责Bug2算法的实现
3.实验内容
3.1.基本理论
3.1.1.simbad平台介绍
使用simbad平台,只需要做好三步就可以设置好机器人控制器,这三步分别完成一个主程序、一个环境类、一个机器人类。
在主程序中,主要是启动simbad和机器人环境描述类。
在环境类中,主要是描述环境中所有的组成成员,包括墙、箱、机器人等。
这个类需要继承EnvironmentDescription类,在其中的构造方法中添加环境中的所有成员。
在机器人类中,首先该类继承Agent类,并重写其中的两个方法initBehavior和performBehavior。
其中,initBehavior是在每次机器人生命开始时都会被模拟器调用的,一般来说不会使用到;performBehavior是每步模拟器运行时都调用的,在正常操作时一秒会调用20次。
最后,就是编译和执行程序了。
其中,编译命令为:
javac–classpathsimbad-1.0main.javaenvironment.javarobot.java
而运行命令如下:
java–classpathsimbad-1.0:
.main
整个simbad平台运行起来后,界面如下图所示:
3.1.2.simbadAPI介绍
在本次实验中,主要用到的是simbad.sim这个包,其中包括了代表机器人和它所在的环境的类。
主要有:
Agent:
Agent就是机器人。
Arch:
机器人可以绕过或从下面通过的拱形结构。
Box:
可以作为机器人的环境中的障碍物。
CameraSensor:
可以从机器人的视角查看机器人的环境。
EnvironmentDescription:
代表“环境”,可以在其中添加机器人和墙或盒子等对象。
LampActuator:
可以添加到机器人上的灯。
LightSensor:
感应光线的强度。
RangeSensorBelt:
包含机器人周围的一组距离传感器。
RobotFactory:
用这个类在机器人上添加传感器。
Wall:
另一种障碍物。
而从simbad平台提供的控制机器人与管理机器人的API看,主要分成两部分:
(1)状态API
booleancollisionDetected():
当机器人碰撞到别的物体时返回true;
intgetCounter():
返回经过模拟步骤的数量;
doublegetOdometer():
返回机器人运动的里程表,以米为单位;
doublegetLifeTime():
返回机器人总的生命时间,以虚拟秒为单位;
voidgetCoords(Point3dcoord):
返回代理在环境中的坐标。
(2)移动API
voidsetRotationalVelocity(doublerv):
设置角速度,以弧度/秒为单位;
voidsetTranslationalVelocity(doubletv):
设置平移速度,以米/秒为单位。
3.1.3.simbad声纳传感器介绍
在这次实验中,用得比较多的就是声纳传感器了,主要用于获取机器人到障碍的距离。
使用传感器前,需要添加它们到机器人中,使用的语句具体如下:
RangeSensorBeltsonars=RobotFactory.addSonarBeltSensor(this);
默认添加9个声纳传感器,以逆时针旋转的方式放置,开始在机器人的正前方0度位置。
如果需要自定义添加的声纳传感器,则使用
RangeSensorBeltsonars=RobotFactory.addSonarBeltSensor(this,sonarsNumber);
每个声纳提供了一系列以米为单位的测量信息和命中状态,只有一个障碍坐落在声纳射线就可以获取到信息。
要访问每个声纳传感器的内容,可以使用hasHit和getMeasurement方法。
3.1.4.势场法介绍
势场法把机器人能处理成在人工势场影响下的一个点,机器人跟随着场移动。
目标表现为对机器人的引力,障碍物表现为斥力。
所有这些力的叠加,施加于机器人,在大多数情况下,机器人被假定为配置空间中的一个点,这样一种人工市场平滑地引导机器人趋向目标,同时避免碰撞已知的障碍物。
但是这种方法也有很多局限性。
根据障碍物形状和大小,会出现局部极小;如果物体是凹的,则可能存在机器人在离物体最近的两个点来回震荡的情况。
3.2.实验方案设计和实验方法过程
3.2.1.实验方案
(1)搭建simbad平台,并建起机器人模拟环境;
(2)使用不同的路径规划算法,分别实现机器人避障方法;
(3)设置机器人初始位置和目标点,进行模拟;
(4)从机器人运动的路径长度与时间来进行比较。
3.2.2.实验设计
公式的设定
本次实验使用静态人工势场方法。
借鉴万有引力公式:
,记d(r,o)为机器人与障碍之间的距离,d(r,g)为机器人与目标之间的距离,则引力公式可以记为:
其中
为引力系数。
斥力公式则记为:
其中
为斥力系数,
为斥力的最大距离。
只有在小于
的范围才考虑斥力。
最后求出合力:
决定机器人的运动方向。
公式系数设定
根据《基于动态人工势场法的路径规划》提供的经验数据,
设定为30,
设定为1。
而
则根据本实验的环境选定为2。
算法流程
(1)判断机器人是否在目标点了,如果是,则提示到达目标点并显示有关机器人运行时间与距离,返回;否则进入下一步;
(2)获取机器人运动速度在x轴、z轴的分量;
(3)获取机器人距离传感器中编号为0、1、8(机器人前面三个)测量到的障碍距离,并分别加上机器人的半径;
(4)分别计算三个方向对机器人的斥力,保存在数组中;
(5)通过三个斥力大小与运动方向,计算出机器人运动方向与x轴正方向的夹角,求出这三个斥力在x轴与z轴的分力,并用加法合并成斥力的合力,这个过程在transform方法中完成;
(6)计算机器人与目标点的距离;
(7)计算引力大小,并分解到x轴与z轴;
(8)分别计算x轴与z轴的合力,并计算机器人运动方向与合力方向的夹角;
(9)设置机器人的角速度为上一步所求夹角的值;
(10)判断机器人是否撞到障碍,如果有碰撞,随机转动,之后回到步骤
(1)。
angleAdjust方法
本方法输入两个向量,返回第一个向量到第二个向量夹角的值,其中,返回值的范围为[-p,p]。
由于本方法可以在两种算法中共用,因此本方法在MyRobot类中,具体说明如下:
在simbad平台上,继承了EnvironmentDescription类的环境类坐标系如下图所示(只画二维,y轴在本实验中并不使用,故忽略):
x
0
z
其中,
在坐标系中为顺时针旋转,
为逆时针旋转。
在simbad中,setTranslationalVelocity方法设置的角速度如果值为正时则机器人顺时针旋转,否则为逆时针旋转。
在本实验中,向量是用Vector2d类来表示的,而该类提供了一个方法angle(Vector2dv2),返回的是调用该方法的向量v1与v2向量之间的夹角弧度值,范围在[0,p]。
因此,而在本实验中,可能出现以下两种情况:
v2v1
v1v2
(1)
(2)
由于使用angle方法返回的值在上面两种情况都一样,而在本实验中,则会出现问题。
例如,在上图,如果v1是机器人运动方向,v2是合力方向,则在
(1)中返回的是正确的值,而在
(2)中则是错误的值,应该是调用angle方法后返回值乘以-1才正确,否则机器人旋转后无法到达合力所示的角度。
因此,在本方法中,首先把输入的两个向量标准化为单位向量,然后求出两个向量的夹角弧度值,然后使用v1顺时针旋转该弧度值后判断是否与v2相等,如果是,则返回该弧度值,否则返回该弧度值乘以-1后的值,具体代码如下:
protecteddoubleangleAdjust(Vector2dv1,Vector2dv2)
{
v1.normalize();
v2.normalize();
doubleangle=v1.angle(v2);
doubler1=v1.x*Math.cos(-angle)-v1.y*Math.sin(-angle);
doubler2=v1.x*Math.sin(-angle)+v1.y*Math.cos(-angle);
if(compare(r1,v2.x,-6)&&compare(r2,v2.y,-6))
returnangle;
else
return-angle;
}
其中,使用compare方法是因为在比较v1旋转后是否与v2相等时,会因为弧度值的精度问题而出现一些偏差,因此使用compare方法比较两个值的差的绝对值是否小于10-6,如果是,则表示相等,否则不相等。
transform方法
本方法的输入为一个包含三个斥力值的数组和机器人运动速度方向,用于将三个方向的斥力分别分解到x轴与z轴上,进行合并,并返回一个向量,包含x轴与z轴上总斥力的大小。
首先,计算出机器人运动方向与x轴正方向的夹角弧度值,使用的是angleAdjust方法;其次,分别计算三个斥力与x轴正方向的夹角,并将斥力分解到x轴与z轴上;最后,对x轴与z轴上的各个斥力的值进行合并,返回一个向量,其中向量的x为x轴上总斥力大小,向量的y为z轴上总斥力的大小。
具体代码如下:
privateVector2dtransform(doubleforce[],Vector2ddirection)
{
Vector2dxpositive=newVector2d(1,0);
doubleangle=angleAdjust(direction,xpositive);
Vector2dforce0=newVector2d(force[0]*Math.cos(angle),force[0]*Math.sin(angle));
angle=angle-2*Math.PI/9;
Vector2dforce1=newVector2d(force[1]*Math.cos(angle),force[1]*Math.sin(angle));
angle=angle+4*Math.PI/9;
Vector2dforce2=newVector2d(force[2]*Math.cos(angle),force[2]*Math.sin(angle));
returnnewVector2d((force0.x+force1.x+force2.x),(force0.y
+force1.y+force2.y));
}
reachGoal方法
本方法输入是机器人现在的位置,输出是一个布尔型的值,作用是判断机器人是否到达目标,如果是,则返回true,否则是false。
由于本方法可以共用,因此放在MyRobot类中。
其中,获取机器人位置的语句是:
Point3dpos=newPoint3d();
this.getCoords(pos);
pos变量现在保存的就是机器人位置坐标。
本实验,判断机器人是否到达目标是以机器人所在位置与目标点的距离是否小于一个较小的值,取值为0.4。
具体代码如下:
protectedbooleanreachGoal(Point3dcurrentPos)
{
if(currentPos.distance(MyEnvironment.goal)<=MyEnvironment.reachGoalConstant)
returntrue;
else
returnfalse;
}
3.2.3.实验过程
(1)运行程序
(2)点击“Simulator”中的“run”按钮,开始运行机器人
(3)到达目标点后获取机器人运行信息
3.3.试验环境(软硬件配置)
3.3.1.软件配置
(1)MyEclipse8.5;
(2)项目工程导入simbad.1.4.jar、vecmath.jar、j3dcore.jar、j3dutils.jar。
3.3.2.硬件配置
一台运行Windows7操作系统的计算机。
3.4.实验结果与分析
从本次实验上来看,我所做的这个势场法在运行时是可以到达目标的。
其中,在虚拟器中,本次运行用了63.5秒,机器人走了30.5米。
通过与Bug2算法运行后的比较,在时间与距离上都有优势。
但是,过程中也体现出不如Bug2算法的地方。
例如,程序开始运行时,由于机器人初始位置附近存在很多的障碍物,因此,机器人花费较多时间才能绕出障碍物。
而在之后的运行中,势场法也体现出了较Bug2算法的优势,就是每次绕过障碍物后,不需要回到机器人初始位置与目标点之间的连线上,而可以直接向目标点前进,这就节省了运行的时间与距离。
4.实验总结
4.1.实验结论
通过在本实验中对环境中障碍物的不同设置,可以发现势场法存在几个缺陷:
(1)当目标点与障碍物靠得很近时,机器人无法到达目标点。
这是由于在这种情况下,机器人所受斥力大于引力,因此,机器人被推远而不能到达目标点;
(2)局部最小点问题,即当机器人某一个受到的合力为零,则此时机器人无法按要求调整方向,或者调整过程较迟钝;
(3)当障碍物在目标点与机器人之间,且三者在同一直线上时,由于机器人所受引力可能大于斥力,因此出现机器人撞到障碍物上的情况;
(4)当机器人向目标点前进时,如果前方出现障碍物,并且障碍物周围也存在一些障碍物,则这种情况下机器人容易在原地打转,难以直接绕过障碍物,从而浪费一些时间。
当然,势场法也能在一些情况下体现出优于Bug2算法的特点:
(1)势场法绕过障碍物后不需要回到机器人初始位置与目标点之间的连线上,而可以直接向目标点前进;
(2)由于Bug2在绕过障碍物时会与障碍物保持一定的安全距离,因此,机器人可能会放弃一些较窄的通道,从而绕得更远,这就浪费了运行的时间,也加大了运行距离;
(3)由于Bug2算法在绕行时是选择一个方向后进行绕行,因此通过选择的方向绕行过障碍物中途难以进行调整,出现绕行距离较远的情况,。
例如,障碍物与环境边界相靠近,导致最后机器人绕行边界。
总的来说,从这个实验中可以看出势场法和Bug2算法在机器人避障这个问题上是各有优势的,应该通过对机器人运行环境的分析后选择较恰当的算法。
如果环境中障碍多却较分散,则可以使用势场法;如果环境中障碍较集中,则可以选择Bug2算法。
当然,还可以对这两个算法进行改进,从而可以更灵活地对机器人避障路径进行选择。
4.2.个人小结
本次实验,让我了解了两种机器人避障的算法,从而了解了它们之间的优缺点。
而在完成本次实验的过程中,我也遇到了一些问题。
例如,一开始并没发现如何让机器人顺时针旋转与逆时针旋转,以及机器人的初始运动方向是向x轴正方向,而且由于对坐标系的不习惯,导致犯了很多的错误,还好最后通过自己调试程序发现了这些问题,并顺利地完成了实验。
从这个过程中,我也体会到了细节与基础知识的重要性。
例如,这次实验过程中分解力和计算合力的那部分,就用到了我在高中所学到的物理知识,而在判断向量顺时针旋转一个角度后所得到的向量,则运用了数学方面的知识,在使用声纳传感器测量障碍距离时,由于声纳传感器获取到的距离并没有加上机器人的半径,因此我在这一部分进行了调整,使得计算斥力时更加准确。
5.参考文献
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能机器人技术 智能 机器人 技术 实验 报告