面向柑橘采摘的机械手采摘程序设计

2023-08-30 10:54杨光友王焱清
湖北工业大学学报 2023年4期
关键词:手爪控制程序位姿

汤 旸, 杨光友,2,王焱清,2

(1 湖北工业大学农机工程研究设计院, 湖北 武汉 430068;2 湖北省农机装备智能化工程技术研究中心, 湖北 武汉 430068)

国内外对于果蔬机械采摘进行了许多研究,并取得了一系列研究成果[1-7]。从这些研究成果可知,由于机械臂的拟人特性能够实现几乎所有的抓取作业,同时还能够适应诸如灰尘、农药等恶劣环境,因此采摘机械普遍采用机械臂作为执行机构移动装置。如熊俊涛等[8]在其设计的多类型水果采摘机器人中采用了四自由度关节机械臂;Onishi等[9]在其设计的自动化水果收获机器人中采用了六自由度的UR3机械臂;尹吉才[10]为其设计的苹果采摘机器人设计了一个六自由度关节机械臂。然而只有机械臂还无法执行采摘作业,还需要末端执行器来配合机械臂共同完成果蔬采摘。柔性执行器作为一种末端执行器具有一定的弹性形变能力,能够降低对采摘对象造成的损伤,因而受到了研究者的广泛关注[11-15]。如鲍官军等[16]设计了一种由3个作为手指部分的气动柔性弯曲关节和一个作为腕部的气动柔性扭转关节组成的柔性末端执行器;卢伟等[17]设计了一种三指四指节的柔性手爪,用于褐菇的无损采摘。本文面向柑橘采摘,基于机械臂和柔性手爪所组成的采摘机械手平台,研究了机械手控制程序的设计。

1 采摘硬件平台

如图1所示,采摘硬件平台由机械臂、机械臂控制器、柔性手爪、手爪控制器、视觉装置以及上位机组成。在柑橘采摘作业中,视觉装置根据Intel RealSense R200深度相机提供的实时彩色图像和包含场景深度信息的深度图像,获取柑橘的位置信息,机械臂带动末端执行器到达指定的柑橘位置,柔性手爪与柑橘直接接触抓取柑橘,并使其与果梗分离实现采摘。上位机在其中负责控制、监测上述硬件平台设备。

图1 采摘平台硬件组成

上位机采用硬件为NVIDIA GTX950M 2G DDR3独立显卡、Intel Core i5-4210M双核处理器、4GB DDR3L内存,系统为Windows10系统的神舟K650D-I5 D3笔记本电脑。

1.1 机械臂

采摘机械臂采用Denso VS-6556G六关节机械臂(图2a),各项技术参数如表1所示。

表1 机械臂技术参数

图2 机械臂及其控制器

机械臂控制器为Denso RC7M控制器如图2b所示,控制器系统版本为2.330,接线情况如图2c所示,通过以太网与上位机进行连接、数据通信。机械臂控制器的主要功能是根据上位机的控制程序驱动机械臂。

1.2 柔性手爪

柔性手爪如图3a所示,三根通过柔性材料制成的手指间隔120°分布在圆周底座上。由于内部气囊结构和外部气动网格结构,手指会根据气压的变化发生弯曲,而正负气压能改变手指的弯曲方向,因此采用气压驱动的方式控制柔性手爪的张开、闭合动作。柔性手爪具有一定的弹性形变能力且手指表面比较粗糙,作为末端执行器能够有效降低采摘过程对采摘对象造成的损伤,提高采摘的容错误差,同时能让抓取也更加牢固。

图3 柔性手爪及其控制器

柔性手爪控制器如图3b所示,控制器由Arduino控制板、驱动元件和气压回路组成,接线如图3c所示。通过USB串口与上位机进行连接、数据通信。手爪控制器的主要功能是根据上位机的控制程序调节回路的气压,切换回路的正压、负压工况,从而控制手爪的张开、闭合动作。

2 采摘控制程序设计

采摘控制程序的主要功能是根据获取到的柑橘位置信息,控制机械臂运动到指定位置,配合柔性手爪的抓取动作,协作执行果梗分离动作,完成柑橘采摘,并将采摘后的柑橘放置到指定位置。

2.1 机械臂控制程序设计

机械臂控制程序由通信功能模块和运动控制功能模块组成。在程序的实现过程中,采用Denso的ORIN2软件开发工具包,ORIN2提供了CAO应用程序编程接口和NetwoRC设备驱动组件,其中NetwoRC是专门用于RC7M控制器的通信、驱动组件,与CAO所提供的编程接口结合,能够对机械臂进行二次开发,实现上位机与机械臂控制器的数据通信以及对机械臂的控制功能。

