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

news2024/12/27 18:34:46

目录

  • 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)
{
  // center
  double center_x = (start_.x_ + goal_.x_) / 2;
  double center_y = (start_.y_ + goal_.y_) / 2;

  // rotation
  double theta = -_angle(start_, goal_);

  // ellipse
  double a = c_best_ / 2.0;
  double c = c_min_ / 2.0;
  double b = std::sqrt(a * a - c * c);

  // transform
  int 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)
{
  // initialization
  c_best_ = std::numeric_limits<double>::max();
  c_min_ = _dist(start, goal);
  int best_parent = -1;
  sample_list_.clear();

  // copy
  start_ = start, goal_ = goal;
  costs_ = gloal_costmap;
  sample_list_.insert(start);
  expand.push_back(start);

  // main loop
  int iteration = 0;
  while (iteration < sample_num_)
  {
    iteration++;

    // generate a random node in the map
    Node sample_node = _generateRandomNode();

    // obstacle
    if (gloal_costmap[sample_node.id_] >= lethal_cost_ * factor_)
      continue;

    // visited
    if (sample_list_.find(sample_node) != sample_list_.end())
      continue;

    // regular the sample node
    Node 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 found
    auto 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 map
	node_rand = self.generateRandomNode()
	
	# visited
	if node_rand in self.sample_list:
	   return 0, None
	
	# generate new node
	node_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 found
	   if dist <= self.max_dist and not self.isCollision(node_new, self.goal):
	       self.goal.parent = node_new.current
	       self.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 map
    node_rand = generate_node(start, goal, param);

    % visited
    if loc_list(node_rand, node_list, [1, 2])
        return
    end

    % generate new node
    [node_new, success] = get_nearest(node_list, node_rand, map, param);
    if success
        node_list = [node_new; node_list];
        distance = dist(node_new(1:2), goal');

        % goal found
        if 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, :) = [];
            return
        end
    end
end

运行效果图

在这里插入图片描述

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


🔥 更多精彩专栏

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

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

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

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

相关文章

超全、超详细的Redis学习笔记总结

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

「2024」预备研究生mem-消序核心原则

一、消序 二、核心原则 相同备选池 三、练习题

数据库索引简介及优化

索引 1.索引简介 1.1 概念 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。索引的本质&#xff1a;索引是数据结构。 注&#xff1a;在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&…

OOM 原因及解决方案

1. 什么是OOM 1.1 OOM 含义: OOM, 全称 “Out Of Memory”, 意思是 “内存用完了”。 它来源于 java.lang.OutOfMemoryError。 1.2 为什么会出现OOM: 官方介绍为当 JVM 因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时, 就会抛出 java.lang.OutOfMemo…

Windows命令行压缩gz文件

tar -help win10好像是某个版本号之后&#xff0c;才能使用tar命令&#xff0c;所以想要直接在win10上面使用tar命令&#xff0c;就更新系统吧。 按 winr 键后输入 cmd 打开命令行终端&#xff0c;输入 tar -help 命令&#xff0c;如下所示。 tar -cf xxx.tar.gz ./xxx //是…

【电路】电路与电子技术基础 课堂笔记 第11章 数制、编码与逻辑代数

11.1 数制与数制转换 11.2 二进制数的编码 1. 二-十进制&#xff08;BCD&#xff09;码 把十进制数的每一位用多位二进制数表示&#xff0c;称为二进制编码的十进制数&#xff0c;简称BCD编码。 具有二进制数的形式&#xff0c;又具有十进制数的特点。 2. 8421码 3. 2421码…

老板谈上4休3工作制1个月后效果:不建议新公司模仿

大家好&#xff01;我是老洪&#xff01; 刚看到一则关于上4休3工作制的资讯&#xff0c;聊两句。 媒体是这样报道的。 一位长沙公司的老板在实施上4休3工作制一个月后表示&#xff0c;不建议新公司模仿。 他指出&#xff0c;个别员工的自律问题在上四休三后暴露出来&#xff0…

人工智能体系和实战指南

前言 人工智能是一个庞大的研究领域。虽然我们已经在人工智能的理论研究和算法开发方面取得了一定的进展&#xff0c;但是我们目前掌握的能力仍然非常有限。机器学习是人工智能的一个重要领域&#xff0c;它研究计算机如何模拟或实现人类的学习行为&#xff0c;以获取新的知识或…

RetinaNet网络介绍

前言 上一篇博文我们介绍了Focal Loss&#xff0c;原理也比较简单&#xff0c;有不了解的小伙伴可以先跳转到之前的博文了解一下。Focal Loss介绍。这篇博文我们来看下Focal Loss的出处&#xff1a;Focal Loss for Dense Object Detection&#xff0c;这篇论文提出了RetainNet之…

Netty之ByteBuf解读

目录 创建简单使用 直接内存vs堆内存 池化vs非池化 组成 常用写入方法 扩容 读取 retain&release slice 其他拷贝方式 duplicate& copy&CompositeByteBuf Unpooled netty中用于进行信息承载和交流的类叫做ByteBuf&#xff0c;从名字可以看出这是Byte的缓…

【025】C++对C的扩展之引用(reference)详解

C对C的扩展 引言一、struct类型增强二、bool类型关键字三、引用&#xff08;reference&#xff09;3.1、普通变量的引用3.2、数组的引用3.3、指针变量的引用3.4、函数的引用3.5、引用作为函数的参数3.6、引用作为函数的返回值类型3.7、常引用 四、引用的典型应用场景五、引用在…

3D绘制爱心(python)

目录 图像绘制代码结果显示参考 图像绘制代码 import time import numpy as np import matplotlib.pyplot as pltclass Guess:def __init__(self, bbox(-1.5, 1.5), resolution50, lines20, scale1.2) -> None:"""bbox: 控制画格的大小resolution: 控制爱心…

6. WebGPU 纹理(Textures )

在本文中&#xff0c;我们将介绍纹理的基础知识。在之前的文章中&#xff0c;我们介绍了 将数据传递到着色器的主要方法&#xff0c;它们是inter-stage variables, uniforms, storage-buffers, and vertex-buffers。将数据传递到着色器的最后一种主要方式是纹理。 纹理通常表示…

北宋文坛伯乐的传承关系

北宋的科学文化水平达到了古代最高峰&#xff0c;文化繁荣&#xff0c;名人辈出&#xff0c;涌现出了一大批大文豪&#xff0c;文坛领袖&#xff0c;词派宗祖等大师级的人物。例如&#xff0c; “宰相词人”晏殊、“两宋三百年来第一人”的范仲淹、“唐宋散文八大家”中的欧阳修…

java版本工程项目管理系统源码-简洁+好用+全面-工程项目管理

​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 ​系统定义 工程项目管理企业不直接与该工程项目的总承包企…

swagger实现在线接口文档

一、前言 之前换了新的单位后&#xff0c;单位的项目有使用到swagger&#xff0c;那个时候觉得这个好方便&#xff0c;后面是建立在他们搭建好的基础上使用一些swagger的注解&#xff0c;但一直想要自己去实现&#xff0c;奈何没有机会&#xff0c;这次机会终于来了&#xff0…

《楚天法治》期刊简介及投稿邮箱

《楚天法治》期刊简介及投稿邮箱 《楚天法治》杂志为半月刊&#xff0c;是一本以关注法制热点、推进法治建设、促进法治社会和谐发展为宗旨的法制类专业期刊。 主管单位&#xff1a;湖北日报传媒集团 主办单位&#xff1a;湖北日报楚天传媒&#xff08;集团&#xff09;有限…

解析kubernetes部署:微信配置文件部署

微信安全配置文件 以下两步二选一 一、暂时没有微信配置文件 1、创建configmap kubectlcreateconfigmapweixin-config--from-file/opt/kubernetes/weixin/weixin-mp.txt--namespacens-javashop 2、创建微信配置文件service(执行如下命令) kubectlcreate-f/opt/kubernetes/weix…

魅族20 INFINITY首销在即:比魅族20 Pro贵2200元,究竟有啥区别?

这两天又有一款高端手机要开售了&#xff0c;这款手机就是魅族20 INFINITY无界版&#xff0c;手机其实早早就已经发布&#xff0c;只不过一直没开售。从配置来说&#xff0c;这款手机也是采用了骁龙8 Gen2芯片&#xff0c;目前只有12GB256GB版一个规格&#xff0c;和魅族20 Pro…

WPF开发txt阅读器7:自定义文字和背景颜色

文章目录 添加控件具体实现代码说明 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定书籍管理系统&#x1f48e;用树形图管理书籍 添加控件 除了字体、字体大小之外&#xff0c;文字和背景颜色也会影响阅读观感&#xff0c…