【L3】深蓝学院-高飞老师 移动机器人规划笔记 基于采样的最优路径规划算法&进阶


在这里插入图片描述

Preliminaries

基于采样的方法与基于搜索的算法不同,基于搜索的规划算法主要适用于低维空间的路径规划,也就是前两章布置的hw所处的一个环境之中,但是在高维空间往往会出现维数灾难。因此,基于随机采样的路径规划方法出现,以解决这样的问题。基于采样的路径规划方法不去苛求完备的c-space构造,更多的关注点在是否碰撞上,采样的方法不具备完备性,但是可以通过概率完备性趋近或替代完备性。

介绍几个概念:

  • 概率完备性:随着采样样本不断增加,如果存在解,则一定能找到可行解。
  • 渐进最优: 随着采样个数趋近于无穷,一定会无限接近找到最优解。
  • Anytime:即时,能很快找到一个可行解,然后不断增量优化。

大概的发展:
在这里插入图片描述
分类:
在这里插入图片描述

Probabilistic Road Map(PRM)

简介

PRM方法,顾名思义,是利用随机采样的方式在环境中建立网络图,将整个连续空间转换为离散空间的问题后,利用之前A*算法等基于搜索的算法在构筑好的离散空间路线图上寻找路径,这样可以提高路径规划的效率。整个算法也分为两个阶段:Learning Phase 和 Query Phase。

Learning Phase 学习阶段

  • 这个阶段即在C-space中先随机采样N个点,当然,要删除在障碍物内的点。
  • 随后,尝试连接各个点,如果连线超过一定距离或者出现碰撞,舍弃该连线。
  • 经过这样的操作后,得到了一个无碰撞的路线图。
    在这里插入图片描述

Query Phase 查询阶段

如上所述,有了路线图后,我们即可带入之前介绍的A*或Dijkstra算法等寻找始终点之间的最优路线。
在这里插入图片描述
在这里插入图片描述

  • 优点:概率完备性,相比于图搜索的比较高效(毕竟搜索的点少了很多)
  • 缺点:两点边界值问题,在状态空间上构建图,但不特别关心所生成路径,而且效率不高。

Trick

因为,极端复杂或高维空间中的碰撞检测十分耗时,为尽量避免碰撞检测,可以采用lazy collision-checking策略。

lazy collision-checking

在撒点和构建图的时候,不管碰撞问题。在搜索到路径之后,再删去发生碰撞的部分,重新搜索其他路径。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

Rapidly-exploring Random Tree 快速扩展随机数算法

简介

PRM是构建图结构,而RRT是构建树结构。从起始点开始在解空间中向目标点生长一棵树,来寻找可行解。

算法流程

算法的具体过程如下:

  1. 将起点和终点加入到树结构;
  2. 在构型空间中随机采样一个点 x r a n d x_{rand} xrand
  3. 在已有的树结构中找到距离这个随机点最近的点 x n e a r x_{near} xnear
  4. x n e a r x_{near} xnear连向 x n e w x_{new} xnew,并取一定步长,得到一个新的点 x n e w x_{new} xnew,如果从 x n e a r x_{near} xnear连接到 x n e w x_{new} xnew如果没有碰撞,则连接起来,将 x n e w x_{new} xnew加入到树结构;
  5. 如果 x n e w x_{new} xnew和目标点 x g o a l x_{goal} xgoal小于一定的距离,那么就尝试连接下 x n e w x_{new} xnew x g o a l x_{goal} xgoal,如果连接起来是无碰撞的,则找到目标点。否则则回到步骤2。

优点:

  • 比PRM相比:更倾向于去寻找从起点到终点的路径,而不是构建整个空间结构的图。

缺点:

  • 解不是优化的。
  • 在整个空间采样。
  • 不够高效,有很大提升空间。

缺点还是比较明显,尤其是解不是最优的,相当于是以搜索速度换取了最优性。随机选点选新点连线的时候,RRT单纯考虑了范围内最近点与新点的连接,这样的连接还是比较草率。

RRT*

简介

RRT算法中是将范围内最近的点 x n e a r x_{near} xnear连向 x n e w x_{new} xnew,RRT*搜索 x n e w x_{new} xnew附近的范围内的节点,挑选 x n e w x_{new} xnew经这些节点到初始点cost最小的情况,选取该点作为 x n e w x_{new} xnew的父节点,并且后续会有剪枝的操作帮助寻找最优路径。

改进的连线策略

如下图,原本依照RRT算法 x n e w x_{new} xnew是要连接到 x n e a r x_{near} xnear的,但是RRT*这里在 x n e w x_{new} xnew周围一定半径的范围中,搜索了所有的节点,并对 x n e w x_{new} xnew经这些节点到最初点cost进行计算,选取最小的作为 x n e w x_{new} xnew连接的父节点。
在这里插入图片描述
比如下图中 x n e a r x_{near} xnear恰好是cost最小的节点,即两点连接,
在这里插入图片描述

range的确定

在这里插入图片描述

rewire function 重连接操作

新加入了节点,相当于加入了解空间的新的信息,那么这个新的信息能否影响到已经建立的树结构呢?这就涉及到rewire function,重连接的操作了。
如下图,引入添加过 x n e w x_{new} xnew后,还是看刚才一定范围内的点,这里以 x 2 x_2 x2为例。
x 2 x_2 x2本来有一条经过 x 1 x_1 x1回溯起点的路径,但是添加过 x n e w x_{new} xnew后, x 2 x_2 x2本来有一条经过 x n e w x_{new} xnew回溯起点的路径明显更短,那么该操作就要将 x 2 x_2 x2的父节点换为 x n e w x_{new} xnew
在这里插入图片描述
在这里插入图片描述
相比于RRT算法找到终点就停止,RRT*算法找到路径之后还要继续进行优化,这也是为什么该算法可以一定程度上解决RRT解不是最优的问题。

