基于LabVIEW的NAO机器人控制研究
2020-06-23陈燕军
陈燕军
(江西现代职业技术学院 机械学院,江西 南昌 330095)
0 引言
NAO机器人是由法国Aldebaran Robotics公司研制成功的一款人工智能仿人机器人,有着讨人喜欢的外形设计和优良的硬件配置,并提供了丰富的二次开发接口,可以支持多平台和多种开发语言编程。NAO机器人不仅运用于机器人研究、人工智能和计算机科学领域,还可以运用于社会学和医疗保健领域,其参与的研究项目包括自闭症治疗、多智能体系统、自动化、讯号处理、全身运动以及路径规划。NAO作为仿人机器人的杰出代表,向我们提供了一个卓越的研究平台[1-4]。
LabVIEW是实验室虚拟仪器工程平台(Laboratory Virtual Instrument Engineering Workbench)的缩写,是由美国国家仪器(NI)公司研制开发的一种图形化的程序开发环境。它为设计者提供了一个便捷、轻松的设计环境,设计者利用它可以像搭积木一样轻松地进行开发,而无需编写繁琐的代码[5]。
LabVIEW是图形化的编程语言,它提供了丰富的显示和控制对象的函数库,还提供了大量的与外部代码和软件进行衔接的外部接口,具有强大的通信功能。作为一种成熟的编程语言,它也提供了对.NET架构的支持[6]。因此,我们选择LabVIEW作为体感控制系统的开发平台[7]。
1 NAOqi.NET框架简介
图1 NAOqi.NET框架结构
运动控制函数模块(ALMotion)可以实现NAO机器人的运动功能,其主要包括:关节刚度控制(Stiffness control API)、关节控制(Joint control API)、行走控制(Locomotion control API)、根据笛卡尔坐标控制关节(Cartesian control API)、跌倒检测(Fall manager API)、碰撞控制(Self-collision avoidance API)和全身控制(Whole Body control API)。
内核控制模块主要包括行为管理器(ALBehavior Mangager)和内存调用。传感器模块主要包括超声波传感器(ALSonar)、碰撞传感器(ALInfrared)、压力传感器(ALFsr)和LED传感器(ALLeds)等。
声音输入输出模块主要包括语言识别(ALSpeech Recognition)、说话(AL Text To Speech)、声源定位(ALAudio Source Localisation)和播放音频文件(ALAudio Recoder)。
视觉模块主要包括摄像头控制(ALVision Device)、人脸识别(ALFace Detection)、拍照(ALPoto Capture)和标志物识别(ALLandmark Dectection)。
在具体实现中我们对NAOqi.NET的API利用LabVIEW进行了封装,将API函数封装成相应的子VI,这样在LabVIEW中就可以以子VI的形式进行调用。对goToPosture函数进行封装前、后示意图如图2、图3所示。
图2 goToPosture封装前程序图
图3 goToPosture封装成子VI示意图
2 基于LabVIEW的NAO机器人运动控制
对NAO机器人的运动控制,归根结底是要实现对各个自由度的控制。NAOqi.NET提供了运动控制所需的函数接口,例如刚度控制函数ALMotion Proxy:set Stiffnesses()、关节控制函数get Angles()和set Angles()、行走控制函数walkTo()、全身控制函数wb Foot State()、碰撞检测函数setCollision Protection Enabled()[10]。
本文以左手运动控制为例来说明在LabVIEW环境下对NAO机器人左手和头部的运动控制。图4为用LabVIEW实现的头部与左手运动控制前面板。前面板包含如下几个对话框:IP地址输入,关节名称,刚度输入、输出,角度输入、输出。
图4 头部与左手运动控制前面板
要实现对NAO机器人的运动控制,首先要解决PC机与机器人的通信问题。通过LabVIEW的.NET工具箱提供的构造器节点来构造Motion Proxy节点。通过输入机器人的IP地址和端口号(9559)就可以建立PC机与NAO机器人的通信。此外,要实现对电机的控制必须设置电机的刚度和角度控制参数。下文将结合具体函数来说明如何设置刚度及控制角度参数。
在NAOqi.NET中将NAO机器人的自由度分为头部、左手、右手、左脚、右脚五条运动链。get Joint Names()函数可以获取运动链中相关关节的名称。其可以输入的参数为Head、LArm、RArm、LLeg、RLeg。get Stiffnesses()和set Stiffnesses()是一对配合使用的函数,通过这对函数可以对各关节的刚度进行设置。刚度的参数可以是0~1的任何数值,当刚度参数设置为0时,电机输出扭矩为0;当刚度设置为1时,电机输出100%扭矩;当刚度参数在0~1变化时,电机输出的扭矩也会相应地变化,数值越大,输出的扭矩也越大。同理,get Angles()是获取当前各关节电机转动幅度,其输出参数可以通过数组传递给下一个函数调用。
NAOqi.NET提供了多种函数来实现NAO机器的控制,例如可以通过angInter polation()、angInter polation With Speed()、angInter polation Bezier()来实现NAO机器人的运动控制。通过angInter polation()函数来控制NAO机器人的头部和左手。angInter polation()有三个输入参数,分别为关节名称输入、目标角度输入和最大运动速度输入。通过目标角度输入可以给NAO机器人的相应关节赋值,使机器人各个关节运动到给定弧度的绝对位置。
3 基于LabVIEW的NAO机器人姿态控制
姿势控制模块(ALRobot Posture)可以使得NAO机器人运动到不同的初始姿态。系统定义了8种基本姿态,分别为Stand、StandInit、StandZero、Crouch、Sit、SitRelax、Lying Belly、Lying Back,可根据需要自行定义[11]。
NAO机器人的姿态控制可以使机器人迅速运动到某一个稳定状态,NAOqi.NET提供的ALRobot Posture∶∶go to Posture()可以实现这8种姿态的快速切换。图5为基于LabVIEW的NAO机器人8种姿态控制程序前面板。通过前面版pIP输入框可以输入相应机器人的IP地址,通过“动作选择”下拉列表可选择要执行的动作,通过max Speed Fraction参数可以限制最大的运动速度。
图5 机器人姿态控制前面板
利用NAOqi.NET提供的go To Posture()和apply Posture()函数来实现对机器人姿态的控制。程序是通过调用go To Posture()函数使机器人快速运动到预定义姿态的,该函数包含posture Name和max Speed Fraction两个参数。其中posture Name是8种预定义的姿态名称,max Speed Fraction定义了运动时的最大速度,其取值范围为0~100。apply Posture()函数用于设置初始姿态,通过它可以定义机器人各关节的初始位置并保存成特定的动作姿态,并在需要重现的地方进行调用。
4 基于LabVIEW的NAO机器人视觉控制
NAO机器人头部具有两个摄像头,用户可以利用摄像头来进行图像采集、红球识别、人脸识别及录像等应用[12]。
图6为NAO机器人的图像采集前面板,利用这个程序可以实现图像采集的功能。在前面板中首先需要设置机器人的IP和端口号来建立网络通信,然后需要设置图片大小和激活的摄像头编号。
图6 NAO图像采集前面板
在图像采集程序中主要利用了NAO.qi.NET提供的set Active Cameras()、subscribe Cameras()、get Images Remote()、unsubsribe()等函数。set Active Cameras()函数的功能是设置具体被激活的摄像头,subscribe Cameras()的功能是设置摄像头的分辨率和输出图像的规格,get Images Remote()的功能是获取摄像头识别的图像,unsubsribe()的功能是关闭摄像头。
5 结束语
通过LabVIEW提供的.NET架构,并将其应用于NAOqi.NET来进行NAO仿人机器人控制。阐述了LabVIEW中的.NET技术及NAOqi.NET框架,分析了基于LabVIEW的NAO仿人机器人控制开发流程及函数。通过LabVIEW编程实现对NAO机器人的运动、位姿、内核、传感器、声音、视觉等控制,进一步简化了NAO机器人的编程控制,并可以实现远程控制。