资源描述
C++大作业项目报告
——AGV 途径规划与运营仿真软件设计
小构成员:
日期:6月16日
指引教师:
目录
C++大作业项目报告 1
——AGV 路径规划与运行仿真软件设计 1
一、课题背景 3
1.1案例背景 3
1.2问题描述 3
1.3任务目标 3
1.4具体分析 3
二、系统设计 4
2.1类体系设计 4
2.2类定义及函数描述 4
2.3程序流程图 5
三、程序重点解析 7
3.1文本文档读入地图信息 7
3.2 Dijkstra 算法程序设计 8
3.3动态显示部分 9
四、程序运行结果展示 10
4.1地图文件 10
4.2运行窗口 10
4.3动态显示窗口 11
4.5改变地图,改变AGV参数运行。 12
五、程序设计小结 14
5.1程序设计的缺陷和不足 14
5.2设计中遇到的困难 14
六、参考资料 15
七、源程序及相关文件 15
八、各小组成员个人报告 15
一、课题背景
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
class CFixedMap
{
struct Coordinate
{
int x;
int y;
int num;
};//记录点构造体
struct combp
{
int x1,y1;
int x2,y2;
};//连通点坐标
struct Combname
{
int num1;
int num2;
};//连通点名
public:
int mVexNum; // 顶点数
int mEdgNum; // 边数
double mMatrix[MAX][MAX]; // 邻接矩阵
Combname comb[MAX]; //连通点名
combp cp[MAX]; //连通点坐标
Coordinate mVexs[MAX]; // 顶点集合
int getx(int n1);
int gety(int n2);
void Input();//以文献方式输入地图信息
void ShowMap();//easyx显示地图
};
(2).基类CAGV
class CAGV
{
int speed; //AGV速度
int width; //AGV宽度
int length; //AGV长度
public:
CAGV();
int getl(); //返回AGV长度
int getw(); //返回AGV宽度
int gets(); //返回AGV速度
};
(3).单一继承类CPathPlan
class CPathPlan:public CFixedMap
{
public:
int path[MAX]; //存储最后一种点
double dist[MAX]; //存储途径距离
int v0; //起始点
int route[40]; //途径
int rnum; //途径顶点数
Coordinate rpoints[MAX];//途径点集
void MaptoGraph();
void Dijstra();
void Putpath();
};
(4).多重继承类CAGVShow
class CAGVShow:public CPathPlan,public CAGV
{
public:
#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程序流程图
开始
AGV信息设定
自动设立AGV?
是
自动载入地图?
手动输入AGV信息
手动输入地图文献名
载入地图文献(文本)
多次演示?
否
显示地图
途径文献输出
途径规划
动态显示
动态显示
显示地图
途径规划
途径文献输出
结束?
结束
是
否
是
否
是
否
三、程序重点解析
3.1文本文档读入地图信息
在最初设计中,为了以便调试与信息录入,地图文本做粗糙不堪,但这的确为程序编写提供了许多便利。如图,优化前地图文献:
可以看出,全都是由数字构成,如果不理解程序,就不懂得文献包括了什么,应当如何修改。在优化时,加入了大量提示信息,由此也浮现了问题。由于文献流输入无法判断输入信息类型,导致了将提示信息录入而无法得到对的信息错误。为解决这一问题,咱们使用了一种简朴手段,即将提示信息与地图信息分隔,并分别录入,然后不再解决提示信息。
改进后地图文本如下:
程序中相应代码:
//以文献方式输入地图信息
void CFixedMap::Input()
{
int panju;
char fname[10]={"map2.txt"};
cout<<"与否载入默认地图?(1:是,2:否)";
cin>>panju;
if(panju==2)
{
cout<<"请输入地图信息文献名:";
cin>>fname;
}
ifstream file(fname);
char use1[100];
char use2[100];
char use3[100];
char use4[100]; //use数组用来储存提示信息。
file>>use1;
file>>mVexNum; //端点个数
file>>use2;
file>>mEdgNum; //边数
file>>use3;
for(int i=0;i<mVexNum;i++) //输入所有点信息
{
file>>mVexs[i].num>>mVexs[i].x>>mVexs[i].y;
}
file>>use4;
for(i=0;i<mEdgNum;i++) //输入连通点编号
{
file>>comb[i].num1>>comb[i].num2;
}
file.close();
}
3.2 Dijkstra 算法程序设计
Dijkstra 算法重要就是查找和更新,开始时想过用指针来做,日后由于跟地图输入结合要用到input函数里变量,于是就采用了用数组来储存距离和途径。在Diikstra算法中一方面是初始化源点数组,然后就是查找其她到源点距离近来点,然后就是将该点并入源点集,再就是更新,以上次并入点为起点开始查找,直到遍历所有点。刷新每次查找后最短距离并保存。
代码如下:
void Dijstra()
{
cout<<"输入起点:";
cin>>v0;
v0--;
int s[MAX];
int v;
int i;
int j;
int w;
double min;
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; //直达状况
else path[v]=-1; //无直达途径
}
dist[v0]=0; //初始时v0属于s集,v0到v0途径最短
s[v0]=1;
for(i=1;i<mVexNum;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<mVexNum;j++)
if(s[j]==0 && (min+mMatrix[v][j]<dist[j])) //如果多通过一种点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.《Visual C++程序设计》
2.Sunshine 博客 《图邻接矩阵存储C语言实现》。
3豆丁网《最短途径Dijkstra算法》。
4.easyx教程。
七、源程序及有关文献
见所传电子稿。
八、各小构成员个人报告
单独成分,见所传电子稿。
展开阅读全文