关注:决策智能与机器学习,深耕AI脱水干货

作者:矮脚兽  来源:知乎

专栏地址:https://www.zhihu.com/column/c_1278371819016101888

如需转载,请联系作者

编者按:RRT是路径规划的重要基础算法之一,本文介绍了基本原理和实现过程,附带全部源码,具有很好的参考价值。

1. 基本原理

RRT(Rapidly-Exploring Random Trees)快速随机扩展树,是一种单一查询路径规划算法.其基本原理如下.

Rapidly-Exploring Random Trees

首先,在构型空间内随机(一般使用均匀分布)生成一个节点  .然后在已知的路径中找到和  距离最短的节点  ,在线段  和  找一个点  ,使得  和  的距离为step_size.最后检测  是否碰到障碍物,如果碰到则舍弃这个节点.

重复上述过程,直到路径上最后一个节点距离目标位置在一定范围内,则找到了我们最终的路径.

2. 代码运行结果

RRT Algorithm

3. 关键C++代码剖析

一共新建了两个类,一个用来创建节点,一个用来运行RRT算法:

class node {
private:float x, y;                // 节点坐标vector<float> pathX, pathY;// 路径node* parent;              // 父节点float cost;
public:node(float _x, float _y);float getX();float getY();void setParent(node*);node* getParent();
};class RRT {
private:node* startNode, * goalNode;        // 起始节点和目标节点vector<vector<float>> obstacleList; // 障碍物vector<node*> nodeList;             // float stepSize;                     // 步长
public:RRT(node*, node*, const vector<vector<float>>&, float , int);node* getNearestNode(const vector<float>&);bool collisionCheck(node*);vector<node*> planning();
};

在RRT中的planning中生成随机的节点并最终形成路径:

while (1) {// 生成一个随机位置vector<float> randomPosition;if (goal_dis(goal_gen) > goal_sample_rate) { // 这里可以优化成直接用节点来表示float randX = area_dis(goal_gen);float randY = area_dis(goal_gen);randomPosition.push_back(randX);randomPosition.push_back(randY);}else { // 找到了目标,将目标位置保存randomPosition.push_back(goalNode->getX());randomPosition.push_back(goalNode->getY());}// 找到和新生成随机节点距离最近的节点node* nearestNode = getNearestNode(randomPosition);// 利用反正切计算角度,然后利用角度和步长计算新坐标float theta = atan2(randomPosition[1] - nearestNode->getY(), randomPosition[0] - nearestNode->getX());node* newNode = new node(nearestNode->getX() + stepSize * cos(theta), nearestNode->getY() + stepSize * sin(theta));newNode->setParent(nearestNode);if (!collisionCheck(newNode)) continue;nodeList.push_back(newNode);// 画出路径line(background,Point(static_cast<int>(newNode->getX() * imageResolution), static_cast<int>(newNode->getY() * imageResolution)),Point(static_cast<int>(nearestNode->getX() * imageResolution), static_cast<int>(nearestNode->getY() * imageResolution)),Scalar(0, 255, 0),10);count++;imshow("RRT", background);waitKey(5);if (sqrt(pow(newNode->getX() - goalNode->getX(), 2) + pow(newNode->getY() - goalNode->getY(), 2)) <= stepSize) {cout << "The path has been found!" << endl;break;}
}

主函数里主要是设置障碍物、起始位置和目标位置并调用RRT规划函数:

int main(int argc, char* argv[]) {// 障碍物,前两个数表示圆心坐标,最后一个数表示半径vector<vector<float>> obstacleList{{7, 5, 1},{5, 6, 2},{5, 8, 2},{5, 10, 2},{9, 5, 2},{11, 5, 2}};// 起始点和目标点node* startNode = new node(2.0, 2.0);node* goalNode = new node(14.0, 9.0);RRT rrt(startNode, goalNode, obstacleList, 0.5, 5);rrt.planning();return 0;
}

代码已上传Github,欢迎下载。

源码地址:https://github.com/kushuaiming/PathPalnning

历史精华好文

  • 专辑1:AI产品/工程落地

  • 专辑2:AI核心算法

  • 专辑3:AI课程/资源/数据

交流合作

请加微信号:yan_kylin_phenix注明姓名+单位+从业方向+地点,非诚勿扰。

