路径规划 | 图解Informed RRT*算法(附ROS C++/Python/Matlab仿真)

news/2024/11/24 22:27:32/

目录

  • 0 专栏介绍
  • 1 Informed RRT*原理
  • 2 Informed RRT*流程
  • 3 ROS C++实现
  • 4 Python实现
  • 5 Matlab实现

0 专栏介绍

🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。

🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法


1 Informed RRT*原理

传统的RRT算法存在一些局限性。在复杂的环境中,RRT算法可能会生成较长的路径,因为它主要依赖于随机采样,路径的探索性较强,而对于局部信息的利用较少,这可能导致路径搜索效率低。

在这里插入图片描述

Informed RRT*算法针对RRT*算法进行了采样优化,用椭圆采样代替全局均匀采样,避免了RRT*算法搜索树上产生过多冗余分支的缺陷,提高了搜索效率和收敛速度。在Informed RRT*算法中,以起点、终点为焦点,二者的直线距离为焦距 c min ⁡ c_{\min} cmin;当前规划的起点、终点最佳路径长度为 c b e s t c_{\mathrm{best}} cbest,以 c b e s t c_{\mathrm{best}} cbest为长轴, c b e s t 2 − c min ⁡ 2 \sqrt{c_{\mathrm{best}}^{2}-c_{\min}^{2}} cbest2cmin2 为短轴构造椭圆采样区域。

在这里插入图片描述

工程上一般先在标准圆内采样,再通过齐次变换

T = [ R p ] , R = [ a cos ⁡ θ b sin ⁡ θ − a sin ⁡ θ b cos ⁡ θ ] , p = [ x c e n t e r y c e n t e r ] T=\left[ \begin{matrix} \boldsymbol{R}& \boldsymbol{p}\\\end{matrix} \right] , \boldsymbol{R}=\left[ \begin{matrix} a\cos \theta& b\sin \theta\\ -a\sin \theta& b\cos \theta\\\end{matrix} \right] , \boldsymbol{p}=\left[ \begin{array}{c} x_{\mathrm{center}}\\ y_{\mathrm{center}}\\\end{array} \right] T=[Rp],R=[acosθasinθbsinθbcosθ],p=[xcenterycenter]

将采样点映射到地图中,其中 θ \theta θ是起点、终点连线与 x x x轴的夹角; p \boldsymbol{p} p是起点、终点的中点; a a a b b b分别是长轴、短轴, R \boldsymbol{R} R是伸缩变换和旋转变换的复合。我们通过代码来直观看看是如何实现椭圆采样的

Node InformedRRT::_transform(double x, double y)
{// centerdouble center_x = (start_.x_ + goal_.x_) / 2;double center_y = (start_.y_ + goal_.y_) / 2;// rotationdouble theta = -_angle(start_, goal_);// ellipsedouble a = c_best_ / 2.0;double c = c_min_ / 2.0;double b = std::sqrt(a * a - c * c);// transformint tx = (int)(a * cos(theta) * x + b * sin(theta) * y + center_x);int ty = (int)(-a * sin(theta) * x + b * cos(theta) * y + center_y);int id = grid2Index(tx, ty);return Node(tx, ty, 0, 0, id, 0);
}

2 Informed RRT*流程

Informed RRT*算法流程如下

在这里插入图片描述

3 ROS C++实现

核心代码如下所示

bool InformedRRT::plan(const unsigned char* gloal_costmap, const Node& start, const Node& goal, std::vector<Node>& path,std::vector<Node>& expand)
{// initializationc_best_ = std::numeric_limits<double>::max();c_min_ = _dist(start, goal);int best_parent = -1;sample_list_.clear();// copystart_ = start, goal_ = goal;costs_ = gloal_costmap;sample_list_.insert(start);expand.push_back(start);// main loopint iteration = 0;while (iteration < sample_num_){iteration++;// generate a random node in the mapNode sample_node = _generateRandomNode();// obstacleif (gloal_costmap[sample_node.id_] >= lethal_cost_ * factor_)continue;// visitedif (sample_list_.find(sample_node) != sample_list_.end())continue;// regular the sample nodeNode new_node = _findNearestPoint(sample_list_, sample_node);if (new_node.id_ == -1)continue;else{sample_list_.insert(new_node);expand.push_back(new_node);}// goal foundauto dist = _dist(new_node, goal_);if (dist <= max_dist_ && !_isAnyObstacleInPath(new_node, goal_)){double cost = dist + new_node.g_;if (cost < c_best_){best_parent = new_node.id_;c_best_ = cost;}}}if (best_parent != -1){Node goal_(goal_.x_, goal_.y_, c_best_, 0, grid2Index(goal_.x_, goal_.y_),best_parent);sample_list_.insert(goal_);path = _convertClosedListToPath(sample_list_, start, goal);return true;}return false;
}

运行效果图

在这里插入图片描述

4 Python实现

核心代码如下所示

