智能机器人实验报告

  |  

文章导航

大四上NAO智能机器人实验报告

实验二 机器人舞蹈

一、实验目的

1、了解Nao人形机器人的关节构造及运动自由度;

2、了解基于关键帧(key frame)的 Nao 人形机器人动作设置方法;

3、了解基于时间轴的多线程编程方法;

4、掌握Nao人形机器人运动姿态控制编程;

二、实验内容

1、了解Nao人形机器人的关节构造及运动自由度;

2、基于关键帧(key frame)实现Nao机器人动作设置;

3、了解基于时间轴的多线程编程方法;

4、通过多线程设置Nao人形机器人舞蹈姿态与背景音乐;

5、实现Nao人形机器人与音乐协调的舞蹈演示;

三、实验设备

1、Nao人形机器人一台

2、路由器一台

3、笔记本电脑一台

4、Nao可编程软件一套

四、实验原理

Nao机器人所配置的Choregraphe软件提供了基于时间轴(time line)的多线程交互式机器人位姿设定与动作控制,通过关键帧(key frame)设定的方法,可以实现流程的机器人动作。图1给出了时间轴指令盒编程界面,图2给出了基于关键帧的方法进行机器人动作设置的说明。通过手臂部动作、腿部动作、音乐设置等多个线程协调工作,可以实现Nao机器人的舞蹈设计与实现。

图1 时间轴指令盒编程界面

图2 基于时间轴的关键帧动作设置

五、实验步骤

1、以无线方式连接 Nao 机器人;

2、基于Choregraphe软件创建时间轴(time line)指令盒;

3、建立多个线程,添加背景音乐;

4、配合音乐节奏,逐帧建立机器人的关键帧动作,注意关键帧之间留出足够的动作转换时间,避免机器人发生摔倒;

5、实现机器人舞蹈表演;

六、实验过程及功能实现

程序的整体实现流程如下:先是一个初始动作(Stand_Up),接下来等待一段时间(Wait)然后进入Time_Line指令盒。在Time_Line指令盒中,最上方动作层可以插入关键帧,包括单个部位或者全身,控制机器人的动作;在下方行为层,我们在一层加入了音乐,另一层使用指令盒在结尾加入了一个腿部自转的动作。Time Line指令盒中程序运行结束后再次执行站立动作(Stand Up),至此程序结束,完成舞蹈流程。舞蹈的核心程序部分是Time_Line。

图3 舞蹈程序总览

图4 音乐层展示

在进行舞蹈动作设计,对Time_Line动作层进行插入关键帧、设计机器人姿势的过程中,可以使用两种方法。其一是在机器人视图中,选择需要移动的部位,对要运动的关节输入所需的角度,改变机器人姿势。使用该方法我们可以较为精准的控制机器人的动作,尤其是对于一些对称性动作,我们使用相同的参数可以保证完美的对称性,但是该方法需要我们了解各个Nao机器人各关节活动的范围,否则就有可能出现输入越界、机器人自身动作发生冲突等问题。其二则是使用人工方式改变机器人动作。这种方式仅需要在电脑上解除机器人运动所需对应关节的自由度,然后人工扭转Nao机器人的各个关节,即可获得需要的动作姿势。该方法不需要完全了解机器人的关节活动范围等参数,但是由于是人工设计姿势的限制,它在精确性上不如第一种方法,仅能保证机器人大致运动到目标姿势。

在实验中,我们使用两种方法相结合的方式进行姿势设置。首先使用第二种方法,按照我们的姿势和动作设计,得到机器人大致的舞蹈动作。然后使用第一种方法,对需要保持对称或是不太完美的帧进行参数调整,使得机器人舞蹈动作更加精确。

图5 舞蹈动作帧展示

图6 舞蹈动作帧展示

七、实验思考题

1、对Nao人形机器人的动作控制及基于关键帧的编程方法进行总结;

对机器人的动作进行控制的时候,通过“机器人视图”,我们可以选择将它的各个关节进行解锁,然后用手进行动作的调整后上锁;或者利用坐标空间,在选择某个关节后直接输入要调整的数据进行调整。这两种控制方式在我们的实验中均有应用。

