💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
本实验采用matlab使用栅格法进行常用路径规划算法(dijkstra算法)的实现以及可视化。本仿真系统主要由五个函数组成。第一个函数PlotGrid(map,start,goal)输入栅格矩阵,起始点,终止点得到包含终止点和起始点的二维栅格地图,第二个函数[x y]=Get_xy(distance,path,map),由路线的距离,具体路线,地图,得到具体路线的坐标,第三个函数Plot(distance,x,y)由路线的距离,具体路线的坐标在二维栅格图上画出具体路线,第四个函数W=G2D(map)由地图坐标矩阵得到邻接矩阵以供dijkstra算法使用,第五个函数
[Cost, Route] = Dijkstras( Graph, SourceNode, TerminalNode )是dijkstra的matlab实现,由节点地图,源节点和目标节点得到最短路径的值,具体路线,是整个实验的核心。最后为了满足随机生成18-20个障碍物,每个障碍物随机占据6-20个栅格的要求有创建了一个地图矩阵生成函数[Map]=creMap(),来生成一个符合要求的随机地图矩阵。
Dijkstra算法是一种用于在图中找到单一起点到其他所有点最短路径的经典算法。在自动导引搬运车(AGV, Automated Guided Vehicle)的路径规划问题中,Dijkstra算法可以用于在预先定义的地图或网络中找到从起始点到目标点的最短路径。下面,我将概述如何使用Dijkstra算法进行AGV路径规划的仿真与实现。
1. 定义地图或图
首先,你需要一个表示AGV工作环境的地图或图。这个图通常包括节点(表示位置或交叉点)和边(表示节点之间的可通行路径及其成本,如距离或时间)。这些边可以带有权重,表示通过该边的成本。
2. 初始化
- 创建一个优先队列(通常使用最小堆实现),用于存储待处理的节点,每个节点附带其到起点的最短距离估计。
- 创建一个数组或字典来存储每个节点到起点的最短已知距离。初始时,除了起点外,所有其他节点的距离都设置为无穷大。
- 初始化起点到自己的距离为0,并将其加入优先队列。
3. 算法过程
- 从优先队列中取出距离最小的节点(即当前找到的最短路径的终点)。
- 遍历该节点的所有邻接节点:
- 对于每个邻接节点,计算通过当前节点到达该邻接节点的总距离(当前节点的最短距离 + 邻接节点与当前节点之间的距离)。
- 如果计算出的总距离小于之前记录的该邻接节点的最短距离,则更新该邻接节点的最短距离,并将其加入或更新在优先队列中的位置。
- 重复步骤1和2,直到优先队列为空或目标节点已被处理。
4. 仿真与实现
编程实现
- 选择编程语言:Python、Java、C++等均可。Python因其简洁的语法和丰富的库支持(如
heapq
用于实现优先队列)而常被选择。 - 数据结构:使用字典来存储节点和它们的邻接节点及其权重,使用列表或
heapq
来实现优先队列。 - 算法实现:按照上述步骤编写Dijkstra算法的代码。
仿真
- 可视化:可以使用matplotlib、pygame或专门的图形界面库来绘制地图和路径。
- 交互:可以添加用户输入来指定起点和终点,并显示计算出的最短路径。
5. 注意事项
- 确保地图或图正确反映了AGV的实际工作环境,包括所有可能的路径和障碍物。
- 考虑AGV的动力学限制,如最大转向角、加速度和速度限制,这些可能需要在路径规划后进行路径平滑处理。
- 实时性:对于需要快速响应的环境,优化算法以减少计算时间是很重要的。
通过上述步骤,你可以使用Dijkstra算法为自动导引搬运车(AGV)实现有效的路径规划仿真与实现。
结论为:
Dijkstra算法可以有效的算出点到点的最短路径,并反馈给机器人进行路径规划,此中方法用于实践需要先得到环境地图,才能进行规划,且在拐点数量与其他算法如蚁群算法,人工势场法及其改进算法相比并不占优势,拐点数量的增加必然会导致机器人移动的连续性和速度。Dijkstra 算法核心是以某个顶点为起点逐渐向外扩展,直到达到目标顶点为止,每次扩展都会尝试路径中所有相邻的顶点。虽然该算法能得到最短路径的最优解,但是它要计算所有点之间的路径,进而运算的效率比较低。由前面的dijkstra算法原理可知,其时间复杂度为O(n2)、A*算法的时间复杂度为O(n)、floyd算法为O(n3)。但与其相比A*算法仍未脱离贪心算法的范畴,并且往往也会同样陷入到产生局部最优的陷阱与问题中,在确定启发函数 h(n)时也存在着相应的难度与问题。
📚2 运行结果
部分代码:
%%%%%%%%%%%%%%%%%%%%%地图绘制函数%%%%%%%%%%%%%%%%%%%%%
function PlotGrid(map,start,goal)
n = size(map,1);
b = map;
b(end+1,end+1) = 0;
figure;
colormap([0 0 0;1 1 1])
pcolor(b); % 赋予栅格颜色
set(gca,'XTick',10:10:n,'YTick',10:10:n); % 设置坐标
axis image xy
% displayNum(n);%显示栅格中的数值.
text(start(1)+0.5,start(2)+0.5,'START','Color','red','FontSize',10);%显示start字符
text(goal(1)+0.5,goal(2)+0.5,'GOAL','Color','red','FontSize',10);%显示goal字符
hold on
%pin strat goal positon
scatter(start(1)+0.5,start(2)+0.5,'MarkerEdgeColor',[1 0 0],'MarkerFaceColor',[1 0 0], 'LineWidth',1);%start point
scatter(goal(1)+0.5,goal(2)+0.5,'MarkerEdgeColor',[0 1 0],'MarkerFaceColor',[0 1 0], 'LineWidth',1);%goal point
hold on
end
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
[1]吴晓雨.物流系统中AGV路径规划算法的研究[D].吉林大学[2024-08-27].DOI:CNKI:CDMD:2.2004.100664.
[2]王玉林,魏国亮,鲍海锋.基于Dijkstra算法的磁带导引AGV路径规划[J].农业装备与车辆工程, 2018, 56(3):4.DOI:CNKI:SUN:SDLG.0.2018-03-015.
🌈4 Matlab代码、文档下载
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取