路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)

本文主要是介绍路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

路径规划综述

在这里插入图片描述

1. 背景介绍

路径规划是指在给定的环境中找到从起点到终点的最佳路径的过程。它在现实生活中有着广泛的应用,包括无人驾驶、物流配送、机器人导航等领域。随着人工智能和计算机技术的发展,路径规划技术也在不断地得到改进和应用。
路径规划中常见的算法可以分为两类:基于搜索的规划和基于采样的规划。

基于搜索的规划包括

  • Breadth-First Searching (BFS)、
  • Depth-First Searching (DFS)、
  • Best-First Searching、
  • Dijkstra’s、
  • A*、
  • Bidirectional A*、
  • Anytime Repairing A*、
  • Learning Real-time A* (LRTA*)、
  • Real-time Adaptive A* (RTAA*)、
  • Lifelong Planning A* (LPA*)、
  • Dynamic A* (D*)、
  • D* Lite 和
  • Anytime D*

等算法。这些算法通过搜索图形结构来找到最短或最优的路径,其中 A* 是最为常用和经典的算法之一。

优缺点比较
  1. BFS(Breadth-First Searching)
    优点:可找到最短路径;适用于无权图。

缺点:时间复杂度高;空间复杂度高。

  1. DFS(Depth-First Searching)
    优点:空间复杂度低。
    在这里插入图片描述

缺点:可能会陷入死循环;不一定能找到最短路径。

  1. Best-First Searching
    优点:速度快;可以处理启发式信息。

缺点:可能会陷入局部最优解。

  1. Dijkstra’s
    优点:可以找到最短路径;适用于有权图。

缺点:时间复杂度高;不能处理负权边。

  1. A*
    优点:速度快;可以处理启发式信息;可以找到最短路径。

缺点:可能会陷入局部最优解。

  1. Bidirectional A*
    优点:速度快;可以找到最短路径。

缺点:需要存储两个搜索树;可能会出现问题,例如搜索空间过大或搜索树生长过慢。

  1. Anytime Repairing A*
    优点:可以在任何时候停止搜索并返回最佳路径;可以处理启发式信息。
    在这里插入图片描述

缺点:可能会陷入局部最优解。

  1. LRTA* (Learning Real-time A*)
    优点:可以处理动态环境;可以处理启发式信息。

缺点:需要进行实时计算,可能会导致性能问题。

  1. RTAA* (Real-time Adaptive A*)
    优点:可以处理动态环境;可以处理启发式信息。

缺点:需要进行实时计算,可能会导致性能问题。

  1. LPA* (Lifelong Planning A*)
    优点:可以在不同的时间段进行搜索;可以处理启发式信息。

缺点:需要存储大量的搜索树。

