巢惠世,梁宏斌,蔡土淇
(辽宁科技大学 机械工程与自动化学院,辽宁 鞍山 114051)
21世纪以来,我国工业机器臂取得了巨大的进步,随着我国传统制造业的转型升级,我国的机械臂市场的潜力是巨大的,所以对机械臂的研究具有重要意义[1-2]。现在机械臂常用的操作系统像VxWorks都是商用的操作系统,虽然实时性好,但是价格昂贵,而价格低廉、开源且可裁剪的Linux则非常适合机械臂系统的自主开发。由于标准的Linux操作系统不具备实时性,需要对其进行实时性改造。
在Linux的实时改造方面,有采用双内核路线的美国新墨西哥州立大学研制的RT-Linux、意大利米兰学院研制的RTAI以及移植性更好的Xenomai[3-4];还有采用直接修改内核路线的加州大学开发的RED-Linux,堪萨斯大学开发的Kurt-Linux,以及实时抢占补丁RT-Patch[5]。经过改造的Linux可以在数控系统、机器人系统、航空领域等得到应用。赵翔宇[6]采用嵌入式Linux对六自由度机械臂控制系统进行设计,运用CAN总线的分布式控制方式,实现了机械臂点到点的抓取控制;应思齐[7]利用Linux系统的嵌入式平台作为SCARA机械臂的控制端,并基于Qt应用软件对机械臂进行运动控制,提高了系统的实时性;中科院沈阳自动化研究所采用RT-Linux实时嵌入式操作系统,研制出基于对话方式设计实现的机器人示教器[8]。
本文针对机械臂实时控制系统开发,采用RT-Patch的改造方法对Linux进行实时性改造,在经过改造的Linux环境下对机械臂下位机进行系统架构搭建,实现译码、插补、逆解、通信功能;同时结合示教器软件设计,完成机械臂从示教器端的指令输入到下位机的数据处理功能,具有示教再现功能,同时使机械臂在实时性达到要求的前提下运行平稳且满足一定的运动精度要求。
Linux作为开放源码项目的典型代表,在各个领域都有广泛的应用,但是标准的Linux是一款分时操作系统,追求的是高的信息吞吐量和公平性[9],虽然Linux的内核在2.4版本后支持和优化了实时性,但是它本质上并不是一个实时操作系统。主要体现在以下方面[10]:(1)内核的不完全抢占;(2)中断不可抢占;(3)时钟颗粒粗糙;(4)实时调度策略不足;(5)优先级反转;(6)虚拟内存。
为解决Linux的实时性问题,本文采用的方法是在Linux社区kernel的基础上加上RT-Preempt补丁,以使得Linux满足实时的需求[11]。RT-Preempt补丁对Linux内核的主要改造包括:(1)通过用rtmutexes重新实现,使内核内锁定原语(使用自旋锁)可抢占;(2)受spinlock_t和rwlock_t保护的关键部分现在可以抢占;(3)将中断处理程序转换为可抢占的内核线程,RT-Preempt补丁在内核线程上下文中处理软中断处理程序,该任务由task_struct表示,就像普通的用户空间进程一样,但是也可以在内核上下文中注册IRQ;(4)将旧的Linux计时器API转换为用于高分辨率内核计时器的单独基础结构,再加上用于超时的基础结构,从而产生具有高分辨率的用户空间POSIX计时器;(5)丰富了实时调度策略算法;(6)实现内核内自旋锁和信号量的优先级继承;(7)提供内存锁定功能,避免实时处理中存储页被换出。
测试环境为Ubuntu10.10,在安装配置完实时补丁后,再在Linux下安装RT测试工具集,运行其中的cyclictest测试工具,默认创建5个SCHED_FIFO策略的RT线程,优先级76~80,运行周期是1 000 μs、 1 500 μs、2 000 μs、2 500 μs、3 000 μs,分别在标准Linux环境下和改造后的Linux环境下进行测试,测试结果如图1所示。由图可知标准Linux内核中RT线程投入运行时间非常不稳定,而按照相关文档加入实时补丁的Linux系统的最大延迟时间为436 μs,平均延迟时间为192 μs,本次测试的最大延迟时间为241 μs,证明Linux系统实时改造是满足要求的。
图1 延迟调用时间图
机械臂的伺服控制系统如图2所示,主要由指令平台(示教器端,即PC机)、实时平台(控制器端,即内嵌Linux系统的工控机)以及关节模块的伺服驱动器和伺服电机组成三级控制。本文主要对指令平台和实平台进行设计。
机器臂示教器作为控制系统的上位机是运动控制器与操作人员之间连接的桥梁,一方面负责对操作人员的操作进行处理,例如机器人作业文件编写、示教再现等;另一方面在图形界面上监控机器人运动过程中的状态信息,并向控制器发送指令使机械臂完成相应的动作。
图2 机械臂伺服控制系统框图
示教器的软件编写是在Windows环境下以Qt作为开发工具进行的,主要进行4方面设计。
(1)设计一款合适的人机交互界面。整个示教器主要分为主界面和控制界面两个界面进行显示。主界面主要显示的是示教编程功能,在该界面可进行指令的输入;控制界面主要进行状态显示、数据点显示、模拟仿真视图显示和通信功能接口。同时示教器也具有指令的插入编辑等功能对应各自的界面。主界面图如图3所示。
图3 主界面图
(2)示教器与机器人控制器进行实时交互。示教器与机器人控制器的通信通过基于TCP/IP协议的以太网通信实现。
(3)提供了机器人操作的基本功能,含有直线、圆弧、关节的插补运动指令,在控制界面还添加了插补点坐标的显示和插补点的仿真试图。
(4)通过界面上的状态信息显示出当前机械臂的状态,遇到故障或者错误时及时反馈到示教器界面。
下位机采用Linux系统(加入实时补丁)作为多任务控制系统的编写环境平台,具有多进程设计的控制系统其稳定性比较高,因此多任务采用多进程进行处理。本次多任务分为四个进程,分别为:TCP通信进程、I/O进程(实时RT进程)、译码进程、插补逆解进程(实时RT进程)。
TCP通信进程:与上位机进行TCP通信实现数据信息的交互,上位机获得的人机运动指令TXT文档传递给下位机[12]。上位机先发送文件的头部信息,发送完毕后延时5 ms,然后循环读取4 KB内存大小的文件数据,再发送给下位机直到文件读取结束。下位机先接收文件的头部信息,然后再连续接收文件的内部信息,从而实现人机涌动指令TXT文档的接收。
I/O进程:此进程为实时进程,以20 ms的周期来读取相关GPIO口的状态置位信息,和内部设置好的GPIO口置位信息对比从而进行相关的程序处理。
译码进程:逐行读取人机运动指令TXT文档,根据每行的运动指令类型添加特征符变量,然后将每行识别的位置、速度、欧拉角的信息和特征符变量依次添加到链表当中,然后通过管道通信给插补逆解进程(实时RT进程)传输链表信息。具体过程如图4所示。
图4 译码流程框图
图5 插补逆解流程图
插补逆解进程:设置定时器,以10 ms为周期触发定时器(设计的插补周期为10 ms),进程开始依次读取链表信息进行加减速、轨迹插补、逆解计算,然后进程移出工作队列放入等待队列,任务进入阻塞状态,等待定时器触发唤醒进程的下一次程序处理,直到链表全部读取完。流程图见图5。
前面已经验证安装RT补丁后的系统实时性是满足要求的,这里进行系统调用插补逆解进程完成机械臂运动控制的实时性检验,仍然用rt-test测试工具集对其进行实时性测试,测试结果如图6所示。
图6 程序执行时间图
图中横坐标为所有插补点,纵坐标为每次执行插补逆解所需要的执行时间,从图中可以看到最大执行时间为310 μs,加上进程最大延迟调用时间436 μs,一共耗时不超过1 ms,为后续添加更复杂功能提供了可能性,证明此系统设计具有良好的实时性和扩展性。
在机械臂的建模方法上采用D-H参数法[13]建立关节坐标系,以PUMA560为原型建立机器人连杆坐标系。利用MATLAB环境下的Robotic工具箱[14]的Link和robot函数建立机器人处于零点位置的位姿,根据表1给出的D-H参数建立机械臂的模型,建立第i个连杆的命令如下:
Li=Link(θi,di,ai,αi)
利用SerialLink函数将六个连杆依次序连接起来,命令如下:
robot=SerialLink([L1,L2,L3,L4,L5,L6])
调用teach函数调节6个关节变量,实现对机器人模型进行控制,关节变量由实时平台的Linux系统计算得到。整个过程模拟焊接轨迹过程,包括三段直线,一段圆弧。机械臂的运动仿真结果如图7所示,从仿真中可以直观地看到末端执行器的整个连续平稳的运动轨迹。
本文在Linux内核上外加RT补丁的实时改造的基础上,独立完成对六自由度机械臂控制系统的搭建。进行以示教器为上位机的示教器软件设计,完成了通信、指令输入、视图仿真等功能,下位机则进行了包括TCP通信、I/O、译码、插补逆解进程的系统架构搭建。
通过实验,验证了Linux外加RT补丁的实时性改造的可行性,并且完全可以应用到机械臂的控制系统当中,实时性可以满足,同时对整个控制系统进行仿真,仿真结果为连续平稳的曲线,证明了机械臂控制系统的运动控制的正确性和可行性。
图7 机械臂运动仿真图