首页 > 其他分享 >路径规划之RRT

路径规划之RRT

时间:2024-08-04 13:38:52浏览次数:5  
标签:obstacles end point 路径 tree new RRT 规划 size

Rapidly exploring random tree (RRT/快速拓展随机树)

优势

通过对状态空间中的采样点进行碰撞检测,避免了对空间的建模,能够有效解决高维空间和复杂约束条件下的路径求解问题。

核心思想

通过随机采样,在自由空间中快速构建一个树形结构,以探索可能的路径。在每次迭代中,算法随机生成一个节点,并试图将该节点连接到最接近的树节点,形成一条边。通过反复迭代这一过程,不断扩展树的范围,直至达到目标状态或达到最大迭代次数为止。

伪代码

  1. 将 \(X_{start}\) 作为起点,并放入随机树中
  2. 随机取一个采样点 \(X_{rand}\) ,并找出距离这个采样点最近的随机数中的点 \(X_{nearest}\)
  3. 沿着\(X_{nearest}\)->\(X_{rand}\)的方向移动一个步长 \(\delta\) 作为新的\(X_{new}\) , 如果\(X_{rand}\)到\(X_{nearest}\)的距离小于步长 \(\delta\) ,则将\(X_{rand}\)设为新的\(X_{new}\)

  4. 对新的\(X_{new}\)进行碰撞检测,如果通过碰撞检测,则将\(X_{new}\)加入random Tree中,若没通过则重新迭代
  5. 判断新节点\(X_{new}\)是否满足\(||X_{new}-X_{goal}||<\epsilon\),若满足则表示到达终点,反之则继续迭代。

matlab代码仿真