class Node:def __init__(self, n):self.x = n[0]self.y = n[1]self.parent = Noneclass RrtStarSmart:def __init__(self, x_start, x_goal, step_len,goal_sample_rate, search_radius, iter_max):self.x_start = Node(x_start)self.x_goal = Node(x_goal)self.step_len = step_lenself.goal_sample_rate = goal_sample_rateself.search_radius = search_radiusself.iter_max = iter_maxself.env = env.Env()self.plotting = plotting.Plotting(x_start, x_goal)self.utils = utils.Utils()self.fig, self.ax = plt.subplots()self.delta = self.utils.deltaself.x_range = self.env.x_rangeself.y_range = self.env.y_rangeself.obs_circle = self.env.obs_circleself.obs_rectangle = self.env.obs_rectangleself.obs_boundary = self.env.obs_boundaryself.V = [self.x_start]self.beacons = []self.beacons_radius = 2self.direct_cost_old = np.infself.obs_vertex = self.utils.get_obs_vertex()self.path = Nonedef planning(self):n = 0b = 2InitPathFlag = Falseself.ReformObsVertex()for k in range(self.iter_max):if k % 200 == 0:print(k)if (k - n) % b == 0 and len(self.beacons) > 0:x_rand = self.Sample(self.beacons)else:x_rand = self.Sample()x_nearest = self.Nearest(self.V, x_rand)x_new = self.Steer(x_nearest, x_rand)if x_new and not self.utils.is_collision(x_nearest, x_new):X_near = self.Near(self.V, x_new)self.V.append(x_new)if X_near:# choose parentcost_list = [self.Cost(x_near) + self.Line(x_near, x_new) for x_near in X_near]x_new.parent = X_near[int(np.argmin(cost_list))]# rewirec_min = self.Cost(x_new)for x_near in X_near:c_near = self.Cost(x_near)c_new = c_min + self.Line(x_new, x_near)if c_new < c_near:x_near.parent = x_newif not InitPathFlag and self.InitialPathFound(x_new):InitPathFlag = Truen = kif InitPathFlag:self.PathOptimization(x_new)if k % 5 == 0:self.animation()self.path = self.ExtractPath()self.animation()plt.plot([x for x, _ in self.path], [y for _, y in self.path], '-r')plt.pause(0.01)plt.show()def PathOptimization(self, node):direct_cost_new = 0.0node_end = self.x_goalwhile node.parent:node_parent = node.parentif not self.utils.is_collision(node_parent, node_end):node_end.parent = node_parentelse:direct_cost_new += self.Line(node, node_end)node_end = nodenode = node_parentif direct_cost_new < self.direct_cost_old:self.direct_cost_old = direct_cost_newself.UpdateBeacons()def UpdateBeacons(self):node = self.x_goalbeacons = []while node.parent:near_vertex = [v for v in self.obs_vertexif (node.x - v[0]) ** 2 + (node.y - v[1]) ** 2 < 9]if len(near_vertex) > 0:for v in near_vertex:beacons.append(v)node = node.parentself.beacons = beaconsdef ReformObsVertex(self):obs_vertex = []for obs in self.obs_vertex:for vertex in obs:obs_vertex.append(vertex)self.obs_vertex = obs_vertexdef Steer(self, x_start, x_goal):dist, theta = self.get_distance_and_angle(x_start, x_goal)dist = min(self.step_len, dist)node_new = Node((x_start.x + dist * math.cos(theta),x_start.y + dist * math.sin(theta)))node_new.parent = x_startreturn node_newdef Near(self, nodelist, node):n = len(self.V) + 1r = 50 * math.sqrt((math.log(n) / n))dist_table = [(nd.x - node.x) ** 2 + (nd.y - node.y) ** 2 for nd in nodelist]X_near = [nodelist[ind] for ind in range(len(dist_table)) if dist_table[ind] <= r ** 2 andnot self.utils.is_collision(node, nodelist[ind])]return X_neardef Sample(self, goal=None):if goal is None:delta = self.utils.deltagoal_sample_rate = self.goal_sample_rateif np.random.random() > goal_sample_rate:return Node((np.random.uniform(self.x_range[0] + delta, self.x_range[1] - delta),np.random.uniform(self.y_range[0] + delta, self.y_range[1] - delta)))return self.x_goalelse:R = self.beacons_radiusr = random.uniform(0, R)theta = random.uniform(0, 2 * math.pi)ind = random.randint(0, len(goal) - 1)return Node((goal[ind][0] + r * math.cos(theta),goal[ind][1] + r * math.sin(theta)))def SampleFreeSpace(self):delta = self.deltaif np.random.random() > self.goal_sample_rate:return Node((np.random.uniform(self.x_range[0] + delta, self.x_range[1] - delta),np.random.uniform(self.y_range[0] + delta, self.y_range[1] - delta)))return self.x_goal
  1. D* (Dynamic A*)
    优点:可以处理动态环境;可以处理启发式信息。

缺点:需要存储大量的搜索树。

  1. D* Lite
    优点:可以处理动态环境;可以处理启发式信息;空间复杂度低。

缺点:可能会陷入局部最优解。

  1. Anytime D*
    优点:可以在任何时候停止搜索并返回最佳路径;可以处理动态环境;可以处理启发式信息。

缺点:可能会陷入局部最优解。

