1 AGV系统概述

AGV原理

AGV行走控制系统由控制面板、导向传感器、方向电位器、状态指示灯、避障传感器、光电控制信号传感器、驱动单元、导引磁条、电源组成。

AGV的导引(Guidance)是指根据AGV导向传感器(Navigation)所得到的位置信息,按AGV的路径所提供的目标值计算出AGV的实际控制命令值,即给出AGV的设定速度和转向角,这是AGV 控制技术的关键。简而言之,AGV的导引控制就是AGV轨迹跟踪。

AGV导引有多种方法,比如说利用导向传感器的中心点作为参考点,追踪引导磁条上的虚拟点就是其中的一种。AGV的控制目标就是通过检测参考点与虚拟点的相对位置,修正驱动轮的转速以改变AGV的行进方向,尽力让参考点位于虚拟点的上方。这样AGV就能始终跟踪引导线运行。

AGV大体上用于以下三个方面:
  1.物料搬运
  在工业现场AGV常用于工位间或自动仓库与工位间的物料搬运作业。例如在组装线上,AGV从自动仓库取出机器零件并送到相应的组装工位。又如在柔性加工系统中,AGV依照加工工序顺次将被加工工件送到相应自动机床进行加工,加工好的零件由AGV送到质检站测,最后合格品送到半成品库。
  2.移动工作台
  在组装或柔性加工系统中AGV常作为移动工作台使用。以欧美一些汽车厂为例,在轿车组装过程中从汽车底盘焊装组立、安装悬挂系统、车轮和制动系统、安装发动机、变速箱、离合器、安装转向系统、安装汽车外壳、安装风档玻璃和座椅到整车配电等一系列组装过程都是在一台AGV上进行的。又如在欧美一些柴油机厂中,柴油机一系列的组装过程也都是在一台AGV上完成的。
  3.与机器人或机器手配合在特殊工作环境下代替人工作业
  在AGV上可以安装机器人或机器手,在特殊工作环境下代替人工作业。例如在核电站中代替人在具有放射线的工作环境下进行遥控作业。

2、AGV上位机部分

以C++代码编写,通过RS232与AGV网关通讯,内置AGV调度控制逻辑以及算法,通过以太网连接至MES系统,达到对AGV定点控制,路径规划监控。

AGV的系统拓扑图大致如下:

基于C++的AGV机器人无线控制-LMLPHP

3、AGV控制代码的编写和分析

串口通讯代码编写设置串口号,并选择波特率为115200

void CMainDlg::OnBtnSerialPort() // 左上角icon按钮

{

    if (simpleCom->IsOpen())

    {

       simpleCom->Close();

    }

    else

    {

       SComboBox* pComboBox = FindChildByName2<SComboBox>(L"cbx_test");

       int nItem = pComboBox->GetCurSel();

       if (nItem == -1)

           return;

       int data = pComboBox->GetItemData(nItem);

       simpleCom->Open(data, 115200);

    }

    bool bOpen = simpleCom->IsOpen();

    SWindow *pButton = FindChildByName(L"btn_serialport");

    if (bOpen)

    {

       pButton->SetWindowTextW(L"已连接");

    }

    else

    {

       pButton->SetWindowTextW(L"连接");

    }

}

     /**************************/

     //判断串口是否连接

     bool bOpen = simpleCom->IsOpen();

     SWindow *pButton = FindChildByName(L"btn_serialport");

     if (bOpen)

     {

            pButton->SetWindowTextW(L"已连接");

     }

     else

     {

            pButton->SetWindowTextW(L"连接");

     }

     m_bLayoutInited = TRUE;

     return 0;

}

 按键相应控制

/**************************/

//AGV前进响应函数

void CMainDlg::OnBtnMoveFront()

{

     //判断串口是否已连接

     bool bOpen = simpleCom->IsOpen();

     if (bOpen == false)

     {

            ShowMessageBox(L"请连接串口");

            return;

     }

     int flag = 1;

     SEdit* pComboBox = FindChildByName2<SEdit>(L"edt_agvinfo");//找到控件

     int agvid = _ttoi(pComboBox->GetWindowTextW());//转换为ID号

     SSliderBar* pSliderBar = FindChildByName2<SSliderBar>(L"slider_test");//找到控件

     int value = pSliderBar->GetValue();

     int left = 0;

     int right = 0;

     switch (flag)

     {

     case 1:

            left = right = value;

            break;

     case 2:

            left = value;

            break;

     case 3:

            right = value;

            break;

     case 4:

            left = right = (value*-1);

            break;

     default:

            break;

     }

     simpleRobot->cmdRemoteMode(agvid, left, right);

}

12-08 10:39