基于C++的AGV机器人无线控制
创始人
2024-04-19 05:02:44
0次

1 AGV系统概述

1.1AGV原理

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的系统拓扑图大致如下:

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

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

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

{

    if (simpleCom->IsOpen())

    {

       simpleCom->Close();

    }

    else

    {

       SComboBox* pComboBox = FindChildByName2(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(L"edt_agvinfo");//找到控件

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

     SSliderBar* pSliderBar = FindChildByName2(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);

}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...