11_Artificial Potential Field_宾夕法尼亚大学机器人运动规划专项课程【学习笔记】

1. Constructing Artificial Potential Field

本节将讲解如何在人工势场中引导机器人在充满障碍物的环境中运动,基本思路是在位形空间内构造一个平滑函数【smooth function】,当机器人靠近障碍物时,该函数值较高;远离障碍物时,该函数值较低;还希望在终点此函数值最小;若机器人移动到(离终点)更远的位置,函数值就会增加,如果建立出这样的函数方程,就可以用它的(下降)梯度【gradient】将机器人引导到所要求的位置。

先举个二维位形空间的简单例子,可以更容易观察到发生了什么,下图是一个典型的二维位形空间,黑色区域表示位形室间障碍物,红点表示目标位置。
在这里插入图片描述
构建一个势场函数,它将引导机器人到达终点,有很多实现方法,但是一个流行办法就是构造一个简单的二次函数【quadratic function】。如图所示,该函数值在终点为零,该值随着到终点的距离的增加而增加。

在该表达式中,向量x表示机器人在二维位形空间中的坐标,xg表示目标位置的坐标,在这里插入图片描述只是用来缩放函数的常数.

在这里插入图片描述

下图显示了该函数在二维工作空间中的变化情况,函数值在目标位置为零,并随着到(目标)的距离而迅速增加。
注意,碗状是二次函数的特征。
如果机器人在下坡时遵循此函数的坡度,它会直接引导机器人朝着目标点前进,我们将此功能称为fa,以提醒我们,这是一种将机器人引导到终点的函数。

在这里插入图片描述
那么,除了到达目标位置以外,我们还希望机器人能够绕开环境中的障碍。为此,将构建第二个函数fr,使得机器人绕过位形空间中的障碍。
ρ(x)表示一个函数,向其输入二维位形空间中点坐标,该函数会返回最近位形空间障碍的距离值,如果位形空间障碍能明确的(用某个值、变量或参数)表示,则可以通过解析构造这样一个函数;或者,如果我们愿意将二维工作空间变成离散的网格,我们可以采用图像处理中一种叫距离变换的方法,基于这种距离变换的方法,使用距离函数来建立排斥函数fr。当靠近障碍物时。函数值变大;而远离障碍物时,函数值变小。

参数d0控制该函数对整体函数的影响,如果机器人与障碍物之间的距离大于d0,该函数不起作用;因此,仅当机器人接近障碍物时,排斥函数才会有(特定的)值。然后,当靠近障碍物的表面时,该值会迅速增加。
在这里插入图片描述
还有很多方法可以建立平滑的排斥函数去引导机器人远离障碍,下图是一种特别热门且方便的方法。
这是个曲面图,从此可以看出排斥函数是如何在例子中的二维空间内变化的。
在这里插入图片描述

有了这两个(到达终点和避开障碍)要素,存在吸引电势就会将机器人引导到目标位置,若存在排斥电势就会使机器人远离障碍物,我们可以简单的将它们加起来以构造同时具有吸引、排斥功能的函数

下面这个曲面图就是两个函数(吸引、排斥函数)的总和

在这里插入图片描述
有了这势场函数,那么如何使用它来指导机器人?这里我们使用微积分计算函数的梯度来操纵机器人,具体步骤如下图,根据势函数的梯度选择机器人v的速度
在这里插入图片描述

此处的比例关系表示了机器人的运动方向,但是机器人的速度取决于程序里速度矢量的大小,例如你可以选择(让机器人)以某个恒定的速度一直移动到距离目标足够近为止;或者,你可以根据(机器人)与目标的距离来选择切换速度。这样一来,机器人在接近目标时会减速,避免冲过头或产生其他不良影响。

总结该算法,机器人会不断评估人工势场的梯度,并朝该方向逐步移动,直到足够接近目标为止。

更具体一点,该算法或该控制策略的运行过程,与石头从势能面向下滚动,到达目标的情形差不多,下图显示的算法的运行过程:
在这里插入图片描述

那么下图则是以另一种方式来描述这个过程,箭头图,其中箭头表示位形空间中各个位置处的梯度场方向

在这里插入图片描述
红线表示通过该梯度的引导(机器人)从起点到终点的运动轨迹

在这里插入图片描述

这里还有一些其他的轨迹实例,都是在这个势场中得出的

在这里插入图片描述

在这里插入图片描述

该过程吸引人的地方在于,通过机器人的运动轨迹就能大概判断出人工势场函数f的梯度。
更具体地说,这意味着该机器人仅使用它的位置和本地传感器的信息就能完成程序,利用自身位置就能构建势场吸引函数的机器人,这种机器人可以测量距当前位置d0范围内的所有障碍物,也可以估算出排斥函数,通过评估机器人当前位置附近位置的势场函数,然后应用简单的有限差分法,可以估算势场梯度。

事实上,最初,这些势场方法是通过精确(计算)开发出来的,因为它们提供了一种简单、直接的方法来引导机器人前往目标点,同时(机器人)根据本地传感器数据躲避障碍物,所以有时将它称作基于传感器的路径规划,机器人位置传感器的读数将会引导它向目标前进,同时它的距离传感器(例如激光扫描仪或立体声系统)的测量信息会让它远离环境中的障碍物