基于采样的规划则是利用随机采样的方法来生成路径

其中最常见的算法是

  • RRT、

  • RRT-Connect、

  • Extended-RRT、

  • Dynamic-RRT、

  • RRT*、

  • Informed RRT*、

  • RRT* Smart、

  • Anytime RRT*、

  • Closed-Loop RRT*、

  • Spline-RRT*、

  • Fast Marching Trees (FMT*) 和

  • Batch Informed Trees (BIT*)

等算法。这些算法适用于复杂环境中的路径规划,如机器人导航、无人驾驶和物流配送等领域。

优缺点
  1. RRT (Rapidly-Exploring Random Trees)
    优点:适用于高维空间;能够有效处理复杂环境;运算速度较快。
    在这里插入图片描述

缺点:无法保证找到最优解;生成的路径可能不是最短路径。

  1. RRT-Connect
    优点:可以保证找到可行路径;适用于多机器人路径规划问题。

缺点:路径质量可能较差;可能收敛速度较慢。

  1. Extended-RRT
    优点:能够处理非完整动力学系统;适用于多机器人协同规划。

缺点:路径质量可能较差;运算速度较慢。

  1. Dynamic-RRT
    优点:能够处理动态环境中的路径规划问题;适用于移动机器人和无人机等领域。
    在这里插入图片描述

缺点:运算速度较慢;路径质量可能较差。

  1. RRT* (Rapidly-Exploring Random Trees Star)
    优点:能够找到最优路径;路径质量较高。

缺点:运算速度较慢;可能需要大量的存储空间。

  1. Informed RRT*
    优点:结合了启发式信息,能够加速搜索过程;能够找到近似最优解。

缺点:运算速度较慢;路径质量可能较差。

  1. RRT* Smart
    优点:通过智能采样策略提高搜索效率;能够找到最优路径。

缺点:运算速度较慢;路径质量可能较差。

  1. Anytime RRT*
    优点:可以在任何时候停止搜索并返回当前的最佳路径;能够找到近似最优解。

缺点:路径质量可能较差;需要进行实时计算。

  1. Closed-Loop RRT*
    优点:能够处理非完整动力学系统和约束条件;路径质量较高。
    在这里插入图片描述

缺点:运算速度较慢;可能需要大量的存储空间。

# --------Visualization specialized for dynamic RRTdef visualization(self):if self.ind % 100 == 0 or self.done:V = np.array(self.V)Path = np.array(self.Path)start = self.env.startgoal = self.env.goal# edges = []# for i in self.Parent:#     edges.append([i, self.Parent[i]])edges = np.array([list(i) for i in self.Edge])ax = plt.subplot(111, projection='3d')# ax.view_init(elev=0.+ 0.03*initparams.ind/(2*np.pi), azim=90 + 0.03*initparams.ind/(2*np.pi))# ax.view_init(elev=0., azim=90.)ax.view_init(elev=90., azim=0.)ax.clear()# drawing objectsdraw_Spheres(ax, self.env.balls)draw_block_list(ax, self.env.blocks)if self.env.OBB is not None:draw_obb(ax, self.env.OBB)draw_block_list(ax, np.array([self.env.boundary]), alpha=0)draw_line(ax, edges, visibility=0.75, color='g')draw_line(ax, Path, color='r')# if len(V) > 0:#     ax.scatter3D(V[:, 0], V[:, 1], V[:, 2], s=2, color='g', )ax.plot(start[0:1], start[1:2], start[2:], 'go', markersize=7, markeredgecolor='k')ax.plot(goal[0:1], goal[1:2], goal[2:], 'ro', markersize=7, markeredgecolor='k')# adjust the aspect ratioset_axes_equal(ax)make_transparent(ax)# plt.xlabel('s')# plt.ylabel('y')ax.set_axis_off()plt.pause(0.0001)if __name__ == '__main__':rrt = dynamic_rrt_3D()rrt.Main()
  1. Spline-RRT*
    优点:通过样条插值提高路径质量;能够找到平滑的路径。