机器人路径规划之RRT算法相关推荐

  1. 【规划】RRT*算法图解

    尽管RRT算法是一个相对高效率,同时可以较好的处理带有非完整约束的路径规划问题的算法,并且在很多方面有很大的优势,但是RRT算法并不能保证所得出的可行路径是相对优化的.因此许多关于RRT算法的改进也致 ...

  2. 灭火机器人路径规划matlab_灭火机器人路径规划研究

    灭火机器人路径规划研究 王艳春 ; 马驰 ; 赵鑫 ; 郝玲 ; 张婷 [期刊名称] <信息通信> [年 ( 卷 ), 期] 2018(000)001 [摘要] 随着社会的需求和技术的快速 ...

  3. 多机器人路径规划的代码_泛在电力物联网 | 基于IACOABC 算法的变电站巡检机器人路径规划...

    区块链 | 方 响等 分布式新能源接入下的区块链共识机制研究 区块链 | 颜 拥等 基于区块链的电力数据保全应用研究 区块链 | 能源互联网中的区块链应用:优势.场景与案例 <浙江电力>2 ...

  4. matlab蚁群算法 路径规划,基于蚁群算法的机器人路径规划MATLAB源码

    基于蚁群算法的机器人路径规划MA TLAB源码 使用网格离散化的方法对带有障碍物的环境建模,使用邻接矩阵存储该环境,使得问题转化为蚁群算法寻找最短路径. function [ROUTES,PL,Tau ...

  5. a算法和a*算法的区别_机器人路径规划算法,全局路径规划与局部路径规划究竟有哪些区别?...

       若步智能                  移动这一简单动作,对于人类来说相当容易,但对机器人而言就变得极为复杂,说到机器人移动就不得不提到路径规划,路径规划是移动机器人导航最基本的环节,指的是 ...

  6. 机器人路径规划_人工蜂群算法

    机器人路径规划_人工蜂群算法 原理 ABC(Artificial BeesColony)算法最先由Basturk等人提出并应用于函数优化问题,蜂群采蜜行为与函数优化问题对应关系如表1所示.由表1可知, ...

  7. 扫地机器人路径规划算法

    路径规划算法 路径规划技术是扫地机器人研究的核心内容之一,机器人定位与环境地图构建(后面雷锋网专栏将会更新)就是为路径规划服务的.所谓机器人路径规划技术,就是机器人根据自身传感器对环境的感知,自行规划 ...

  8. 栅格法路径算法C语言,基于地图栅格与QPSO算法结合的机器人路径规划方法与流程...

    本发明属于机器人路径规划领域,提出一种基于地图栅格与QPSO结合的机器人路径规划方法. 背景技术: 移动机器人路径规划是寻找一条无碰撞的可行路径问题的方法.近些年,群智能优化算法逐渐成为移动机器人路径 ...

  9. 【路径规划】基于matlab Hybrid A_Star算法机器人路径规划【含Matlab源码 1390期】

    ⛄一.A_star算法简介 1 A Star算法及其应用现状 进行搜索任务时提取的有助于简化搜索过程的信息被称为启发信息.启发信息经过文字提炼和公式化后转变为启发函数.启发函数可以表示自起始顶点至目标 ...

  10. 智能仿生算法在机器人路径规划的应用综述

    智能仿生算法在机器人路径规划的应用综述 1 绪论 1.1 机器人路径规划方法 路径规划是移动机器人导航中最重要的技术之一. 对于移动机器人而言,路径规划就是解决特定工作环境和任务要求下的路径优选问题, ...

最新文章

  1. python的切片和索引是什么_NumPy 切片和索引
  2. easyui treegrid php,easyUI TreeGrid
  3. Linux Select
  4. 强力推荐几种多媒体播放器方案(jQuery、Flash、HTML5)
  5. 深度学习(六十九)darknet 实现实验 Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffma
  6. python怎么打开笔记本无线网络开关_如何轻松搞定 笔记本搜不到WIFI信号问题
  7. 20190917:(leetcode习题)将有序数组转换为二叉搜索树
  8. android 点击,触摸事件
  9. 解读Unity中的CG编写Shader系列二
  10. 太极发送卡片软件_QQxml卡片消息发送-防撤回等等安卓QQ插件Notified-支持太极框架 -发送QQ卡片消息...
  11. 读《谁说大象不能跳舞》
  12. 透过分布地图,看我中华大地!
  13. 千万级规模高性能、高并发的网络架构经验分享
  14. Halcon找圆系列(4)测量圆直径/半径的方法之暴力拟合法 vs 测量工具法
  15. AStar路径规划算法
  16. WS2812原理及实现
  17. 情人节程序员用HTML网页表白【全屏3D相册】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  18. c语言见习报告,专业见习报告(汉语言文学)
  19. jQuery基础二DOM操作
  20. pandas--数据预处理

热门文章

  1. 柔性电子综述2014:Wearable Electronics and Smart Textiles 可穿戴电子设备
  2. 邻接矩阵转换为邻接表;邻接表转换为邻接矩阵
  3. win7旗舰版上装VS2010错误(提示:miicrosoft 应用程序报告[安装失败])
  4. 前端导出 pdf 分页带表头,导出pdf 不分页
  5. 怎样用matlab拟合,怎么用用matlab拟合两条直线
  6. WLT8016:模组通信调试
  7. 黑苹果win双系统还原四叶草引导(Windows EFI分区)
  8. Android代码中设置横屏
  9. java ioutils 写入文件_IOUtils和FileUtils的学习笔记
  10. 鸟哥的 linux 的私房菜 基础学习篇,鸟哥的 Linux 私房菜 -- 基础学习篇