王炜
近年来,随着服务机器人研究的飞速发展,发展出大量应用于服务机器人的编程平台,Windows下较为典型的通用编程平台有LabVIEW[1]以及Microsoft Robotics Studio[7],前者提出了 G语言,开始使用编译性图形化编程,并将软件与虚拟仪器结合,代替了许多传统仪器,广泛应用于工程项目中;后者为微软开发的一款机器人开发环境,具备了可扩展、跨越硬件平台、实时性等特点,同时包含了庞大的组件库和仿真环境,方便用户使用。Linux下新兴的ROS[2]系统凭借其庞大的组件库、合理的构架以及开源的特性,吸引了大量的开发用户,其他开发的机器人平台如 OROCOS[3]、Player[4]等也被应用于服务机器人研究。同时一些机器人器材制造商在产品中也会附带自己的开发平台(例如ABB),但是其通用性较差。纵观这些编程平台,总会或多或少存在某些缺陷。比如Microsoft Robotics Studio以及LabVIEW属于商业软件,不支持开源,自身系统庞大,面向对象多为工程师、设计人员;OROCOS、ROS缺乏友好的图形用户编程界面,使得普通用户望而却步。
本文针对以上编程环境存在的问题,设计了基于分层编程方式的服务机器人编程平台,基本模块层面向开发人员开放,开发人员将复杂的驱动、算法等基本模块一次性编写完成,通过统一接口协议嵌入模块库;任务规划层提供友好的图形化界面,用户根据任务需求,将基本模块像搭积木一样搭建起来,即可完成对服务机器人的编程,实现各种任务。通过该分层模式,既兼顾了底层开发的需要,又使得不具备或具备很少专业知识的用户也能方便的给机器人编程[5],同时该平台还具有内核小,界面简洁等优势。通过在“交龙”服务机器人上进行测试与实验,将语音识别、定位导航、物体识别、机械臂控制模块嵌入该平台,可以很方便的对“交龙”进行编程,完成各种不同的任务流程。
参考其他平台的设计指标[1~4],考虑其独立性、模块化、可扩展性、实时性、重复利用性、编程语言等各个方面,该平台将系统结构分为三层:基本模块层、执行协调层、任务规划层,如图1所示:
图1 平台系统结构图
基本模块层提供了庞大的模块库,并通过模块管理器进行统一管理;执行协调层由程序解释器构成,一方面对任务规划层的用户程序进行解释分析,另一方面通过模块管理器调用相应模块,完成相应的任务,该层对任务规划层和基本模块层起到协调的作用;任务规划层提供友好的人机交互界面,方便用户以图形化编程的形式进行任务规划。下文将针对各层进行详细介绍。
基本模块层由模块库和模块管理器构成。模块库中包含设备驱动、控制算法、逻辑算法等基本模块,构成了平台的最底层。模块管理器负责对模块库进行统一的数据通信管理和调度。
基本模块层定义了统一的模块接口协议,用户可根据此协议编写自定义模块,将其纳入模块库。协议中规定模块以完成编译的动态链接库形式存储,提高了底层执行效率。
不同模块间数据通信传输是模块管理器的设计难点,本文采用数据共享机制,如图2所示:
图2 数据共享机制结构图
数据通讯分为数据存储层、数据映射层和数据访问层。在数据存储层,每个模块自行分配数据内存,保证了模块数据的独立性;通过数据映射层,平台对所有模块的数据地址以指针变量的形式进行统一管理,形成地址池,每个数据地址被映射到用户自定义的变量;在数据访问层,需要数据的用户或者模块直接通过自定义变量对共享数据进行访问。通过该机制,用户可直接利用数据而不必关心数据来源,实现了数据链接层透明化。
任务规划和程序编写主要体现在任务规划层,利用图形化编程界面设计,如图3所示:
图3 图形化编程界面示意图
用户可以很便捷的完成对服务机器人的编程。
在界面风格设计中,本文力求简洁清晰,保证用户上手简单。菜单主要分为主菜单和调试菜单,主菜单提供了对程序的管理功能(创建、删除、拷贝、编辑等)以及各个窗口(编程窗口、变量窗口、模块面板)的管理功能。调试菜单为用户提供了简单的调试功能(运行、单步执行、暂停、停止等),方便用户对程序进行监控。
在编程风格设计中,该界面采用了流程图式编程,箭头连线通过连接不同的模块,表示任务的流程走向;这种编程风格使得用户可以很直观的将规划的任务流程反映在编程界面上,用户只需要根据任务的要求将模块面板以及模块库中的相应模块直接拖拽到编程界面,按照流程用连线连接即可。平台采取自动识别用户变量类型,并依靠前文提到的数据共享机制进行数据传递。
图标是图形化编程的基本单元,在编程中起着关键作用,合理的设计也就尤为重要,在RT软件中,组件单元包含了状态、输入、输出、命令四个基本部分,本文在其基本单元的设计中借鉴了RT[6]的组件形式,同时融入了自己的特点,具体体现在如下几个方面:
(1)易于理解:图标名称采用文字显示,上标为模块名称,下标为模块命令名称或参数,简单易懂,用户可通过接口对名称进行自定义,对于当前模块的运行状态,则通过不同的颜色框予以表示。
(2)参数表达:LabVIEW、RT等平台的参数之间通过连线来表现传递关系,而该平台采用流程式编程,连线表达的是任务的走向,输入输出参数采用文本输入形式。同时为了保证界面干净整洁,参数可选择显示或隐藏,隐藏状态下鼠标滑到相应图标上会显示参数,参数的编辑修改通过双击图标实现。
(3)集结性:编程界面图标数量过多,会使得整个界面排列紊乱,为了保证界面简洁干净,同时方便用户将不同功能的模块归类划分,该平台提供了图标集结功能,用户可以将多个模块(图标)整合为一个模块(Block),Block可以编辑注释,便于程序浏览。每一个Block即为一个新的功能模块,用户可以对其进行模块操作。
(4)存储格式:由于程序全部由图标和连线架构而成,因此采用通用的XML格式存储,方便对图标和连线进行统一管理。
(5)多分支性:考虑到判断选择语句的应用以及多线程同步的需求,本文在连线上添加了参数,解释器会根据满足参数要求的连线方向执行程序。
执行协调层由程序解释器构成,完成用户程序的运行和调试功能。
该层采取解释执行方案,在程序运行过程中,程序解释器解释当前用户的任务流程,调度相应模块,具体流程,如图4所示:
图4 程序解释执行图
该种执行方式一方面考虑到了用户的使用方便,方便用户进行单步调试,另一方面也顾及了程序的执行速度。
2011年中国服务机器人大赛中,该平台在“交龙”服务机器人上首次正式使用。该机器人装载有激光测距传感器、摄像头、麦克风等基本传感器以及云台、机械臂、电动机等执行机构,如图5所示:
图5 交龙机器人图
在比赛中,“交龙”机器人需要完成特征人识别任务,具体任务流程如下:
(1)机器人通过门道进入比赛场地,并走到预先设定的一个点。
(2)由裁判预先给定三名测试人员的识别顺序,三名给出名字的人员依次站到机器人面前,机器人给他们介绍自己,询问他们的名字,被测试人员给予机器人的任何信息,都可被机器人用来作为识别的手段,但是不允许触摸机器人,然后,机器人必须判别是否已经记住该人员,如果记住则开始识别下一个人员,没有记住可以跳过去,不扣分。识别结束后,测试人员离开场地。
(3)三名人员识别后,机器人自主行走到第二点。
(4)由裁判给出五名测试人员的出场顺序,他们依次站到机器人面前,面向机器人保持十秒钟,机器人要能识别出他们并且能够说出他们的名字。其中一测试个人员是机器人不认识的,机器人要表达(语音或动作)出他不认识这个人。在这个过程中不允许触摸机器人,握手除外。识别过程中,如果机器人识别不出一个人,可以提前选择放弃,如果识别错误将会受到惩罚。
(5)识别结束,能够自主离开的机器人自主离开房间,没有预先说明的可以关掉机器人,该项比赛结束。
针对任务流程,用户利用该平台编写了相关图形化程序,如图6所示:
图6 特征人识别任务程序图
图中Block为功能模块,每一个Block里面包含许多基本模块,如“人腿监测”Block的展开后即为发声、导航、云台控制等基本模块。通过模块集合的形式,使得界面更加简洁。箭头方向标识了整个程序的运行流程,由于采用流程式编程风格,任务的规划可以通过程序界面清晰明了的表现出来。
程序运行过程中,当前正在执行的模块会以深色框标识出(如图6中Wait模块),变量窗口实时显示变量数据,方便用户跟踪流程,用户可通过单步执行、顺序执行、暂停、结束等按钮对程序进行断点调试。
在比赛过程中,依靠该平台简洁的编程环境和独特分层编程理念,有效缩短了编程和调试时间,仅用2个小时就完成了“特征人识别”任务的规划,并最终顺利完成整个任务流程,获得该项目冠军。通过该比赛编程实例,验证了该平台极高的编程效率。其清晰明了的编程界面也吸引了众多参赛队伍的兴趣。
为了简化服务机器人编程流程,本文提出了分层式图形化编程平台,通过分层式编程思想,将底层模块开发与顶层任务规划合理分开。一方面通过基本模块层为开发人员定义接口模板,将其编写的庞大模块库封装为统一格式,从而使得上层用户不必关心底层实现方法;另一方面,在任务规划层设计图形化的流程式编程环境,使得用户可以将任务流程方便直接的转化为计算机程序;执行协调层负责两层之间的协调,完成程序的运行和调试。简约的风格也使得用户不需要掌握太多的编程知识即可入手,从而可以将更多的精力集中在任务规划层,提高服务机器人编程效率,方便用户完成复杂任务规划。通过比赛编程实例验证了该编程平台的有效性和便捷性。
[1]Bishop. RH Learning with LabView 2009[M]. New Jersey, USA: Prentice Hall, 2009.
[2]Robot Operating System: http://www.ros.org/wiki ,2010.
[3]Bruyninckx. H Open robot control software: the OROCOS project[C]. Proceedings ICRA. IEEE International Conference on, Belgium, 2001: 2523- 2528.
[4]Cervera. E Practical multi-robot applications with player and JADE [C]. 10th International Conference on Control Automation Robotics and Vision, Hanoi, 2008:2004 -2009.
[5]张小冰,陈卫东, 曹其新. 面向服务机器人的简易编程环境设计[J]. 上还交通大学学报, 2007, 41(11):1811-1815.
[6]Ando, N Suehiro, T Kitagaki, K et al. RT-middleware:distributed component middleware for RT[C]. Intelligent Robots and Systems International Conference on, Australia,2005: 3933 - 3938.
[7]Jackson. J Microsoft robotics studio: A technical introduction[J]. Robotics & Automation Magazine, IEEE,2007: 82-87.