智能机器人工作站仿真实时系统构建方法
2020-12-14张国栋洪荣晶方成刚
张国栋 洪荣晶,2 方成刚,2
1(南京工业大学机械与动力工程学院 江苏 南京 211816)2(南京工大数控科技有限公司 江苏 南京 211800)
0 引 言
机器人虚拟仿真方便了人们对整个机器人工作站的布局规划以及整体预览[1]。在实际工业应用中,常用的离线编程软件robotstudio、DELMIA、SprutCAM都需要通过存储设备将离线程序导入到机器人中,这一操作不能及时验证机器人轨迹的正确性。在机器人离线编程的过程中,采用虚拟仿真与实际设备进行联动,可以更方便地监控周遭设备的运行状态。很多仿真软件例如roboguide虽然实现了与机器人的信号交互,但与周遭设备之间的联动运动却不是很好,甚至根本无法做到。
针对以上实际研究过程中的不足与存在的问题,本文使用Python语言基于RoboDK软件平台开发了与周遭设备之间的信号交互功能,以及与机器人之间实时数据交互功能。这两大功能在实际过程中有如下用途:(1)通过TCP/IP协议实现与机器人通信,可以将运动指令发送给机器人,方便检查机器人轨迹的正确性,方便及时调整,并可以实时监控机器人运行状态。(2)通过Python-Snap7模块实现与周遭设备进行通信,实现与周遭设备的联动,便于在项目实行时候查看整个工作站的运行情况。
1 机器人伴随仿真系统搭建
机器人伴随仿真系统具体流程框架如图1所示,主要是Python接口函数与机器人端实现数据交互,然后通过解包等相关流程,结合RoboDK中Robolink、Robodk相关模块,实现伴随仿真。
图1 仿真框架结构图
1.1 创建机器人机构
机器人的正向运动学是旋转运动中从机器人关节变量空间到笛卡尔坐标系空间的运动变换。对于给定的一组关节变量,求取末端执行器的位置和方向是正向运动学的主要问题[2]。确定UR机器人的正向运动学,主要是为了在实时传输机器人的关节值之后可以准确获得相关机器人的一个实时姿态,从而在RoboDK的图形界面中实时显示机器人的姿态。
在RoboDK将机器人三维模型根据运动机构数分为BASE、J1、J2、J3、J4、J5、J6七个部分,保证机器人的基坐标系的位置处于工作站的原点。通过“实用程序”中“创建机构或者机器人”选项创建机器人,对于标准6轴机器人,通过其关节值和轴运动范围定义机器人。其中UR机器人的关节长度如图2所示。创建完成之后,机器人的D-H参数如表1所示。
图2 UR机器人连杆长度
表1 UR机器人的D-H参数表
根据D-H参数方法,得到机器人的相邻关节n到n-1的位姿变换为:
n-1A(θn)=
Rot(xn-1,θn)Trans(0,0,dn)Trans(an,0,0)Rot(xn,αn)
(1)
式中:an和dn为平移距离;θn和αn为旋转角度。
对于六轴机械手,机器人法兰末端到机器人的基坐标系的变换矩阵为:
Tn=0A11A22A33A44A55A6
式中:0A11A22A3确定末端法兰的位置;3A44A55A6确定末端法兰的姿态。
1.2 通信连接获取机器人位姿信息
1.2.1Socket通信获取机器人信息
Socket是TCP/IP网络通信中最为常用的一个API(应用程序接口),任何网络通信都是通过Socket来完成的。本文所使用的UR机器人在TCP/IP协议的基础上,提供了丰富的端口用于与外部设备进行交互[3]。其中UR机器人30003为实时反馈端口,与客户端信息交流的频率为125 Hz,通过此端口每次收到的数据为1 044个字节,以标准网络格式排列。主要反馈内容包括机器人的关节目标、速度、加速度、电流、扭矩等值。在Python中建立通信客户端,对机器人控制器中的数据进行实时读取,使用到的Python中提供的Socket模块对象函数主要如表2所示。
表2 Socket对象函数
客户端与服务器端(机器人端)连接时的时序图如图3所示。
图3 面向连接TCP的时序图
通过Socket连接之后,客户端接收由机器人30003端口发送出来的机器人所有状态信息,返回信息以字节形式返回。其中客户端接收机器人的主要信息如下:
dic= {′MessageSize′: ′i′, ′Time′: ′d′, ′q target′: ′6d′, ′qd target′: ′6d′, ′qdd target′: ′6d′,′I target′: ′6d′,
′M target′: ′6d′, ′q actual′: ′6d′, ′qd actual′: ′6d′, ′I actual′: ′6d′, ′I control′: ′6d′,
′Tool vector actual′: ′6d′, ′TCP speed actual′: ′6d′, ′TCP force′: ′6d′, ′Tool vector target′: ′6d′,
′TCP speed target′: ′6d′, ′Digital input bits′: ′d′, ′Motor temperatures′: ′6d′, ′Controller Timer′: ′d′,
′Test value′: ′d′, ′Robot Mode′: ′d′, ′Joint Modes′: ′6d′, ′Safety Mode′: ′d′, ′empty1′: ′6d′, ′Tool Accelerometer values′: ′3d′,
′empty2′: ′6d′, ′Speed scaling′: ′d′, ′Linear momentum norm′: ′d′, ′SoftwareOnly′: ′d′, ′softwareOnly2′: ′d′, ′V main′: ′d′,
′V robot′: ′d′, ′I robot′: ′d′, ′V actual′: ′6d′, ′Digital outputs′: ′d′, ′Program state′: ′d′, ′Elbow position′: ′3d′, ′Elbow velocity′: ′3d′}
1.2.2struct函数解析数据
在TCP/IP协议进行诸如Int、char之类的数据传输的时候,服务器端需要某种机制将某些特定的结构体的类型打包成二进制流的字符串后进行网络传输,而客户端也应该经过某种机制进行解包还原原来的结构体数据[4]。从机器人控制器端发送来的1 044个字节,对其进行解包获得相应的数据,对照机器人30003端口发送的数据表得知前256个字节的排列顺序以及相关内容如表3所示。
表3 实时反馈数据包
通过struct.unpack_from()对接收到的机器人的信息进行解包,其流程如图4所示。
图4 数据解包流程
Struct.unpack_from()函数中参数分别表示:格式化字符串格式、缓冲区、偏移量。函数定义方法如下:根据格式化字符串格式从位置偏移处开始从缓冲区解包。缓冲区大小(以字节为单位,减去偏移量)至少为格式所需要的大小。图4表示从缓存区第256个字节开始解包,解包数据格式为“!dddddd”,即6个整数,按网络字节顺序进行排列,即得到机器人6个实时关节值。
1.3 机器人模型运动仿真
通过1.1节、1.2节获得机器人的实时关节数据。机器人传输过来的值为UR所规定的格式,均为弧度制。需要对其利用相关的数学公式转化为度数,然后利用Robolink模块对应函数,实现对模拟环境中机器人的动作控制。
程序中可设置刷新时间以及进行多线程编程,可以让机器人进行数据获取的同时执行模拟环境中机器人移动操作。在RoboDK中,通过其提供的基于Python的API,将工业机器人虚拟环境中的三维运动与实际相结合。用于Python的RoboDK API分为以下两个模块:Robolink模块,Robodk模块。Robolink模块主要功能为:检索RoboDK工作站树中的任何对象,由Item对象表示;根据Robolink.Item类对该项执行不同的操作。本次运用到的Robolink.ltem类函数主要是setJoints(),其主要说明为:设置机器人或目标的当前关节。如果设置了机器人关节,则将在屏幕上更新机器人位置。
对从上述Socket通信和解包所得到的真实机器人的关节值进行相关数学转换,转换程序如下:
def on_packet(packet):
global ROBOT_JOINTS
#从数据包中检索所需信息
rob_joints_RAD=packet_value(packet,UR_GET_JOINT_POSITIONS)
#print(rob_joints_RAD)
ROBOT_JOINTS=[ji*180.0/pi for ji in rob_joints_RAD]
转换完成之后得到的机器人的关节值为度数,将变量放入到setJoints函数中即可。在此之前,需要获取已经配置好的机器人名称,其中更新位姿的主要流程如图5所示。
图5 更新位姿流程
上述过程完成之后,在RoboDK客户端实时获取实际机器人的末端位姿,在UR5机器人控制器中固定IP,启用机器人以太网通信。通过UR机器人控制面板polyscope面板控制机器人运动,即可在RoboDK中实时显示机器人位姿,如图6所示。其中,左端为离线编程的环境中机器人位姿,右端为机器人polyscope控制面板。可以看出,实际机器人的关节值实时传递给虚拟环境中的机器人,到达位姿一致,且可以实时更新,保证机器人控制面板和虚拟机器人面板的关节值均保持相同。
图6 实验结果图
2 机构仿真系统搭建
在工业机器人的离线编程的实际应用中,机器人常会与周遭设备进行互动,例如焊接时,焊接机器人往往需要与变位机设备进行互动,如果在仿真场景中实时反馈变位机的位姿,对机器人的离线编程具有很大的帮助。在自动化系统之中,很多设备都是由PLC监控其运行,通过PLC可以知道当前设备的一个运行状态、位置。可以在虚拟场景中得知PLC相关状态的信号,然后将这些信号通过RoboDK中Robolink、Robodk两大模块,虚拟出实际场景中运动机构的动作。机构半实物仿真相关过程如图7所示。
图7 机构半实物仿真过程
2.1 Python读取PLC数据
Python与西门子PLC进行通信,主要是靠snap7套件。snap7是一个开源的32/64位多平台以太网通信套件[5],主要用于与西门子S7系列1200、1500的PLC进行本地连接。Python-snap7是snap7库的Python包装器。通过RoboDK中嵌套的Python API接口,安装好Python-snap7模块、snap7模块。完成环境搭建工作之后,方可与相关的PLC之间进行通信。
结合Python-snap7的模块函数的相关分析以及相关文档,Python-snap7库中的函数主要类方法是read_area和write_area[6],函数中主要的函数参数为需要提供PLC的区域地址(area、dbnumber)、起始偏移地址(start)、读和写的数据长度(size/data)。PLC能提供如下信息:PLC的存储区通过tag的形式与存储区间关联,分为输入(I)、输出(O)、位存储区(M)、数据块(DB)。程序在访问对应的(I/O)tag时,是通过访问CPU中的过程影响存储区对应的地址进行操作的。函数参数中area、size的取值与数据区域、数据类型的对应关系如表4所示。
表4 函数参数对应关系表
从PLC的用户手册可知,对于M3.4,对应的就是MK(0x83),对应的起始地址是3,对应的bit位为4,即数据类型为bit。在读取该位即调用函数的时候,其变量需要设置为area=snap7.snap7types.areas.MK,dbnumber=0,start=3.3,size=1,即可读取关于M3.4的状态。为了更好地对PLC状态进行读写,现通过Python语言实现了PLC程序监控测试面板,并且通过RoboDK中嵌入的API接口将面板嵌入其中,如图8所示,通过该交互界面可以实现以下功能:
图8 PLC程序监控面板
(1)PLC状态读取。通过GUI界面中输入PLC的IP,确定其机架号、插槽号;并且设置相关的读取数据区域,其中读写数据的参数主要由表4到表6决定,设置好相关参数之后,点击“查询数据”按钮,即可在最下方文本显示框中看到相关数据。
(2)PLC 数据写入。先设置好要写入的数据区域(基本步骤参见第一步),然后设置要写入的数据,如要写入MB0中的M0.3、M0.4为1,设置好读写区域之后,将准备发送的数据写为“2#0001 1000”或“24”即可。
2.2 设备仿真
将上述功能面板进行精简化之后,所得PLC信号监控面板如图9所示。为了方便对机构的控制,通过博途软件进行PLC程序的编写,将梯形图程序下载到PLC中之后,通过PLC信号设置精简面板,设置相对应的PLC输入信号以及监控相关输出信号,驱动相应机构运动,并且设置相关的仿真机构的运动。本次仿真机构为变位机,其驱动程序如图10所示。
图9 PLC信号设置精简面板
图10 变位机驱动程序
变位机运动由三个电磁阀控制,其中:阀1、阀2分别控制变位机正转、反转;阀3控制压紧气缸的伸缩,并且有一光电传感器开关为变位机运动到位的标记信号。M2.0、M2.1控制变位机的正反转,如表5所示。对PLC进行值写入时,直接对MB2进行操作即可。
表5 变位机状态与MB2取值对应表
通过变位机的三维创建其机构,如图11所示。设置其变位机机构回转速度和回转加速度与真实机构一致,将仿真机构的驱动信号设置为PLC的等待信号。程序结构如图12所示。
图11 创建变位机机构
图12 变位机运动程序
通过驱动该程序,设置MB2信号为1,真实变位机正转,同时变位机仿真程序也开始运行。设置MB2信号为0,真实变位机回零位,同时仿真程序驱动虚拟变位机回零位[7]。
3 结 语
本文通过RoboDK中Python的API接口,实现机器人关节目标值的读取,并且利用了RoboDK API接口中Robolink模块,完成了从实际机器人控制虚拟机器人的伴随仿真。拓展了该软件的新功能,并且可在其他支持TCP/IP通信的机器人上进行相关测试。该功能可在离线环境中实时观测机器人的位置,便于机器人位置的监控,且可以方便机器人创建相对工件坐标系。对于离线轨迹的创建也较为方便,在离线仿真中意义重大。同时也实现与PLC控制系统之间的信号交互,可实现与实际设备之间的伴随仿真。目前该系统功能测试阶段已过,处于程序优化阶段,但基本功能已经实现。今后将继续优化该系统的两大功能,进一步完善RoboDK相关拓展功能[8-9]。