【启发式算法】RRT算法详细介绍(Python)

【启发式算法】RRT算法详细介绍(Python)
        📢本篇文章是博主人工智能(AI)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉启发式算法专栏:

       【启发式算法】(8)---《RRT算法详细介绍(Python)》

【启发式算法】RRT算法详细介绍(Python)

目录

 一、RRT算法的核心思想

 二、基本流程

 三、RRT算法伪代码

[Python] RRT算法实现

[Results] 运行结果

[Notice]  注意事项

四、RRT的特点

五、改进版本:RRT*

六、应用场景


        RRTRapidly-exploring Random Tree快速扩展随机树是一种采样式路径规划算法,广泛应用于机器人运动规划、自动驾驶、无人机路径设计等领域。它特别适用于高维空间中的路径规划问题。下面是对RRT算法的详细介绍:


 一、RRT算法的核心思想

        RRT的核心思想是通过在空间中随机采样点并逐步构建一棵树形结构(搜索树),来快速探索空间并找到从起点到终点的可行路径

        RRT偏向于快速探索未被探索的空间区域,从而快速覆盖整个搜索空间。


二、基本流程

输入:

  • 起点 q_start
  • 终点 q_goal
  • 空间约束(如障碍物、边界等)
  • 步长 Δq

最大迭代次数 

N

步骤:

  1. 初始化一棵树 T,树的根节点为起点 q_start
  2. 对于每次迭代:
    • 随机采样一个点 q_rand(可以是完全随机,也可以有一定概率采样为 q_goal,称为“目标偏向”)。
    • 在树中找到距离 q_rand 最近的节点 q_nearest
    • 从 q_nearest 向 q_rand 移动一个固定步长 Δq,得到新的节点 q_new
    • 如果 q_new 不在障碍物中,则将其加入树中,并将其父节点设为 q_nearest
    • 如果 q_new 距离 q_goal 很近,可以认为找到了可行路径。
  3. 如果找到路径,沿父节点回溯得到路径;否则直到达到最大迭代次数。

 三、RRT算法伪代码

def RRT(q_start, q_goal, N, Δq): T = Tree(q_start) for i in range(N): q_rand = random_sample() q_nearest = nearest_node(T, q_rand) q_new = steer(q_nearest, q_rand, Δq) if is_valid(q_nearest, q_new): T.add_node(q_new, parent=q_nearest) if distance(q_new, q_goal) < threshold: return extract_path(T, q_new) return failure 

[Python] RRT算法实现

下面提供了一个简化版的 Python 实现示例,并配合图示说明RRT的执行过程。

 项目代码我已经放入GitCode里面,可以通过下面链接跳转:🔥

【启发式算法】--- RRT算法

若是下面代码复现困难或者有问题,也欢迎评论区留言
"""《RRT算法》 时间:2025.06.16 作者:不去幼儿园 """ import numpy as np import matplotlib.pyplot as plt import random class Node: def __init__(self, x, y): self.x = x self.y = y self.parent = None def distance(n1, n2): return np.hypot(n1.x - n2.x, n1.y - n2.y) def get_random_node(goal_sample_rate, goal): if random.random() < goal_sample_rate: return Node(goal.x, goal.y) return Node(random.uniform(0, 100), random.uniform(0, 100)) def steer(from_node, to_node, extend_length=5.0): dist = distance(from_node, to_node) theta = np.arctan2(to_node.y - from_node.y, to_node.x - from_node.x) new_x = from_node.x + extend_length * np.cos(theta) new_y = from_node.y + extend_length * np.sin(theta) new_node = Node(new_x, new_y) new_node.parent = from_node return new_node def is_collision(node): # 简化处理:假设无障碍物 return False def rrt(start, goal, max_iter=500, goal_sample_rate=0.05): nodes = [start] for _ in range(max_iter): rnd = get_random_node(goal_sample_rate, goal) nearest = min(nodes, key=lambda n: distance(n, rnd)) new_node = steer(nearest, rnd) if not is_collision(new_node): nodes.append(new_node) if distance(new_node, goal) < 5.0: goal.parent = new_node nodes.append(goal) break return nodes def draw_path(last_node): path = [] node = last_node while node: path.append((node.x, node.y)) node = node.parent path = path[::-1] plt.plot([x for x, y in path], [y for x, y in path], '-r') def draw_tree(nodes): for node in nodes: if node.parent: plt.plot([node.x, node.parent.x], [node.y, node.parent.y], '-g') start = Node(10, 10) goal = Node(90, 90) nodes = rrt(start, goal) draw_tree(nodes) draw_path(goal) plt.plot(start.x, start.y, "bs", label="Start") plt.plot(goal.x, goal.y, "gs", label="Goal") plt.legend() plt.grid(True) plt.axis([0, 100, 0, 100]) plt.title("RRT Path Planning (No Obstacles)") plt.show() 
  有博主给出了更好更完整的RRT算法,在下面的github库中:RRT算法 

[Results] 运行结果

图示说明:

运行上面代码后会出现如下图所示效果:

  • 🌲 绿色的线表示RRT生成的搜索树结构。
  • 🔴 红色路径表示最终从起点到终点的规划路径。
  • 🔵 起点,🟢 终点。


[Notice]  注意事项

  • 每一步都从树中最近节点往随机点延伸。
  • 最终形成一条从起点连到终点的路径。
  • 可在is_collision()中添加障碍物检测逻辑以模拟真实环境。
​# 环境配置 Python 3.11.5 torch 2.1.0 torchvision 0.16.0 gym 0.26.2
        由于博文主要为了介绍相关算法的原理和应用的方法,缺乏对于实际效果的关注

