路劲规划与轨迹跟踪学习4——人工势场法

本文参考(85条消息) 【路径规划】局部路径规划算法——人工势场法(含python实现 | c++实现)_CHH3213的博客-CSDN博客_人工势场法路径规划

路径规划与轨迹跟踪系列算法学习_第6讲_人工势场法_哔哩哔哩_bilibili

1. 算法简介

人工势场法是一种原理比较简单的移动机器人路径规划算法,它将目标点位置视做势能最低点,将地图中的障碍物视为势能高点,计算整个已知地图的势场图,然后理想情况下,机器人就像一个滚落的小球,自动避开各个障碍物滚向目标点。

2. 算法精讲

2.1 引力势场

引力势场主要与汽车和目标点间的距离有关, 距离越大, 汽车所受的势能值就越大; 距离越小, 汽车所受的势能值则越小, 所以引力势场的函数为:

2.2 斥力势场 

  • 决定障碍物斥力势场的因素是汽车与障碍物间的距离, 当汽车未进入障碍物的影响范围时, 其受到的势能值为零; 在汽车进入障碍物的影响范围后, 两者之间的距离越大, 汽车受到的势能值就越小, 距离越小, 汽车受到的势能值就越大。

  • 斥力势场的势场函数为:

 相应的斥力为斥力势场的负梯度作用力:

 2.3 合力势场

根据上述定义的引力场函数和斥力场函数,可以得到整个运行空间的复合场,机器人的合力势场大小为机器人所受的斥力势场和引力势场之和,故合力势场总函数为:

 所受合力为:

 合力的方向决定汽车的行驶朝向,合力的大小决定汽车的行驶加速度。

3. 引力斥力推导计算

 

 化简后得斥力大小为

 4. 算法缺陷与改进

4.1 目标不可达的问题

由于障碍物与目标点距离太近,当汽车到达目标点时,根据势场函数可知,目标点的引力降为零,而障碍物的斥力不为零,此时汽车虽到达目标点, 但在斥力场的作用下不能停下来,从而导致目标不可达的问题。

4.2 陷入局部最优的问题

车辆在某个位置时,无法向前搜索避障路径。

出现局部最优主要有两种情况:

  • 如下图,汽车受到的障碍物的斥力和目标点的引力之间的夹角近似为180°,几乎在同一条直线上,就会出现汽车在障碍物前陷入局部最优的问题。
  • 如果若干个障碍物的合斥力与目标点的引力大小相等、方向相反,则合力为0,智能汽车自身判断到达势能极小值的位置,但没有到达期望的目标点位置。由于合力为零,汽车就会陷在势能极小的位置,无法继续前进和转向,以致无法到达期望的目标点。

 4.3 解决方案

 4.3.1 改进障碍物斥力势场函数

通过改进障碍物斥力势场函数来解决局部最优和目标不可达的问题;在传统人工势场法的障碍物斥力场模型中加入调节因子,使汽车只有到达目标点时, 斥力和引力才同时减小到零, 从而使局部最优和目标不可达的问题得到解决。

改进后的斥力场函数为:

为汽车与目标点的距离,式中n为可选的正常数。 

 的方向为障碍物指向车辆;的方向为车辆指向目标点。

 

 改进的斥力场函数中加入了汽车与目标点间的距离,这样使汽车在驶向目标的过程中,受到的引力和斥力同时在一定程度上减小,且只有在汽车到达目标点时,引力和斥力才同时减小为零,即目标点成为势能值的最小点,从而使局部最优和目标不可达的问题得到解决。

4.3.2 道路边界斥力势场

如图,假设每一条车道宽度为d,有2条车道(故道路宽度为2d)。车辆宽度为w,故车辆在每一条车道内允许调整的横向移动范围为d−w。

