基于NAO机器人各类编程方式分析
2019-06-03王元杰
王元杰, 林 都, 鲜 浩
(中北大学电气与控制工程学院,太原030051)
0 引言
机器人技术是集机械、电子、控制技术、计算机、人工智能等多个学科领域于一身的一项综合性应用型技术,是衡量一个国家科技发展水平高低的重要标志[1]。
机器人研究中极为热门的研究方向之一——仿人机器人,它有着类人的肢体结构(通常具有仿人的头部或四肢结构),能够在特定环境中代替人类来完成各种工作,进一步而言,仿人机器人可以说在很多方面扩展了人类的能力范围。因此,仿人机器人在科研、教育、医疗等多个领域中得到了广泛的应用,各科研机构在仿人机器人的研究中进行了大量的科研工作,仿人机器人也成为全球各发达国家不惜投入大量人力、物力、财力去角逐的科技制高点[2-3]。
NAO机器人是一款仿人形机器人,是目前世界上应用最广泛的仿人型机器人之一[4]。
NAO机器人高58 cm,具有25个自由度(图1),以及大量传感器(图2),支持远程控制,可实现完全编程等功能。他丰富的传感器资源以及灵活的结构,可以完成各种复杂的操作和功能。
图1 NAO传感器示意图
图2 NAO机器人关节示意图
同时,NAO机器人也得到了公众的肯定,在2007年,它成为机器人世界杯(RoboCup)的标准平台;在2010年,NAO机器人作为科技大使出现[4]在上海世博会上[5]。
将NAO机器人的技术开放给所有的高等教育项目,因为它使用Linux系统的嵌入式处理器,所以不仅可以使用C++,Python等语言进行编程,也可以使用官方开发的一套可视化编译软件进行编程,这就使得NAO机器人的开发有了很大的自由空间和可能性[6]。
NAO的研究范围覆盖了包括语音识别,视频处理,模式识别,自闭症治疗,自动化,喜好处理,路径规划等很多的方面和领域。这些领域中间,包括了一些不是以软件编程为主要方向的研究者,NAO机器人多样的编译环境某种程度上给非控制和软件方向的研究者带来了一定的困扰[7]。
本文主要以人脸识别为例,使用最常用的可视化编程以及Python语言,具体分析各种编译方式的优劣,以及其在各类应用场合下的实际情况。
1 背景知识介绍NAO机器人的视觉系统
NAO机器人通过摄像头获取图像信息,处理并获得有效的信息。在机器人的头部,垂直安装了两个高清摄像头,其参数:输出YUV422,视场58°,水平视场47.8°,垂直视场 34.8°,聚焦范围 30 cm ~ ∞,聚焦类型定焦,物理分辨率VGA,QVGA,帧速30 f/s。摄像头传感器可捕捉清晰的VGA格式画面,最高分辨率下可以达到30帧/s的速度。头部水平方向可以转动接近239°,垂直方向可转动接近68°;视角范围在水平方向约61°,垂直方向约为 34.8°(图3),因此可以识别各类物体。NAO机器人广为人知的人脸识别就是根据这个设计而开发的一项互动功能。NAO可以学习记忆不同的人脸信息,并对其进行识别[8-9]。
图3 机器人摄像头时域示意图
2 Python语言编程实例
Python是一种高级的、解释性的、交互式的、面向对象的脚本语言,更是一门跨平台、开源、免费的解释性高级动态编程语言,是一种通用编程语言。除了可以解释执行之外,Python还支持将源代码伪编译为字节码来优化程序提高运行效率并对源代码进行保密。Python支持命令式编程(How to do)和函数式编程(What to do)两种方式,完全支持吗?面向对象程序设计,语法简洁清晰,功能强大且易学易用[10-11]。
Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,以及其他语言的一些标点符号,它具有比其他语言更有特色的语法结构。Python是一种解释型语言,开发过程中没有编译这个环节。Python是面向对象语言,它支持面向对象的风格或代码封装在对象的编程技术[12]。
同时,Python已经在很多领域有着非常丰富的应用,可以说是一门非常实用的编程语言。例如:Python是云计算中最流行的语言、大量优秀的Web框架,以及许多用于Python开发的科学计算和人工智能:典型库numpy等等。而在金融工程领域中,Python同样被大量使用[13]。
由于Python是一种动态语言,语言结构清晰简洁,库丰富、成熟、稳定,科学计算和统计分析功能强大,生产效率比 C,C++和 java要高[14]。
以人脸识别为例,写了一个这样一段代码来完成——一个在看到一个人脸的时候打招呼的程序编译。
首先构造了一个类,命名为HumanGreeterModule,主要的任务就是设定人脸识别和进行反馈。
其中:subscribeToEvent函数定义了对FaceDetected事件的响应,onFaceDateced函数是具体的执行任务,调用tts文件进行文字转语音的输出,完成打招呼的功能。
class HumanGreeterModule(ALModule):
def__init__(self,name):
ALModule.__init__(self,name)
self.tts=ALProxy( 'ALTextToSpeech')
global memory
memory=ALProxy("ALMemory")
memory. subscribeToEvent ( " FaceDetected","
HumanGreeter","onFaceDateced")
def onFaceDateced(self,*_args):memory.subscribeToEvent
("FaceDetected","HumanGreeter")
self.tts.say("Hallo") memory.subscribeToEvent("
FaceDetected","HumanGreeter","onFaceDateced")
从这段函数中可以清晰地看到每个过程的具体步骤,调用了什么样的资源,实现了什么样的功能。
3 图形化编程实例
图形化编程是官方提供的一种编程方式。在专用的编译软件Choregraph中,以官方提供的指令盒为基础进行编程,通过连线的方式即可完成编程[15]。
Choregraphje软件(见图4)是一款编程软件,可以编写程序、与NAO链接、烧写程序、与Webots链接可以仿真执行程序。
图4 Choregraph主界面
如图5~7所示,通过软件界面,我们可以直观的看到机器人的姿态信息和机器人上的程序信息。
图5 机器人视图
图6 机器人关节角度
同样以人脸识别并进行语音问候为例,使用可视化编程方式重新进行编程:首先,在指令盒库(图8)中找到需要的模块,指令盒分为两个部分,列表和备注。然后,通过图9所示的操作,很简单的就完成了这个小程序的编写工作。可以发现,正好有两个模块发现人脸和语音说话,我们将其连接就可以完成操作。
图7 机器人应用程序列表
图8 指令盒
图9 图形化编程人脸识别并问候
4 算法比较
Python和可视化编程可以说是NAO机器人初学者常用的两种编程语言,那么又该如何选择呢?
从结构上,明显可以看出,可视化编程要比Python编程更加简单。相比之下,可视化编程具有更加简单的结构和更加清晰的流程顺序,可以说是一种非常适合新手来了解机器人的一种编程方式。
但是,可视化编程的局限性同样也很明显,即只能使用现有的模块进行编程,同时,对模块具体实现过程并不是很了解。以人脸识别及问候的实例为例,如图10所示打开人脸识别模块可以看到,触发的线并没有接在起始点的位置,而是一个叫做Almemory的event触点上,如果没有Python的知识(见图11),很难解释这是一个什么样的event。同时打开最内层的模块,可以看到,这些模块最后其实还是使用Python进行编译的。但是,很明显,它的指令不单单是内部的函数,还有包括外部接口的一部分内容,因此很难对它进行二次编译来达到我们的目的或者提高效率。
图10 Almemory触点
图11 人脸识别模块内部脚本
实际上,可视化编译可以理解为是一些已经编译好的、具有较好普适性的Python程序包以一种固定形式进行封装和图形化之后的产物。这种编译方式更适合作为机器人启蒙性质的教育,或者针对没有什么编程基础的群体进行小型实例开发的编译环境,又或者是新手开发者用来熟悉机器人的一个平台,因为它具有较好的稳定性和更加易读的性质。
相较于可视化编程,Python具有更大的灵活空间,可以进行更复杂的运算,或者控制器的设计,实现算法等任务,必须要受到已有的模块的束缚。同时,我们可以更深入地了解每个功能的具体实现过程,使用更合适的指令,达到更高的执行效率。同样,如果是针对某个方面的机器人设计,例如我们需要做个算法的控制器,很难找的全部合适的指令盒供我们使用,这个时候我们只能自己进行编译。
当然对于初学者来说,完全独立编写全部功能的指令可能并不是那么容易,在此可以使用折中的办法,在无法完成的功能处使用官方的指令盒来实现,指令盒不能满足要求甚至没有指令盒的部分,调用Python进行编程,混合进行编程,在choregraph中调用Python的指令盒,即可完成这样的功能,在Python中,可以加载官方naoqi库,其中也有大量的函数可供使用,可以大幅减少编程的工作量。
5 结语
编译环境日新月异的今天,选择一个合适的编译环境和编程方式对以后的开发工作有着很大的帮助。明确自己的定位,选择一个合适的编译环境是无疑是一个非常重要的却很容易被忽视的步骤。总结成一句话,以机器人为辅助平台或者非计算机类专业的开发者更适合图形化的编译环境,这个可以让你更快地了解机器人,完成相应的工作。需要完成相对复杂的任务或者有一定编程基础的开发者更推荐使用python作为编译平台进行程序开发,这样可以使你拥有更大的发挥空间和拓展余地。