(9-1-01)自动驾驶中基于概率采样的路径规划:RRT算法介绍+RRT算法的定义与实现(1)

  1. 提升在复杂环境中使用RRT算法族解决路径规划问题的实践能力。

9.1 RRT算法介绍

快速扩展随机树(Rapidly-exploring Random Trees,RRT)是一种用于路径规划的算法,特别适用于机器人、自动驾驶车辆和其他自主系统的运动规划问题。该算法通过在自由空间中随机采样并迭代地构建一棵树来寻找从起点到目标点的可行路径。

RRT是近十几年得到广泛发展与应用的基于采样的运动规划算法,它由美国爱荷华州立大学的 Steven M. LaValle 教授在1998 年提出。RRT 算法是一种在多维空间中有效率的规划方法。原始的 RRT 算法是通过一个初始点作为根节点,通过随机采样,增加叶子节点的方式,生成一个随机扩展树,当随机树中的叶子节点包含了目标点或进入了目标区域,便可以在随机树中找到一条由树节点组成的从初始点到目标点的路径。

RRT 算法的主要优点之一是它的随机性和快速性。通过随机采样并迭代地扩展树,RRT 能够有效地探索大型自由空间,并在有限时间内找到可行路径。此外,RRT 算法对于高维空间中的运动规划问题也很有效,因为它不需要显式地构建整个空间的表示,而是在需要时根据采样点来动态扩展搜索树。

注意:RRT算法也有一些局限性,例如在某些情况下可能会找到次优路径,以及对于高度动态的环境或需要考虑更多因素的问题可能不够灵活。因此,有时候需要结合其他算法或改进来解决特定的路径规划问题。

9.2 RRT算法的定义与实现

RRT算法通过随机采样和树结构迭代地探索搜索空间,直到找到连接起点和目标点的路径。算法不断生成新节点,并将其连接到最近邻节点,直到达到最大迭代次数或找到路径。最终,从树中提取路径作为解。

9.2.1 RRT算法的实现步骤

实现RRT算法的基本步骤如下所示。

(1)初始化:将起点添加到搜索树中作为唯一节点。

(2)循环:在搜索树中不断迭代,直到找到目标点或达到最大迭代次数。

  1. 采样:在自由空间中随机采样一个点作为新的探索点。
  2. 最近邻搜索:在搜索树中找到与新采样点最近的节点。
  3. 扩展:从最近邻节点向采样点之间的直线路径上进行一步扩展,并检查是否碰撞了障碍物。
  4. 连接:如果扩展路径是无碰撞的,则将新的节点添加到搜索树中,并将连接它的边添加到树中。
  5. 目标检测:检查新添加的节点是否足够接近目标点,如果是,则算法终止。

(3)路径提取:当算法终止时,从搜索树中提取从起点到目标点的路径。

9.2.2 原始的RRT算法

在介绍 RRT 算法之前,先说明一下路径的表示方法。我们用一个有向图来表示路径G=(V,E)

,那么一条可行的路径就是一个顶点的序列(v1,v2,v3,…,vn)

v1=qinit

vn=qgoal

。同时,为了使该序列构成一条有效路径,要求每一对相邻顶点(𝑣𝑖 , 𝑣𝑖+1) 都是图中的一条有向边,即满足(vi,vi+1)E

,其中1in-1

表示边。这样,路径规划问题就转化为:如何利用采样得到的节点不断扩展图 G,以找到一条从初始节点通往目标节点的路径。

“原始的 RRT 算法”指的是最初提出的、最基本版本的 RRT(Rapidly-exploring Random Tree)算法。这个版本是由 Steven M. LaValle 在他的论文 "Rapidly-exploring Random Trees: A New Tool for Path Planning" 中提出的。原始的 RRT 算法是用于路径规划的一种基本方法,其核心思想是通过随机采样和树结构迭代地探索搜索空间,直到找到连接起点和目标点的路径。在算法的每次迭代中,随机生成一个点并通过扩展树来探索新的空间区域,以此逐步构建一棵树。通过这种方式,RRT 算法能够在自由空间中快速生成路径,并且在有限时间内收敛到一条可行路径。

例如下面的例子实现了基本的RRT算法,在这个例子中,主要的RRT算法实现在 main 函数的for 循环中。在每次迭代中,都会随机采样一个点 q_rand,然后找到树中最接近该点的节点 q_nearest,并使用 extend 函数将该随机点扩展到树中。最后,将扩展后的节点加入树中。

