C++大作业项目报告.docx
- 文档编号:8707044
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:168.47KB
C++大作业项目报告.docx
《C++大作业项目报告.docx》由会员分享,可在线阅读,更多相关《C++大作业项目报告.docx(14页珍藏版)》请在冰豆网上搜索。
C++大作业项目报告
C++大作业项目报告
——AGV路径规划与运行仿真软件设计
小组成员:
日期:
2015年6月16日
指导老师:
一、课题背景
1.1案例背景
AGV(自动导引车)由于运动灵活,被广泛用于生产车间物料的搬运。
由于单机搬运能力有限,实践中经常需要由多台AGV同时进行搬运.由于AGV一般无法感知全局信息,为避免多AGV发生碰撞并提高AGV搬运效率,多台AGV需要与上位机调度系统进行通信并依据调度指令运行。
1.2问题描述
在已知AGV运行的地图以及AGV运行速度前提下,采用C++编写单台AGV
路径规划的最短路径算法,并动态显示AGV的运行.
1.3任务目标
针对AGV搬运调度需求开发一套AGV路径规划与运行监控仿真软件,合理规划单台AGV运行路径并动态显示运行轨迹。
1。
4具体分析
由以上介绍可知,AGV在工业生产中有着很广泛的应用,对AGV导引程序的研究是有着很强实际意义的.要完成一个完整的AGV路径规划程序,就要考虑地图,AGV,和路径三个方面的问题。
而其中,路径又是最为重要的.本程序要求仿真显示,所以显示部分也是重点。
若制作多台AGV的路径规划程序,还应当考虑到路径的重叠,以避免碰撞产生。
二、系统设计
2.1类体系设计
包含了两个基类CFixedMap和CAGV,一个单一继承的派生类CPathPlan和一个多重派生类CAGVShow。
2。
2类定义及函数描述
各个类的成员以及成员函数的作用如注解所示。
(1).基类:
CFixedMap
classCFixedMap
{
structCoordinate
{
intx;
inty;
intnum;
};//记录点的结构体
structcombp
{
intx1,y1;
intx2,y2;
};//连通点坐标
structCombname
{
intnum1;
intnum2;
};//连通点名
public:
intmVexNum;//顶点数
intmEdgNum;//边数
doublemMatrix[MAX][MAX];//邻接矩阵
Combnamecomb[MAX];//连通点名
combpcp[MAX];//连通点坐标
CoordinatemVexs[MAX];//顶点集合
intgetx(intn1);
intgety(intn2);
voidInput();//以文件方式输入地图信息
voidShowMap();//easyx显示地图
};
(2)。
基类CAGV
classCAGV
{
intspeed;//AGV速度
intwidth;//AGV宽度
intlength;//AGV长度
public:
CAGV();
intgetl();//返回AGV长度
intgetw();//返回AGV宽度
intgets();//返回AGV速度
};
(3).单一继承类CPathPlan
classCPathPlan:
publicCFixedMap
{
public:
intpath[MAX];//存放最后一个点
doubledist[MAX];//存放路径距离
intv0;//起始点
introute[40];//路径
intrnum;//路径顶点数
Coordinaterpoints[MAX];//路径点集
voidMaptoGraph();
voidDijstra();
voidPutpath();
};
(4).多重继承类CAGVShow
classCAGVShow:
publicCPathPlan,publicCAGV
{
public:
#definek(abs(y2-y1))/(abs(x1-x2))
inta,b,c,d;
intx1,x2,y1,y2;//AGV实际坐标
inti,j;
intl,w,s;//对应类CAGV中的相关数据
voidshow();
};
2.3程序流程图
开始
AGV信息设定
自动设置AGV?
是
自动载入地图?
手动输入AGV信息
手动输入地图文件名
载入地图文件(文本)
多次演示?
否
显示地图
路径文件输出
路径规划
动态显示
动态显示
显示地图
路径规划
路径文件输出
结束?
结束
是
否
是
否
是
否
三、程序重点解析
3。
1文本文档读入地图信息
在最初的设计中,为了方便调试与信息录入,地图文本做的粗糙不堪,但这确实为程序编写提供了许多便利.如图,优化前的地图文件:
可以看出,全都是由数字组成,如果不了解程序,就不知道文件包含了什么,应该怎样修改。
在优化时,加入了大量提示信息,由此也出现了问题.由于文件流输入无法判断输入的信息类型,造成了将提示信息录入而无法得到正确信息的错误。
为解决这一问题,我们使用了一个简单的手段,即将提示信息与地图信息分隔,并分别录入,然后不再处理提示信息。
改进后的地图文本如下:
程序中的相应代码:
//以文件方式输入地图信息
voidCFixedMap:
:
Input()
{
intpanju;
charfname[10]={"map2。
txt"};
cout<〈”是否载入默认地图?
(1:
是,2:
否)";
cin〉>panju;
if(panju==2)
{
cout〈〈”请输入地图信息文件名:
";
cin〉〉fname;
}
ifstreamfile(fname);
charuse1[100];
charuse2[100];
charuse3[100];
charuse4[100];//use数组用来储存提示信息。
file〉〉use1;
file>〉mVexNum;//端点个数
file>>use2;
file>>mEdgNum;//边数
file>>use3;
for(inti=0;i〈mVexNum;i++)//输入所有点的信息
{
file〉〉mVexs[i]。
num>〉mVexs[i].x〉〉mVexs[i].y;
}
file〉>use4;
for(i=0;i { file〉>comb[i].num1〉>comb[i]。 num2; } file。 close(); } 3。 2Dijkstra算法程序设计 Dijkstra算法主要就是查找和更新,开始时想过用指针来做,后来由于跟地图的输入结合要用到input函数里的变量,于是就采用了用数组来储存距离和路径。 在Diikstra算法中首先是初始化源点数组,然后就是查找其他到源点距离最近的点,然后就是将该点并入源点集,再就是更新,以上次并入的点为起点开始查找,直到遍历所有点。 刷新每次查找后的最短距离并保存。 代码如下: voidDijstra() { cout〈<"输入起点: "; cin〉>v0; v0——; ints[MAX]; intv; inti; intj; intw; doublemin; for(v=0;v〈mVexNum;v++)//初始化S,dist,path { s[v]=0;//0表示未求出最短路径 dist[v]=mMatrix[v0][v];//开始时假定为最短路径 if(dist[v]〈maxD&&v! =v0) path[v]=v0;//直达情况 elsepath[v]=—1;//无直达路径 } dist[v0]=0;//初始时v0属于s集,v0到v0路径最短 s[v0]=1; for(i=1;i 穷举 { min=maxD; for(w=0;w〈mVexNum;w++)//找一个最近到的点,下标装入v if(s[w]==0&&dist[w]〈min)//点w不属于s集且离v0更近 { v=w;//经点w中转 min=dist[w]; } s[v]=1;//将v并入S,由v0到达v点最短距离为min,假设由v0到v再由v到其余各点,更新当前最后一个点及距离 for(j=0;j if(s[j]==0&&(min+mMatrix[v][j] { dist[j]=min+mMatrix[v][j]; path[j]=v;//点的序号 } } } 3。 3动态显示部分 问题主要是集中在用easyx画图上,从直线到斜线到反向直线和任意一个线段,全部用循环和间歇控制,主要工作就是每隔一个间隔绘制一定的图像使得间隔连起来的一个整体是一个顺畅的连贯的运行图。 说起来简单可实践起来哪怕是循环中画图和清空的顺序不对,显示的都会是一个完全不像样的运行线路,所以整个程序部分对逻辑的要求比较严格,每个细节都要重复重复地检查和试运行才能达到不出错的地步.寻找错误几乎成了整个程序设计的主要工作,不过也是在告诉我们,编好程序不一定要多么高级,而是少犯错. 程序代码过多,参见cpp文件。 四、程序运行结果展示 4.1地图文件 4.2运行窗口 4.3动态显示窗口 4.4.fops.txt路径输出 4。 5改变地图,改变AGV参数运行。 (1)。 地图文件 (2).运行窗口,动态显示,fops路径文件输出。 五、程序设计小结 5.1程序设计的缺陷和不足 (1)地图输入的方式虽然采用了文件流,但是实用价值仍然不高,负责输入的组员曾经考虑过使用图片载入,但查阅相关资料后因为难度较大而放弃。 (2)算法的革新未能实现,直接使用了比较简单和落后的Dijkstra算法,程序的处理能力并不强。 (3)多台AGV运行未能实现.后期优化的同时,尝试将1台AGV增加到两台,但是由于动态显示部分程序的特殊性未能完成. (4)动态显示比较流畅,然而利用sleep方法完成的显示部分会将整个程序冻结,计时器没能使用,是一个遗憾。 (5)程序的界面不够友好,由于前期各项工作完成的进度不如人意,程序的MFC改编也未能完成. 5。 2设计中遇到的困难 主要是小组成员各个部分的衔接问题.大家各自完成后,程序的整合比想象中困难许多,浪费了大量的时间。 因为每个人使用变量的习惯不同,几个部分一开始完全分离,往往是一个小问题就要排查半天才能解决。 六、参考资料 1.《VisualC++程序设计》 2。 Sunshine的博客《图的邻接矩阵存储的C语言实现》. 3豆丁网《最短路径的Dijkstra算法》。 4.easyx教程。 七、源程序及相关文件 见所传电子稿. 八、各小组成员个人报告 单独成份,见所传电子稿。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 作业 项目 报告