在NAO上播放音频
在NAO机器人上播放音频文件常用的库为ALAudioPlayer
,里面有2个可以播放音乐的函数:play()
和playFile()
。
play()
该函数的C++函数头为:1
void play(const int& taskId, const float& volume, const float& pan)
该函数有3个参数,其中第一个为必须的,后面2个是可选的。第一个参数为任务ID,即文件名,通常由ALAudioPlayer
库里面的loadFile("文件名")
函数产生的。第二个为音频的音量,其值为0.0-1.0
,第三个为Stereo panorama requested (-1.0 : left / 1.0 : right)
d。
1 | from naoqi import ALProxy |
首先建立一个ALAudioPlayer
库的实例,然后用loadFile()
加载音频文件,最后使用play()
函数进行播放。
playFile()
该函数的C++函数头为:1
void playFile(const std::string& fileName, const float& volume, const float& pan)
该函数基本和play()
类似,只是第一个参数为文件名,即不需要在用loadFile()
函数来转换。1
2
3
4
5
6from naoqi import ALProxy
audio = ALProxy("ALAudioPlayer", '169.254.67.213', 9559)
songfile = "文件名绝对路径"
audio.playFile(songfile)
将音频文件传入到NAO中
NAO机器人存储器中自带一些音频文件,同时也支持将本地音频文件上传至NAO中。NAO机器人本身相当于一个服务器,本地计算机相当于主机,只要输入正确的IP地址和端口号即可访问和文件操作。常用的方式为自带的Choregraph软件和其他文件传输软件。
Choregraph软件
NAO机器人自带的Choregraph软件可以将本地文件上传到NAO机器人的存储内存中,其文件传输协议为FTP模式。
首先将NAO机器人连接到Choregraph软件中,具体可以参考另一篇博客:基于python的NAO机器人开发01。然后在连接选项中,选择高级->文件传送,此时必须是连接真机,虚拟机器人没有此功能。
然后输入用户名(nao)和密码(初始为nao)。
在空白处右击,选择创建文件夹即可创建自己的文件夹,点击上传功能并选择相应的本地文件即可将文件上传至NAO机器人中,此时文件存放的路径为:/home/nao/...
。
例如新建一个test
的文件夹,并将test_wav.wav
音频文件上传至NAO机器人中,可以使用下面的代码播放音频。1
2
3
4
5
6
7
8from naoqi import ALProxy
def playMusic():
audio = ALProxy("ALAudioPlayer", '169.254.67.213', 9559)
songfile = "/home/nao/test/test_wav.wav"
audio.playFile(songfile)
playMusic()
注:NAO机器人中,只能识别wav
格式的音频文件,不支持mp3
等其他格式的。
WinSCP软件
除了使用Choregraph
软件可以传输文件外,还可以使用其他的文件传输软件,比如WinSCP
。输入其对应的IP
地址和端口号,即可访问其内部文件夹。
打开WinSCP
软件后,首先选择FTP
文件传输模式,然后输入相应的NAO机器人IP
地址,用户名和密码同Choregraph
软件。输入正确后,即可进入到机器人的内部存储文件夹。
在WinSCP
中上传本地文件,直接选中文件拖拽到相应位置即可,右击选择属性也可以直接更改其文件夹或文件的访问权限。
将python文件传入NAO机器人中,并直接运行
除了可以上传音频文件,其他任何文件都可以上传至NAO机器人中,而NAO机器人中自带python
的解释器,所以可以将py
文件上传到NAO中,并直接运行python
文件。
NAO机器人内部使用的是linux
操作系统,使用PuTTY
软件可以进入到该系统中。linux
系统的命令也都适用于此,输入相应的命令即可直接运行python
文件。
登陆NAO系统
打开PuTTY软件后,选择SSH登陆方式,然后输入正确的IP地址和端口号即可登陆NAO系统,用户名和密码同之前。
NAO系统中常用的Linux命令
cd ~
:返回根目录cd /.../...
:进入某个文件夹,例:cd /home/nao/test/
(TAB键可以自动补全)cd ..
:返回上一级文件夹pwd
:查看当前所在目录ls
: 查看当前文件夹的内容(ls:list)ls -l
:查看当前文件夹的内容和详细信息rm file
:删除名为file的文件(rm:remove)rmdir dir
:删除名为dir的目录(dir:dictionary)chmod \*** file
:修改文件权限
文件权限共分为3种,r
:读权限,用数字4表示;w
:写权限,用数字2表示;x
:执行权限,用数字1表示。一共有3类用户:文件所有者,同组用户和其他用户。每种用户用1个数字表示。
比如将文件所有者的权限改为可读可写可执行:chmod 700 file
。将所有用户都改为可读可写可执行:chmod 777 file
。
7表示4+2+1,即3个权限之和,file
为完整的文件路径名。ifconfig
:显示以太网信息su
:登陆超级用户,密码为rootreboot
:重启shutdown -h now
:现在关机(需要root权限)
在NAO中执行运行python文件
NAO支持多种编程,其内部带有python
的解释器,使用python \*.py
文件可以直接运行。
例如在/home/nao/
目录下新建一个test
的文件夹,并将之前的python文本文件和音频文件放入该文件夹中。首先利用cd /home/nao/test/
命令进入该文件夹,然后输入python test.py
命令,就可以实现之前的功能。
注:如果音频不能正确播放,可能需要权限设置,将文件权限改为可读可写可执行即可。NAO有2块网卡,即有线网卡和无线网卡。分别对应一个IP
地址,其本身也有一个本地IP
地址,即127.0.0.1
。当运行NAO本地的python
文件时,可以将IP
地址设置为有线连接或无线连接的IP
地址,也可以直接设置为本地IP
地址。
NAO机器人跳舞
NAO机器人全身有25个自由度,通过控制每个自由度的变化可以实现多种不同的运动动作。
ALMotionProxy
库中的angleInterpolation()
函数可以控制每个关节的变化,其函数头为:1
void angleInterpolation(const AL::ALValue& names, const AL::ALValue& angleLists, const AL::ALValue& timeLists, const bool& isAbsolute)
函数的第一个参数为关节的名字,第二个参数为关节的角度(弧度制),第三个参数为关节变化的时间(s),第四个参数为是否为相对变化,即变化的角度是否跟随上一个变化。
NAO中的每个关节的名称可以参考NAO的官方文档,通过给每个关节不同的角度值就可以实现不同的动作,所谓舞蹈就是一连串动作的结合。
这里参考了别人的跳舞代码:
Dance模板库dance.py
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49class DancePart(object):
""" DancePart for Nao dance includes lists of names, times, and keys for Python
simplified dances exported from Choreographe"""
def __init__(self, part_length, pause_length, names, times, keys):
super(DancePart, self).__init__()
self.part_length = part_length
self.pause_length = pause_length
self.names = names
self.times = times
self.keys = keys
def get_part_length(self):
return self.part_length
def get_pause_length(self):
return self.pause_length
def get_names(self):
return self.names
def get_times(self):
return self.times
def get_keys(self):
return self.keys
class Dance(object):
""" Nao robot dance. The attribute num_parts is the number of parts in the dance.
The parts attribute is a list of DanceParts"""
def __init__(self, song_name, num_parts, parts):
super(Dance, self).__init__()
self.song_name = song_name
self.num_parts = num_parts
self.parts = parts
def get_part(self, part_num):
return self.parts[part_num]
def get_song_name(self):
return self.song_name
def get_num_parts(self):
return self.num_parts
def get_parts(self):
return self.parts
waltzDance舞蹈代码waltzDance.py
:
1 | # -*- encoding: UTF-8 -*- |
具体调用:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15from naoqi import ALProxy
import waltzDance
import time
motion = ALProxy("ALMotion", NaoIP, Port)
def dance(danceName):
for i in range(danceName.get_num_parts()):
motion.angleInterpolation(danceName.get_part(i).get_names(),
danceName.get_part(i).get_keys(),
danceName.get_part(i).get_times(), True)
# time.sleep(danceName.get_part(i).get_pause_length())
time.sleep(0.3)
waltz = waltzDance.waltz
dance(waltz)
当然也可以设计其他的舞蹈动作。
多线程实现边唱歌边跳舞
利用python实现
python中有专门的多线程模块threading,我们可以把跳舞作为主线程,唱歌作为一个子线程,在跳舞的同时,开启一个线程专门来播放音频,即可实现边唱歌边跳舞。
首先创建个线程的对象,然后用start()
函数来开启该线程。1
2
3import threading
mythread = threading.Thread(target=function_name, args=(function_parameter1, ))
mythread.start()
创建对象时,第一个参数是目标函数的函数名(不是调用,不需要加括号),第二个参数是目标函数的参数,是可选参数,用元组的形式将参数封装起来,如果只有1个参数,后面的逗号不可以省略。然后调用start()
开启线程。1
2
3
4t1 = threading.Thread(target=playMusic)
t1.start()
dance.dance(waltz)
利用模块的post属性实现
除了python的多线程可以实现此功能之外,ALAudioPlayer
类中的post
属性也可以实现。
在NAOqi模块的一些持续性动作的类中,比如播放音频的ALAudioPlayer
类的playFile()
,运动类ALMotion
中的moveTo()
,都有一个post
属性。所谓post
属性就是将这个持续性动作的进程挂起,NAO可以在执行这个进程的同时进行其他的操作。其调用方式为在playFile()
函数前加上.post
。1
2
3audio = ALProxy("ALAudioPlayer", '169.254.67.213', 9559)
songfile = "/home/nao/test/test_wav.wav"
audio.post.playFile(songfile)
在post
语句下面可以添加其他的功能,此时NAO会一直播放音频文件,并执行下面的语句,直到音频文件播放完毕。例如实现边跳舞边唱歌,只需在playFile()
函数前加上post
,然后在下面调用dance()
函数。1
2
3def danceAndSong(danceName, songName):
audio.post.playFile(songName)
dance()
除了播放音频的库可以加post
之外,行走库中的moveTo()
也可以,即可以实现边行走边执行其他的模块,比如边行走边调用NAO的视觉系统,例如我的另一篇博客:NAO高尔夫比赛:python初级版。
开机自启动边跳舞边唱歌
如果想实现开机自启动某个程序,需要更改NAO的开机启动配置文件,其文件路径为/home/nao/naoqi/preferences/autoload.ini
。使用Choregraph软件或者WinSCP软件将其下载到本地计算机中,然后使用VScode或其他编译器软件打开,找到其中的[python]
,然后将需要启动的py文件路径放在下一行,重新启动NAO机器人就会自动执行该文件。
需要将python文件中的IP地址改为NAO的本地IP,即"127.0.0.1"
。
附:Choregraph实现开机自启动
首先新建一个项目文件,编写代码。例如我写了一个说“hello world”的程序,命名为hello。
然后保存并上传到机器人系统中,上传功能在应用程序视图。
在应用程序中找到你的文件,并右击设置为默认状态。会出现一个小旗子。最后重启机器人,就会进入你写的程序中。
注:NAO机器人开机后会进入自主模式,即开机后会站立并来回晃动。这个好像去不掉,可以在你写的代码里面进行处理。我实际测试下来,需要等待一段时间才会进入到开机自启动的项目中。