缺点:运算速度较慢;可能需要大量的存储空间。

  1. Fast Marching Trees (FMT*)
    优点:运算速度快;能够找到最短路径。
    在这里插入图片描述

缺点:路径质量可能较差;在高维空间中效果可能不理想。

  1. Batch Informed Trees (BIT*)
    优点:通过批量采样提高搜索效率;能够找到最优路径。

缺点:运算速度较慢;可能需要大量的存储空间。

2. 常见的路径规划算法

2.1 Dijkstra算法

Dijkstra算法是一种用于图中寻找最短路径的算法,它可以应用于有向图或无向图。该算法通过不断更新起点到各个顶点的最短路径来找到最终的最短路径。Dijkstra算法的时间复杂度为O(V^2),其中V为顶点数,但可以通过优先队列实现最小堆来优化时间复杂度。
在这里插入图片描述

2.2 A*算法

A算法是一种启发式搜索算法,它结合了Dijkstra算法和贪婪最佳优先搜索算法的优点。A算法通过估计从当前节点到目标节点的代价来动态调整搜索方向,从而更快地找到最佳路径。A*算法在很多实际应用中表现出色,并且具有较高的效率和准确性。
在这里插入图片描述

2.3 RRT算法

RRT(Rapidly-exploring Random Tree)算法是一种适用于高维空间的路径规划算法,它通过随机采样和不断扩展树形结构来搜索路径。RRT算法适用于具有复杂空间结构的环境,并且在机器人导航和运动规划中有着广泛的应用。

3. 路径规划在无人驾驶中的应用

无人驾驶技术作为当今人工智能领域的热点之一,路径规划在其中扮演着至关重要的角色。无人驾驶车辆需要通过传感器获取周围环境信息,并利用路径规划算法来决定车辆的行驶路线,以确保安全和高效地到达目的地。由于道路交通环境的复杂性,路径规划算法需要考虑到实时交通状况、障碍物避让、交通规则等因素,因此对路径规划算法的要求也更加严格。

4. 路径规划在物流配送中的应用

随着电商行业的快速发展,物流配送成为了一个备受关注的领域。路径规划在物流配送中的应用不仅可以提高配送效率,还可以降低成本。通过合理的路径规划,配送车辆可以在最短的时间内覆盖更多的配送点,从而提高送货效率。同时,路径规划算法还需要考虑到配送点的时效性、交通拥堵情况等因素,以提供最优的配送方案。
在这里插入图片描述

5. 路径规划的挑战与未来发展

随着人工智能和计算机技术的不断发展,路径规划领域也面临着一些挑战。例如,在复杂的城市环境中,路径规划需要考虑到人行道、交通信号灯、行人车辆等多种因素,这对算法的精度和实时性提出了更高的要求。未来,路径规划技术可能会结合更多的传感器数据和深度学习技术,以提高路径规划的效率和准确性。

结语

路径规划作为人工智能领域中的重要应用之一,对于实现智能化的交通系统和物流配送具有重要意义。随着技术的不断进步,路径规划算法将会在更多的领域发挥作用,为人们的生活带来便利和安全。

这篇关于路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/537003

相关文章

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

史上最全nginx详细参数配置

《史上最全nginx详细参数配置》Nginx是一个轻量级高性能的HTTP和反向代理服务器,同时也是一个通用代理服务器(TCP/UDP/IMAP/POP3/SMTP),最初由俄罗斯人IgorSyso... 目录基本命令默认配置搭建站点根据文件类型设置过期时间禁止文件缓存防盗链静态文件压缩指定定错误页面跨域问题

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Python 交互式可视化的利器Bokeh的使用

《Python交互式可视化的利器Bokeh的使用》Bokeh是一个专注于Web端交互式数据可视化的Python库,本文主要介绍了Python交互式可视化的利器Bokeh的使用,具有一定的参考价值,感... 目录1. Bokeh 简介1.1 为什么选择 Bokeh1.2 安装与环境配置2. Bokeh 基础2

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模