通过建立道路边界斥力势场以限制汽车的行驶区域,并适当考虑车辆速度对斥力场的影响 

 

 

 

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人工蜂群算法是一种基于模拟蜜蜂觅食行为的优化算法,可用于求解复杂的路径规划问题。下面是一份用 Python 实现的人工蜂群算法描述机器人栅栏图格路径规划的代码示例: ```python import numpy as np # 栅栏图格地图类 class Map: def __init__(self, width, height, obstacles): self.width = width self.height = height self.obstacles = obstacles def is_obstacle(self, x, y): for obstacle in self.obstacles: if obstacle[0] == x and obstacle[1] == y: return True return False # 机器人类 class Robot: def __init__(self, map, start, end): self.map = map self.start = start self.end = end # 计算两点之间的距离 def distance(self, point1, point2): return np.sqrt(np.power(point1[0] - point2[0], 2) + np.power(point1[1] - point2[1], 2)) # 计算路径长度 def path_length(self, path): length = 0 for i in range(len(path) - 1): length += self.distance(path[i], path[i + 1]) return length # 搜索可行路径 def find_path(self): # 初始化参数 n = 100 # 蜜蜂数量 limit = 20 # 蜜蜂搜索范围 max_iter = 100 # 最大迭代次数 alpha = 0.5 # 局部搜索因子 beta = 0.5 # 全局搜索因子 path_len = float('inf') # 初始路径长度为正无穷大 path = None # 最优路径 # 初始化蜜蜂 bees = [] for i in range(n): bee = {'pos': self.start, 'path': [self.start]} bees.append(bee) # 迭代搜索 for i in range(max_iter): # 局部搜索 for bee in bees: local_best_len = float('inf') local_best_path = None for j in range(-limit, limit + 1): for k in range(-limit, limit + 1): x = bee['pos'][0] + j y = bee['pos'][1] + k if x >= 0 and x < self.map.width and y >= 0 and y < self.map.height and not self.map.is_obstacle(x, y): new_path = bee['path'] + [(x, y)] new_len = self.path_length(new_path) if new_len < local_best_len: local_best_len = new_len local_best_path = new_path bee['path'] = local_best_path # 全局搜索 for bee in bees: global_best_len = float('inf') global_best_path = None for j in range(n): if bees[j] != bee: other_bee = bees[j] if other_bee['path'][-1] == bee['path'][-1]: common_path_len = self.path_length(other_bee['path']) new_path = bee['path'] + other_bee['path'][1:] new_len = self.path_length(new_path) + alpha * common_path_len if new_len < global_best_len: global_best_len = new_len global_best_path = new_path bee['path'] = global_best_path # 更新最优路径 for bee in bees: if bee['path'][-1] == self.end: bee_len = self.path_length(bee['path']) if bee_len < path_len: path_len = bee_len path = bee['path'] # 更新蜜蜂位置 for bee in bees: if bee['path'][-1] != self.end: i = np.random.randint(len(bee['path']) - 1) j = np.random.randint(len(bee['path']) - 1) bee['pos'] = bee['path'][i] bee['path'] = bee['path'][:i] + bee['path'][j:] return path ``` 该代码中,`Map` 类表示栅栏图格地图,`Robot` 类表示机器人。`Robot` 类中的 `find_path` 方法实现了人工蜂群算法的搜索过程,其中包括局部搜索和全局搜索两个过程。搜索过程中,每只蜜蜂都记录了当前的位置和路径,通过不断更新路径来搜索最优路径。最优路径的更新过程中,采用了局部搜索因子和全局搜索因子来平衡局部搜索和全局搜索的贡献。最终返回的路径即为搜索到的最优路径。 要使用该代码,需要先构造一个 `Map` 对象和一个 `Robot` 对象,然后调用 `Robot` 对象的 `find_path` 方法即可得到最优路径。例如: ```python # 构造地图 width = 10 height = 10 obstacles = [(2, 2), (3, 2), (4, 2), (5, 2), (6, 2), (6, 3), (6, 4), (6, 5), (5, 5), (4, 5), (3, 5)] map = Map(width, height, obstacles) # 构造机器人 start = (0, 0) end = (9, 9) robot = Robot(map, start, end) # 搜索路径 path = robot.find_path() print(path) ``` 该代码将在一个 $10 \times 10$ 的栅栏图格地图中搜索从 $(0, 0)$ 到 $(9, 9)$ 的最优路径,其中包含了一些障碍物。搜索完成后,将打印出搜索到的最优路径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值