rrt_plan.m
function rrt()
    % Parameters
    map_size = [100, 100];
    start_pos = [1, 1];
    end_pos = [100, 100];
    num_obstacles = 10;
    max_iter = 1000;
    step_size = 5;

    % Generate map with random rectangular obstacles
    obstacles = generate_random_obstacles(map_size, num_obstacles);

    % RRT Algorithm
    tree = start_pos;
    parent = 0; % Root has no parent
    for i = 1:max_iter
        rand_point = [randi(map_size(1)), randi(map_size(2))];
        nearest_idx = find_nearest(tree, rand_point);
        new_point = steer(tree(nearest_idx,:), rand_point, step_size);

        if ~check_collision(new_point, obstacles)
            tree = [tree; new_point]; %#ok<AGROW>
            parent = [parent; nearest_idx]; %#ok<AGROW>
            plot_tree(tree, parent, obstacles, map_size, start_pos, end_pos);

            if norm(new_point - end_pos) < step_size
                disp('Path found!');
                plot_path(tree, parent, end_pos);
                return;
            end
        end
    end
    disp('Path not found within the maximum iterations.');

    function obstacles = generate_random_obstacles(map_size, num_obstacles)
        obstacles = [];
        for i = 1:num_obstacles
            x = randi([1, map_size(1) - 10]);
            y = randi([1, map_size(2) - 10]);
            w = randi([5, 20]);
            h = randi([5, 20]);
            obstacles = [obstacles; x, y, w, h]; %#ok<AGROW>
        end
    end

    function idx = find_nearest(tree, point)
        distances = vecnorm(tree - point, 2, 2);
        [~, idx] = min(distances);
    end

    function new_point = steer(from, to, step_size)
        direction = (to - from) / norm(to - from);
        new_point = from + step_size * direction;
    end

    function collision = check_collision(point, obstacles)
        collision = false;
        for i = 1:size(obstacles, 1)
            x = obstacles(i, 1);
            y = obstacles(i, 2);
            w = obstacles(i, 3);
            h = obstacles(i, 4);
            if point(1) >= x && point(1) <= x + w && point(2) >= y && point(2) <= y + h
                collision = true;
                return;
            end
        end
    end

    function plot_tree(tree, parent, obstacles, map_size, start_pos, end_pos)
        clf;
        hold on;
        axis([0 map_size(1) 0 map_size(2)]);
        for i = 2:size(tree, 1)
            plot([tree(i,1), tree(parent(i),1)], [tree(i,2), tree(parent(i),2)], 'b-');
        end
        for i = 1:size(obstacles, 1)
            rectangle('Position', obstacles(i,:), 'FaceColor', [0.5 0.5 0.5]);
        end
        plot(start_pos(1), start_pos(2), 'go', 'MarkerSize', 10, 'MarkerFaceColor', 'g');
        plot(end_pos(1), end_pos(2), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');
        drawnow;
    end

    function plot_path(tree, parent, end_pos)
        path = [end_pos];
        nearest_idx = find_nearest(tree, end_pos);
        while nearest_idx > 1
            path = [tree(nearest_idx,:); path]; %#ok<AGROW>
            nearest_idx = parent(nearest_idx);
        end
        path = [tree(1,:); path];
        plot(path(:,1), path(:,2), 'r-', 'LineWidth', 2);
    end
end

仿真结果

标签:obstacles,end,point,路径,tree,new,RRT,规划,size
From: https://www.cnblogs.com/alee1106/p/18340558

相关文章

  • Day 32 动态规划 Part01
    动态规划解题步骤确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组509.斐波那契数显然dp[i]代表fib[i],fib[i]=fib[i-1]+fib[i-2],fib[0]=0,fib[1]=1,遍历从前往后遍历即可。下面的代码优化了空间复杂度,但思路是一致的。......
  • 解密动态规划:简单易懂的方法和分类大揭秘
    动态规划是一种解决问题的算法思想,它通过将问题划分成多个子问题并进行递推求解,从而得到最优解。以下是简单易懂的动态规划方法以及动态规划的分类:简单易懂的动态规划方法:确定状态:分析问题,找出问题的关键参数,并将其抽象为状态。确定状态转移方程:确定状态之间的关系,即如何从......
  • 一个conda环境,多个路径
    我不明白为什么我的基础环境存储在8个不同的地方。我只是运行condaupdate--all和condaclean-all来尝试让conda运行得更快,但我找不到任何资源来解释为什么基本环境会有如此多的重复项。一个相关的问题:这重要吗?(base)PSC:\Windows\system32>condae......
  • 动态规划与搜索练习
    这是我搜集到的一些动态规划和搜索的练习题搜索小练习动态规划小练习祝你CSP拿到\(^{一等奖}_{一等奖}\)!这是解析动态规划一、双子序列最大和由于两个子序列不重叠,显然的这两个子序列之间一定有一个断点。要求两个子序列之和最大值,可以枚举断点的位置,对比每个断点下左序......
  • (11-1)基于SLAM的自主路径导航系统:背景介绍+项目介绍
    在本章的内容中,通过具体实例展示了实现一个自主路径导航系统的过程。本项目利用TurtleBot3机器人和ROS框架实现了自主路径规划功能,通过SLAM技术进行实时地图建立和定位,并结合move_base包实现路径规划。用户可以根据需求选择不同的SLAM方法,包括gmapping、cartographer、hector......
  • Overleaf中插入pdf图片只显示图片路径的解决方式
    最近在用Overleaf写一篇论文,使用IEEE的LaTex模板时发现一个问题,我使用pdfLaTex编译器无法正确显示我插入的pdf图片,网上翻解决方式没有翻到,误打误撞解决了这个问题,问题如下图所示: 即只在图片区域显示路径,不显示图片本身,解决方案是:在右侧设置里找到编译模式,将【快速(draft)】更......
  • 【笔记】动态规划选讲:凸优化技术大赏 2024.8.3
    如果您是搜索引擎搜进来的。很抱歉,没有您需要搜索的题目的题解。典题\(n\)个物品的背包,重量在\(1\sim4\)之间,价值在\(1\sim10^9\)之间。\(n\leq10^5\)。Minkowski和会遇到不连续的问题。不妨按照\(i\bmod12\)划分dp数组,每个剩余系都是凸的。枚举拿了\(......
  • C++动态规划(01背包)
    例题1:有 N 个物品,从 1 到 N 编号。对于每个 i(1≤i≤N),物品 i 的重量是 wi​ 价值是 vi​。太郎决定从 N 个物品里选一些放进背包带回家。太郎的背包的容量是 W,因此放进背包的物品的总重量不能超过 W。求太郎带回家的物品的总价值可能达到的最大值。1.贪......
  • 「代码随想录算法训练营」第二十八天 | 动态规划 part1
    509.斐波那契数题目链接:https://leetcode.cn/problems/fibonacci-number/题目难度:简单文章讲解:https://programmercarl.com/0509.斐波那契数.html视频讲解:https://www.bilibili.com/video/BV1f5411K7mo题目状态:过!思路:当n=0时,返回0;当n=1时,返回1;当n>=2时,返回fib(......
  • 动态规划:基础篇
    目录1.斐波那契数(LeetCode509)解法1:动态规划(基础版)解法2:动态规划(优化版) 2.爬楼梯(方案个数)(斐波那契数列扩展)(LeetCode70) 解法1:动态规划(基础版)解法2:动态规划(优化版)3. 爬楼梯(最小花费)(LeetCode746)解法1:动态规划(基础版)  解法2:动态规划(优化版)......