1、1C+大作业项目报告AGV 路径规划与运行仿真软件设计小组成员: 日期:2015 年 6 月 16 日指导老师: 2目录C+大作业项目报告 1AGV 路径规划与运行仿真软件设计 1一、课题背景 31.1 案例背景 31.2 问题描述 31.3 任务目标 31.4 具体分析 3二、系统设计 42.1 类体系设计 42.2 类定义及函数描述 42.3 程序流程图 5三、程序重点解析 73.1 文本文档读入地图信息 73.2 Dijkstra 算法程序设计 83.3 动态显示部分 9四、程序运行结果展示 104.1 地图文件 104.2 运行窗口 104.3 动态显示窗口 114.5 改变地图,改变
2、 AGV 参数运行。 .12五、程序设计小结 145.1 程序设计的缺陷和不足 145.2 设计中遇到的困难 14六、参考资料 15七、源程序及相关文件 15八、各小组成员个人报告 153一、课题背景1.1 案例背景AGV(自动导引车)由于运动灵活,被广泛用于生产车间物料的搬运。由于单机搬运能力有限,实践中经常需要由多台 AGV 同时进行搬运。由于 AGV 一般无法感知全局信息,为避免多 AGV 发生碰撞并提高 AGV 搬运效率,多台 AGV 需要与上位机调度系统进行通信并依据调度指令运行。1.2 问题描述在已知 AGV 运行的地图以及 AGV 运行速度前提下,采用 C+编写单台 AGV路径规
3、划的最短路径算法,并动态显示 AGV 的运行。1.3 任务目标针对 AGV 搬运调度需求开发一套 AGV 路径规划与运行监控仿真软件,合理规划单台AGV 运行路径并动态显示运行轨迹。1.4 具体分析由以上介绍可知,AGV 在工业生产中有着很广泛的应用,对 AGV 导引程序的研究是有着很强实际意义的。要完成一个完整的 AGV 路径规划程序,就要考虑地图, AGV,和路径三个方面的问题。而其中,路径又是最为重要的。本程序要求仿真显示,所以显示部分也是重点。若制作多台 AGV 的路径规划程序,还应当考虑到路径的重叠,以避免碰撞产生。4二、系统设计2.1 类体系设计包含了两个基类 CFixedMap
4、和 CAGV,一个单一继承的派生类 CPathPlan 和一个多重派生类 CAGVShow。2.2 类定义及函数描述各个类的成员以及成员函数的作用如注解所示。(1).基类:CFixedMapclass CFixedMapstruct Coordinateint x;int y;int num;/记录点的结构体struct combpint x1,y1;int x2,y2;/连通点坐标struct Combnameint num1;int num2;/连通点名public:int mVexNum; / 顶点数int mEdgNum; / 边数double mMatrixMAXMAX; / 邻接矩
5、阵Combname combMAX; /连通点名combp cpMAX; /连通点坐标Coordinate mVexsMAX; / 顶点集合int getx(int n1);int gety(int n2);void Input();/以文件方式输入地图信息void ShowMap();/easyx 显示地图5;(2).基类 CAGVclass CAGVint speed; /AGV 速度int width; /AGV 宽度int length; /AGV 长度public:CAGV();int getl(); /返回 AGV 长度int getw(); /返回 AGV 宽度int gets(
6、); /返回 AGV 速度;(3).单一继承类 CPathPlanclass CPathPlan:public CFixedMappublic:int pathMAX; /存放最后一个点double distMAX; /存放路径距离int v0; /起始点int route40; /路径int rnum; /路径顶点数Coordinate rpointsMAX;/路径点集void MaptoGraph();void Dijstra();void Putpath();(4).多重继承类 CAGVShowclass CAGVShow:public CPathPlan,public CAGVpubl
7、ic:#define k (abs(y2-y1)/(abs(x1-x2)int a,b,c,d;int x1,x2,y1,y2; /AGV 实际坐标int i,j;int l,w,s; /对应类 CAGV 中的相关数据void show();2.3 程序流程图6开始AGV 信息设定自动设置 AGV?是自动载入地图?手动输入 AGV 信息手动输入地图文件名载入地图文件(文本)多次演示?否显示地图路径文件输出路径规划动态显示动态显示显示地图路径规划路径文件输出结束?结束是否是否是否7三、程序重点解析3.1 文本文档读入地图信息在最初的设计中,为了方便调试与信息录入,地图文本做的粗糙不堪,但这确实为
8、程序编写提供了许多便利。如图,优化前的地图文件:可以看出,全都是由数字组成,如果不了解程序,就不知道文件包含了什么,应该怎样修改。在优化时,加入了大量提示信息,由此也出现了问题。由于文件流输入无法判断输入的信息类型,造成了将提示信息录入而无法得到正确信息的错误。为解决这一问题,我们使用了一个简单的手段,即将提示信息与地图信息分隔,并分别录入,然后不再处理提示信息。改进后的地图文本如下:程序中的相应代码:/以文件方式输入地图信息void CFixedMap:Input()int panju;char fname10=“map2.txt“;coutpanju;if(panju=2)coutfnam
9、e;ifstream file(fname);char use1100;char use2100;char use3100;char use4100; /use 数组用来储存提示信息。fileuse1;filemVexNum; /端点个数fileuse2;filemEdgNum; /边数fileuse3;for(int i=0;imVexsi.nummVexsi.xmVexsi.y;fileuse4;for(i=0;icombi.num1combi.num2;file.close();3.2 Dijkstra 算法程序设计Dijkstra 算法主要就是查找和更新,开始时想过用指针来做,后来由于
10、跟地图的输入结合要用到 input 函数里的变量,于是就采用了用数组来储存距离和路径。在 Diikstra 算法中首先是初始化源点数组,然后就是查找其他到源点距离最近的点,然后就是将该点并入源点集,再就是更新,以上次并入的点为起点开始查找,直到遍历所有点。刷新每次查找后的最短距离并保存。代码如下:void Dijstra()coutv0;v0-;int sMAX;int v;int i;int j;int w;9double min;for(v=0;vmVexNum;v+) /初始化 S,dist,pathsv=0; /0 表示未求出最短路径distv=mMatrixv0v; /开始时假定为最
11、短路径if(distvmaxD /直达情况else pathv=-1; /无直达路径distv0=0; /初始时 v0 属于 s 集,v0 到 v0 路径最短sv0=1;for(i=1;imVexNum;i+) /假设由一个中转点到达会近些,验证。再假设由两个中转点到达会近些,验证。穷举min=maxD;for(w=0;wmVexNum;w+) /找一个最近到的点,下标装入 vif(sw=0 /经点 w 中转min=distw;sv=1; /将 v 并入 S,由 v0 到达 v 点最短距离为 min,假设由 v0 到 v 再由 v 到其余各点,更新当前最后一个点及距离for(j=0;jmVex
12、Num;j+)if(sj=0 pathj=v; /点的序号3.3 动态显示部分问题主要是集中在用 easyx 画图上,从直线到斜线到反向直线和任意一个线段,全部用循环和间歇控制,主要工作就是每隔一个间隔绘制一定的图像使得间隔连起来的一个整体是一个顺畅的连贯的运行图。说起来简单可实践起来哪怕是循环中画图和清空的顺序不对,显示的都会是一个完全不像样的运行线路,所以整个程序部分对逻辑的要求比较严格,每个细节都要重复重复地检查和试运行才能达到不出错的地步。寻找错误几乎成了整个程序设计的主要工作,不过也是在告诉我们,编好程序不一定要多么高级,而是少犯错。程序代码过多,参见 cpp 文件。 10四、程序运
13、行结果展示4.1 地图文件4.2 运行窗口114.3 动态显示窗口4.4 fops.txt 路径输出124.5 改变地图,改变 AGV 参数运行。(1 ) .地图文件(2 ) .运行窗口,动态显示, fops 路径文件输出。1314五、程序设计小结5.1 程序设计的缺陷和不足(1 ) 地图输入的方式虽然采用了文件流,但是实用价值仍然不高,负责输入的组员曾经考虑过使用图片载入,但查阅相关资料后因为难度较大而放弃。(2 ) 算法的革新未能实现,直接使用了比较简单和落后的 Dijkstra 算法,程序的处理能力并不强。(3 ) 多台 AGV 运行未能实现。后期优化的同时,尝试将 1 台 AGV 增加
14、到两台,但是由于动态显示部分程序的特殊性未能完成。(4 ) 动态显示比较流畅,然而利用 sleep 方法完成的显示部分会将整个程序冻结,计时器没能使用,是一个遗憾。(5 ) 程序的界面不够友好,由于前期各项工作完成的进度不如人意,程序的 MFC 改编也未能完成。5.2 设计中遇到的困难主要是小组成员各个部分的衔接问题。大家各自完成后,程序的整合比想象中困难许多,浪费了大量的时间。因为每个人使用变量的习惯不同,几个部分一开始完全分离,往往是一个小问题就要排查半天才能解决。15六、参考资料1.Visual C+程序设计2.Sunshine 的 博客 图的邻接矩阵存储的 C 语言实现 。3 豆丁网最短路径的 Dijkstra 算法 。4.easyx 教程。七、源程序及相关文件见所传电子稿。八、各小组成员个人报告单独成份,见所传电子稿。