郑怡廷 赵琛 王一帆 陶泽勇
(国核电站运行服务技术公司,上海 200233)
随着当今科技的快速发展,工业用机械臂已经成为工业生产、运输、无损检测等多种领域不可或缺的设备。尤其是在高温、高辐射、有毒气体等恶劣环境中,机械臂能够代替操作人员进行现场工作,使得操作人员可在安全位置进行远程操控[1-3]。
各类机械臂厂商会提供响应的操作界面,但有时其使用受到各类限制且使用起来不甚方便,故而厂商也提供了各类接口供操作人员进行二次开发,通过二次开发,可定制各类特定功能以方便现场的各类操作[4-7]。机械臂在实际使用过程中,如果直接在某些场合使用,会造成碰撞等事故,对现场设备和机械臂本身造成损坏。再者,操作过程中有时操作人员收现场条件限制,无法准确观测现场情况,需要借助仿真软件辅助推断现场情况。故而机械臂仿真软件对于机械臂的使用起到极其重要的作用。
本文介绍使用Python语言对优傲公司生产的UR10机械臂进行二次开发,实现对UR10机械臂进行远程操控,同时连接V-REP EDU仿真软件,实现同步仿真功能。
优傲公司(Universal Robots,简称UR)是一家专业从事生产多功能、协作式工业机械臂的丹麦公司,主要产品包括台式的机械臂UR3、UR3e,中小型机械臂UR5、UR5e、UR10、UR10e,重型机械臂UR16e。所有的型号都是六关节机械臂,依照不同型号支持不同的负载。优傲公司生产的机械臂在多种场合广泛运用,为了在现场的环境中能够更好的使用,有必要对其进行仿真的开发研究[8]。
本软件采用了UR10型号的机械臂作为研究对象。该机械臂拥有1300mm半径移动范围,有效荷载10千克和六个轴,所有轴转动范围都支持正负360°,支持Modbus-TCP,EthernetIP以及Profinet三种主线。同时,UR10支持多个通讯接口,包括Dashboard、Primary、Secondary、Realtime、RTDE、Socket、XML-RPC等接口,主要使用的接口包括:Dashboard使用29999端口,执行机器人初始化、加载程序、开始和暂停程序、运行以及设置用户角色等,该接口需要上位机主动发送Dashboard命令字符串后返回相应数据;Primary接口使用30001端口,主要发送机器人状态以及附加信息,会以10HZ的频率向上位机发送相关信息,当接口在收到上位机脚本指令字符串后会立即中断当前运行的程序,然后运行收到的指令。Secondary接口使用30002端口,与Primary接口相似,但发送的信息中只包括机器人状态而不包括附加信息。Realtime,接口使用30003端口,与Primary、Secondary接口相似,以125HZ的频率向上位机发送详细状态信息。RTDE接口使用3004端口,RTDE接口不能接收脚本信息,只能以125HZ频率发送机器人的详细状态信息。Socket 通讯通过Socket相关脚本指令与上位机进行通讯。XML-RPC通讯通过XML格式传输数据。Modbus-TCP通过Modbus协议传输数据。UR10机械臂支持三种运动模式:关节运动、线性运动、圆周运动。关节运动(MoveJ),通过输入6个关节的弧度值来确定移动位置,移动采用曲线路径。线性运动(MoveL),通过输入6个参数,其中3个参数代表位置,3个参数代表姿态来确定移动位置,移动采用线性方式,使工具保持在线性路径上。圆周运动(MoveP)同样通过输入6个参数,3个参数代表位置,3个参数代表姿态来确定移动位置,但是是以恒定速度通过圆形混合区进行移动。
UR机械臂有三种种编程方式:Polyscope编程、URScript脚本编程以及C-API编程,本文中UR10为更好通过Python来呈现,降低延迟率,故选用UR公司自有的URScript脚本级机器人编程语言。和大部分脚本编程语言一样,URScript支持布尔值、整数、浮点、字符串、null等基本类型,此外有独有的姿态类型,用来表示机械臂的位姿。URScript支持自定义函数、控制流语句、多线程功能[9]。
在UR10机械臂运动编程仿真环境中,基于通讯接口Realtime来开发,可以将不同语言开发的模型集成在一个平台上运行,实现低延迟操控和仿真。通过对UR10机械臂、空间环境、运动策略等参数进行配置,能够快速构建适用于所需空间和运动操控的任务,如图1所示。
Python语言作为当今最流行的程序开发语言之一,代码优美易读,开发效率高,拥有种类齐全丰富的开发库。本文考虑语言通用性,采用版本Python3.6来进行语言编写,其中,程序使用Tkinter8.6图形界面接口库,Tk是一个轻量级、跨平台的图形用户开发包,Tkinter是其在Python上的接口。在开发时使用的集成开发环境(IDE)为JetBrains PyCharm,是著名的开发Python语言的IDE,界面简洁,功能齐全,易于使用[10]。
图1 UR10机械臂编程仿真结构
Python在官方网站下载即可,注意下载与本机操作系统和位数相符的安装本,下载完成后默认安装即可,注意需要勾选Add Python to PATH,否则安装完成后需要手动配置环境变量。如果选择自定义安装,则一定要勾选td/tk and IDLE,Tkinter是Python的自带库,完成安装后即搭建了开发环境。
V-REP(Virtual Robot Experimentation Platform EDU,虚拟机器人实验平台(教育版))是一款跨平台的仿真软件。V-REP软件内自带众多机器人模型,同时也支持从外部文件导入模型。V-REP支持嵌入脚本、附加脚本或沙盒脚本、插件、远程API、ROS节点。其中嵌入脚本、附加脚本或沙盒脚本、插件都支持Lua语言,远程API支持C、Python、Java、Matlab、Octave和Lua等语言。V-REP软件自带UR10模型,可直接使用,但为了能和程序进行正常通讯,需要作一定的配置。首先,要在V-REP中新建场景,之后将UR10模型拖入场景中,然后需要编辑UR10的子脚本,在自动生成的子脚本下function sysCall_init()子函数中调用simRemoteApi.start函数,该函数可在指定端口上启动API服务,用于与程序进行通讯,做循环判定,当simRemoteApi.start函数返回-1时则结束程序[11-12]。
为了更好地观测仿真UR10的运动轨迹,需要在UR10的TCP处加入轨迹显示,在UR10_link7节点新增Graph控件,在Graph控件的配置中新增三个记录数据流(data stream to record),分别对应UR10_link7在笛卡尔坐标系的X,Y,Z轴,配置完毕后,随着机械臂在V-REP软件内的移动,操作人员可在V-REP软件内直观观察到过去一段时间机械臂的移动轨迹,当机械臂作一定功能的移动时,轨迹功能很好的辅助操作人员确认移动情况。
UR10机械臂可视化仿真平台由三个模块组成,分别为数据接收模块、数据发送模块、仿真交互模块。数据接收模块接收UR10机械臂发出的状态数据,数据发送模块发送向机械臂发送指令使机械臂运动,仿真交互模块与VREP交互数据实现仿真。
数据接收模块使用Realtime接口,30003端口,采用TCP连接方式连接,连接后机械臂会以以125HZ的频率发送详细状态信息。考虑到上位机的处理能力和资源配置情况,在时间精度要求不高的场合,不必拆解每一个包,可根据实际情况适当降低获取的频率。
Realtime接口每次发送1108个字节(UR10不同的内置软件版本会有所不同,但主要数据格式不变),发送的数据格式如表1:
表1中的笛卡尔坐标采用(X,Y,Z,Rx,Ry,Rz)表示,其中X,Y,Z表示位置,Rx,Ry,Rz表示姿态,UR10机械臂采用旋转矢量法表示姿态。由于并非所有的数据都需要观测,本程序仅选取较为重要的一些数据进行显示。获取数据后,使用struct.unpack函数,将tcp接收到的返回值转换为指定格式,除了数据包总长度为int外其他所有的数据都为double,此外还需要注意,接收到的数据为大端格式,所以要按照">d"的格式转换数据,无论有几个值,数据最终都以元祖格式返回,后续处理时需自行转换。
表1
如下示例获取第一个轴的实际位置:
data = tcp_connect.get_tcp_recv()
position = struct.unpack(">d",data[252:260])[0]
获取的值是弧度,在程序中将其转换为角度方便使用。在获取到数据后,程序如上述例子数据处理并显示到程序界面上供操作人员查看。
数据发送模块负责将根据操作人员的操作生成的上位机指令发送到UR10机械臂,以实现对通过二次开发的本软件对UR10机械臂的操控。数据发送模块同样采用30003端口,TCP协议发送,发送命令使用URScript语言。移动命令支持JOG、Move Pose、Move Location模式。JOG,即点动,按下鼠标左键后开始移动,移动过程中松开鼠标不放,鼠标放开后即停止。支持两种方式,轴移动和位姿移动,轴移动采用关节运动方式,即MoveJ方式,位姿移动采用线性运动,即MoveL方式。
MoveJ方式:movej([j1,j2,j3,j4,j5,j6],a,v),其中j1-j6代表UR10机械臂的六个轴,a代表关节加速度(rad/s^2),v代表关节速度(rad/s),还有两个可选参数时间和交融半径可选,本程序不用。点动时,操作人员选择要动的轴,程序通过拼接字符串将命令拼接好发送至UR10机械臂。
MoveL方式:movel([x,y,z,Rx,Ry,Rz],a,v),其中x,y,z代表三轴的位置,Rx,Ry,Rz代表姿态,其他与MoveJ类似。
Move Pose方式,即由操作人员输入6轴的位置,UR10机械臂通过内部算法直接移动到响应位置。
Move Location方式,与Move Pose类似,操作人员输入位姿的6个参数,UR10机械臂通过内部算法直接移动到响应位置。
当需要机械臂停止时,发送停止命令即可,stopj命令对应MoveJ运动方式,stopl命令对应MoveL移动方式。本程序还定制了一些现场实际使用的特定模式,例如三点间的循环运动,机械臂与每个点停留一定时间,之后向下个点运动。脚本直接存放于程序下,可根据现场的实际情况实施修改。
仿真交互模块负责程序与V-REP交互,主要功能是将UR10机械臂的位置数据反馈到V-REP中,使得操作者能够观测仿真环境。在使用前,需要对程序进行配置才可使Python程序正常链接V-REP。在V-REP安装目录下programming emoteApiBindingspythonpython目录中找到vrep.py、vrepConst.py、remoteApi.dll这三个文件,将其拷贝到本程序的同级目录下,之后在Python程序头部导入vrep模块即可。随后需要考虑链接V-REP的功能,使用vrep.simxStar函数,该函数作用是启动一个通信线程与V-REP相连,注意函数中的端口号要与V-REP子脚本中配置的端口号一致。
图2 UR10机械臂可视化平台操控界面
使用时分为仿真模式和实时同步模式,仿真模式时只在V-REP中驱动仿真界面不操作实际机械臂,实时同步模式实际操作机械臂,通过数据接收模块读取UR10机械臂的实际位置后将其反馈给V-REP。仿真模式较为简单,由于无需与UR10机械臂交互,当操作人员点击按钮后,只要算出移动后的位置,将移动位置传输给V-REP接口即可。实时同步模式中,当操作人员点击按钮后,首先通过数据发送模块将命令传送给UR10机械臂,然后通过数据接收模式获取UR10机械臂的实时位置反馈,最后通过仿真交互模块将位置数据传给V-REP以实现仿真功能。
在连接成功后,通过vrep.simxGetObjectHandle函数获取UR10和UR10各个关节轴的句柄,将其存于一个变量之中以供之后调用。当用户操作后程序获取位置时,将各轴位置通过vrep.simxSetJointTargetPosition函数通知VREP程序,调用时将各轴位置和之前获取的句柄一一对应。simxSetJointTargetPosition中的各轴位置使用的是弧度,源程序使用的角度,需要在程序中进行转换。
基于Python的UR10机械臂可视化平台操控界面如图2所示。
首先,打开V-REP软件,打开先前设置好的V-REP场景,并启动模拟环境。之后打开操作程序,点击V-REP连接按钮,当程序提示成功后,如果使用仿真模式即可直接操作,在V-REP上查看仿真运动轨迹。如果使用实时同步模式还需要点击机械臂连接按钮,之后即可各种操作,观察UR10机械臂的运动情况和V-REP中的仿真情况。操作人员按下各个JOG+、JOG-按钮即可对相应的轴或者位姿进行点动,放开鼠标即停止点动,为了安全原因,每次点动最多移动90°,移动超过90°后会自动停止,需要继续移动要松开鼠标并再次按下鼠标。经过测试,本软件能够顺利操控机械臂,延迟时间低,在实时同步模式下UR10机械臂与VREP软件延迟低于0.1s,能够使操作人员较好的利用仿真环境操控实际机械臂,实现了UR机械臂模拟的需求。
基于对UR10机械臂可视化仿真平台设计分析,叙述了Python语言编写的操控及仿真的机构、设计和实现,通过仿真结果来验证该设计方案的可行性,体现了平台的通用性和可扩展性,为进一步优化、研究机械臂仿真和操控打下了基础。