C++大作业项目报告.docx

上传人:李医生 文档编号:6336958 上传时间:2020-10-25 格式:DOCX 页数:17 大小:236.69KB
返回 下载 相关 举报
C++大作业项目报告.docx_第1页
第1页 / 共17页
C++大作业项目报告.docx_第2页
第2页 / 共17页
C++大作业项目报告.docx_第3页
第3页 / 共17页
C++大作业项目报告.docx_第4页
第4页 / 共17页
C++大作业项目报告.docx_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《C++大作业项目报告.docx》由会员分享,可在线阅读,更多相关《C++大作业项目报告.docx(17页珍藏版)》请在三一文库上搜索。

1、;.C+大作业项目报告 AGV 路径规划与运行仿真软件设计小组成员:日期: 2015 年 6 月 16 日指导老师:;.;.目录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 运行窗口114.3 动态显示窗口124.5 改变地图,改变AGV 参数运行。13五、程序

2、设计小结155.1 程序设计的缺陷和不足155.2 设计中遇到的困难15六、参考资料16七、源程序及相关文件16八、各小组成员个人报告16;.;.一、课题背景1.1 案例背景AGV(自动导引车 )由于运动灵活,被广泛用于生产车间物料的搬运。由于单机搬运能力有限,实践中经常需要由多台AGV 同时进行搬运。 由于 AGV 一般无法感知全局信息,为避免多 AGV 发生碰撞并提高 AGV 搬运效率,多台 AGV 需要与上位机调度系统进行通信并依据调度指令运行。1.2 问题描述在已知 AGV运行的地图以及AGV运行速度前提下,采用C+编写单台AGV路径规划的最短路径算法,并动态显示AGV 的运行。1.3

3、 任务目标针对 AGV 搬运调度需求开发一套 AGV 路径规划与运行监控仿真软件, 合理规划单台 AGV 运行路径并动态显示运行轨迹。1.4 具体分析由以上介绍可知, AGV 在工业生产中有着很广泛的应用,对 AGV 导引程序的研究是有着很强实际意义的。 要完成一个完整的 AGV路径规划程序,就要考虑地图, AGV,和路径三个方面的问题。 而其中, 路径又是最为重要的。 本程序要求仿真显示, 所以显示部分也是重点。若制作多台 AGV 的路径规划程序,还应当考虑到路径的重叠,以避免碰撞产生。;.;.二、系统设计2.1 类体系设计包含了两个基类 CFixedMap 和 CAGV,一个单一继承的派生

4、类 CPathPlan 和一个多重派生类 CAGVShow。2.2 类定义及函数描述各个类的成员以及成员函数的作用如注解所示。(1).基类: CFixedMapclass CFixedMapstructCoordinateint x;int y;int num;/ 记录点的结构体struct combpint x1,y1;int x2,y2;/ 连通点坐标struct Combnameint num1;int num2;/ 连通点名public:int mVexNum;/顶点数int mEdgNum;/边数double mMatrixMAXMAX;/邻接矩阵Combname combMAX;/

5、 连通点名combp cpMAX;/ 连通点坐标Coordinate mVexsMAX;/顶点集合int getx(int n1);int gety(int n2);.;.void Input();/ 以文件方式输入地图信息void ShowMap();/easyx 显示地图;(2).基类 CAGVclass CAGVint speed;/AGV 速度int width;/AGV 宽度int length;/AGV 长度public:CAGV();int getl();/ 返回 AGV 长度int getw();/ 返回 AGV 宽度int gets();/ 返回 AGV 速度;(3).单一继

6、承类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 CAGVpublic:#define k (abs(y2-y1