基于关键帧的编程方法的本质是在某个时间点保存机器人当前状态下各关节所处的坐标。可以分为对整个身体,仅头,仅手臂,仅腿进行保存,时间线上的每个小格代表一毫秒(在默认中框架率FPS为10)。两个保存的帧之间的时间差代表从这个动作到下一个动作所用的时间,如果时间间隔过小,而动作较为剧烈的话,很可能会影响机器人的稳定性,甚至使机器人跌倒。

2、对Nao人形机器人基于时间轴的多线程编程模式进行总结;

Nao机器人的多线程表现在基于时间轴的编程中,存在多个行为层的并行行为,且多个行为层的线程可以同时被处理。

基于时间的编程主要包含在一段时间中Nao的动作变化,时间轴会依据时间来编排Nao机器人的动作。在基于时间轴的多线程编程模式中,主要分为动作层、行为层和编辑部分的设计。在动作层中,我们可以定义每个框架的动作样式,通过建立关键帧,包括单个部位或者全身,控制机器人的动作姿态。在这个阶段主要需要避免因两帧间隔过短、动作过大,导致机器人失去平衡的问题;在下方行为层,我们可以继续生成动作层和关键框架,关键框架有图表可以放置指令盒,用以执行其他任务指令。实验中,我们可以新建多个行为层,在执行动作层的同时,继续执行其他行为,比如进行背景音乐播放,为机器人的舞蹈动作进行配乐。而且在这个部分,我们也可以将之前预设的动作或者其他功能模块导入进行使用,作为动作层的一种补充。我们机器人最后的原地旋转和立正动作就是在行为层中完成的。对于编辑部分,我们在本次实验中并没有进行修改,但是该部分可以对动作播放的框架率(FPS),框架数量,以及播放模式等属性进行设定,修改这部分的参数对机器人的动作也会产生影响。

八、实验结果展示

九、实验体会

本次实验中,我们使用广播体操音乐对机器人进行了编舞。正如我前面所讲的,本次任务的核心是关键帧部分,这部分的工作也给我们留下的印象最深。我们也尝试过在行为层插入动作模块,但是只能添加预设的动作,因为我们想设置自己的动作,所以还是选择了在动作层插入关键帧。在建立关键帧的过程中,为了避免机器人摔倒。我们专门有一个队员在执行程序的时候扶着机器人,这才避免了在前期动作设置不合理的时候机器人不至于因失去平衡而跌倒,造成损坏。

从逐个动作的人工设计到关节参数的详细调整,从各帧动作的简单排列到伴着音乐的逐帧对应,可以说机器人编舞的过程工作量还是蛮大的。从动作的思考设计、再到插入关键帧实现动作、再到最终的当机器人成功舞蹈,我们了解了Nao机器人基于时间的编程模式,也掌握了一些指令盒的使用。当最终看到我们的机器人按照设想,随着音乐节拍做出动作的时候,我们心里还是成就感满满的。在感受到机器人带来的趣味与快乐的同时,也确实增进了对Nao机器的的了解,掌握了更多的相关知识,算是收获满满。

实验三 人脸识别

一、实验目的

1、了解 Nao 人形机器人的音频和视频传感器工作原理;

2、了解基于声音的目标定位方法;

3、了解基于图像的人脸识别方法;

4、掌握Nao人形机器人声源定位、人脸检测及人脸识别方法。

二、实验内容

1、了解Nao人形机器人的视觉及听觉传感信息基本处理方法;

2、实现主动人脸寻找、定位与识别记忆;

3、编程实现根据声音源寻找定位人脸,识别身份并进行语音交互。

三、实验设备

1、Nao人形机器人一台

2、路由器一台

3、笔记本电脑一台

4、Nao可编程软件一套

四、实验原理

Nao机器人配置有两个视觉传感器即摄像头,分别位于额头和下巴,两个摄像头各自有不同的观测范围,图1给出了Nao机器人的摄像头配置。通过调用摄像头可以获取Nao机器人看到的图像,从而利用图像处理的各种方法实现图像目标定位、识别、记忆等。Nao机器人还配备有4个麦克风,用于声音信号的拾取,图2给出了Nao机器人的麦克风配置。基于麦克风获取的声音信号,可以实现声源定位、语音识别功能。此外,Nao机器人还配备有两个扬声器,可以实现人机之间的语音交互。

