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

news/2025/1/30 11:19:44/

目录

  • 0 专栏介绍
  • 1 RRT-Connect基本原理
  • 2 RRT-Connect vs. RRT
  • 3 ROS C++算法实现
  • 4 Python算法实现
  • 5 Matlab算法实现

0 专栏介绍

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

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


1 RRT-Connect基本原理

在原始RRT算法中,终点附近的区域信息并不能得到有效利用,为了解决这个问题,可以分别以起点和终点为根节点进行双搜索树双向扩展,当两棵树建立连接时可回溯可行路径,称为RRT-Connect算法

在这里插入图片描述
在这里插入图片描述

2 RRT-Connect vs. RRT

对原始版本RRT算法不了解的同学请看:路径规划 | 图解快速随机扩展树RRT算法(附ROS C++/Python/Matlab仿真)。与RRT算法相比,RRT-Connect有什么特别的优势呢?

  • 更高效的路径搜索:RRT-Connect算法通过引入Connect启发式算法,将传统的扩张函数替换为一种贪婪策略——允许在更长的距离上移动,而不仅限于单步扩展,从而在探索可行路径时具有更高的效率。这使得RRT-Connect能够更快地收敛到可行路径,尤其是在没有微分约束的情况下。
  • 更好的全局规划性能:RRT-Connect算法的另一个优点是它能够同时从起始配置和目标配置开始扩展RRT。这种双向扩展可以更好地探索搜索空间,并在找到可行路径时更快地连接起始配置和目标配置。这使得RRT-Connect算法在全局路径规划方面更为有效,并且具有更好的搜索性能。

RRT-Connect算法流程如下所示

在这里插入图片描述

3 ROS C++算法实现

核心代码如下所示

bool RRTConnect::plan(const unsigned char* gloal_costmap, const Node& start, const Node& goal, std::vector<Node>& path,std::vector<Node>& expand)
{sample_list_f_.clear();sample_list_b_.clear();// copystart_ = start, goal_ = goal;costs_ = gloal_costmap;sample_list_f_.insert(start);sample_list_b_.insert(goal);expand.push_back(start);expand.push_back(goal);// main loopint iteration = 0;while (iteration < sample_num_){// 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_f_, sample_node);if (new_node.id_ == -1)continue;else{sample_list_f_.insert(new_node);expand.push_back(new_node);// backward exploringNode new_node_b = _findNearestPoint(sample_list_b_, new_node);if (new_node_b.id_ != -1){sample_list_b_.insert(new_node_b);expand.push_back(new_node_b);// greedy extendingwhile (true){double dist = std::min(max_dist_, _dist(new_node, new_node_b));double theta = _angle(new_node_b, new_node);Node new_node_b2;new_node_b2.x_ = new_node_b.x_ + (int)(dist * cos(theta));new_node_b2.y_ = new_node_b.y_ + (int)(dist * sin(theta));new_node_b2.id_ = grid2Index(new_node_b2.x_, new_node_b2.y_);new_node_b2.pid_ = new_node_b.id_;new_node_b2.g_ = dist + new_node_b.g_;if (!_isAnyObstacleInPath(new_node_b, new_node_b2)){sample_list_b_.insert(new_node_b2);expand.push_back(new_node_b2);new_node_b = new_node_b2;}elsebreak;// connected -> goal foundif (new_node_b == new_node){path = _convertClosedListToPath(new_node_b);return true;}}}}// swapif (sample_list_b_.size() < sample_list_f_.size())std::swap(sample_list_f_, sample_list_b_);iteration++;}return false;
}

运行效果图

在这里插入图片描述

4 Python算法实现

核心代码如下所示

def plan(self):for _ in range(self.sample_num):# generate a random node in the mapnode_rand = self.generateRandomNode()            # generate new nodenode_new = self.getNearest(self.sample_list_f, node_rand)if node_new:self.sample_list_f.append(node_new)# backward exploringnode_new_b = self.getNearest(self.sample_list_b, node_new)if node_new_b:self.sample_list_b.append(node_new_b)# greedy extendingwhile True:dist = min(self.max_dist, self.dist(node_new, node_new_b))theta = self.angle(node_new_b, node_new)node_new_b2 = Node((node_new_b.current[0] + dist * math.cos(theta),(node_new_b.current[1] + dist * math.sin(theta))),node_new_b.current, node_new_b.g + dist, 0)if not self.isCollision(node_new_b2, node_new_b):self.sample_list_b.append(node_new_b2)node_new_b = node_new_b2else:breakif node_new_b == node_new:return self.extractPath(node_new)if len(self.sample_list_b) < len(self.sample_list_f):self.sample_list_f, self.sample_list_b = self.sample_list_b, self.sample_list_freturn 0, None

在这里插入图片描述

5 Matlab算法实现

核心代码如下所示

