【《AGV调度算法设计与编写案例分析》4200字】_第1页
【《AGV调度算法设计与编写案例分析》4200字】_第2页
【《AGV调度算法设计与编写案例分析》4200字】_第3页
【《AGV调度算法设计与编写案例分析》4200字】_第4页
【《AGV调度算法设计与编写案例分析》4200字】_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AGV调度算法设计与编写案例分析目录TOC\o"1-3"\h\u17865AGV调度算法设计与编写案例分析 1204001.1软件及开发环境介绍 1231301.2C++语言介绍 1300621.2.1C++语言的起源 157391.2.2C++的特点 2129181.3使用C++进行系统设计 382541.3.1运行C++程序的步骤 352171.3.2代码说明 3本设计系统使用编程语言为C++,使用的编译环境为QTCreator。1.1软件及开发环境介绍QtCreator是Qt被

Nokia

收购后推出的一款全新的轻量级集成开发环境(IDE)。此IDE能够跨平台运行,支持的系统包括Linux(32位及64位)、MacOSX以及Windows。根据官方描述,QtCreator开发的初衷是为了使开发人员能够利用Qt这个应用程序框架更加快速及轻易的完成开发任务。QtCreator包括项目生成向导、高级的C++代码编辑器、浏览文件及类的工具、集成了QtDesigner、QtAssistant、QtLinguist、图形化的GDB调试前端,集成qmake构建工具等。1.2C++语言介绍1.2.1C++语言的起源C++是一种非常流行的程序设计语言。它是一种静态数据类型检查的,支持多范型的通用程序设计语言。C++支持过程化程序设计、数据抽象化、面向对象程序设计、泛型程序设计、基于原则设计等多种程序设计风格。C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。不过,虽然C语言非常流行,但并非是完美无缺的。C语言虽然是一种高级编程语言,但又同时具备一些低级语言的特点。于是这就造成了C语言的存在在高级编程语言和低级编程语言之间,所以就造成了它的优点和缺点都很突出。与低级语言(如汇编语言)相似的点在于,C语言程序可以直接操纵计算机的内存。这这因素使得C语言成为系统程序编写时的首选。但是在编写其他程序时,C语言不像其他高级语言那样容易理解。另外,它不像其他高级语言那样具有完善的自动检查功能。为了解决上述问题以及C语言的另一些缺陷,AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(BjarneStroustrup)在20世纪80年代初发明了C++。他将C++设计成一种更好的C语言。C语言的很大一部分都成了C++的一个子集,所以大多数C语言程序其实也是C++程序(反之则不成立,许多C++程序都绝非C语言程序)。与C语言不同的是,C++具备了“面向对象编程”(OOP)的能力。C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。1.2.2C++的特点(1)支持数据封装和数据隐藏在C++中,“类”是支持数据封装的工具,“对象”则是数据封装的实现。C++通过建立用户定义类支持数据封装和数据隐藏。在面向对象的软件编译器应用程序系统设计中,将该类数据和对该类的相关数据执行信息分别进行合法转换运算后将操作的两个函数分别进行封装组合到一起,并以此函数作为其中一个函数类的自动执行定义。其中的函数对象类型说明了其是否具有某一个属于给定函数范畴的对象类型。每一个对象给定的此类的集体对象都可能包括了此类所对象指定的若干个受到私人、公共、保护的集体成员。完好地重新定义的系统类一旦被重新建立,就可能会把它们用来看作不只是一个完全不被封装的系统实体,可以直接用来把它作为一个系统整体的组成单元。类的真正内部管理工作已经被人们隐藏了很多起来,使用他们完善自己重新定义的这个类的工具人们不必再那么需要再去认识和看到任何类的真正内部管理工作,只要他们已经能够完全知道他们怎样才能正确地看和使用它。(2)支持继承和重用在C++现有类的基础上可以声明新类型,这就是继承和重用的思想。通过继承和重用可以更有效地组织程序结构,明确类间关系,并且充分利用已有的类来完成更复杂、深入的开发。新定义的类为子类,成为派生类。它可以从父类那里继承所有非私有的属性和方法,作为自己的成员。(3)支持多态性采用多态性为每个类指定表现行为。多态性形成由父类和它们的子类组成的一个树型结构。在这个树中的每个子类可以接收一个或多个具有相同名字的消息。当一个消息被这个树中一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。多态性的这一特性允许使用高级抽象。继承性和多态性的组合,可以轻易地生成一系列虽然类似但独一无二的对象。由于继承性,这些对象共享许多相似的特征。由于多态性,一个对象可有独特的表现方式,而另一个对象有另一种表现方式。1.3使用C++进行系统设计1.3.1运行C++程序的步骤(1)搭建编译环境;(2)启动编译器;(3)编辑程序文档;(4)编译程序;(5)对代码进行封装;(6)执行程序;1.3.2代码说明首先进行地图生成,在此使用第三节所提到的栅格地图建模法,在代码中以二维数组来存储数据,代码描述为:int_MAP[31][31]={0};生成31*31的地图如图4-1所示:图4-1建立31*31模拟场景地图在图4-1程序运行界面右侧,是实现各种功能的操作按键,交互方式为:使用鼠标点击按钮,按钮调用所链接的函数段,以此来实现按钮上文字所描述的功能。代码描述为:MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui→setupUi(this);this→setWindowTitle("AGV自动寻路模拟");this→resize((N+9)*25,(M+9)*25);this→setFocus(Qt::MouseFocusReason);b_set=newQPushButton(this);b_set→setText("设置禁行区域");b_set→setGeometry((N+2)*25,30,150,20);b_set→setEnabled(true);agv_set=newQPushButton(this);agv_set→setText("部署agv");agv_set→setGeometry((N+2)*25,60,150,20);agv_set→setEnabled(true);tg_set=newQPushButton(this);tg_set→setText("设定目标");tg_set→setGeometry((N+2)*25,90,150,20);tg_set→setEnabled(true);findpath=newQPushButton(this);findpath→setText("自动寻路");findpath→setGeometry((N+2)*25,120,150,20);findpath→setEnabled(true);refresh1=newQPushButton(this);refresh1→setText("重置");refresh1→setGeometry((N+2)*25,150,150,20);refresh1→setEnabled(true);control=newQPushButton(this);control→setText("模拟设备对接");control→setGeometry((N+2)*25,180,150,20);control→setEnabled(true);yslj=newQPushButton(this);yslj→setText("预设路径");yslj→setGeometry((N+2)*25,210,150,20);yslj→setEnabled(true);yslj_move=newQPushButton(this);yslj_move→setText("按预设路径移动");yslj_move→setGeometry((N+2)*25,240,150,20);yslj_move→setEnabled(true);save_lj=newQPushButton(this);save_lj→setText("使用记忆路线");save_lj→setGeometry((N+2)*25,270,150,20);save_lj→setEnabled(true);a=newAstar();last_way=NULL;connect(b_set,SIGNAL(clicked()),this,SLOT(shift_to_b_set_mode()));connect(agv_set,SIGNAL(clicked()),this,SLOT(shift_to_agv_set_mode()));connect(tg_set,SIGNAL(clicked()),this,SLOT(shift_to_tg_set_mode()));connect(findpath,SIGNAL(clicked()),this,SLOT(_findpath()));connect(refresh1,SIGNAL(clicked()),this,SLOT(ref1()));connect(control,SIGNAL(clicked()),this,SLOT(control_sim()));connect(yslj,SIGNAL(clicked()),this,SLOT(set_lj()));connect(yslj_move,SIGNAL(clicked()),this,SLOT(move_yslj()));connect(save_lj,SIGNAL(clicked()),this,SLOT(lj_save()));}每条功能语句会引用其所对应的槽函数,具体如下:(1)功能“部署AGV”,其对应按钮的代码为:agv_set=newQPushButton(this);agv_set→setText("部署agv");agv_set→setGeometry((N+2)*25,60,150,20);agv_set→setEnabled(true);按钮后链接的槽函数为:if(setstar)//放置AGV{painter.setBrush(QBrush(Qt::red,Qt::SolidPattern));painter.drawRect(QRect(_starx*25,(_stary+1)*25,25,25));}此段代码实现了在地图上放置一个AGV小车,并将其标记为红色,效果如图4-2所示:图4-2在模拟地图中部署AGV小车我们给代码加一个for循环for(autoit=m_starts.begin();it!=m_starts.end();it++)则可实现在地图上布置多个AGV小车,效果如图4-3:图4-3在模拟地图中部署多个AGV小车(2)功能“设定目标”,其对应按钮代码为tg_set=newQPushButton(this);tg_set→setText("设定目标");tg_set→setGeometry((N+2)*25,90,150,20);tg_set→setEnabled(true);按钮后链接的槽函数为:if(settg)//放置目标{painter.setBrush(QBrush(Qt::blue,Qt::SolidPattern));painter.drawRect(QRect(_endx*25,(_endy+1)*25,25,25));}此段代码实现了在地图上放置一个目标,并将其标记为蓝色,效果如图4-4所示:图4-4在模拟地图中放置一个目标(3)功能“设置禁行区域”,其对应代码为:b_set=newQPushButton(this);b_set→setText("设置禁行区域");b_set→setGeometry((N+2)*25,30,150,20);b_set→setEnabled(true);findpath=newQPushButton(this);findpath→setText("自动寻路");findpath→setGeometry((N+2)*25,120,150,20);findpath→setEnabled(true);yslj_move=newQPushButton(this);yslj_move→setText("按预设路径移动");yslj_move→setGeometry((N+2)*25,240,150,20);yslj_move→setEnabled(true);switch(_MAP[i][j]){case1://画墙壁painter.setBrush(QBrush(Qt::gray,Qt::SolidPattern));painter.drawRect(QRect(i*25,(j+1)*25,25,25));break;case0://画通路painter.setBrush(QBrush(Qt::white,Qt::SolidPattern));painter.drawRect(QRect(i*25,(j+1)*25,25,25));break;case2://生成路径painter.setBrush(QBrush(Qt::yellow,Qt::SolidPattern));painter.drawRect(QRect(i*25,(j+1)*25,25,25));break;case3://画预设路径painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));painter.drawRect(QRect(i*25,(j+1)*25,25,25));break;}此段代码包含了所有关于路径在地图上显示的功能,绘制禁行区域如图4-5示,在图中以灰色显示:图4-5在地图上绘制禁行区域在设定好“墙”,并且分别放置了AGV小车以及目标地点后,选择“自动寻路”,即可生成以A*算法实现的寻找最短路径功能。寻路成功后在地图上使用黄色来显示以求得的路径,具体效果如图4-6、4-7所示:图4-6在地图上显示求得一条的路径图4-7在地图上显示求得多条路径“预设路径”是在不是用自动寻路的情况下,按用户的需求在地图上预设一条路径,用户可以根据不同的运输情况,自由的在地图上绘制运行路径,此功能在地图上以绿色显示自定义的路径,具体效果如图4-8所示:图4-8在地图上预设路径以绿色显示预设路径绘制完毕后,点击“按预设路径移动”按钮,即可使AGV小车按照预设路径运行至目标,效果如图4-9所示:图4-9AGV按照预设路径行驶至目标(4)功能“模拟设备对接”,其对应代码为:control=newQPushButton(this);control→setText("模拟设备对接");control→setGeometry((N+2)*25,180,150,20);control→setEnabled(true);此功能可描述为:在AGV运行过程中,或者AGV运行环境较为复杂(如环境中有电梯、自动门等)时,AGV车辆会发送一个信号给上行系统,再由上行系统发送开门指令给电梯/自动门的控制系统,以实现调度系统的通讯。由于不同的控制系统有不同的通信协议,因此实现此功能需要立足于实际的仓储环境中,因此这里只做出一个提示,如图4-10所示图4-10与电梯/自动门进行通讯时的提示(5)总结在本小节中,详细描述和解释了代码所实现的功能以及其在图形界面中的实现效果。1.3.3代码展示(1)A*算法主程序#include"Astar.h"Astar::~Astar(){}int_MAP[31][31]={0};voidAstar::search(Node*_startPos,Node*_endPos){if(_startPos→x<0||_startPos→x>row||_startPos→y<0||_startPos→y>col||_endPos→x<0||_endPos→x>row||_endPos→y<0||_endPos→y>col)return;Node*current;startPos→changepos(_startPos→x,_startPos→y);endPos→changepos(_endPos→x,_endPos→y);openList.push_back(startPos);while(openList.size()>0){current=openList[0];if(current→x==endPos→x&¤t→y==endPos→y){//printMap();way=current;openList.clear();closeList.clear();break;}NextStep(current);closeList.push_back(current);openList.erase(openList.begin());sort(openList.begin(),openList.end(),compare);}}voidAstar::checkPoit(intx,inty,Node*father,intg){if(x<0||x>row||y<0||y>col)return;if(this→unWalk(x,y))return;if(isContains(&closeList,x,y)!=-1)return;intindex;if((index=isContains(&openList,x,y))!=-1){Node*point=openList[index];if(point→g>father→g+g){point→father=father;point→g=father→g+g;point→f=point→g+point→h;}}else{Node*point=newNode(x,y,father);countGHF(point,endPos,g);openList.push_back(point);}}voidAstar::NextStep(Node*current){checkPoit(current→x-1,current→y,current,WeightW);//左checkPoit(current→x+1,current→y,current,WeightW);//右checkPoit(current→x,current→y+1,current,WeightW);//上checkPoit(current→x,current→y-1,current,WeightW);//下if(mode){checkPoit(current→x-1,current→y+1,current,WeightWH);//左上checkPoit(current→x-1,current→y-1,current,WeightWH);//左下checkPoit(current→x+1,current→y-1,current,WeightWH);//右下checkPoit(current→x+1,current→y+1,current,WeightWH);//右上}}intAstar::isContains(vector<Node*>*Nodelist,intx,inty){for(inti=0;i<Nodelist→size();i++){if(Nodelist→at(i)→x==x&&Nodelist→at(i)→y==y){returni;}}return-1;}voidAstar::countGHF(Node*sNode,Node*eNode,intg){inth=abs(sNode→x-eNode→x)+abs(sNode→y-eNode→y)*WeightW;intcurrentg=sNode→father→g+g;intf=currentg+h;sNode→f=f;sNode→h=h;sNode→g=currentg;}boolAstar::compare(Node*n1,Node*n2){//printf("%d,%d",n1→f,n2→f);returnn1→f<n2→f;}boolAstar::unWalk(intx,inty){if(_MAP[x][y]==1)returntrue;returnfalse;}/*voidAstar::printPath(Node*current){if(current→father!=NULL)printPath(current→father);printf("(%d,%d)",current→x,current→y);}voidAstar::printMap(){for(inti=0;i<=row;i++){for(intj=0;j<=col;j++){printf("%d",map[i][j]);}printf("\n");}}*/voidNode::changepos(int_x,int_y){this→x=_x;this→y=_y;}(2)图形化窗口程序#include"mainwindow.h"#include"ui_mainwindow.h"#include<QMessageBox>intN=31,M=31;MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui→setupUi(this);this→setWindowTitle("AGV自动寻路模拟");this→resize((N+9)*25,(M+9)*25);this→setFocus(Qt::MouseFocusReason);b_set=newQPushButton(this);b_set→setText("设置禁行区域");b_set→setGeometry((N+2)*25,30,150,20);b_set→setEnabled(true);agv_set=newQPushButton(this);agv_set→setText("部署agv");agv_set→setGeometry((N+2)*25,60,150,20);agv_set→setEnabled(true);tg_set=newQPushButton(this);tg_set→setText("设定目标");tg_set→setGeometry((N+2)*25,90,150,20);tg_set→setEnabled(true);findpath=newQPushButton(this);findpath→setText("自动寻路");findpath→setGeometry((N+2)*25,120,150,20);findpath→setEnabled(true);refresh1=newQPushButton(this);refresh1→setText("重置");refresh1→setGeometry((N+2)*25,150,150,20);refresh1→setEnabled(true);control=newQPushButton(this);control→setText("模拟设备对接");control→setGeometry((N+2)*25,180,150,20);control→setEnabled(true);yslj=newQPushButton(this);yslj→setText("预设路径");yslj→setGeometry((N+2)*25,210,150,20);yslj→setEnabled(true);yslj_move=newQPushButton(this);yslj_move→setText("按预设路径移动");yslj_move→setGeometry((N+2)*25,240,150,20);yslj_move→setEnabled(true);save_lj=newQPushButton(this);save_lj→setText("使用记忆路线");save_lj→setGeometry((N+2)*25,270,150,20);save_lj→setEnabled(true);a=newAstar();ast_way=NULL;connect(b_set,SIGNAL(clicked()),this,SLOT(shift_to_b_set_mode()));connect(agv_set,SIGNAL(clicked()),this,SLOT(shift_to_agv_set_mode()));connect(tg_set,SIGNAL(clicked()),this,SLOT(shift_to_tg_set_mode()));connect(findpath,SIGNAL(clicked()),this,SLOT(_findpath()));connect(refresh1,SIGNAL(clicked()),this,SLOT(ref1()));connect(control,SIGNAL(clicked()),this,SLOT(control_sim()));connect(yslj,SIGNAL(clicked()),this,SLOT(set_lj()));connect(yslj_move,SIGNAL(clicked()),this,SLOT(move_yslj()));connect(save_lj,SIGNAL(clicked()),this,SLOT(lj_save()));}MainWindow::~MainWindow(){deleteui;}voidMainWindow::shift_to_b_set_mode(){mode=0;update();}voidMainWindow::shift_to_agv_set_mode(){mode=1;update();}voidMainWindow::shift_to_tg_set_mode(){mode=2;update();}voidMainWindow::paintEvent(QPaintEvent*){QPainterpainter(this);painter.setPen(Qt::black);for(inti=0;i<31;i++)for(intj=0;j<31;j++){switch(_MAP[i][j]){case1://画墙壁painter.setBrush(QBrush(Qt::gray,Qt::SolidPattern));painter.drawRect(QRect(i*25,(j+1)*25,25,25));break;case0://画通路painter.setBrush(QBrush(Qt::white,Qt::SolidPattern));painter.drawRect(QRect(i*25,(j+1)*25,25,25));break;case2://生成路径painter.setBrush(QBrush(Qt::yellow,Qt::SolidPattern));painter.drawRect(QRect(i*25,(j+1)*25,25,25));break;case3://画预设路径painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));painter.drawRect(QRect(i*25,(j+1)*25,25,25));break;}if(setstar)//放置AGV{painter.setBrush(QBrush(Qt::red,Qt::SolidPattern));painter.drawRect(QRect(_starx*25,(_stary+1)*25,25,25));}if(settg)//放置目标{painter.setBrush(QBrush(Qt::blue,Qt::SolidPattern));painter.drawRect(QRect(_endx*25,(_endy+1)*25,25,25));}}}voidMainWindow::mousePressEvent(QMouseEvent*event){if(event→button()==Qt::LeftButton&&mode==0){intj=(event→y())/25-1,i=(event→x())/25;_MAP[i][j]=!_MAP[i][j];update();}if(event→button()==Qt::LeftButton&&mode==1){intj=(event→y())/25-1,i=(event→x())/25;_starx=i;_stary=j;setstar=true;update();}if(event→button()==Qt::LeftButton&&mode==2){intj=(event→y())/25-1,i=(event→x())/25;_endx=i;_endy=j;settg=true;update();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论