一些改进的trick

  • Bias Sampling :设定一些概率,使得采样是向着目标点的。
  • Sample Rejection:在已有一个解的代价 c ∗ c^* c后,如果采样到一个点发现g+h已经大于 c ∗ c^* c,则舍弃这个采样点。
  • Branch-and-bound(Tree Pruning):同样,已有 c ∗ c^* c的情况下,如果tree的某一个支路到某一个节点时,它的g+h已经远远大于 c ∗ c^* c了,那就删除这个支路(不一定是好的)
  • Graph Sparsify:一个格子只留一个采样点,稀疏化(连续下不是最优的)。
  • Neightbor Query:k最近邻或范围查询,K-D tree和range tree等搜索方法。
  • Delay Collision Check:以某种顺序排序neighbours,提高效率(如果中途就找到想要的点的话)
  • Bi-directional:起点终点两棵树两个方向一起找,相互连接终止。
  • Condition Rewire:相当于先用RRT找到第一个解之后,再去做rewire。
  • Data Re-use:针对对称节点,碰撞信息的复用。

Kinodynamic-RRT*

思路

为了更贴合机器人运动学规律,将RRT*点和点之间的直线连接变换为运动学路径。
在这里插入图片描述

Anytime-RRT*

思路

机器人在走的时候,实时进行路径规划,更新路径。

Advanced Sampling-based Methods

Informed RRT*

用RRT*找到路径后,限制在路径周围的椭圆中采点(椭圆多次迭代不断收缩)
在这里插入图片描述

Cross-entropy motion planning

当一个轨迹生成之后,就在轨迹周围的区域进行采样,这几个点就构成了多高斯模型,采点后就生成了多条轨迹,然后对多个轨迹进行均值和方差的计算,作为新的多高斯分布,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其他变体

在这里插入图片描述

Implementation

Open Motion Planning Library

Open Motion Planning Library
Moveit with ROS
Tutorials
以上在机械臂场景中用的比较多。

在这里插入图片描述
以上是移动机器人相关的实现。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于粒子群算法的机械臂“3-5-3”时间轨迹规划的MATLAB完整代码,代码中包含了机械臂的运动学模型、目标函数和粒子群算法的实现。 ```matlab clc; clear; close all; % 机械臂运动学模型 function [x,y] = arm_kinematics(theta1,theta2,theta3) % 计算机械臂末端的位置 l1 = 1; l2 = 1; l3 = 1; x = l1*cos(theta1) + l2*cos(theta1+theta2) + l3*cos(theta1+theta2+theta3); y = l1*sin(theta1) + l2*sin(theta1+theta2) + l3*sin(theta1+theta2+theta3); end % 目标函数 function [time] = objective_function(theta) % 计算机械臂运动的轨迹长度 n = size(theta,2); path_length = 0; for i=1:n-1 [x1,y1] = arm_kinematics(theta(1,i), theta(2,i), theta(3,i)); [x2,y2] = arm_kinematics(theta(1,i+1), theta(2,i+1), theta(3,i+1)); path_length = path_length + sqrt((x2-x1)^2 + (y2-y1)^2); end % 计算机械臂运动的时间 time = path_length / 0.1; end % 粒子群算法 function [theta_best, fval_best] = particle_swarm_optimization() % 初始化粒子群 n = 3; % 机械臂数量 m = 20; % 粒子数量 theta = zeros(n, m); for i=1:m theta(:,i) = rand(n,1)*2*pi; end v = zeros(n, m); theta_best = theta; fval_best = zeros(1, m); for i=1:m fval_best(i) = objective_function(theta(:,i)); end [fval_min, index] = min(fval_best); theta_min = theta(:,index); % 粒子群迭代 w = 0.7298; % 惯性系数 c1 = 1.49618; % 个体学习因子 c2 = 1.49618; % 全局学习因子 max_iteration = 100; for iteration=1:max_iteration for i=1:m % 更新粒子速度和位置 v(:,i) = w*v(:,i) + c1*rand(n,1).*(theta_best(:,i)-theta(:,i)) + c2*rand(n,1).*(theta_min-theta(:,i)); theta(:,i) = theta(:,i) + v(:,i); % 边界处理 for j=1:n if theta(j,i) < 0 theta(j,i) = 0; elseif theta(j,i) > 2*pi theta(j,i) = 2*pi; end end % 更新个体最优解和全局最优解 fval = objective_function(theta(:,i)); if fval < fval_best(i) theta_best(:,i) = theta(:,i); fval_best(i) = fval; end if fval < fval_min theta_min = theta(:,i); fval_min = fval; end end end theta_best = theta_min; fval_best = fval_min; end % 测试 [theta_best, fval_best] = particle_swarm_optimization(); disp(['最短时间:', num2str(fval_best)]); disp(['最优关节角度:', num2str(theta_best)]); ``` 在运行该代码时,会输出机械臂的最短时间和最优关节角度。需要注意的是,该代码中的机械臂运动学模型和目标函数只适用于3个关节、长度相等的机械臂,如果需要适用于其他类型的机械臂,需要相应修改代码。同时,粒子群算法也有其局限性,可能无法得到全局最优解,需要根据具体情况选择合适的优化算法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值