路径规划最全综述+代码+可视化绘图(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 = None


class 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_len
        self.goal_sample_rate = goal_sample_rate
        self.search_radius = search_radius
        self.iter_max = iter_max

        self.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.delta
        self.x_range = self.env.x_range
        self.y_range = self.env.y_range
        self.obs_circle = self.env.obs_circle
        self.obs_rectangle = self.env.obs_rectangle
        self.obs_boundary = self.env.obs_boundary

        self.V = [self.x_start]
        self.beacons = []
        self.beacons_radius = 2
        self.direct_cost_old = np.inf
        self.obs_vertex = self.utils.get_obs_vertex()
        self.path = None

    def planning(self):
        n = 0
        b = 2
        InitPathFlag = False
        self.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 parent
                    cost_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))]

                    # rewire
                    c_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_new

                if not InitPathFlag and self.InitialPathFound(x_new):
                    InitPathFlag = True
                    n = k

                if 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.0
        node_end = self.x_goal

        while node.parent:
            node_parent = node.parent
            if not self.utils.is_collision(node_parent, node_end):
                node_end.parent = node_parent
            else:
                direct_cost_new += self.Line(node, node_end)
                node_end = node

            node = node_parent

        if direct_cost_new < self.direct_cost_old:
            self.direct_cost_old = direct_cost_new
            self.UpdateBeacons()

    def UpdateBeacons(self):
        node = self.x_goal
        beacons = []

        while node.parent:
            near_vertex = [v for v in self.obs_vertex
                           if (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.parent

        self.beacons = beacons

    def ReformObsVertex(self):
        obs_vertex = []

        for obs in self.obs_vertex:
            for vertex in obs:
                obs_vertex.append(vertex)

        self.obs_vertex = obs_vertex

    def 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_start

        return node_new

    def Near(self, nodelist, node):
        n = len(self.V) + 1
        r = 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 and
                  not self.utils.is_collision(node, nodelist[ind])]

        return X_near

    def Sample(self, goal=None):
        if goal is None:
            delta = self.utils.delta
            goal_sample_rate = self.goal_sample_rate

            if 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_goal
        else:
            R = self.beacons_radius
            r = 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.delta

        if 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 RRT
    def visualization(self):
        if self.ind % 100 == 0 or self.done:
            V = np.array(self.V)
            Path = np.array(self.Path)
            start = self.env.start
            goal = 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 objects
            draw_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 ratio
            set_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. 路径规划的挑战与未来发展

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

结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/269793.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【hacker送书第11期】Python数据分析从入门到精通

探索数据世界&#xff0c;揭示未来趋势 《Python数据分析从入门到精通》是你掌握Python数据分析的理想选择。本书深入讲解核心工具如pandas、matplotlib和numpy&#xff0c;助您轻松处理和理解复杂数据。 通过matplotlib、seaborn和创新的pyecharts&#xff0c;本书呈现生动直…

web前端游戏项目-辨色大比拼【附源码】

web前端游戏项目-辨色大比拼【附源码】 《辨色大比拼》是一个旨在测试和提升玩家颜色识别能力的在线游戏。在游戏中&#xff0c;玩家将通过辨识颜色来解谜并推进游戏进程。辨色大比拼也是一个寓教于乐的游戏&#xff0c;它不仅提供了一个有趣的辨色挑战&#xff0c;还能帮助玩…

[C/C++]数据结构: 链式二叉树的构建及遍历

一: &#x1f4ac;二叉树的概念 1.1:&#x1f6a9; 概念 二叉树是指树中节点的度不大于2的有序树,它是一种最简单且重要的树,二叉树的递归定义为:二叉树是一颗空树,或者是一颗由一个根节点和两颗互不相交的,分别称为跟的左孩子和右孩子树组成的非空树,其中左子树和右子树都是二…

Linux部署MeterSphere结合内网穿透实现远程访问服务管理界面

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

【网络编程】基于UDP数据报实现回显服务器程序

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 前言 我们如果…

Python基础入门第六节课笔记

while循环 for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行&#xff0c;直到指定的条件不满足为止。 while 条件&#xff1a; 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. 当条件成立时&#xff0c;执行下方缩…

【JavaEE初阶一】线程的概念与简单创建

1. 认识线程&#xff08;Thread&#xff09; 1.1 关于线程 1.1.1 线程是什么 由前一节的内容可知&#xff0c;进程在进行频繁的创建和销毁的时候&#xff0c;开销比较大&#xff08;主要体现在资源的申请和释放上&#xff09;&#xff0c;线程就是为了解决上述产生的问题而提…

软件测试 —— 如何测试图片上传功能?

作为一名专业的软件测试人员&#xff0c;测试图片上传功能是一个重要的任务&#xff0c;以下是一些测试该功能的常用方法&#xff1a; 1. 上传功能测试&#xff1a;确保图片上传功能正常工作&#xff0c;包括选择图片文件、点击上传按钮、上传进度显示、上传成功/失败的提示等。…

postman的下载安装和使用

第一章、使用postman向后端发送请求 1.2&#xff09;postman下载与安装使用 我的百度网盘postman点击下载 提取码&#xff1a;bybp 下载后双击.exe文件直接安装 点击此次创建集合 点击此处创建请求 1.2&#xff09;发送get请求 选择自己的请求方式&#xff0c;输入请求…

1861_什么是H桥

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! 1861_什么是H桥 H桥电路可以…

Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库

问题&#xff1a;下图中是一个生成库的模块&#xff0c;其中qglobal.h的使用有点疑惑&#xff0c;可以参考下文链接。 ​​​​​​​​​​​​https://www.cnblogs.com/techiel/p/8035014.htmlhttps://www.cnblogs.com/techiel/p/8035014.html

Redis过期删除策略和内存淘汰策略

1、设置Redis键过期时间 Redis提供了四个命令来设置过期时间&#xff08;生存时间&#xff09;。 EXPIRE <key> <ttl> &#xff1a;表示将键 key 的生存时间设置为 ttl 秒。 PEXPIRE <key> <ttl> &#xff1a;表示将键 key 的生存时间设置为 ttl 毫秒。…

算法基础之最长上升子序列 II

最长上升子序列 II 核心思想&#xff1a;不去遍历全部的数据(会有冗余) 用vector模拟栈 ①如果该元素大于栈顶元素,将该元素入栈 ②替换掉第一个大于或者等于这个数字的那个数&#xff08;二分&#xff09; #include<iostream>#include<algorithm>#include&l…

Kafka日志文件存储

日志文件 kafka在server.properties配置文件中通过log.dir属性指定了Kafka的日志存储路径 核心文件 1. log文件 实际存储消息的日志文件, 大小固定1G(参数log.segment.bytes可配置), 写满后就会新增一个新的文件, 文件名是第一条消息的偏移量 2. index文件 以偏移量为索引…

4.9【共享源】流的多生产者和消费者

当一个系统中存在多个生产者和消费者时&#xff0c;情况可能会变得复杂。 了解生产者和消费者流之间支持的基数非常重要。 本质上&#xff0c;一个生产者流可以与多个消费者流连接&#xff0c;但一个消费者流只能连接到一个生产者流。请注意&#xff0c;基数关系仅限于单个流&…

3D渲染农场什么比较好用 2024渲染农场最新收费实测

随着数字设计领域的进步与发展&#xff0c;对于3D渲染服务的需求日益增加。3D渲染农场这一概念因此变得极为重要&#xff0c;特别是在电影制作、建筑可视化以及产品设计等行业中。现在&#xff0c;让我们深入了解3D渲染农场的定义以及市面上优秀的3D渲染服务提供商。 一、什么是…

Ai画板原理

在创建时画板可以选择数量和排列方式 也可以采用这个图片左上的画板工具&#xff0c;选择画板在其他地方画框即可生成&#xff0c;同时可以在属性框中可以修改尺寸大小 选择全部重新排列可以进行创建时的布局

STM32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件

资料下载: https://download.csdn.net/download/vvoennvv/88658447 一、概述 关于IAP的原理和Ymodem协议&#xff0c;本文不做任何论述&#xff0c;本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级&#xff0c;以及bootloader和主程序两个工程的配置…

yolo实现数据增强(数据集不够,快速增加数据集)

目录结构 附上数据增强的全部代码 # -*- codingutf-8 -*-import time import random import copy import cv2 import os import math import numpy as np from skimage.util import random_noise from lxml import etree, objectify import xml.etree.ElementTree as ET imp…

makefile教程(1)

makefile教程 makefile是什么&#xff1a; makefile是用户自行完成的IDE&#xff08;integrated development environment集成开发环境&#xff09;程序&#xff0c;与传统的操作系统下的编译不同&#xff0c;makefile可以通过用户自行安排&#xff0c;决定文件的编译顺序&am…