图1 Nao机器人摄像头配置

图2 Nao机器人的麦克风配置

五、实验步骤

1、以无线方式连接Nao机器人;

2、编程实现声源定位及人脸检测;

3、编程实现人脸识别记忆,至少能够分辨两个不同身份人脸;

4、在人脸识别的基础上,编程实现识别到不同人脸时的不同语音交互。

六、实验过程及功能实现

1、人脸数据库建立

Nao机器人进行人脸识别的前提是人脸数据库不为空,若数据库为空,那必然无法正确识别人脸。在实验中,我们先使用Unlearn_All_Face指令清空人脸数据库,防止此前保存的人脸对新录入的人脸产生影响。此后,使用Learn_Face指令将需要识别的人脸存入数据库。在本实验中,我们录入了田瑞峰、郝世龙和任泽华同学的人脸,并将他们分别取代号为图图、健康哥哥和壮壮,为接下来的Nao机器人人脸识别功能做好准备。

图3 Nao机器人人脸数据库建立程序

2、人脸识别

Nao机器人的人脸识别方法主要依赖于Face_Reco脸部记录指令完成。该指令使用摄像头和数据库中的脸部数据来辨识脸部。脸部记录指令盒可以辨认出每张脸属于谁(如果数据库中有的话)。当脸部辨识成功,第二个输出端会输出脸的名字。当有数张脸被辨识出来,数据库中记录的名字会依序输出。

在进行识别后,我们首先使用Say_Text指令使机器人报出识别到的人脸代号,再使用一个Switch_Case分支,使机器人在识别到不同人脸后,执行不同的动作,以进一步标识不同的人脸识别结果。

此外,为保证人脸识别功能可以循环运行(非一次性识别),我们将执行完动作后的指令流返回到Face_Reco脸部记录指令盒,使人脸识别功能可以反复、持续运行。

图4 Nao机器人识别程序

七、实验思考

1、对Nao人形机器人的声源定位方法进行总结;

按照官方介绍,Nao使用4个麦克风来探测声音,声源定位功能帮助机器人辨别出声源方向。Nao的声源定位基于一个名为“到达时间差”的方法,当一个声源发出声音时,NAO的4个麦克风接受到声波的时间略有不同。如果一个人站在Nao左边和它说话,其声波会首先到达左侧麦克风,在几微秒后到达位于前方和后方的麦克风,最后到达右侧麦克风。这种时间差名为“双耳时间差”,可对其进行数学处理,以确定声源的位置。在Choregraphe软件中有相关的指令盒,可以调用并运行该功能。

但本实验中的声源定位似乎是与摄像头人脸追踪的程序存在冲突,因而始终未能实现。在我们的实验中,若Nao机器人的摄像头识别到一个人脸,那么其头部会始终跟随识别到的人脸进行转动,此时就算我们在程序中加入了声源定位指令Sound_Loc(提供角度和置信度)或是Sound_Tracker(根据输入,头部转向),Nao机器人也不会执行声源定位任务。

在调试过程中,当我们将Camera_select部分的Python代码进行修改,将摄像头选择参数修改为1,强行停止摄像头的工作,此时发现Nao机器人可以顺利执行声源定位指令。但这样一来,摄像头由于停止工作,又无法进行人脸识别工作。所以通过调试,我们认为可能是默认执行的人脸跟随功能阻止了声源定位的执行。

2、对Nao人形机器人的人脸检测方法进行总结;

脸部检测指令盒(Face_Detection)会使用摄像头来检测脸部及产生辨别人数,在执行该指令的过程中,实际调用的是Nao机器人中ALFaceDetection的视觉API模块,人脸检测被定义为该API中的一个事件FaceDetected()。

在该部分中,Nao机器人通过两个摄像头进行图像采集,然后将用分类器所检测出的区域图像与模板图像进行匹配,将所得到的相似度值与预设阈值进行比较,相似度大于阈值的判断为是目标,小于阈值的判断为非目标,并在程序中使用FaceID标注检测到的不同人脸。注意,按照Nao机器人官方文档说明,需要保证摄像头捕捉到的脸部在图像中至少为20像素,否则会检测失败。

