机器人路径规划之RRT算法
关注:决策智能与机器学习,深耕AI脱水干货
作者:矮脚兽 来源:知乎
专栏地址:https://www.zhihu.com/column/c_1278371819016101888
如需转载,请联系作者
编者按:RRT是路径规划的重要基础算法之一,本文介绍了基本原理和实现过程,附带全部源码,具有很好的参考价值。
1. 基本原理
RRT(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算法相关推荐
- 【规划】RRT*算法图解
尽管RRT算法是一个相对高效率,同时可以较好的处理带有非完整约束的路径规划问题的算法,并且在很多方面有很大的优势,但是RRT算法并不能保证所得出的可行路径是相对优化的.因此许多关于RRT算法的改进也致 ...
- 灭火机器人路径规划matlab_灭火机器人路径规划研究
灭火机器人路径规划研究 王艳春 ; 马驰 ; 赵鑫 ; 郝玲 ; 张婷 [期刊名称] <信息通信> [年 ( 卷 ), 期] 2018(000)001 [摘要] 随着社会的需求和技术的快速 ...
- 多机器人路径规划的代码_泛在电力物联网 | 基于IACOABC 算法的变电站巡检机器人路径规划...
区块链 | 方 响等 分布式新能源接入下的区块链共识机制研究 区块链 | 颜 拥等 基于区块链的电力数据保全应用研究 区块链 | 能源互联网中的区块链应用:优势.场景与案例 <浙江电力>2 ...
- matlab蚁群算法 路径规划,基于蚁群算法的机器人路径规划MATLAB源码
基于蚁群算法的机器人路径规划MA TLAB源码 使用网格离散化的方法对带有障碍物的环境建模,使用邻接矩阵存储该环境,使得问题转化为蚁群算法寻找最短路径. function [ROUTES,PL,Tau ...
- a算法和a*算法的区别_机器人路径规划算法,全局路径规划与局部路径规划究竟有哪些区别?...
若步智能 移动这一简单动作,对于人类来说相当容易,但对机器人而言就变得极为复杂,说到机器人移动就不得不提到路径规划,路径规划是移动机器人导航最基本的环节,指的是 ...
- 机器人路径规划_人工蜂群算法
机器人路径规划_人工蜂群算法 原理 ABC(Artificial BeesColony)算法最先由Basturk等人提出并应用于函数优化问题,蜂群采蜜行为与函数优化问题对应关系如表1所示.由表1可知, ...
- 扫地机器人路径规划算法
路径规划算法 路径规划技术是扫地机器人研究的核心内容之一,机器人定位与环境地图构建(后面雷锋网专栏将会更新)就是为路径规划服务的.所谓机器人路径规划技术,就是机器人根据自身传感器对环境的感知,自行规划 ...
- 栅格法路径算法C语言,基于地图栅格与QPSO算法结合的机器人路径规划方法与流程...
本发明属于机器人路径规划领域,提出一种基于地图栅格与QPSO结合的机器人路径规划方法. 背景技术: 移动机器人路径规划是寻找一条无碰撞的可行路径问题的方法.近些年,群智能优化算法逐渐成为移动机器人路径 ...
- 【路径规划】基于matlab Hybrid A_Star算法机器人路径规划【含Matlab源码 1390期】
⛄一.A_star算法简介 1 A Star算法及其应用现状 进行搜索任务时提取的有助于简化搜索过程的信息被称为启发信息.启发信息经过文字提炼和公式化后转变为启发函数.启发函数可以表示自起始顶点至目标 ...
- 智能仿生算法在机器人路径规划的应用综述
智能仿生算法在机器人路径规划的应用综述 1 绪论 1.1 机器人路径规划方法 路径规划是移动机器人导航中最重要的技术之一. 对于移动机器人而言,路径规划就是解决特定工作环境和任务要求下的路径优选问题, ...
最新文章
- python的切片和索引是什么_NumPy 切片和索引
- easyui treegrid php,easyUI TreeGrid
- Linux Select
- 强力推荐几种多媒体播放器方案(jQuery、Flash、HTML5)
- 深度学习(六十九)darknet 实现实验 Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffma
- python怎么打开笔记本无线网络开关_如何轻松搞定 笔记本搜不到WIFI信号问题
- 20190917:(leetcode习题)将有序数组转换为二叉搜索树
- android 点击,触摸事件
- 解读Unity中的CG编写Shader系列二
- 太极发送卡片软件_QQxml卡片消息发送-防撤回等等安卓QQ插件Notified-支持太极框架 -发送QQ卡片消息...
- 读《谁说大象不能跳舞》
- 透过分布地图,看我中华大地!
- 千万级规模高性能、高并发的网络架构经验分享
- Halcon找圆系列(4)测量圆直径/半径的方法之暴力拟合法 vs 测量工具法
- AStar路径规划算法
- WS2812原理及实现
- 情人节程序员用HTML网页表白【全屏3D相册】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
- c语言见习报告,专业见习报告(汉语言文学)
- jQuery基础二DOM操作
- pandas--数据预处理
热门文章
- 柔性电子综述2014:Wearable Electronics and Smart Textiles 可穿戴电子设备
- 邻接矩阵转换为邻接表;邻接表转换为邻接矩阵
- win7旗舰版上装VS2010错误(提示:miicrosoft 应用程序报告[安装失败])
- 前端导出 pdf 分页带表头,导出pdf 不分页
- 怎样用matlab拟合,怎么用用matlab拟合两条直线
- WLT8016:模组通信调试
- 黑苹果win双系统还原四叶草引导(Windows EFI分区)
- Android代码中设置横屏
- java ioutils 写入文件_IOUtils和FileUtils的学习笔记
- 鸟哥的 linux 的私房菜 基础学习篇,鸟哥的 Linux 私房菜 -- 基础学习篇