def plan(self):# generate a random node in the mapnode_rand = self.generateRandomNode()# visitedif node_rand in self.sample_list:return 0, None# generate new nodenode_new = self.getNearest(self.sample_list, node_rand)if node_new:self.sample_list.append(node_new)dist = self.dist(node_new, self.goal)# goal foundif dist <= self.max_dist and not self.isCollision(node_new, self.goal):self.goal.parent = node_new.currentself.goal.g = node_new.g + self.dist(self.goal, node_new)self.sample_list.append(self.goal)return self.extractPath(self.sample_list)return 0, None

运行效果图

在这里插入图片描述

5 Matlab实现

核心代码如下:

function [cost, flag, node_list, path] = plan(node_list, start, goal, map, param)cost = 0;flag = false;path = [];% generate a random node in the mapnode_rand = generate_node(start, goal, param);% visitedif loc_list(node_rand, node_list, [1, 2])returnend% generate new node[node_new, success] = get_nearest(node_list, node_rand, map, param);if successnode_list = [node_new; node_list];distance = dist(node_new(1:2), goal');% goal foundif distance <= param.max_dist && ~is_collision(node_new(1:2), goal, map, param)goal_ = [goal, node_new(3) + distance, node_new(1:2)];node_list = [goal_; node_list];flag = true;cost = goal_(3);path = extract_path(node_list, start);node_list(1, :) = [];returnendend
end

运行效果图

在这里插入图片描述

完整工程代码请联系下方博主名片获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

http://www.ppmy.cn/news/340833.html

相关文章

应用程序打开错误 0x0000007b,缺各种dll、

最近要修改一个dll&#xff0c;老版本的dll是vs2010写的&#xff0c;现在用vs2015写的在打开exe的时候&#xff0c;报了很多确实dll。 例如&#xff1a;mfc140d.dll,msvcp140d.dll等。由于程序是win32的编译器弄得&#xff0c;就理所当然去c盘下的windows&#xff0c;system32…

笔记本电脑蓝屏代码stop:0x0000007b(0xb84d3524,0xc0000034,0x00000000,0x00000000)

10多年前的电脑&#xff0c;6年左右没开过机了&#xff0c;今天看到想怀旧 一下&#xff0c;没想到还打不开了&#xff0c;直接蓝屏一闪而过重新启动&#xff0c;但启动不成功。经过一翻调试&#xff0c;终于解决。 解决方案&#xff1a; 1&#xff0c;先设置一下&#xff1a;…

xp系统遭遇STOP 0X0000007B蓝屏,附解决方案

方法一 : 进入BIOS&#xff0c;选择AHCI模式 开机重启看下是否能启动 如果不能启动&#xff0c;则选择为安全模式&#xff0c;进入安全模式后&#xff0c;再关机&#xff01; 重启就好了 方法二&#xff1a; 1&#xff1a;进入安全模式后&#xff0c;关机。 2&#xff1a;重…

电脑意外断电导致蓝屏代码0X0000007B的解决办法

电脑开机时如上图所示解决方法&#xff1a; 方法一&#xff1a;.重启启动 方法二&#xff1a;重新启动时按下del键&#xff0c;进入安全模式&#xff0c;选择最后一次正确配置之后按下Enter键

服务器系统报错00007b,重装win7系统出现蓝屏0X0000007B的解决方法

重装win7系统出现蓝屏0X0000007B的解决方法分享给大家&#xff0c;重装XP系统蓝屏怎么办&#xff0c;代码为0X0000007B(0XF7A83528&#xff0c;0XC0000034&#xff0c;0X00000000&#xff0c;0X00000000)&#xff0c;这个该怎么解决呢?其实听到蓝屏这个词很多用户都非常熟悉&a…

xp系统计算机蓝屏,Xp系统出现蓝屏代码 0x0000007b解决方法

蓝屏是大家最讨厌看到的一个界面&#xff0c;如果出现蓝屏界面证明是电脑出现了相应的问题。 Xp系统出现蓝屏代码 0x0000007b解决方法; 如果您的电脑在开机时出现蓝屏并且蓝屏代码为&#xff1a;0x0000007b&#xff0c;那么您可以参考本篇文章中的教程进行尝试调整。一般出现 0…

0X0000007B蓝屏

电脑开机蓝屏&#xff0c;安全模式也不好使 0X0000007B(0XFFFF880009A97E8,0XFFFFFFFC0000034,0X0000000000000000,0X000000000000000) Win7版本 按网上看到的都是&#xff0c;硬盘数据线两头重新插拔&#xff0c;内存重新插拔&#xff0c;我也首先排除了这些问题 0X000000…

0x0000007B是什么意思?解决方案

0x0000007b电脑蓝屏通常情况是硬盘的存储控制器驱动加载错误导致故障。对于这种情况就要有相应解决措施&#xff0c;下面来看看具体解决方法。 导致驱动加载错误的情况可能有以下三种情况&#xff1a; 1.无法自动识别硬盘控制器&#xff1a; 使用非正版的个别操作系统光盘&…