我们在实验中使用脸部检测指令盒(Face_Detection)时,内部检测盒会从内存中读取FaceDetected()的返回值FaceInfo,得到检测到的人脸信息(如FaceID等),进而输出检测到的人脸数量。从我们API使用者的视角上看,也就是在脸部检测指令盒(Face_Detection)的输出端直接输出检测出的人脸数目。当然,在指令盒输出侧还有另一个输出,它在没有检测出脸部的时候会被启动,用来结束检测过程。

3、对Nao人形机器人的人脸识别方法进行总结;

Nao机器人的人脸识别方法主要依赖于Face_Reco脸部记录指令盒完成。而该指令盒和脸部检测指令和一样,调用的是Nao机器人中ALFaceDetection的视觉API模块。而且在进行人脸识别的过程中,需要以人脸检测事件FaceDetected()为基础。

正如我前面提到的,FaceDetected()对每个被检测的脸,都会在返回值中返回一个关键信息——FaceInfo。在FaceInfo中,存储了FaceID、脸部长宽、脸部轮廓、scoreReco、faceLabel等关键信息。人脸检测过程中,scoreReco是识别过程返回的分数(越高越好),在识别过程前设置置信度阈值,若识别分数大于设定阈值大小,程序判定识别成功,会在faceLabel中标注已识别脸部的名称。否则识别失败,认为检测到的人脸并不存在于数据库。

注意到,在识别过程中,每个检测到的人脸都会被赋予0到1之间的匹配分数。分数越高,表示确定性越高。我们可以通过调节阈值的方式,使人脸识别的要求变得更加放松或是更加严格。较低的阈值意味着模块经常返回结果,但结果可能是错误的。较高的值表示仅考虑具有较高确定性的匹配项,从而降低了出错的风险,但可能很难获得任何结果。

在实际的功能实现时,我们直接调用了Face_Reco脸部记录指令盒,该指令使用摄像头和数据库中的脸部数据来辨识输入的人脸。从流程上看,该功能首先进行人脸的检测,在存在人脸的情况下,可以将检测到的人脸与数据库人脸进行比对,辨认出每张脸属于谁(如果数据库中有的话)。当脸部辨识成功,输出端将输出脸的名字。当有数张脸被辨识出来,数据库中记录的名字会依序输出。

此外,使用Nao机器人进行人脸识别时也有注意事项。按照官方文档说明,在识别过程中,摄像头捕捉的人脸图像至少要20个像素。而且文档还强烈建议最小尺寸为40像素,以获得更好的学习和识别效果。

八、实验结果展示

九、实验体会

通过本次实验,我们熟悉了人脸检测和人脸识别的功能。在实验过程中,我们的确希望能够完成人脸识别+声源定位两部分功能,但是似乎Nao机器人内嵌的人脸追踪程序与声源定位存在矛盾,所以最终确实没有同时实现。

在建立人脸数据库的同时,由于机器人始终在进行人脸追踪,所以换下一位同学记录人脸的时候经常会记录失败,而上一位同学由于被摄像头追踪,人脸被反复记录。这样看,我们采用一个程序记录人脸的方式在操作性上确实较差,后续改进可以考虑通过每次只记录一张人脸,让学习部分的程序单次运行三次的方式进行人脸记录,提高建立数据库这部分功能的稳定性。在后续的人脸识别任务中,我们使用Face_Reco脸部记录指令盒顺利的完成了识别任务,也感受到了Nao机器人的趣味与功能的强大,Nao机器人的种种功能,真的是给我们带来了许多惊喜与快乐,给我们也留下了深刻的印象。

当然,最后的遗憾就是没有完成声源定位,这个任务困扰了我们至少两节课,尝试了各种可能的办法都没有将它与人脸识别功能完美结合,还是有些不甘心。在与其他组同学的交流中,发现大家都没有完成这一部分,所以感觉这应该还是一个很有趣、也很有挑战的任务,但是限于实验已经结束,可能对这个问题的思考和探索也只能留到以后了吧。

本站总访问量 您是第位访客