探索informed - RRT*(RRT Family)全局最优轨迹规划算法
informed-RRT*(RRT Family)全局最优轨迹规划算法# 机器人轨迹规划(路径规划)#RRT #RRT-Connect 双向RRT#RRT* # iRRT*//. 可快速自定义不同维度的栅格地图;//. code模块化编写&编程规范可有助于和进一步扩展和创新以及与其它算法联仿!!在机器人领域,轨迹规划(也就是路径规划)一直是个热门且关键的话题。
informed-RRT*(RRT Family)全局最优轨迹规划算法 # 机器人轨迹规划(路径规划) #RRT #RRT-Connect 双向RRT #RRT* # iRRT* //. MATLAB coding //. 可快速自定义不同维度的栅格地图; //. code模块化编写&编程规范可有助于和进一步 扩展和创新以及与其它算法联仿 ! ! (RRT family): 1. RRT code; 2. RRT_Connect code; 3. RRT* code; 4. informed-RRT* code;

在机器人领域,轨迹规划(也就是路径规划)一直是个热门且关键的话题。今天咱们就来聊聊RRT家族里的informed - RRT*算法,同时看看与之相关的其他RRT系列算法,还会穿插一些MATLAB代码示例哦。
RRT家族成员初览
RRT家族里有多个成员,像RRT、RRT - Connect(双向RRT )、RRT以及我们重点要说的informed - RRT 。每个成员都有其独特的优势和适用场景。
RRT算法
RRT算法的核心思想比较简单直观,它通过随机采样在搜索空间中逐步构建一棵搜索树。下面是一段简单的RRT MATLAB代码示例(这里只是示意关键部分,并非完整可运行代码):
% 初始化树,根节点为起始点
tree = [start_point];
while ~goal_reached
% 随机采样一个点
sample = sample_free_space();
% 在树中找到距离采样点最近的节点
nearest = nearest_neighbor(tree, sample);
% 从最近节点向采样点扩展一段距离
new_point = steer(nearest, sample);
if collision_free(new_point)
% 将新点添加到树中
tree = [tree; new_point];
if near_goal(new_point)
goal_reached = true;
end
end
end
这段代码中,samplefreespace函数负责在自由空间中随机采样,nearestneighbor找到树中离采样点最近的节点,steer从最近节点向采样点扩展,collisionfree判断新点是否在障碍物区域,near_goal判断是否接近目标点。RRT算法能快速探索空间,但找到的路径不一定是最优的。
RRT - Connect(双向RRT )
双向RRT从起始点和目标点同时开始构建搜索树,这大大加快了搜索速度。代码实现上和RRT类似,但需要维护两棵树。
% 初始化起始树和目标树
start_tree = [start_point];
goal_tree = [goal_point];
while ~trees_connected
% 随机采样一个点
sample = sample_free_space();
% 在起始树中找到距离采样点最近的节点
nearest_start = nearest_neighbor(start_tree, sample);
% 在目标树中找到距离采样点最近的节点
nearest_goal = nearest_neighbor(goal_tree, sample);
% 从起始树的最近节点向采样点扩展一段距离
new_start_point = steer(nearest_start, sample);
% 从目标树的最近节点向采样点扩展一段距离
new_goal_point = steer(nearest_goal, sample);
if collision_free(new_start_point) && collision_free(new_goal_point)
% 将新点添加到相应树中
start_tree = [start_tree; new_start_point];
goal_tree = [goal_tree; new_goal_point];
if trees_connected(start_tree, goal_tree)
trees_connected = true;
end
end
end
这里多了一棵从目标点开始构建的树,通过同时扩展两棵树,增加了相遇的概率,从而更快找到路径。
RRT*算法
RRT*在RRT的基础上增加了重布线(rewiring)机制,它能在构建树的过程中不断优化路径,逐渐找到更优解。
% 初始化树,根节点为起始点
tree = [start_point];
while ~goal_reached
% 随机采样一个点
sample = sample_free_space();
% 在树中找到距离采样点最近的节点
nearest = nearest_neighbor(tree, sample);
% 从最近节点向采样点扩展一段距离
new_point = steer(nearest, sample);
if collision_free(new_point)
% 寻找新点附近的节点集合
nearby = nearby_nodes(tree, new_point);
% 从附近节点集合中找到到新点代价最小的节点
best_nearby = best_parent(nearby, new_point);
% 将新点连接到代价最小的节点
tree = [tree; new_point];
% 重布线
for i = 1:size(nearby, 1)
if cost(nearby(i, :), new_point) < cost(nearby(i, :), nearest)
% 重新连接节点
tree = rewire(tree, nearby(i, :), new_point);
end
end
if near_goal(new_point)
goal_reached = true;
end
end
end
这段代码中,nearbynodes找到新点附近的节点,bestparent从附近节点中找代价最小的节点来连接新点,rewire进行重布线操作,不断优化树的结构,使路径更优。
informed - RRT*算法
informed - RRT 是在RRT基础上进一步优化的算法,它利用目标信息来引导搜索,从而更快地找到全局最优解。它通过在目标点周围定义一个椭圆区域,在这个区域内进行更密集的采样,提高找到最优路径的效率。
% 初始化树,根节点为起始点
tree = [start_point];
% 计算起始点到目标点的距离
distance_to_goal = norm(start_point - goal_point);
% 根据距离计算椭圆参数
a = distance_to_goal;
b = distance_to_goal;
while ~goal_reached
% 在椭圆区域内采样
sample = sample_ellipse(a, b, goal_point);
% 在树中找到距离采样点最近的节点
nearest = nearest_neighbor(tree, sample);
% 从最近节点向采样点扩展一段距离
new_point = steer(nearest, sample);
if collision_free(new_point)
% 寻找新点附近的节点集合
nearby = nearby_nodes(tree, new_point);
% 从附近节点集合中找到到新点代价最小的节点
best_nearby = best_parent(nearby, new_point);
% 将新点连接到代价最小的节点
tree = [tree; new_point];
% 重布线
for i = 1:size(nearby, 1)
if cost(nearby(i, :), new_point) < cost(nearby(i, :), nearest)
% 重新连接节点
tree = rewire(tree, nearby(i, :), new_point);
end
end
if near_goal(new_point)
goal_reached = true;
end
end
end
这里的sample_ellipse函数在定义的椭圆区域内采样,相比RRT*随机采样,它能更有针对性地向目标区域搜索,大大提高了找到全局最优路径的速度。
MATLAB编码优势
使用MATLAB进行这些算法的编码有不少好处。比如说,我们可以快速自定义不同维度的栅格地图。在代码编写上采用模块化方式,并且遵循编程规范,这对于算法进一步扩展和创新非常有帮助,而且便于和其他算法联合仿真。例如,我们可以把地图生成、碰撞检测、路径搜索等功能封装成不同的函数模块,这样无论是修改算法细节还是与其他算法结合,都变得更加容易。

总之,RRT家族的这些算法各有千秋,informed - RRT*凭借其独特的搜索策略在寻找全局最优轨迹规划上有着出色的表现,而MATLAB为我们实现和研究这些算法提供了一个便捷的平台。希望今天的分享能让大家对这些算法有更深入的了解。


DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)