2.1.1通信功能模块通信功能模块用于实现上位机与机械臂控制器之间的数据通信,其中用到了NetwoRC提供的ROBOTalk通信包。该通信包提供了2种与机械臂控制器通信的方式,分别为RS232串口通信和以太网通信。这里采用以太网通信。

上位机与机械臂控制器通过创建的ArmConn()函数实现通信连接,具体实现方式如图4所示。

图4 ArmConn()程序流程

上位机与机械臂控制器之间通过传递变量的形式进行数据通信,而变量又以位姿变量和状态变量为主。位姿变量包含机械臂在空间中的位置和姿态等信息,可以分为P型变量和J型变量。P型变量的值对应机械臂末端的位置和姿态,变量形式为P(X,Y,Z,RX,RY,RZ,FIG)。其中:X、Y、Z表示机械臂末端位置,RX、RY、RZ表示机械臂末端姿态,FIG是机械臂的关节形态。J型变量的值对应机械臂各关节的角度,变量形式为J(J1,J2,J3,J4,J5,J6)。状态变量包含机械臂的工作状态等信息,比如@BUSY_STATUS的值对应机械臂的工作状态,@CURRENT_POSITION的值对应机械臂当前的末端位姿。

上位机与控制器之间通过创建的ArmGetVar()和ArmSaveVar()函数传递位姿变量。其中,ArmGetVar()用于读取机械臂控制器中的位姿变量,ArmSaveVar()用于将位姿变量存入机械臂控制器。ArmGetVar()通过pICtrl->AddVariable(VarName, “”, &pIVar)创建位姿变量名为VarName的CaoVariable类pIVar对象,最后通过pIVar->get_Value(&Value)读取到指定变量的值。ArmSaveVar()则在创建位姿变量名为VarName的pIVar对象后,通过pIVar->put_Value(&Value)将值存入到指定变量中。

上位机通过创建的ArmStatusMonitor()函数从控制器中获取当前的机械臂状态变量,实现机械臂状态监测功能。ArmStatusMonitor()通过pIRobot->AddVariable(VarName, “”, &pIVar)创建状态变量名为VarName的pIVar对象,最后通过pIVar->get_Value(&Value)读取到指定变量的值。

2.1.2运动控制功能模块上位机通过创建的ArmMove()函数向机械臂控制器发送控制指令,控制机械臂运动到指定位姿,具体实现方式如图5所示。

图5 ArmMove()程序流程

其他机械臂运动控制函数如ArmGoHome()函数用于控制机械臂返回初始位姿,通过向ArmMove()中的vntPose输入机械臂的初始位姿实现,ArmStop()函数用于中止机械臂运动,通过调用Halt(“”)函数实现,ArmRotate()函数用于控制机械臂某关节旋转,ArmApproach()函数用于控制机械臂沿X、Y、Z轴方向接近等等。

机械臂控制器中包含NetwoRC提供的PAC驱动程序RobSlave。RobSlave在运行状态下能根据上位机发送的控制指令,执行对应的PAC程序控制机械臂运动,PAC为Denso机械臂所使用的控制编程语言,因此创建的机械臂运动控制函数都需要调用IsRobSlaveRunning()函数来判断机械臂控制器中的RobSlave是否运行。

2.2 柔性手爪控制程序设计

柔性手爪控制程序由通信功能模块和手爪动作控制功能模块组成,除上位机程序以外,还包括手爪控制器的Arduino程序。在程序的实现过程中,通过SerialPort串口通信工具包,实现上位机与手爪控制器中Arduino的USB串口通信。上位机程序主要用于发送控制指令和监测手爪控制器,而Arduino程序则负责监测引脚以及通过引脚控制各气压回路元件,在程序的协作下共同实现柔性手爪的动作控制功能。

2.2.1通信功能模块上位机与手爪控制器通过在上位机程序中创建的GripperConn()函数和在Arduino程序中创建的Setup()函数实现数据通信。GripperConn()通过调用InitPort(COM3, 9600, NONE, 8, 1)初始化串口程序,然后通过StartMonitoring()启动串口,其中COM3为串口号、9600为波特率、NONE为检验位、8为数据位、1为停止位。Setup()通过调用Serial.begin(9600)与上位机建立串口通信连接,其中9600为波特率与上位机程序的波特率对应。

手爪控制器通过在Arduino程序中创建的ReceiveData()函数接收上位机发送的信息。ReceiveData()通过Serial.available()判断串口的连接状态,通过Serial.read()进行单字节信息的读取,每4个字节就将信息存入到data[4]字符数组中,data[4]即为接收到的上位机信息。

