基于机器视觉的六轴工业机器人神经网络自适应控制算法
2022-03-23张兴华
张兴华
(广东白云学院机电工程学院,广州 510450)
0 引 言
目前,工业机器人逐渐在多种行业从事生产应用,开始了制造业的转型与升级,从而出现了机器人替代人的热潮。机器人视觉识别技术,基于实时监控和信息管理平台设备通信模块对机器人进行数据采集和三维建模仿真,实现对机器人设备的远程实时监控[1-4]。运动学方面,采用对时间求导的方法求线速度逆问题的解析解;采用向量分解原理求角速度逆问题的解析解。将工业机器人的模型抽象简化为数学模型,可进行离机求解[5-6]。文献[7]中针对汽车零部件自动化生产的发展需求,设计了一套用于汽车尾门装饰板自动焊接的机器人工作站。文献[8]中利用六维力传感器采集机器人末端受到的外力或力矩,将采集的数据进行滤波、重力补偿处理后,通过导纳控制策略控制机器人关节运动,从而调整机器人末端的姿态,实现轴孔的柔顺自动装配。文献[9]中针对平面金属薄板饰件精加工智能产线,研究了基于视觉的产线各加工单元自动上下料装置的解决方案。文献[10]中运用智能和物联网等先进技术,重点进行了机器视觉系统的引入、装配过程装配力及位置的全过程监控。文献[11]中提出一种基于激光扫描测量臂测量系统的6轴工业机器人运动学标定方法。文献[12]中设计了一种基于CANopen的六轴串联机器人控制系统,并给出控制系统的硬件组成和软件设计。文献[13]中设计开发了一种六轴工业机器人虚拟仿真教学系统,并实现了系统网站部署访问。文献[14]中根据机器人D-H模型设计了由步进电机提供驱动的6轴工业机器人,采用循环反馈的方式进行优化设计。文献[15]中设计了机器人伺服控制系统,六轴机器人运行时,由于其末端姿态与位置的变化,使机器人各轴的负载与转动惯量实时变化,如果机器人在运动过程中受到外在扰动,将导致机器人各轴伺服系统不能快速、精确辨识负载转动惯量,导致机器人各轴电机容易出现震荡、谐振的现象。提出一种基于非线性动态学习因子的粒子群优化算法,该算法以伺服系统控制模型中的速度控制器为核心,实时辨识负载转动惯量值,使伺服系统内部控制参数根据实际工况调节,运用该辨识值,通过计算得到速度控制PI参数值,并实时修正速度环控制器PI参数值。基于工业机器人搭建实验平台,使得机器人行走轨迹的位置误差最大波动量从±10 mm减小到±3 mm,但是这种算法的控制精度不够理想。
本文基于神经网络自适应控制算法对控制器的脉冲输出进行补偿控制,从而使得机器人各关节的运动更加平滑可靠。实验结果表明本机器人可以实现按预设连续轨迹精确运行,运行精度可以达到±0.03 mm。
1 设计思路与工作原理
机器人视觉模块选用OpenMV3,它配置了STM32F765微处理器。在机器人工作范围的正上方安放OpenMV3视觉模块,用于检测工件坐标位置数据。通过STM32F765微处理器串口把数据发送到装备有Matlab的电脑,编写控制程序。根据工件坐标位置数据实时计算出每个关节驱动电动机转角的q值并且等周期地发送到微处理器。微处理器把转角换算成脉冲,采用神经网络自适应控制算法对控制器的脉冲输出进行补偿控制,从而使得机器人各关节的运动更加平滑可靠,送到各个电动机驱动器,从而控制机器人的各个关节精确转动。
2 机器人视觉的实现
OpenMV3 STM32F765上的引脚P0、P1、P2、P4、P5、P6接台达ASDA-B2系列的6个伺服驱动器PULSE引脚,用Python编程语言进行视觉模块OpenMV3进行工件坐标位置的获得,程序中主要的类与方法如下:
image.match_descriptor返回的Kptmatch类。kptmatch.rect()返回一个矩形元组(x,y,w,h),用于特征点的边界框image.draw_rectangle的图像中心视觉获取方法。kptmatch.cx()返回工件的中心x位置通过索引[0]取得这个值。kptmatch.cy()返回工件的中心y位置通过索引[1]取得这个值。
3 机器人机械结构设计
机器人三维模型如图1所示,机器人的机械结构参数如下:
图1 机器人三维模型(mm)
L1 底座高度0.234 m,底座轴线与大臂的关节处相距0 m,轴线夹角90°;
L2 大臂的长度0.400 m,它的轴线与关节的角度为pi/2;
L3 大臂的上关节比小臂的轴线0.113 m,即a=0.113,α=pi/2;
L4 小臂的臂长0.347 m,小臂的轴线与前一个连杆的交角pi/2;
L5 关节手腕;
L6 末端定位平面比手腕关节中心低63 mm。
4 机器人运动控制
六轴机器人主要包含了机械本体系统、运动控制系统、传感反馈系统等,机器人负载5 kg,确定工业机器人的总体设计目标和具体的技术指标,从而确定总体设计方案。该机器人共包含6个串联关节,全部为旋转关节。
6关节机械手动态可描述为:
式中:q∈R6为关节角度;M(q)∈R6×6为惯量矩阵;C∈R6×6为离心力和哥氏力项;G(q)∈R6为重力项;F()为摩擦力矩;τ∈R6为控制力矩。
6关节机械手模型具有如下特性:
特性2 M(q)为正定对称矩阵,且存在常数m1>0和m2>0使得:
控制目的:在机械手非线性未知的情形下设计控制器使得q跟踪期望轨迹qd,其中和有界且已知,
定义跟踪误差为
定义滑模变量为
其中,Λ>0为设计参数。可以验证q··=-r+q·d+Λe且
式中:
由于机械手非线性未知,f(x)也未知。将f(x)的第i个元素记为fi(x),利用神经网络,当x属于某一紧集时,fi(x)可表示为
式中:wi为权值向量;ei(x)<eN;
第i轴的角速度
视觉模块检测到工件物体坐标X、Y,因为工作台的高度是已知的,所以Z坐标作为常量写入到计算程序中。数据通过串口通信发到通过给定机器人之末端执行器需要到达的位置,对其进行反解,求出各个关节的角度变化。把6个关节的即时转角q运算出来,传送到伺服驱动器。
如图2所示的抓取点坐标(0,0.5,0),图3放置点坐标(0.5,0,0.8)。根据给定2个点的值,得到末端位姿,再来规划即时关节转角。编写Matlab计算程序如下:
图2 抓取点坐标
图3 放置点坐标
clear;clc;%建立机器人模型定义D-H参数
%theta d a alpha offset%
L1=Link([0 0.234 0 pi/2 0]);
L2=Link([pi/2 0 0.4 0 0]);
L3=Link([0 0 0.113 pi/2 0]);
L4=Link([0 0.347 0 pi/2 0]);
L5=Link([pi 0 0 pi/2 0]);
L6=Link([0 0.07 0 0 0]);
robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','myRobot');
T1=transl(0,0.5,0);%根据起点得到起点位姿
T2=transl(0.5,0,0.8);%根据终点得到终点位姿
q1=robot.ikine(T1);%根据起点位姿得起点关节角
q2=robot.ikine(T2);%根据终点位姿得终点关节角
t=0:0.2:2;%开始于0 s,结束于2 s,采样步长0.2 s[q,qd,qdd]=jtraj(q1,q2,t);
T=robot.fkine(q);%根据插值,得到末端执行器位姿
robot.plot(q); %动画
用Matlab进行白色工件取放的即时关节电动机转角计算,执行10次等周期计算的每间隔0.2 s的6个轴的关节角数值如表1所示。该表格是机器人运行控制的关键数据,表中的数据单位是rad。
对表1进行数据分析,每0.2 s解算一次6个关节角度的转角,以机器人底座上的腰身回转关节1为例加以说明:关节1的转角是表格中的第1列的数据,从第1步的1.570 8 rad即pi/2 rad(90°),再经过0.2 s运转到1.557 4 rad,再经过0.2 s运转到1.479 8 rad,再经过0.2 s运转到1.479 8,再经过0.2 s运转到1.314 6 rad,再经过0.2 s运转到1.072 2,再经过0.2 s运转到0.785 4 rad,再经过0.2 s运转到1.072 2,再经过0.2 s运转到0.785 4 rad,再经过0.2 s运转到0.498 6 rad,再经过0.2 s运转到0.256 2,再经过0.2 s运转到0.091 0 rad,再经过0.2 s运转到0.013 4 rad,再经过0.2 s运转到1.332 3×10-15即0 rad(0°)。大臂俯仰电动机关节2至手部关节6的电动机转角详见表1。表中第1~6列表示6个电动机的关节角度,通过串口通信方式把角度数据传送到控制器发脉冲控制机器人6个关节的电动机转动到一定的角度,通过STM32F765上面下载的经过模拟验证的Python程序,对伺服驱动器上设置的电子齿轮比换算成脉冲信号,脉冲的个数决定了电动机的角度,脉冲的频率决定了伺服电动机的转速。电机的即时转速见表2所示。
表1 关节1~6的电动机每0.2 s所在角度
表2 关节1~6的电动机运行角速度
OpenMv3上微控制器定时器引脚分配:从P0~P6分别接在6个ASDA-B2型的台达交流伺服电动机驱动器PULSE引脚。
Timer 1 Channel 3 Negative->P0(PB15)
Timer 1 Channel 2 Negative->P1(PB14)
Timer 1 Channel 1 Negative->P2(PB13)
Timer 2 Channel 3 Positive->P4(PB10)
Timer 2 Channel 4 Positive->P5(PB11)
Timer 2 Channel 1 Positive->P6(PA5)
由Pyhton编写的程序让P0、P1、P2、P4、P5、P6端口接到上位机的即时转角弧度及角速度数据后,使以上6个引脚发出PWM脉宽信号,信号发生程序如下:
from pyb import Pin,Timer
p=Pin('P0')#P0 has TIM1,CH3
tim=Timer(1,freq=1000)
ch=tim.channel(3,Timer.PWM,pin=p)
ch.pulse_width_percent(50)
此程序运行效果为用OpenMV3的P0引脚产生了频率为1.0 kHz的脉冲信号来控制1号电动机,即实现机器人腰身的回转动作。
6个关节电动机的运行速度q1,rad/s。关节1~6的电动机每运行角速度见表3。应用了台达ASDA-B2伺服电动机驱动器的电子齿轮比的设置P1-44设置电子齿轮比分子(N1)参数P1-45设置电子齿轮比分母(M),ECMA系列电机的编码器2 500线的,电动机1转,编码器产生2 500个脉冲,假如编码器计数模式是4倍计数,那么转1圈就是10 000脉冲转1圈为360°,即2Pi rad,3.141 6×2=6.283 2 rad。
5 直线插补运动的实现
末端执行器走直线的程序设计:如从右上点p1(1.414 2,0,1.914 2)直线运行到左下点p2(0.933 1,1.933 1,0.861 8),编写如下的程序:
init_ang=[0 0 0 0 0 0];step=40;
targ_ang=[pi/4,-pi/3,pi/5,pi/2,-pi/4,pi/6];
[q,qd,qdd]=jtraj(init_ang,targ_ang,step);
subplot(3,2,[1,3]);robot.plot(q);subplot(3,2,2);
i=1:6;plot(q(:,i));
p1=[-0.707 1-0.000 0 0.707 1 1.414 2;0.000 0-1.000 0-0.000 0-0.000 0;0.707 1 0.000 0 0.707 1 1.914 2;0 0 0 1.0000];
p2=[0.964 0-0.263 9-0.033 2 0.933 1;0.097 9 0.236 1 0.966 8 1.933 1;-0.247 3-0.935 2 0.253 4 0.861 8;0 0 0 1.000 0];
Tc=ctraj(p1,p2,step);
Tjtraj=transl(Tc);subplot(3,2,5);
plot2(Tjtraj,'r');title('p1--p2');
运行结果如图4所示。
图4 直线插补运行结果
当需要运行其他的线性轨迹时,只要修改末端执行器在p1、p2的位姿矩阵,在矩阵第4列填写新的坐标位置即可。
圆弧轨迹插补运动的实现:当需要运行圆弧轨迹时,可以把圆弧根据精度需要划分出若干等分,精度要求越高,等分数越大,用折线来拟合圆弧。实验结果机器人末端执行器可以精确灵活地实现圆弧运动。
6 结 语
经过反复工件抓取实验,工件抓取后放置的位置偏差均在0.03 mm左右,机器人工作精度可以达到大多数实际工业场合下的精度要求。