四、RRT的特点

 优点:

  • 非常适合高维空间的路径规划。
  • 易于实现。
  • 对复杂环境有良好的适应能力。

 缺点:

  • 路径不最优,常常是“锯齿状”路径。
  • 随机性强,规划时间不稳定。
  • 在障碍物密集区域效果不佳。

五、改进版本:RRT*

RRT*(RRT Star)(下一篇文章介绍)是RRT的优化版本,加入了“路径优化”的机制:

  • 在每次加入新节点时,不仅连接最近点,还会尝试重新连接周围节点,以获得更短路径。
  • 理论上可以得到渐近最优解。

六、应用场景

  • 机器人路径规划
  • 无人机自主导航
  • 自动驾驶车辆的避障与路径生成
  • 多自由度机械臂的运动规划
 更多启发式算法文章,请前往:【启发式算法】专栏

        博客都是给自己看的笔记,如有误导深表抱歉。文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者添加VX:Rainbook_2,联系作者。✨

Read more

OpenClaw 跨平台部署与SearXng免费搜索配置教程(Windows/macOS)

本教程将指导你在 Windows 10 和 macOS 上从零开始部署 OpenClaw,并通过 MCP (Model Context Protocol) 方式集成 SearXNG 作为免费搜索引擎,实现 AI 联网搜索。方案基于 mcp-adapter 插件和 searxng-mcp 服务器,已在两种平台上验证可行。 📌 概述 * OpenClaw:一个强大的 AI Agent 框架,支持工具调用。 * SearXNG:自托管的元搜索引擎,聚合多个上游结果,保护隐私。 * MCP:模型上下文协议,让 AI 可以调用外部工具。 * 目标:让本地运行的 OpenClaw(使用 Ollama 模型)能够通过 SearXNG 获取实时网络信息。 🔧 前置准备

By Ne0inhk
Flutter 三方库 inno_build 的鸿蒙化适配指南 - 实现极速的构建脚本增强、支持项目环境隔离与自动化 HAP 打包流程定制

Flutter 三方库 inno_build 的鸿蒙化适配指南 - 实现极速的构建脚本增强、支持项目环境隔离与自动化 HAP 打包流程定制

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 inno_build 的鸿蒙化适配指南 - 实现极速的构建脚本增强、支持项目环境隔离与自动化 HAP 打包流程定制 前言 在进行 Flutter for OpenHarmony 的企业级部署时,仅仅依靠原生的命令行构建有时显得捉襟见肘,难以应对多渠道打包、混合环境参数注入以及复杂的资产预编译需求。inno_build 是一个轻量级且极具扩展性的构建增强工具。它为 Flutter 项目穿上了一层“自动化铠甲”,让原本散乱的构建脚本变得井然有序。本文将探讨如何在鸿蒙开发流水线中深度整合该库。 一、原理解析 / 概念介绍 1.1 基础原理 inno_build 核心是一个基于任务流(Task Flow)的执行引擎。它通过读取项目根目录下的配置文件,在执行 build 操作前后自动注入 Hook

By Ne0inhk
Flutter 组件 r_flutter 的适配 鸿蒙Harmony 实战 - 驾驭资源映射自动化、实现鸿蒙端资产强类型引用与资产冲突静态校验方案

Flutter 组件 r_flutter 的适配 鸿蒙Harmony 实战 - 驾驭资源映射自动化、实现鸿蒙端资产强类型引用与资产冲突静态校验方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 r_flutter 的适配 鸿蒙Harmony 实战 - 驾驭资源映射自动化、实现鸿蒙端资产强类型引用与资产冲突静态校验方案 前言 在鸿蒙(OpenHarmony)的大型 UI 工程开发中,“资源管理”是一个极易产生低级错误的重灾区。面对动辄几百个图标(PNG/SVG)、各种自定义字体文件以及多层级的资源目录。如果我们依然使用硬编码字符串(如 Image.asset('assets/images/home_icon_v2_final.png')),那么不仅毫无代码提示可言,由于文件名拼写错误引发的运行期资源丢失(Missing Asset)更是家常便饭。 我们需要一种“代码即资产”的强类型保护。 r_flutter

By Ne0inhk
Flutter 组件 dartle 的鸿蒙化适配实战 - 驾驭极致工程构建大坝、实现 OpenHarmony 全链路自动化、任务依赖治理与工业级 CI/CD 编排方案

Flutter 组件 dartle 的鸿蒙化适配实战 - 驾驭极致工程构建大坝、实现 OpenHarmony 全链路自动化、任务依赖治理与工业级 CI/CD 编排方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 dartle 的鸿蒙化适配实战 - 驾驭极致工程构建大坝、实现 OpenHarmony 全链路自动化、任务依赖治理与工业级 CI/CD 编排方案 前言 在鸿蒙(OpenHarmony)生态的大规模、多模块协同开发、或者是对构建流程有极其严苛要求的 0308 批次政企级项目中。“构建链路的清晰度与任务间死锁依赖维度”是衡量整个工程体系稳健运行的最终质量门禁。面对包含数十个方舟编译器(ArkCompiler)任务、海量资源混淆步骤、甚至是跨端二进制包(Bundle)分发的重型流水线。如果仅仅依靠 Shell 脚本中那几串干瘪的顺序执行。不仅会导致在定位构建回退(Regression)时让开发工程师如同在脚本废墟中盲人摸象。更会因为缺乏任务级的大局观呈现。令技术管理层在跨部门指挥调度时陷入严重的信息盲区。 我们需要一种“逻辑严密、任务原子、并发有序”的工程资产汇报艺术。 dartle 是一套专注于无缝整合

By Ne0inhk