2.2.2动作控制功能模块

上位机信息以控制指令为主,通过在上位机程序中创建的GripperOpen()和GripperClose()函数发送控制指令,控制柔性手爪动作。其中,GripperOpen()控制手爪张开,GripperClose()控制手爪闭合。GripperOpen()通过调用WriteToPort(data)向手爪控制器发送手爪张开指令,GripperClose()通过调用WriteToPort(data)向手爪控制器发送手爪闭合指令,其中data即为控制指令,指令内容如表2所示。根据接收到的控制指令,手爪控制器通过在Arduino程序中创建的GripperAction()函数控制柔性手爪的张开和闭合动作,具体实现方式如图6所示。

表2 控制指令

图6 GripperAction()程序流程

2.3 机械手采摘控制程序设计

机械手柑橘采摘流程如图7所示。

图7 采摘流程

根据柑橘采摘流程,基于机械臂和柔性手爪的控制程序进行机械手采摘程序设计。

2.3.1轨迹规划轨迹规划功能的主要目的就是根据采摘点的位置信息,计算出机械臂在采摘过程中所要经过的轨迹位姿点,通过创建的TrajectoriesPlanning()函数实现。

考虑到机械手的果梗分离动作、采摘过程中的枝叶干涉以及采摘对象的放置,分别根据计算结果预设5个关键的位姿点。第一个点为采摘准备点,位于柑橘正前方一定距离的位置;第二个点为采摘点,即柑橘的位置点;第三个点为采摘完成点,位于采摘点前方和下方一定距离的位置,同时这个点还是采摘动作中P42的X,Y,Z的值;第四个点为采摘放置点,用于放置采摘的柑橘,放置点的位置取决于收集筐的位置;第五个点为放置完成点,用于确保放置完成,在离放置点正上方一定距离的位置,最后将这5个位姿点分别存放到机械臂控制器的P40、P41、P42、P43和P44变量中。

2.3.2机械手果梗分离动作控制由于末端执行器采用柔性手爪,因此机械臂将在手爪抓取到柑橘后,通过分别旋转第4个和第六个关节180°扭动柑橘,同时向后移动拉扯柑橘的方式,分离柑橘和果梗。为实现此功能,创建了ArmPickAction()函数。

ArmPickAction()通过调用GripperClose()控制柔性手爪闭合抓取柑橘,再调用ArmMove(1L, “@E P42”, “”)控制机械臂完成扭动、弯折、拉扯柑橘果梗的动作。其中P42的X,Y,Z取决于采摘完成点的位置,而RX,RY,RZ则通过计算机械臂关节旋转的姿态变化获得,FIG取1。

2.3.3采摘程序实现机械手的采摘程序通过创建ArmPick()函数实现,具体实现方式如图8所示。

图8 ArmPick()程序流程

3 验证试验

为了验证本文所设计的机械臂控制程序、柔性手爪控制程序以及机械手采摘程序的可行性,编写了测试程序界面。

3.1 测试程序界面

测试程序界面采用MFC微软基础类库提供的界面控件和应用程序编程接口(图9),按照功能可以划分为柔性手爪功能区域、机械臂功能区域、消息区域以及采摘功能区域。

图9 测试程序界面

柔性手爪功能区域对应图9的区域1方框。区域内包括串口通信参数的输入框、柔性手爪的通信连接与断开按钮、柔性手爪的张开和闭合动作控制按钮、动作控制指令的输入框与发送指令按钮;机械臂功能区域对应图9的区域2方框,区域内包括机械臂控制器IP地址的输入框、机械臂的通信连接与断开按钮、机械臂当前工作状态与位姿显示框、机械臂状态监测功能按钮、机械臂运动方式和运动目标位姿变量的输入框、机械臂运动与急停控制按钮、位姿变量的输入框、位姿变量保存与读取按钮;消息区域对应图9的区域3方框,区域内包括采摘程序运行状态等数据信息的显示框;采摘功能区域对应图9的区域4方框,区域内包括机械手复位、采摘和停止采摘控制按钮。

3.2 测试过程及结果分析

在实验室环境下,以所布置的仿真柑橘树上的柑橘作为采摘对象,以采摘平台及其各项控制程序作为测试对象。

3.2.1测试前准备工作柔性手爪的工作参数设置,通过上位机测试程序界面将柔性手爪气压回路中的气压值设置为柔性手爪的最大承载气压100 kPa;上位机与机械臂通信设置,打开机械臂控制器,通过小型示教器将通信方式设置为以太网,通信权限设置为允许读写,启动模式设置为外部启动模式;机械臂的其他设置,通过小型示教器将机械臂的速度值设置为36%,并以循环运行的方式运行机械臂控制器中的RobSlave程序。