2. Issues with Local Minima

人工势场法操作起来相对简单,它们可以使用本地传感器数据,以几十赫兹的刷新速度来对机器人进行实时控制。但是,这些方法的缺点是很难保证它们不会失效。理想情况下,人工势场函数只在终点处出现全局最小值【global minimum】。

实际上,除了终点之外,在其它位置也可能出现引力和斥力合成后,有局部最小值【lacal minimum】的情况。

在这里插入图片描述
以上图位形空间为例,当构造人工势场的时候 会得到下图所示的曲面图。其中,有两个最小值,一个在目标点处,另一个在我们建立的涵洞里。
在这里插入图片描述
这在实践中意味着,简单的梯度下降的控制策略,会不会在终点处结束,取决于机器人起点的位置。回到前面石头(滚落)的比喻,在这些目标点以外对应局部最小值的波谷中,机器人很可能会被卡住,由下图可以看到,机器人的轨迹终结于局部最小值而不是终点处。
在这里插入图片描述
而且,实际中,这类局部极小值问题很难消除。某些障碍和参数设置会导致局部最小值,但并不是全部;而在实践中,很难事先知道,这个问题(陷入局部最小点)什么时候会发生。

有一种检查这些人工势场方案的思路,挺有用的,或许能启发到你,在很多情况下,他们能够成功引导机器人到所需的位置,但它们也可能会陷入死胡同,这就往往需要回溯程序来检测这些情况,然后再切换到不同的规划策略。

感谢 B 站 up 主 Here_Kin 的翻译和分享!
【自制中英】宾夕法尼亚大学机器人专项课程二 运动规划 - Robotics:Motion and Planning

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,机器人路径规划避障是一个复杂的问题,需要综合考虑机器人的动力学模型、环境信息、目标位置等因素。人工力矩方法是一种常用的路径规划避障方法,它利用力矩来控制机器人运动,使得机器人避开障碍物并到达目标位置。 以下是一个简单的 Python 代码示例,实现了基于人工力矩方法的机器人路径规划避障。 ```python import numpy as np # 定义机器人的动力学模型 def robot_dynamics(x, u): # x: 状态向量,包括机器人的位置和速度 # u: 控制向量,包括机器人的加速度 # 返回机器人的下一个状态 return np.array([x[0] + x[1], x[1] + u]) # 定义人工力矩方法 def artificial_potential_field(x, obstacles, goal): # x: 当前机器人的位置 # obstacles: 障碍物的位置 # goal: 目标位置 # 返回机器人的控制向量 # 定义参数 k_att = 1 # 引力常数 k_rep = 10 # 斥力常数 min_dist = 1 # 障碍物最小安全距离 # 计算机器人到目标点的距离和方向 dist = np.linalg.norm(x - goal) dir = (goal - x) / dist # 计算机器人到每个障碍物的距离和方向 rep_forces = np.zeros(2) for obstacle in obstacles: obs_dir = (x - obstacle) / np.linalg.norm(x - obstacle) obs_dist = np.linalg.norm(x - obstacle) if obs_dist < min_dist: # 如果机器人到障碍物的距离小于最小安全距离,斥力最大 force = k_rep * (1 / obs_dist - 1 / min_dist) ** 2 * obs_dir else: # 否则,斥力随机器人到障碍物的距离而逐渐减小 force = k_rep / obs_dist ** 2 * obs_dir rep_forces += force # 计算机器人的控制向量 att_force = k_att * dist * dir total_force = att_force + rep_forces control = np.dot(np.array([[0, -1], [1, 0]]), total_force) # 计算控制向量的法向量,即力矩 return control # 定义主程序 def main(): # 初始化机器人状态和目标位置 x = np.array([0, 0]) goal = np.array([10, 10]) # 初始化障碍物位置 obstacles = np.array([[3, 3], [5, 5], [7, 7]]) # 控制机器人运动,直到到达目标位置 while np.linalg.norm(x - goal) > 0.1: control = artificial_potential_field(x, obstacles, goal) # 计算控制向量 x = robot_dynamics(x, control) # 更新机器人状态 print('Robot position:', x) if __name__ == '__main__': main() ``` 在上面的代码中,我们首先定义了机器人的动力学模型 `robot_dynamics`,它根据当前机器人的状态和控制向量,计算机器人的下一个状态。 然后,我们定义了人工力矩方法 `artificial_potential_field`。它根据当前机器人的位置、障碍物的位置和目标位置,计算机器人的控制向量。其中,我们使用了引力和斥力的概念,引力使机器人朝向目标位置运动,斥力使机器人远离障碍物。我们还定义了一些参数,如引力常数、斥力常数、最小安全距离等。 最后,我们定义了主程序 `main`,它通过调用 `artificial_potential_field` 和 `robot_dynamics` 函数控制机器人运动,直到机器人到达目标位置。 在实际应用中,我们可以通过传感器获取机器人和障碍物的位置信息,然后调用 `artificial_potential_field` 函数计算控制向量,再通过执行器控制机器人运动。同时,由于环境信息可能会发生变化,我们需要不断地更新障碍物的位置信息,重新计算控制向量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值