% main loop
for i=1: param.sample_num% generate a random node in the mapnode_rand = generate_node(goal, param);% generate new node[node_new, success] = get_nearest(sample_list_f, node_rand, map, param);if successsample_list_f = [node_new; sample_list_f];% backward exploring[node_new_b, success_b]  = get_nearest(sample_list_b, node_new(1:2), map, param);if success_bsample_list_b = [node_new_b; sample_list_b];% greedy extendingwhile truedistance = min(param.max_dist, dist(node_new(1:2), node_new_b(1:2)'));theta = angle(node_new_b, node_new);node_new_b2 = [node_new_b(1) + distance * cos(theta), ...node_new_b(2) + distance * sin(theta), ...node_new_b(3) + distance, ...node_new_b(1:2)];if ~is_collision(node_new_b2(1:2), node_new_b(1:2), map, param)sample_list_b = [node_new_b2; sample_list_b];node_new_b = node_new_b2;elsebreakend% goal foundif node_new_b(1) == node_new(1) && node_new_b(2) == node_new(2)flag = true;cost = sample_list_f(1, 3) + sample_list_b(1, 3);path = extract_path(sample_list_f, sample_list_b, start, goal);expand = [sample_list_f; sample_list_b];returnendendendend[len_f, ~] = size(sample_list_f); [len_b, ~] = size(sample_list_b);if len_b < len_ftemp = sample_list_f;sample_list_f = sample_list_b;sample_list_b = temp;end
end

在这里插入图片描述

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


🔥 更多精彩专栏

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

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

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

相关文章

android智能手机推荐,android智能手机推荐!

2000元选择的机子还是很多的&#xff0c;主要看你喜欢哪个方面是喜欢玩游戏多一些还是喜欢照相多一些还是喜欢外形多一些等等&#xff0c;2000左右给你推荐HTC的G7和G15和索爱的MT15I你可以自己选择一下 HTC Desire(G7) 2010年 3.7英寸 480800像素 SAMOLED/SLCD 原始系统安卓2.…

前端调用手机相机拍照

转载地址 HTML5调用手机相机拍照 前端调用手机相机拍照 实现方式常见有两种&#xff1a; 一种是通过video控件&#xff0c;通过捕获video的流&#xff0c;截取video中的图像实现拍照&#xff0c; 还有一种是通过input[file]控件调用移动端的摄像头&#xff0c;实现拍照。 两种方…

华为手机如何调时间显示_华为手机照相有时间日期显示怎样设置

华为手机照相有时间日期显示设置方法如下: 1、在手机界面找到图库点击打开。 2、进入图库后选择一张照片打开。 3、打开图片后、点击下图所示右上角的选项。 4、进入后会看到显示拍摄时间和拍摄地点没有打开。 5、打开“显示拍摄时间”和“显示拍摄地点”以后,再返回到图片中…

中国最大的系统软件开发外包公司排行榜有哪些

中国最大的系统软件开发外包公司排行榜有哪些   1 华盛恒辉   2 五木恒润   3 北京华盛恒辉   4 北京五木恒润   5 海尔   6 神州   7 浙大网新   8 熊猫电子  9 浪潮   10 东软 11 北大方正   12 微软   13 朝华 14 计算机软件与技术  …

计算机职业工资排名2015,2015年各行业薪酬排行榜出炉

原标题&#xff1a;2015年各行业薪酬排行榜出炉 2015年各行业薪酬排行榜出炉 会计网讯 据调查数据显示&#xff0c;2012-2014年月薪都进入34个行业前十的行业是&#xff0c;金融业、咨询与调查、广电及文化艺术业、批发业、法律服务、职业中介服务、家电及电子产品零售、计算机…

山东省计算机专业专科排名2015,2015山东专科学校排名及排行榜

原标题&#xff1a;2015山东专科学校排名及排行榜 点击查看>>> 深度推荐阅读&#xff1a; 1、 2、丨 3、丨 4、 5、 山东共有72所专科学校参与了2015山东专科学院排名&#xff0c;其中排名第一的是烟台职业学院&#xff0c;排名第二的是滨州职业学院&#xff0c;排名第…

网上开店最好卖的东西排行榜

简介&#xff1a;很多人都想在网上开店&#xff0c;但是又不知道卖什么产品&#xff1f;什么产品好卖&#xff1f;我们根据淘宝网2009年第二季度和易趣网2009年第二季度、拍拍网2009年第而季度销售情况。总结了网上销售目前销售额最大的十种产品的优劣势分析。 1.化妆品及化妆…

建议收藏 | 可实操,数据中台选型示例

在了解清楚了选择数据中台时应关注的内容后&#xff0c;CTO/CIO可以借鉴以下数据中台选型示例&#xff0c;企业选购合适的数据中台。 01 项目背景 数字化时代&#xff0c;数据已经成为企业的战略级资产。某集团把建设数字化转型作为重要发展战略&#xff0c;致力于将数字化转…