实例9-1:使用原始的RRT算法寻找路径(codes/9/yuan.py

实例文件yuan.py的具体实现代码如下所示。

import math import random import matplotlib.pyplot as plt # 定义节点类 class Node: def __init__(self, x, y): self.x = x self.y = y # 计算两个节点之间的距离 def distance(n1, n2): return math.sqrt((n1.x - n2.x)**2 + (n1.y - n2.y)**2) # 扩展函数 def extend(nearest, rand, max_distance): d = distance(nearest, rand) if d <= max_distance: return rand else: theta = math.atan2(rand.y - nearest.y, rand.x - nearest.x) x = nearest.x + max_distance * math.cos(theta) y = nearest.y + max_distance * math.sin(theta) return Node(x, y) # 主函数 def main(): q_init = Node(0, 0) # 起始点 q_goal = Node(10, 10) # 目标点 V = [q_init] # 存储节点的集合 iterations = 100 # 迭代次数 max_distance = 1.0 # 最大扩展距离 for i in range(iterations): # 采样随机点 q_rand = Node(random.uniform(0, 100), random.uniform(0, 100)) # 找到距离随机点最近的节点 q_nearest = V[0] for node in V: if distance(node, q_rand) < distance(q_nearest, q_rand): q_nearest = node # 扩展树 q_new = extend(q_nearest, q_rand, max_distance) V.append(q_new) # 输出节点集合 print("Nodes:") for node in V: print("(", node.x, ",", node.y, ")", end=" ") print() # 绘制节点和路径 plt.figure(figsize=(8, 8)) plt.plot([node.x for node in V], [node.y for node in V], 'bo', markersize=3) # 绘制节点 plt.plot([q_init.x, q_goal.x], [q_init.y, q_goal.y], 'r-') # 绘制起点和终点之间的路径 plt.plot(q_init.x, q_init.y, 'go', label='Start') # 绘制起点 plt.plot(q_goal.x, q_goal.y, 'ro', label='Goal') # 绘制终点 plt.xlabel('X') plt.ylabel('Y') plt.title('RRT Algorithm Visualization') plt.legend() plt.grid(True) plt.show() if __name__ == "__main__": main()

上述代码实现了基本的RRT(Rapidly-exploring Random Tree)算法,具体实现流程如下所示。

(1)首先,定义类Node,用于表示二维空间中的节点,每个节点有 x 和 y 坐标。

(2)然后,定义了一个计算两个节点之间距离的函数 distance,以及一个扩展节点的函数 extend。distance 函数使用欧几里得距离公式计算两个节点之间的距离,extend 函数用于在当前最近节点和随机生成的节点之间进行扩展,保证扩展距离不超过最大距离。

(3)接着,在主函数main中定义了起始节点 q_init 和目标节点 q_goal,并创建了一个存储节点的集合 V,将起始节点加入集合。

(4)在迭代过程中,程序将执行如下所示的操作:

  1. 采样随机点:生成一个随机的二维坐标点作为新的随机点 q_rand。
  2. 找到距离随机点最近的节点:遍历节点集合 V,找到与随机点 q_rand 最近的节点 q_nearest。
  3. 扩展树:使用 extend 函数将最近节点 q_nearest 和随机点 q_rand 之间的距离进行扩展,生成一个新的节点 q_new,并将其加入节点集合 V 中。
  4. 以上过程会持续进行指定的迭代次数。

(5)最后,将生成的节点和起点到终点之间的路径进行可视化展示,如图9-1所示。使用 matplotlib 库绘制了生成的节点和路径,节点用蓝色圆圈表示,起点用绿色圆圈表示,终点用红色圆圈表示,路径用红色线段表示。展示了算法在迭代过程中生成的节点分布情况以及起点到终点的路径。

图9-1 节点和路径的可视化

9.2.3 基于概率P的RRT算法

基于概率 P 的 RRT(Probabilistic Roadmap Planning)是一种路径规划算法,是 RRT 算法的一种变体。与传统的 RRT 算法不同,基于概率 P 的 RRT 引入了概率因素来指导树的生长,以提高路径搜索的效率。

在传统的 RRT 算法中,随机采样点的选择是均匀随机的,而在基于概率 P 的 RRT 中,采样点的选择是依据一定的概率分布进行的。这个概率分布通常会考虑到环境的特性,比如障碍物的分布情况、起点和终点的位置等。通过合理选择概率分布,可以使得采样点更有可能出现在搜索空间中有意义的区域,从而加速路径搜索的过程。

基于概率 P 的 RRT 算法仍然遵循 RRT 的基本思想,即通过不断生长树来探索搜索空间,并最终找到起点到目标点的可行路径。但是,通过引入概率因素,该算法能够更加智能地选择扩展方向,从而更快地收敛到解。这种方法通常可以提高算法的效率,并且在某些情况下能够更好地应对复杂的环境和任务需求。

例如下面是一个基于概率P的RRT算法的完整例子,包括了节点结构的定义、距离计算函数、扩展函数以及主函数实现。

实例9-2:使用基于概率P的RRT算法(codes/9/prrt.py

实例文件prrt.py的具体实现代码如下所示。

import random import math import matplotlib.pyplot as plt # 定义节点结构 class Node: def __init__(self, x, y): self.x = x self.y = y # 计算两个节点之间的距离 def distance(n1, n2): return math.sqrt((n1.x - n2.x) ** 2 + (n1.y - n2.y) ** 2) # 根据概率P选择目标点 def chose_target(qrand, qgoal, P): if random.random() < P: return qgoal else: return qrand # 找到距离目标点最近的节点 def nearest(V, q): nearest_node = V[0] min_dist = distance(nearest_node, q) for node in V: dist = distance(node, q) if dist < min_dist: nearest_node = node min_dist = dist return nearest_node # 在节点qnearest和目标点q之间进行局部扩展,得到新节点 def steer(qnearest, q): theta = math.atan2(q.y - qnearest.y, q.x - qnearest.x) x = qnearest.x + math.cos(theta) y = qnearest.y + math.sin(theta) return Node(x, y) # 判断从节点qnearest到节点qnew的路径是否避开障碍物 def obstacle_free(qnearest, qnew): # 在这里假设路径是始终可行的 return True # Extend函数,实现基于概率P的RRT算法的扩展操作 def extend(V, qrand, qgoal, P): q = chose_target(qrand, qgoal, P) qnearest = nearest(V, q) qnew = steer(qnearest, q) if obstacle_free(qnearest, qnew): V.append(qnew) return V # 可视化函数,绘制节点集合和边集合 def visualize(V, E, q_init, q_goal): fig, ax = plt.subplots() for node in V: ax.plot(node.x, node.y, 'bo') for edge in E: ax.plot([edge[0].x, edge[1].x], [edge[0].y, edge[1].y], 'k-') ax.plot(q_init.x, q_init.y, 'go') # 起始点 ax.plot(q_goal.x, q_goal.y, 'ro') # 目标点 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_title('Probabilistic RRT Visualization') plt.show() # 主函数 def main(): random.seed() # 初始化随机种子 q_init = Node(0, 0) # 起始点 q_goal = Node(10, 10) # 目标点 V = [q_init] # 存储节点的集合 E = [] # 存储边的集合 iterations = 50 # 迭代次数 P = 0.9 # 概率P for _ in range(iterations): # 采样随机点 q_rand = Node(random.randint(0, 100), random.randint(0, 100)) # 扩展树 q_nearest = nearest(V, q_rand) q_new = steer(q_nearest, q_rand) if obstacle_free(q_nearest, q_new): V.append(q_new) E.append((q_nearest, q_new)) # 输出节点集合和边集合 print("Nodes:", end=" ") for node in V: print(f"({node.x}, {node.y})", end=" ") print() # 可视化 visualize(V, E, q_init, q_goal) if __name__ == "__main__": main()

上述代码的实现流程如下所示:

(1)首先,定义了节点结构 Node,包含节点的 x 和 y 坐标,并实现了一些基本的几何计算函数,如计算两个节点之间的距离、选择目标点、找到距离目标点最近的节点等。

(2)然后,在主函数main中初始化了起始点和目标点,并创建了节点集合 V 和边集合 E。通过随机选择节点进行迭代,每次迭代根据概率 P 选择目标点,在当前树中找到距离目标点最近的节点,然后在这个最近节点和目标点之间进行局部扩展,生成新的节点。如果新节点的路径不与障碍物相交,就将新节点添加到节点集合中,并将扩展过程中的边添加到边集合中。

(3)接着,利用 matplotlib 库实现了可视化功能,将节点集合和边集合绘制在二维坐标系中,并标记了起始点和目标点。这样可以直观地观察到基于概率 P 的 RRT 算法在搜索空间中的探索过程和生成的路径。

(1)最后,打印输出了生成的节点集合,并绘制了路径信息的可视化图,如图9-2所示。这样,可以通过输出结果和可视化图形了解算法的执行情况和生成的路径信息。

图9-2 路径信息的可视化图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 文本处理工具

先创建一个测试文件data.txt# 创建并写入内容&#xff0c;执行后直接生成data.txt cat > data.txt << EOF 2026-01-01,张三,技术部,9000 2026-01-02,李四,市场部,8500 2026-01-03,王五,技术部,10000 2026-01-04,赵六,销售部,7500 2026-01-05,钱七,技术部,9500 # 这是员…

别只盯酷炫形态,CES 2026逛展,我更关注AI硬件的落地底气

刚从CES 2026展会上归来&#xff0c;仍觉余韵未消、震撼不已&#xff01;今年拉斯维加斯这场展会&#xff0c;堪称AI硬件领域的巅峰对决。服务机器人能精准听令调酒&#xff0c;智能座舱靠眼动追踪交互&#xff0c;AR眼镜轻巧却功能强大……各类展品共同描绘出智能无缝的未来生…

小白考CPA难吗?难度、通过率科目指南

对于零基础小白来说&#xff0c;CPA&#xff08;注册会计师&#xff09;考试常被贴上“难度大”“通过率低”的标签&#xff0c;但真正的关键在于是否找对了备考路径。考伯乐依托多年财经教育沉淀&#xff0c;专为小白打造从入门到持证的高效方案&#xff0c;今天就从难度、通过…

嘈杂环境秒哑火?声网让AR眼镜走出实验室

刚从CES 2026的AR眼镜展区逛完出来&#xff0c;心情五味杂陈。这赛道竞争愈发激烈&#xff0c;重量减10克、分辨率升500PPI&#xff0c;甚至有品牌塞进eSIM模块。可我作为用了近两年AR眼镜的老用户&#xff0c;站在展台前却格外平静。参数进步固然好&#xff0c;但对我这种要日…

GEO优化赛道的“隐形风险”:最新报告揭示服务商选择中的“安全红线”

在GEO&#xff08;生成式引擎优化&#xff09;带来的巨大增长诱惑面前&#xff0c;企业决策者往往容易忽略一个致命问题&#xff1a;选择错误的服务商&#xff0c;可能会给品牌带来难以预估的合规、技术与经营风险。根据《2026年-中国GEO服务商综合能力评估报告》&#xff0c;首…

甩掉软件内耗,靠国产CAD把效率拉满

干了十年设计&#xff0c;我认为选对工具比埋头画图更能提效率。我现在手头的整机项目&#xff0c;从概念雏形到工程详图&#xff0c;全程都靠CAXA 3D一个软件&#xff0c;效率非常高。CAXA 3D双模式设计刚好适配了整机设计的不同阶段。前期团队头脑风暴的时候可以使用创新模式…

釉匠水性釉面涂料防水性能深度解析:科技釉面打造长效屏障

在现代家居装修和建筑工程中&#xff0c;墙面涂料的防水防潮性能直接关系到居住质量与建筑寿命。针对消费者关注的“釉匠水性釉面涂料防水性能好吗”这一核心疑问&#xff0c;本文将结合武汉釉匠环保科技有限公司的官方技术资料及行业标准&#xff0c;从技术原理、功能特性、资…

CAXA 3D规范BOM源头数据,告别信息缺失扯皮

干采购这行&#xff0c;最头疼的不是找供应商比价&#xff0c;是跟设计部的BOM表死磕。尤其是那些信息不全的BOM&#xff0c;随便一个空白格&#xff0c;都能让我后续工作卡壳半天。以前就吃过这亏&#xff0c;有次拿到的BOM表里&#xff0c;“表面处理”那一栏是空的。我拿着表…

能控制手机屏幕的开源agent多模态工具

之前探索了能控制电脑桌面的开源agent工具。 https://blog.csdn.net/liliang199/article/details/156018145 这里进一步探索能控制手机屏幕的开源agent多模态工具。 1 模拟工具 以下是几款可以实现移动端模拟操作的开源工具。 其中&#xff0c;Open-AutoGLM和Airtest功能较为…

JVM 内存分区

目录一、JVM内存分区1.程序计数器2.栈3.堆4.方法区&#xff08;元空间&#xff09;5.字符串常量池二、对象创建过程1.类加载检查2.分配内存3.初始化0值4.设置对象头5.执行init()方法&#xff08;构造方法&#xff09;一、JVM内存分区 Java虚拟机&#xff08;Java Virtual Mach…

书匠策AI:颠覆你的课程论文写作体验,从“小白”到“大神”只需一步

每当期末季来临&#xff0c;无数大学生面对课程论文题目感到茫然无措。书匠策AI科研工具中的课程论文功能&#xff0c;正成为学术界悄然兴起的一股智能革命。一、课程论文的困境与数字化转变深夜&#xff0c;电脑屏幕的冷光照亮了一张疲惫的脸。王明是某大学社会学专业的大二学…

统一电能质量变换器(UPQC)Matlab/Simulink仿真:IP-IQ检测与电压电流补偿...

统一电能质量变换器&#xff08;UPQC&#xff09;Matlab/simulink仿真&#xff0c;ip-iq检测&#xff0c;电压电流补偿&#xff0c;软件版本matlab2016最近在实验室折腾统一电能质量变换器&#xff08;UPQC&#xff09;的仿真&#xff0c;发现Matlab2016的Simulink真是个好东西…

植物大战僵尸修改器下载安装教程(2026最新版|全流程图文详解)

一、前言&#xff1a;修改器能解决哪些核心问题 《植物大战僵尸》作为一款经典塔防游戏&#xff0c;即使多年后依然拥有大量忠实玩家。但在反复体验过程中&#xff0c;部分用户会遇到以下实际痛点&#xff1a; 后期关卡难度较高&#xff0c;测试阵型成本过大 阳光、冷却时间等…

洞察食材,管理健康:智能冰箱引领个性化饮食新时代

在全民健康意识觉醒与智能家居技术迭代的双重驱动下&#xff0c;智能冰箱已彻底摆脱单纯食品储存设备的定位&#xff0c;逐步演进为家庭健康管理的核心节点。目前智能冰箱的竞争焦点已从基础的保鲜、远程控制功能&#xff0c;转向以技术赋能深层健康价值的方向&#xff0c;通过…

南芯烧录软件使用

界面如下&#xff1a;连接前先检查硬件&#xff1a;保证D D- 对应 SDA SCL引脚 GND对GND HV对应Vcc&#xff0c;需要注意,有时候会出现cc1口可以但是cc2口不行的情况接着在connect ic选择指定ic&#xff0c;这里需要注意有时候选择的芯片会和实际使用的芯片不同&#xff0c;比…

救命神器8个AI论文平台,本科生毕业论文救星!

救命神器8个AI论文平台&#xff0c;本科生毕业论文救星&#xff01; 论文写作的“隐形助手”&#xff1a;AI 工具如何改变你的毕业之路 在当今信息爆炸的时代&#xff0c;高校学生尤其是本科生&#xff0c;面对毕业论文的压力日益增大。从选题、开题到撰写、查重&#xff0c;每…

精密的舞步:探秘十字滑台的工业灵魂

精密的舞步&#xff1a;探秘十字滑台的工业灵魂在自动化制造的舞台上&#xff0c;十字滑台如同一位精准的舞者&#xff0c;以微米级的精度演绎着机械芭蕾。作为工业设备的核心运动部件&#xff0c;其精妙的设计背后蕴藏着力学与控制理论的深度交融。一、结构精粹&#xff1a;刚…

西门子PLC博图与优傲UR机器人的Profinet通讯实战

西门子plc博图与优傲UR机器人进行Profinet通讯&#xff0c;s7-1200/1500 与UR机器人通讯&#xff0c;实际应用案例使用中&#xff0c;可提供GSD配置文件&#xff0c;设置说明书&#xff0c;和博图plc程序&#xff0c;目前版本为v15或以上&#xff0c;程序只提供配置好的内容配置…

新手友好的锁相环学习电路:从理论到实践

锁相环学习电路&#xff0c;有教程 对新手非常友好&#xff0c;一看就懂 [1]&#xff0c;输出频率800MHz或者1GHz&#xff0c; 采用Ring_VCO的结构 [2]&#xff0c;输入参考频率20MHz [3]&#xff0c;分频器是40-50分频 4&#xff0c;电荷泵电流20uA 5&#xff0c;工艺是smic 5…

【干货收藏】智能体执行一半就终止?大模型上下文窗口超长问题深度解析

文章讨论了大模型应用中智能体因上下文管理不当导致的异常终止问题。作者发现智能体在第二次思考时因上下文窗口超长而正常终止&#xff0c;根本原因是历史记录未做好管理。在Langchain技术体系中&#xff0c;作者提出创建TrimmedInMemorySaver类解决方案&#xff0c;自动过滤思…