1、华南理工大学本科生课程报告课程类别: 专业选修课课程名称: 智能机器人技术课程代码: 145030任课教师: 张平 李方机器人避障姓 名 学 号 院 系 计算机科学与工程学院 班 级 计算机科学与技术 1 班 成 绩 课程报告提交时间: 2013 年 1 月 3 日目 录 1. 实验目的 .12. 实验任务说明 .12.1. 实验任务描述 .12.2. 人员分工 .13. 实验内容 .13.1. 基本理论 .13.1.1. simbad 平台介绍 .13.1.2. simbad API 介绍 23.1.3. simbad 声纳传感器介绍 .33.1.4. 势场法介绍 33.2. 实验方案设计和
2、实验方法过程 .43.2.1. 实验方案 43.2.2. 实验设计 43.2.2.1.公式的设定 .43.2.2.2.公式系数设定 .43.2.2.3.算法流程 .53.2.2.4.angleAdjust 方法 .53.2.2.5.transform 方法 .73.2.2.6.reachGoal 方法 73.2.3. 实验过程 83.3. 试验环境(软硬件配置) .93.3.1. 软件配置 93.3.2. 硬件配置 93.4. 实验结果与分析 .104. 实验总结 .104.1. 实验结论 .104.2. 个人小结 .115. 参考文献 .11智能机器人技术课程报告11. 实验目的熟悉机器人仿
3、真软件(例如Simbad、Webots、TeamBots、Player/Stage/Gazebo 、MotionPlaner 等)的使用方法;掌握若干机器人路径规划算法。2. 实验任务说明2.1. 实验任务描述在机器人软件平台上建立一个包含若干个静止障碍物和运动障碍物的仿真环境,设定机器人的起始点和终点后,机器人能够规划出一条从起始点到目标点的安全路径。查阅相关路径规划算法,实现一种以上算法并相互比较。要求给出源代码、试验结果并且进行演示。2.2. 人员分工 姓名 工作内容林钊翔 负责势场法的实现与一些共用方法的实现陈伟彬 负责 Bug2 算法的实现3. 实验内容3.1. 基本理论3.1.1.
4、 simbad 平台介绍使用 simbad 平台,只需要做好三步就可以设置好机器人控制器,这三步分别完成一个主程序、一个环境类、一个机器人类。在主程序中,主要是启动 simbad 和机器人环境描述类。在环境类中,主要是描述环境中所有的组成成员,包括墙、箱、机器人等。这个类需要继承 EnvironmentDescription 类,在其中的构造方法中添加环境中的所有成员。在机器人类中,首先该类继承 Agent 类,并重写其中的两个方法initBehavior 和 performBehavior。其中,initBehavior 是在每次机器人生命开始时都会被模拟器调用的,一般来说不会使用到;per
5、formBehavior 是每步模拟器运行时都调用的,在正常操作时一秒会调用 20 次。 智能机器人技术课程报告2最后,就是编译和执行程序了。其中,编译命令为:javac classpath simbad-1.0 main.java environment.java robot.java而运行命令如下:java classpath simbad-1.0: .main整个 simbad 平台运行起来后,界面如下图所示:3.1.2. simbad API 介绍在本次实验中,主要用到的是 simbad.sim 这个包,其中包括了代表机器人和它所在的环境的类。主要有:Agent:Agent 就是机器人
6、。Arch:机器人可以绕过或从下面通过的拱形结构。Box:可以作为机器人的环境中的障碍物。CameraSensor:可以从机器人的视角查看机器人的环境。智能机器人技术课程报告3EnvironmentDescription:代表 “环境” ,可以在其中添加机器人和墙或盒子等对象。LampActuator:可以添加到机器人上的灯。LightSensor:感应光线的强度。RangeSensorBelt:包含机器人周围的一组距离传感器。RobotFactory:用这个类在机器人上添加传感器。Wall:另一种障碍物。而从 simbad 平台提供的控制机器人与管理机器人的 API 看,主要分成两部分:(1
7、) 状态 APIboolean collisionDetected():当机器人碰撞到别的物体时返回 true;int getCounter():返回经过模拟步骤的数量;double getOdometer():返回机器人运动的里程表,以米为单位;double getLifeTime():返回机器人总的生命时间,以虚拟秒为单位;void getCoords(Point3d coord):返回代理在环境中的坐标。(2) 移动 APIvoid setRotationalVelocity(double rv):设置角速度,以弧度 / 秒为单位;void setTranslationalVelocit
8、y(double tv):设置平移速度,以米 / 秒为单位。3.1.3. simbad 声纳传感器介绍在这次实验中,用得比较多的就是声纳传感器了,主要用于获取机器人到障碍的距离。使用传感器前,需要添加它们到机器人中,使用的语句具体如下:RangeSensorBelt sonars = RobotFactory.addSonarBeltSensor(this);默认添加 9 个声纳传感器,以逆时针旋转的方式放置,开始在机器人的正前方 0 度位置。如果需要自定义添加的声纳传感器,则使用RangeSensorBelt sonars = RobotFactory.addSonarBeltSensor(
9、this, sonarsNumber);每个声纳提供了一系列以米为单位的测量信息和命中状态,只有一个障碍坐落在声纳射线就可以获取到信息。要访问每个声纳传感器的内容,可以使用hasHit 和 getMeasurement 方法。智能机器人技术课程报告43.1.4. 势场法介绍势场法把机器人能处理成在人工势场影响下的一个点,机器人跟随着场移动。目标表现为对机器人的引力,障碍物表现为斥力。所有这些力的叠加,施加于机器人,在大多数情况下,机器人被假定为配置空间中的一个点,这样一种人工市场平滑地引导机器人趋向目标,同时避免碰撞已知的障碍物。但是这种方法也有很多局限性。根据障碍物形状和大小,会出现局部极小
10、;如果物体是凹的,则可能存在机器人在离物体最近的两个点来回震荡的情况。3.2. 实验方案设计和实验方法过程3.2.1. 实验方案(1) 搭建 simbad 平台,并建起机器人模拟环境;(2) 使用不同的路径规划算法,分别实现机器人避障方法;(3) 设置机器人初始位置和目标点,进行模拟;(4) 从机器人运动的路径长度与时间来进行比较。3.2.2. 实验设计3.2.2.1. 公式的设定本次实验使用静态人工势场方法。借鉴万有引力公式: ,记2rGMmFd(r,o)为机器人与障碍之间的距离,d(r,g) 为机器人与目标之间的距离,则引力公式可以记为: 2a引 ),(/grdKF其中 为引力系数。斥力公
11、式则记为:aK rod,2r斥 rod),(,0F斥 其中 为斥力系数, 为斥力的最大距离。只有在小于 的范围才考虑斥力。rKr r最后求出合力: 决定机器人的运动方向。斥引合3.2.2.2. 公式系数设定根据基于动态人工势场法的路径规划 1提供的经验数据, 设定为aK智能机器人技术课程报告530, 设定为 1。而 则根据本实验的环境选定为 2。rKrd3.2.2.3. 算法流程(1) 判断机器人是否在目标点了,如果是,则提示到达目标点并显示有关机器人运行时间与距离,返回;否则进入下一步;(2) 获取机器人运动速度在 x 轴、z 轴的分量;(3) 获取机器人距离传感器中编号为 0、1、8(机器
12、人前面三个)测量到的障碍距离,并分别加上机器人的半径;(4) 分别计算三个方向对机器人的斥力,保存在数组中;(5) 通过三个斥力大小与运动方向,计算出机器人运动方向与 x 轴正方向的夹角,求出这三个斥力在 x 轴与 z 轴的分力,并用加法合并成斥力的合力,这个过程在 transform 方法中完成;(6) 计算机器人与目标点的距离;(7) 计算引力大小,并分解到 x 轴与 z 轴;(8) 分别计算 x 轴与 z 轴的合力,并计算机器人运动方向与合力方向的夹角;(9) 设置机器人的角速度为上一步所求夹角的值;(10) 判断机器人是否撞到障碍,如果有碰撞,随机转动,之后回到步骤(1) 。3.2.2
13、.4. angleAdjust 方法本方法输入两个向量,返回第一个向量到第二个向量夹角的值,其中,返回值的范围为- ,。由于本方法可以在两种算法中共用,因此本方法在MyRobot 类中,具体说明如下:在 simbad 平台上,继承了 EnvironmentDescription 类的环境类坐标系如下图所示(只画二维,y 轴在本实验中并不使用,故忽略):x0智能机器人技术课程报告6 z其中,在坐标系中为顺时针旋转,为逆时针旋转。在 simbad 中,setTranslationalVelocity 方法设置的角速度如果值为正时则机器人顺时针旋转,否则为逆时针旋转。在本实验中,向量是用 Vecto
14、r2d 类来表示的,而该类提供了一个方法angle(Vector2d v2),返回的是调用该方法的向量 v1 与 v2 向量之间的夹角弧度值,范围在0,。因此,而在本实验中,可能出现以下两种情况:v2 v1v1 v2(1) (2)由于使用 angle 方法返回的值在上面两种情况都一样,而在本实验中,则会出现问题。例如,在上图,如果 v1 是机器人运动方向,v2 是合力方向,则在(1)中返回的是正确的值,而在(2)中则是错误的值,应该是调用 angle 方法后返回值乘以-1 才正确,否则机器人旋转后无法到达合力所示的角度。因此,在本方法中,首先把输入的两个向量标准化为单位向量,然后求出两个向量的
15、夹角弧度值,然后使用 v1 顺时针旋转该弧度值后判断是否与 v2 相等,如果是,则返回该弧度值,否则返回该弧度值乘以-1 后的值,具体代码如下:protected double angleAdjust(Vector2d v1, Vector2d v2)v1.normalize();v2.normalize();double angle = v1.angle(v2);double r1 = v1.x * Math.cos(-angle) - v1.y * Math.sin(-angle);double r2 = v1.x * Math.sin(-angle) + v1.y * Math.cos(
16、-angle);if (compare(r1, v2.x, -6) elsereturn -angle;智能机器人技术课程报告7其中,使用 compare 方法是因为在比较 v1 旋转后是否与 v2 相等时,会因为弧度值的精度问题而出现一些偏差,因此使用 compare 方法比较两个值的差的绝对值是否小于 10-6,如果是,则表示相等,否则不相等。3.2.2.5. transform 方法本方法的输入为一个包含三个斥力值的数组和机器人运动速度方向,用于将三个方向的斥力分别分解到 x 轴与 z 轴上,进行合并,并返回一个向量,包含 x 轴与 z 轴上总斥力的大小。首先,计算出机器人运动方向与 x
17、 轴正方向的夹角弧度值,使用的是angleAdjust 方法;其次,分别计算三个斥力与 x 轴正方向的夹角,并将斥力分解到 x 轴与 z 轴上;最后,对 x 轴与 z 轴上的各个斥力的值进行合并,返回一个向量,其中向量的 x 为 x 轴上总斥力大小,向量的 y 为 z 轴上总斥力的大小。具体代码如下:private Vector2d transform(double force, Vector2d direction)Vector2d xpositive = new Vector2d(1, 0);double angle = angleAdjust(direction, xpositive);
18、Vector2d force0 = new Vector2d(force0 * Math.cos(angle), force0 * Math.sin(angle);angle = angle - 2 * Math.PI / 9;Vector2d force1 = new Vector2d(force1 * Math.cos(angle), force1 * Math.sin(angle);angle = angle + 4 * Math.PI / 9;Vector2d force2 = new Vector2d(force2 * Math.cos(angle), force2 * Math.s
19、in(angle);return new Vector2d(force0.x + force1.x + force2.x), (force0.y+ force1.y + force2.y);3.2.2.6. reachGoal 方法本方法输入是机器人现在的位置,输出是一个布尔型的值,作用是判断机器人是否到达目标,如果是,则返回 true,否则是 false。由于本方法可以共用,因此放在 MyRobot 类中。其中,获取机器人位置的语句是:Point3d pos = new Point3d();this.getCoords(pos);智能机器人技术课程报告8pos 变量现在保存的就是机器人位置坐
20、标。本实验,判断机器人是否到达目标是以机器人所在位置与目标点的距离是否小于一个较小的值,取值为 0.4。具体代码如下:protected boolean reachGoal(Point3d currentPos)if (currentPos.distance(MyEnvironment.goal) =MyEnvironment.reachGoalConstant)return true;elsereturn false;3.2.3. 实验过程(1) 运行程序(2) 点击“Simulator”中的“run”按钮,开始运行机器人智能机器人技术课程报告9(3) 到达目标点后获取机器人运行信息3.3.
21、 试验环境(软硬件配置)3.3.1. 软件配置(1)MyEclipse 8.5;(2)项目工程导入 simbad.1.4.jar、vecmath.jar 、j3dcore.jar、j3dutils.jar 。3.3.2. 硬件配置一台运行 Windows 7 操作系统的计算机。智能机器人技术课程报告103.4. 实验结果与分析从本次实验上来看,我所做的这个势场法在运行时是可以到达目标的。其中,在虚拟器中,本次运行用了 63.5 秒,机器人走了 30.5 米。通过与 Bug2 算法运行后的比较,在时间与距离上都有优势。但是,过程中也体现出不如 Bug2算法的地方。例如,程序开始运行时,由于机器人
22、初始位置附近存在很多的障碍物,因此,机器人花费较多时间才能绕出障碍物。而在之后的运行中,势场法也体现出了较 Bug2 算法的优势,就是每次绕过障碍物后,不需要回到机器人初始位置与目标点之间的连线上,而可以直接向目标点前进,这就节省了运行的时间与距离。4. 实验总结4.1. 实验结论通过在本实验中对环境中障碍物的不同设置,可以发现势场法存在几个缺陷:(1)当目标点与障碍物靠得很近时,机器人无法到达目标点。这是由于在这种情况下,机器人所受斥力大于引力,因此,机器人被推远而不能到达目标点;(2)局部最小点问题,即当机器人某一个受到的合力为零,则此时机器人无法按要求调整方向,或者调整过程较迟钝;(3)
23、当障碍物在目标点与机器人之间,且三者在同一直线上时,由于机器人所受引力可能大于斥力,因此出现机器人撞到障碍物上的情况;(4)当机器人向目标点前进时,如果前方出现障碍物,并且障碍物周围也存在一些障碍物,则这种情况下机器人容易在原地打转,难以直接绕过障碍物,从而浪费一些时间。当然,势场法也能在一些情况下体现出优于 Bug2 算法的特点:(1)势场法绕过障碍物后不需要回到机器人初始位置与目标点之间的连线上,而可以直接向目标点前进;(2)由于 Bug2 在绕过障碍物时会与障碍物保持一定的安全距离,因此,机器人可能会放弃一些较窄的通道,从而绕得更远,这就浪费了运行的时间,智能机器人技术课程报告11也加大
24、了运行距离;(3)由于 Bug2 算法在绕行时是选择一个方向后进行绕行,因此通过选择的方向绕行过障碍物中途难以进行调整,出现绕行距离较远的情况, 。例如,障碍物与环境边界相靠近,导致最后机器人绕行边界。总的来说,从这个实验中可以看出势场法和 Bug2 算法在机器人避障这个问题上是各有优势的,应该通过对机器人运行环境的分析后选择较恰当的算法。如果环境中障碍多却较分散,则可以使用势场法;如果环境中障碍较集中,则可以选择 Bug2 算法。当然,还可以对这两个算法进行改进,从而可以更灵活地对机器人避障路径进行选择。4.2. 个人小结本次实验,让我了解了两种机器人避障的算法,从而了解了它们之间的优缺点。
25、而在完成本次实验的过程中,我也遇到了一些问题。例如,一开始并没发现如何让机器人顺时针旋转与逆时针旋转,以及机器人的初始运动方向是向 x轴正方向,而且由于对坐标系的不习惯,导致犯了很多的错误,还好最后通过自己调试程序发现了这些问题,并顺利地完成了实验。从这个过程中,我也体会到了细节与基础知识的重要性。例如,这次实验过程中分解力和计算合力的那部分,就用到了我在高中所学到的物理知识,而在判断向量顺时针旋转一个角度后所得到的向量,则运用了数学方面的知识,在使用声纳传感器测量障碍距离时,由于声纳传感器获取到的距离并没有加上机器人的半径,因此我在这一部分进行了调整,使得计算斥力时更加准确。5. 参考文献1 毕盛等.基于动态人工势场法的路径规划J.机电产品开发与创新.2006,19(4):25-26.2 沈文君.基于改进人工势场法的机器人路径规划算法研究D.暨南大学,2009.3 (美)R 西格沃特,IR诺巴克什著.自主移动机器人导论.李人厚译.西安:西安交通大学出版社,2007