基于Protobuf的机器人示教器软件设计与实现*
2016-08-31夏飞虎叶瑛歆胡天亮张承瑞
夏飞虎 叶瑛歆 胡天亮 张承瑞
(①山东大学机械工程学院,山东 济南 250061;②高效与洁净机械制造教育部重点实验室(山东大学),山东 济南 250061)
基于Protobuf的机器人示教器软件设计与实现*
夏飞虎①②叶瑛歆①②胡天亮①②张承瑞①②
(①山东大学机械工程学院,山东 济南 250061;②高效与洁净机械制造教育部重点实验室(山东大学),山东 济南 250061)
为提高工业机器人示教器数据通信性能,改善示教器人机界面设计,提出了一种基于以太网通信和嵌入式Windows CE开发的机器人示教器软件设计方案。该方案在通信实现上基于Google Protobuf定义Socket传输数据协议,简化了机器人示教器与控制器之间传输数据组包和解析;在界面设计上运用Windows CE系统的优势,实现了开发简单、反应速度快、可扩展性好的人机界面;在软件设计方面基于动态链接库的映射机制实现了模块化的软件结构,提高了软件系统的独立性和开放性。最后通过在SCARA机器人上的测试,验证了示教器软件的可用性。
Google Protobuf;工业机器人;示教器;软件设计
机器人示教器是实现人机交互的工具,是机器人控制系统的重要组成部分。在应用上,示教器有两种类型,一种是作为控制器显示和键盘延伸的输入输出设备,另一种是带有独立CPU的通信型示教器。通信型示教器系统大多基于单片机和嵌入式计算机。相比于单片机,嵌入式计算机具有的系统开发和扩展方便、通信稳定、开放性高等优点使其能更好满足示教器越来越丰富的功能需求。但基于嵌入式计算机开发机器人示教器涉及两台相互独立的计算机之间进行通信,如何保证通信的速率、稳定性和数据传输的准确性是通信型示教器开发中的重要问题。
通信型示教器与控制器常用的通信方式有两种:串口通信[1-2]、以太网通信[3]以及串口与以太网混合通信[4]。串口通信方式实现简单,但其传输速率和传输距离均不如以太网通信[5]。串口与以太网混合通信方式根据对通信要求的不同,通过采用串口与PLC通信,同时使用以太网与运动控制通信,能很好地改善通信性能,但通信系统过于复杂。以太网通信方式将PLC通信和运动控制通信集中通过以太网实现,在简化了通信系统的同时能保证通信性能,但多种数据同时传输使得传输数据协议的制定较为复杂。因此,设计一种简单的传输数据协议来开发通过以太网方式通信的示教器具有重要意义。
针对以上问题,本文在课题组前期开发的基于实时以太网的运动视觉一体化机器人控制器平台的基础上[6-9],提出了一种基于嵌入式Windows CE的工业机器人示教器设计方案。该方案采用基于Socket的TCP/IP网络通信模式,通过以太网实现示教器与控制器之间所有数据的通信,充分利用Windows CE系统图形界面友好、反应速度快、可扩展性好的优点和以太网具有的速率高、稳定性好、传输距离远等优势。同时,基于Google Protobuf提供的序列化框架,设计了一种机器人示教器与控制器之间数据传输协议,使传输数据的定义变得简洁高效。在示教器软件设计上,通过动态链接库机制和多线程、模块化的软件结构实现了示教器的开放性。并以SCARA机器人为样机搭建了示教器性能测试平台,验证示教器软件的正确性和可操作性。
1 示教器软件结构设计
如图1所示,机器人控制系统由机器人示教器、机器人控制器和机器人本体组成。本文以课题组前期研发的运行实时拓展软件Kithara拓展的Windows7系统的工业PC为控制器,采用标准以太网卡与示教器集成。示教器为运行Windows CE 6.0系统的嵌入式计算机。
示教器系统的软件结构采用模块化、多线程的策略进行开发,包括两个部分:运行在示教器上的人机交互(HMI)模块及以太网通信模块和运行在控制器上的以太网通信模块,其结构如图2所示。控制器上的以太网通信模块以动态链接库(DLL)的形式加载到控制器主程序,采用C++语言开发。HMI模块是示教器程序的主控模块,为提高界面开发效率采用C#语言开发;以太网通信模块以C#引用(using)的形式加载到HMI模块中。在示教器软件运行过程中主要实现3个任务:界面显示和触屏消息的刷新,按键消息的响应和通信数据的交互。任务的并行执行采用多线程的方式,即开辟3个线程分别对应负责3个任务,界面线程为主线程,按键处理线程和通信线程为两个支线程。界面主线程负责扫描界面输入与刷新界面输出;通信线程调用以太网通信模块中的函数完成与控制器的通信和与HMI的交互;按键处理线程负责将按键的输入向HMI的传递。
示教器的软件设计主要实现人机交互和以太网通信两个功能。
2 示教器人机交互功能实现
人机交互功能是通过一系列的人机界面、输入输出操作实现的。示教器为用户提供了按键和触屏两种输入方式,用来实现参数设置、指令输入、程序编辑等功能。界面为用户提供了机器人位姿状态、报警信息显示,操作窗口等功能,随着机器人应用场合更加广泛,示教器还能方便扩展功能,如集成机器人视觉后的视觉图像显示等。Windows CE是一种模块化的、具有强大通信能力的嵌入式操作系统,专门用来支持各种便携式的个人计算设备,非常适合用于示教器开发。
图3列出了示教器界面的结构。主界面是HMI的初始界面,主要实现机器人位姿、报警信息显示,手动操作,示教器系统信息显示,坐标系选择以及调用其它界面的功能选择操作等功能。设置界面,包含机器人机构参数,伺服参数,用户自定义的运动速度、加速度、加加速度、工况参数,机器人坐标系等的设置、修改和查看。自动模式是机器人在搬运、码垛等工况下的工作模式,通过设置机器人运动轨迹中的几个固定的示教点,自动生成机器人运动轨迹,完成相应工作任务。自动模式界面,包括示教点的设置、修改、查看以及自动模式下的相应按键。编辑模式界面是机器人的运动轨迹程序编辑界面,包含了机器人轨迹编程的特定语言,程序编辑、程序代码执行,键盘等。文件管理界面,是进行示教程序管理的界面,包含了文件读写、修改、存储等操作。
3 示教器与控制器通信功能实现
机器人示教器和控制器软件系统作为两个独立的进程使用客户端/服务器模式[10]实现,控制器为服务器,示教器为客户端。示教器与控制器通过网线连接,以太网通信的具体实现采用套接字(socket)来完成。在示教器和控制器上分别设计了一个以太网通信模块,封装socket实现函数和数据传输协议,完成示教器和控制器之间的数据信息的交互。具体有以下3个方面的作用:
(1)网络检测。检测网络出现的异常,维护网络的稳定可靠,使其能正常通信。
(2)数据传输。接收数据并解析到相应的接收数据缓冲区,或将要下发的数据写入相应的下发数据缓冲区并下发。
(3)数据交互。提供接口函数给主线程,使其方便地从通信模块中读写数据。数据传输协议采用Protobuf提供的语法格式来定义。
3.1Protobuf简介
Google Protobuf(简称Protobuf)是Google提供的一个开源序列化框架,一种支持多种语言、跨平台的结构化数据串行化方法,可用于分布式应用之间的数据通信、数据存储或者异构环境下的数据交换[11]。Protobuf最大的特点是以二进制流存储,以一种高效、简洁、可扩展的数据格式对结构化数据进行编码[12]。开发人员按照特定的语法定义结构化的数据格式,然后使用Protobuf编译器生成用来读写该数据的类的代码,通过将这些类的文件添加到项目中,调用相关方法来完成数据的读写和序列化与反序列化工作。
3.2数据传输协议
机器人示教器与控制器之间的传输数据主要包括参数数据、指令数据和状态数据,集成机器视觉后还包括视觉图像数据,如图4所示。参数数据包括机器人的机构参数、伺服电动机的伺服参数和用户自定义的用户参数;指令数据是指通过示教器发送给控制器用来控制机器人运动的命令,根据类型的不同又分为触发性指令和长效指令;状态数据包括机器人关节坐标、末端坐标以及运动报警信息等。可以看出,这些数据类型中既有机器人运动状态等周期性数据,也有运动指令等随机性数据,因此必须制定一套数据传输协议以确保信息传输的高效准确。Protobuf的特点使其非常适合网络数据传输,因此,本文基于Protobuf设计了机器人示教器与控制器之间的数据传输协议。
Protobuf将传输数据定义在.proto文件中,传输数据的结构在该文件中以message格式定义。每个数据结构拥有一个或多个字段,每个字段都由一个字段修饰符、字段值类型、字段名和字段标识符组成。修饰符用于指定该字段是必选字段(required)、可选字段(optional)或者是重复字段(repeated),重复字段通常被用来当做数组使用;值类型指定了字段的数据类型,可以是基本数据类型,也可以是枚举(enum)、message等类型;字段名是字段的ID,不允许重名;标识符用于标识该字段序列化时在二进制流中的位置。下面列举了一个名为PosData的message定义的例子,其含有3个字段。
message PosData
{
enum DataType
{
DOWNLOAD = 0;
UPLOAD = 1;
UNDEFINE = 2;
}
required DataType dataType = 1 [default = UNDEFINE];
optional double feedPos = 2;
repeated double absPos = 3;
}
定义好的.proto文件通过编译器生成指定语言数据类的代码,C++生成.pb.h和.pb.cc文件,C#生成.cs文件。.proto文件中的每个message都会对应地生成一个C++类或C#类,类中针对message中的每个字段都会生成一系列的函数用于方便地对字段进行读写操作。以feedPos为例,会生成下列函数:
// optional double feedpos = 2;
inline bool has_feedpos () const;
inline void clear_feedpos ();
static const int kfeedPosFieldNumber = 2;
inline ::google::protobuf:: double feedpos () const;
inline void set_feedpos (::google::protobuf:: double value);
基于Protobuf数据规则,本文在RobotData.proto文件中定义了机器人的传输数据。该文件中包含两个一级message,分别为数据头DataHead和数据区DataInfo。数据头中定义了数据区的数据模式、数据状态和数据长度,如图5所示。数据区中定义了机器人运动参数、运动指令和运动状态以及扩展的视觉信息等数据,这些数据在DataInfo中分别定义成不同的message,实现数据的结构化存放。数据的结构化存放满足了周期性数据和随机性数据在传输中的不同需求,也使数据读写和后期扩展更加方便。数据头和数据区共同构成了数据协议,以整体的形式在以太网中传输,如图6所示。
数据头中定义的数据区的数据模式是指数据是下发模式还是上传模式,下发模式是指从示教器往控制器发送数据,上传模式是指控制器往示教器发送数据。下发模式的数据主要是随机性数据,上传模式的数据既有机器人位姿、关节位置等周期性,又有报警、错误信息等非周期性数据。数据状态用于校验数据类型,不同的场合会有不同的数据需求,如某些紧急情况下会发送紧急数据。数据包长度在数据发送前通过Protobuf提供的函数获得,在数据包反序列化时使用。数据发送前先要根据数据区的内容写数据头;数据接收后也先要解析数据头,再根据数据头解析数据区。
3.3数据交互接口
以太网中传输的数据是Protobuf格式数据,要将其转换成示教器界面层或控制器运动内核层(RunTime)使用的数据还必须通过自定义的数据交互接口来完成。数据交互接口中包括了Protobuf数据定义类(RobotData.pb.h、RobotData.pb.cc)、Protobuf数据收发类(TcpComm.h、TcpComm.cpp)、用户数据定义类(DataInfo.h、DataInfo.cpp)、用户数据读写类(DataComm.h、DataComm.cpp)等四个类,类关系图如图7所示。图中编号为数据传输流程,①~⑤为数据接收读取流程,⑥~⑩为数据写入发送流程。
Protobuf数据收发类中封装了与以太网通信的接口函数,用户数据读写类封装了与示教器界面或控制器非实时层交互的接口函数。用户数据定义类的作用是充当了一个数据缓冲区,示教器在下发数据之前先通过用户数据读写类中的写函数将要下发的数据写入数据缓冲区,再周期性地传递给用户Protobuf数据定义类,完成下发;示教器在周期性地接收数据后将接收的Protobuf数据读入数据缓冲区,HMI或RunTime再通过用户数据读写类中的读函数读取所需的数据。
3.4数据传输流程
Protobuf定义的数据协议在Socket通讯中的基本原理是[13]:发送端在发送之前将要传输的消息按message格式打包并序列化;接收端在收到消息时,反序列化并解包。Protobuf提供的API定义了序列化和反序列化的函数,如表1所示。
表1Protobuf序列化与反序列化函数
操作函数C++序列化SerializeToArray()C++反序列化ParseFromArray()C#序列化Serializer.Serialize()C#反序列化Serializer.Deserialize()
常用的Socket通信应用类型有两类:用于面向连接的TCP(Transmission control protocol,传输控制协议)服务应用和用于无连接的UDP(user data protocol,用户数据报协议)服务应用[14]。TCP通信在正式收发数据前,必须和对方建立可靠地连接,因此准确性高。机器人示教器与控制器之间的通信必须保证数据的严格准确,因此采用基于面向连接的TCP协议的Socket通信。控制器为Socket服务器端,示教器为Socket客户端,在独立的线程中通过定时器实现每200 ms完成一次数据接收与发送,通信工作流程如图8所示。
4 实例验证
在实验室的机器人控制平台上,以SCARA机器人为实例,进行了以下两个方面的试验,试验平台如图9所示。
(1)示教器与控制器之间以太网通信准确性和稳定性的试验。模拟示教器正常使用情况下数据的发送和接收情况,如从示教器设置参数,下发指令,从控制器获取机器人位姿、报警信息等,观察数据的准确性和网络的稳定性。结果表明,以太网通信准确稳定。
(2)示教器、控制器与机器人联机试验。试验过程中用示教器改变机器人的位姿、设定机器人运动速度和指定运动轨迹,观察机器人的实际响应情况及示教器的状态显示等。结果表明,通过示教器可以方便快捷的使机器人按照指定的方式稳定的运动。
5 结语
在嵌入式WinCE平台下开发机器人示教器,能充分利用系统支持的丰富软硬件资源,使示教器软件开发更加方便,人机界面更加友好,性能更加完善。使用以太网实现示教器与控制器之间的通信,解决了传输速率的问题,提高了通信效率,同时提高了通信的稳定性和数据传输的准确性。基于Google Protobuf定义传
输数据协议,简化了数据协议,可在不改变软件结构的情况下修改数据,实现数据与算法的分离。
[1]洪鹰,王乐. 基于嵌入式计算机的机器人示教器研究[J]. 计算机工程与应用,2013,49(1):78-81.
[2]周伟,徐方. 基于Wince的机器人示教盒的设计与开发[J]. 机械设计与制造, 2012(3):9-11.
[3]赵凤申,李爱芹,吴文祥. 工业机器人嵌入式示教盒设计[J].电焊机, 2011,41(12): 9-12.
[4]何竞择,贠超,张栋,等. 抛光机器人示教控制系统设计[J]. 制造业自动化, 2011,33(13): 5-8.
[5]常春国,史金飞,罗翔,等. Windows与Linux串口通信和网络通信的比较研究[J]. 中国制造业信息化:学术版, 2006(7): 49-52,65.
[6]Wang K, Zhang C, Ding X, et al. A new real-time Ethernet for numeric control[C].Intelligent Control and Automation (WCICA), 2010 8th World Congress on. IEEE, 2010: 4137-4141.
[7]郎需林,靳东,张承瑞,等. 基于实时以太网的 DELTA 并联机械手控制系统设计[J]. 机器人, 2013, 35(5): 576-581.
[8]姬帅,张承瑞,孙书仁,等. 基于实时以太网的开放式运动控制系统[J]. 山东大学学报:工学版, 2014, 44(5): 7-13.
[9]孙好春,张承瑞,胡天亮. 基于 SMP 的总线式软运动控制引擎设计[J]. 农业机械学报, 2014, 45(3): 288-292.
[10]Xue M, Zhu C. The socket programming and software design for communication based on client/server[C].Circuits, Communications and Systems, 2009. PACCS'09. Pacific-Asia Conference on. IEEE, 2009: 775-777.
[11]Feng J, Li J. Google Protocol Buffers research and application in online game[C].Conference Anthology, IEEE. IEEE, 2013: 1-4.
[12]Sumaray A, Makki S K. A comparison of data serialization formats for optimal efficiency on a mobile platform[C].Proceedings of the 6th International Conference on Ubiquitous Information Management and Communication. ACM, 2012: 48.
[13]李纪欣,王康,周立发,等. Google Protobuf在Linux Socket通讯中的应用[J]. 电脑开发与应用, 2013,26(4): 1-5.
[14]张允刚,刘常春,刘伟,等.基于Socket和多线程的远程监控系统[J]. 控制工程, 2006, 13(2): 175-177.
如果您想发表对本文的看法,请将文章编号填入读者意见调查表中的相应位置。
Design and implementation of the robot handheld’s software based on Protobuf
XIA Feihu①②, YE Yingxin①②, HU Tianliang①②, ZHANG Chengrui①②
(①School of Mechanical Engineering, Shandong University,Jinan 250061,CHN;②Key Laboratory of High Efficiency and Clean Mechanical Manufacturing, Shandong University, Jinan 250061, CHN)
To improve the data communication performance and the human-machine interface design of the industrial robot handheld, a software design method of the robot handheld based on Ethernet and Windows CE is proposed. In the implementation of communication, Socket data transmission protocol is defined based on Google Protobuf, which simplifies the packaging and parsing of transmission data between robot handheld and the controller. In interface design, the use of Windows CE system simplifies the development, also fast response and good extensibility of human-machine interface are achieved. In software design, mapping mechanism based on dynamic link library is used to realize the modularized software architecture, which increases independence and openness of the software system. Through the test on SCARA robot, feasibility of handheld software is validated.
Google Protobuf; industrial robot; handheld; software design
TP242.2
A
夏飞虎,男,1989年生,硕士研究生,研究领域为机器人控制系统。
(编辑谭弘颖)(2016-01-05)
160537
数控一代机械产品创新的区域应用示范工程(2014BAF09B01)科技部国家支撑计划