7、)/(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 程序流程图;.;.开始否自动设置AGV?手动输入 AGV信息是AGV 信息设定否自动载入地图?手动输入地图文件名是载入地图文件(文本)否路径文件输出多次演示?是显示地图路径规划动态显示否结束?是显示地图路径规划动态显示路径文件输出结束;.;.三、程序重点解析3.1 文本文档读入地图信息在最初的设计中, 为了方便调试与信息录入, 地图文本做的粗糙不堪, 但这确实为程序编写提供了许多便利。如图,优化前

8、的地图文件:可以看出, 全都是由数字组成, 如果不了解程序, 就不知道文件包含了什么, 应该怎样修改。在优化时, 加入了大量提示信息, 由此也出现了问题。 由于文件流输入无法判断输入的信息类型, 造成了将提示信息录入而无法得到正确信息的错误。为解决这一问题,我们使用了一个简单的手段,即将提示信息与地图信息分隔,并分别录入,然后不再处理提示信息。改进后的地图文本如下:程序中的相应代码:/ 以文件方式输入地图信息void CFixedMap:Input()int panju;char fname10=map2.txt;coutpanju;if(panju=2)coutfname;.;.ifstre

9、am 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;double min;.;.for(v=0;vmVexNum;v+)/ 初始化 S,dist,pathsv=0;/0 表示未求出最短路径distv=mMatrixv0v;/ 开始时假定为最短路径i

11、f(distvmaxD & v!=v0)pathv=v0;/ 直达情况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 & distwmin)/ 点 w 不属于 s 集且离 v0 更近v=w;/ 经点 w 中转min=distw;sv=1;/ 将 v 并入 S,由 v0 到达 v 点最短距离为m

12、in, 假设由 v0 到 v 再由 v 到其余各点,更新当前最后一个点及距离 for(j=0;jmVexNum;j+)if(sj=0 & (min+mMatrixvjdistj)/ 如果多经过一个点v到点j 的距离更短,更新distj=min+mMatrixvj;pathj=v;/ 点的序号3.3 动态显示部分问题主要是集中在用 easyx 画图上,从直线到斜线到反向直线和任意一个线段,全部用循环和间歇控制, 主要工作就是每隔一个间隔绘制一定的图像使得间隔连起来的一个整体是一个顺畅的连贯的运行图。说起来简单可实践起来哪怕是循环中画图和清空的顺序不对,显示的都会是一个完全不像样的运行线路,所以整

13、个程序部分对逻辑的要求比较严格,每个细节都要重复重复地检查和试运行才能达到不出错的地步。寻找错误几乎成了整个程序设计的主要工作,不过也是在告诉我们,编好程序不一定要多么高级,而是少犯错。程序代码过多,参见cpp 文件。;.;.四、程序运行结果展示4.1 地图文件;.;.4.2 运行窗口;.;.4.3 动态显示窗口4.4fops.txt 路径输出;.;.4.5 改变地图,改变AGV 参数运行。(1) .地图文件(2) .运行窗口,动态显示,fops 路径文件输出。;.;.;.;.五、程序设计小结5.1 程序设计的缺陷和不足( 1) 地图输入的方式虽然采用了文件流,但是实用价值仍然不高,负责输入的

14、组员曾经考虑过使用图片载入,但查阅相关资料后因为难度较大而放弃。(2)算法的革新未能实现,直接使用了比较简单和落后的Dijkstra 算法,程序的处理能力并不强。( 3) 多台 AGV 运行未能实现。 后期优化的同时, 尝试将 1 台 AGV增加到两台, 但是由于动态显示部分程序的特殊性未能完成。( 4) 动态显示比较流畅,然而利用sleep 方法完成的显示部分会将整个程序冻结,计时器没能使用,是一个遗憾。(5)程序的界面不够友好,由于前期各项工作完成的进度不如人意,程序的MFC改编也未能完成。5.2 设计中遇到的困难主要是小组成员各个部分的衔接问题。大家各自完成后,程序的整合比想象中困难许多,浪费了大量的时间。 因为每个人使用变量的习惯不同, 几个部分一开始完全分离, 往往是一个小问题就要排查半天才能解决。;.;.六、参考资料1.Visual C+程序设计2.Sunshine 的 博客图的邻接矩阵存储的C 语言实现。3 豆丁网最短路径的Dijkstra 算法。4.easyx 教程。七、源程序及相关文件见所传电子稿。八、各小组成员个人报告单独成份,见所传电子稿。;.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1