3.2.2程序测试

1)机械臂控制程序测试试验。通过上位机测试程序界面输入机械臂控制器的IP地址192.168.0.2,再通过连接功能按钮启动通信模块程序建立与机械臂的数据通信连接,将P型的机械臂末端位姿坐标变量P(312,-197.62,463.34,90,30,90,1)和J型的机械臂各关节角度变量J(30,60,90,15,90,45)分别传递并保存到机械臂控制器中,选择机械臂的运动插补方式为曲线插补运动,选择机械臂的运动目标位姿变量为已经存入控制器中的P型和J型变量,最后通过运动控制功能按钮启动运动控制程序,控制机械臂从初始位姿运动到指定位姿。

2)柔性手爪控制程序测试试验。通过上位机测试程序界面输入串口号COM3、波特率9600、检验位NONE、数据位8、停止位1,再通过连接功能按钮启动通信模块程序与手爪控制器建立数据通信连接,通过动作控制功能按钮启动控制程序,控制柔性手爪执行张开、闭合动作。

3)机械手柑橘采摘试验。在已经与机械臂和柔性手爪建立通信连接的情况下,根据获得的柑橘位置信息,通过采摘功能按钮启动机械手采摘控制程序,为机械手的采摘轨迹进行规划后,控制机械手按照轨迹运动到柑橘采摘点,柔性手爪同步抓取柑橘,执行柑橘与果梗的分离动作,并最终将采摘后的柑橘放置到指定位置,完成柑橘采摘。

4)测试结果。如图10所示,图10a为机械臂的初始位姿,10b、10c为机械臂控制程序的测试结果,图10d、10e为柔性手爪控制程序的测试结果,图10f、10g、10h、10i、10j为机械手采摘控制程序的测试结果。

3.2.3试验结果分析分析整个验证试验,影响机械手采摘作业的因素主要有4个。

1)柔性手爪内部的气压值,测试过程中设置为100 kPa。气压值过大导致超出手爪的气压承载能力,损坏柔性手爪;气压值过小导致手爪无法提供足够大的抓取力,无法抓牢柑橘,从而导致在果梗分离或放置的过程中柑橘脱落,导致采摘失败。

2)机械臂的运动速度,测试过程中设置为36%。运动速度过慢增加机械臂在运动过程中所消耗的时间,减慢采摘速度;运动速度过快导致人员发生危险,测试材料发生损坏。

3)采摘轨迹规划功能程序,测试过程中规划了5个关键位姿点。位姿点过少无法满足机械手在采摘过程中所要执行的必要动作,导致机械手沿采摘轨迹运动时与柑橘及周围的枝干、叶片发生擦碰,柑橘相对于采摘点发生位移,使手爪抓取不到柑橘,最终采摘失败,或是机械手、柑橘树、其他柑橘的损伤,位姿点过多,机械臂在运动过程中所消耗的时间增加,减慢采摘速度。

4)分离动作控制功能程序,测试过程中控制机械手的第四、六关节同方向各旋转180°旋扭柑橘果梗,同时控制机械手向后拉扯柑橘果梗,180°的旋转角度和只有旋扭、拉扯两个部分的果梗分离动作不会因为旋转角度过大、动作过多增加果梗分离消耗的时间,减慢采摘速度,又不会因为旋转角度过小、动作过少导致无法分离柑橘和果梗,导致采摘失败。

4 结束语

本文以Denso VS-6556G六关节机械臂作为采摘机械臂、气动柔性手爪作为末端执行器组成了采摘机械手平台,研究了机械手柑橘采摘的控制程序设计,并基于测试程序界面进行了控制程序测试试验和柑橘采摘试验,验证了机械臂运动控制程序和柔性手爪动作控制程序,以及根据已知的柑橘位置信息,规划采摘轨迹,控制机械手运动到采摘位置抓取柑橘,成功实现柑橘与果梗的分离,并将其带到指定的位置进行放置的可行性,对水果采摘机器人的控制程序设计具有参考价值。

猜你喜欢
手爪控制程序位姿
基于PLC的变电站备用电源自动投入装置控制程序的研究
针对旋转手爪的结构设计与分析
中科大机器人柔性手爪在机器人世界盃上获奖
基于共面直线迭代加权最小二乘的相机位姿估计
基于CAD模型的单目六自由度位姿测量
小型四旋翼飞行器位姿建模及其仿真
自适应4点同心手爪机构研究设计
基于PLC数值处理模块的PID控制程序研究
基于几何特征的快速位姿识别算法研究
纸机传动控制程序的复用性研究