一
当NAO开启Dialog时,听到人说话开始,以及说话结束时,都会发出一个声音,『bee』一样的。这个行为特征是可以能用API来关掉的。
ALSpeechRecognitionProxy.setVisualExpression(false)
二
NAOqi系统自动启动配置文件放在两个地方:
/home/nao/naoqi/preferences/autoload.ini /etc/naoqi/autoload.ini
其中上面那个是用户可以修改的,可以在里面加入自己想随机启动的程序。
下面那个是系统模块,只有root权限才能修改。里面主要加载的是NAOqi内置的模块,如:
[core] albase logmanager.LogManager servicemanager.ALServiceManager packagemanager.PackageManager preferencemanager framemanager aldebug.ALDebug [extra] notificationmanager notificationadder._ALNotificationAdder dcm_hal expressiveness alresourcemanager robotmodel aldiagnosis sensors albodytemperature motion
三
Nuance默认引擎语音参数在配置文件里面可配置:
/home/nao/.local/share/PackageManager/apps/robot-language-french-romeo/share/tts/nuance/fr_FR/voiceSettings.xml
参数像这个样子的:
<?xml version="1.0" encoding="UTF-8" ?> <VoiceSettings> <Setting name="pitchShift" description="Ratio of the pitch shifting applied to the main voice" value="1.10"/> <Setting name="doubleVoice" description="Ratio of the pitch shifting applied to the doubling voice" value="0.0"/> <Setting name="doubleVoiceLevel" description="Level of the doubling voice" value="0.0"/> <Setting name="doubleVoiceTimeShift" description="Delay (ms) between the double voice and the main voice" value="0.0"/> <Setting name="voiceLevel" description="Voice level" value="1.0"/> <Setting name="sourceVoice" description="Voice name" value="naomnc"/> <Setting name="model" description="Voice model" value="bet3"/> </VoiceSettings>
可以修改配置文件,也可以通过API来设置和修改这些参数值,从而使NAO发出不同类型的声音。
四
通过GStreamer来将Pepper的摄像头图像实时传输:
gst-launch-0.10 v4l2src always-copy=false queue-size=14 device=/dev/video0 ! 'video/x-raw-yuv,width=640,height=480,framerate=30/1' ! ffmpegcolorspace ! jpegenc ! rtpjpegpay ! udpsink host=192.168.11.9 port=9000 sync=false -v
但有时候运行这个命令,就会导致Pepper崩溃,硬件上面报错,然后机器关机。
解决办法是关掉自主生活模式再运行命令,然后也不要使用Choregraphe来看Pepper的视频,原因大概是视频设备占用的问题。
五
NAOqi系统里面有ALRedBallDetecter模块,可以追踪、识别红球。但球的颜色是可以通过API来修改的,具体函数为:
ALColorBlobDetectionProxy::setColor() ALColorBlobDetectionProxy::setObjectProperties() ALColorBlobDetectionProxy::getCircle()
六
如何在NAOqi系统安装python的pip工具?
wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py python get-pip.py --user export PATH=$HOME/.local/bin:$PATH
七
ALConnectionManager模块里面有关于wifi连接和管理的函数,其中也有一些事件。
据我使用发现,当我们在NAO的wifi连接界面,断开一个网络连接时,触发的事件为:NetworkServiceStateChanged,而不是NetworkStateChanged。
当连接上一个wifi网络时,这两个事件都会触发。
八
平时写代码需要复制到机器人系统里面运行做测试的,可以通过scp命令,但scp不是增量的。
如果只修改了一个代码文件,那么只需要把修改过的文件复制过去覆盖,其它文件不用动。可以用rsync命令实现,如下面命令所当前目录下面的AXMService文件夹复制到远程机器人系统里:
rsync AXMService -av --exclude=.git --exclude=.idea --exclude axmservice/config.py --exclude="*.pyc" nao@192.168.0.13:.local/
其中 –exclude 参数设置需要忽略哪些文件。
九
在pepper中查看平板中浏览器console日志,可以在naoqi系统中执行如下命令
adb shell logcat "|" grep CONSOLE
十
通过Choregraph安装 PKG 包时,遇到这个报错
An error occurred during application's installation: error while trying to open project archive /Users/kyle/Documents/灵聚大脑/user_motion.pkg: Failed to convert a wide-character filename to a multi-byte filename, please make sure the package is not corrupted.
原因是pkg文件夹路径包含中文,换成英文目录就OK了。
十一
在QiChat中,调用系统内置模块方法时,参数不能用双引号,比如:
u:([站起来]) 好的 ^pCall(ALRobotPosture.goToPosture("StandInit", 0.4))
在调用的时候就会报错: tail -f /var/log/naoqi/tail-naoqi.log
[I] 1464923672.601594 3889 Dialog.DialogEngine: Force input: 站起来 [I] 1464923672.603667 3889 Dialog.FastMatcher: Matching result: (0.967742) 站 起 来 [MATCH 站, 站 (0.0); MATCH 起, 起 (0.0); MATCH 来, 来 (0.0)] [I] 1464923672.605031 3889 Dialog.Model: 站起来 is matched by rule u model:standard app: topic:axmbasic lang:mnc line:8 [I] 1464923672.606126 3889 Dialog.Model: Matching "站起来": 1 ms [I] 1464923672.619235 3889 ALAnimatedSpeechInterfance: Animated Speech: Say : 好的\last\^pCall(ALRobotPosture.goToPosture(StandInit,0.4)) [I] 1464923672.623770 3889 animatedspeech.main: Animated saying: \pau=500\ 好的 \last\ \mrk=1\ mrk=1: ^pCall(ALRobotPosture.goToPosture(StandInit,0.4)) [I] 1464923672.647859 3924 audio.altexttospeech.nuance: Enable equalizer 0 Start synthesis of pause=500\ 好的 mrk=1\ [I] 1464923672.988508 3924 audio.alspeechrecognition: onSpeakersPlaying 1464923673.215256 [I] 1464923672.992801 3924 audio.alspeechrecognition: **************************** listening ON ***************** [E] 1464923673.223602 3889 animatedspeech.director: An exception as been thrown during this call: ALRobotPosture.goToPosture([StandInit,0.4]) with this error: parse error
改成单引号就好了:
u:([站起来]) 好的 ^pCall(ALRobotPosture.goToPosture('StandInit', 0.4))
在NAO上面,如果qichat的参数为中文,则会出现调用出错:
u:(_[开始闲聊 我们聊聊吧 开始聊天 小莫小莫]) 好的 ^call(AXMAsr.begin_chat($1))
改成这样就可以
u:(_[开始闲聊 我们聊聊吧 开始聊天 小莫小莫]) 好的 ^call(AXMAsr.begin_chat('开始闲聊'))
但是在$1两边加上单引号不行,参数会被忽略。但是在单引号两边各加上一个空格,就可以:
u:(_[开始闲聊 我们聊聊吧 开始聊天 小莫小莫]) 好的 ^call(AXMAsr.begin_chat(' $1 '))
十二
在NAO里面加载 qichat ,启动Dialog时,NAO在听人讲话的时候,会随机做一些动作,尝试了以下办法都无效:
ALAutonomousLife.setState('disabled') ALAnimatedSpeech.setBodyLanguageEnabled(False) ALAnimatedSpeech.setBodyLanguageModeFromStr('disabled') ALAnimatedSpeech.setBodyLanguageMode(0)
最后成功的方法是
ALAutonomousMoves.setExpressiveListeningEnabled(False)
十三
替NAO设置VPN代理。
当用网线连接NAO与mac电脑时,在mac的网络设置里面,会出现一个NAO与mac的网络接口。
在mac上面连接好vpn。
然后打开mac的『系统偏好设置』-『共享』,在下面的互联网共享,右边选项『共享以下来源的连接』中,选择你的VPN连接。在下面『用以下端口共享给电脑』中,勾选上面NAO与mac连接的那个接口。最后勾上右边的互联网共享。
这样NAO上网就会使用mac的网络,并且用VPN。
十四
给NAO刷机必需使用 2.1 版本的 Choregraphe,通过菜单『Connection – Advanced – Update Robot System』,选择opn系统文件,上传到NAO机器人里面。
然后系统会把 OPN 文件放到路径:
/var/persistent/.image/upgrade.img
系统重启后会自动从这个文件重装系统。安装完后,镜像文件会被删除,有一个升级的日志文件:
Walle [0] ~ $ ls /var/persistent/.image/upgrade.log /var/persistent/.image/upgrade.log Walle [0] ~ $ cat /var/persistent/.image/upgrade.log ------------------------------------------------------------ Starting upgrade to version 2.1.4 Thu Jun 9 02:45:13 UTC 2016 >>> Checking the image/CPU compatibility... Image/CPU compatibility checks passed. >>> Checking the image/robot kind compatibility... Image/Robot compatibility checks passed. >>> Checking the image integrity... Image integrity checks passed. >>> Checking the partition layout... Partitions layout checks passed. >>> Upgrading the system... System has been upgraded. >>> Checking the flashed data integrity... Flashed data integrity check passed. >>> Removing the upgrade image... Done.
十五
python脚本杀掉所有behaviors时,如果这个脚本是通过 choregraphe 的运行按钮运行起来了,则不能杀掉自己,否则会挂死。正确写法示例:
def _stop_other_bh(self): running_bhs = self.qi_helper.ALBehaviorManager.getRunningBehaviors() self.log('get bhs=%s' % running_bhs) for app in running_bhs: if not app.startswith(self.project_behavior_name) and not app.startswith('.lastUploadedChoregrapheBehavior'): self.log('stop %s' % app) self.qi_helper.ALBehaviorManager.stopBehavior(app)
十六
pepper出硬件报警时,会影响运动,一般会低下头站不起来,这时可以通过API解释报警的限制:
qicli call ALMotion.setDiagnosisEffectEnabled 0
十七
通过API来拿Pepper的硬件ID:
Pepper [0] ~ $ qicli call ALMemory.getData Device/DeviceList/ChestBoard/BodyId "AP990438A00Y67100236" Pepper [0] ~ $ qicli call ALMemory.getData RobotConfig/Head/HeadId "AP990237I00Y5C101543"
BodyID和HeadID的Key:
Device/DeviceList/ChestBoard/BodyId RobotConfig/Head/HeadId RobotConfig/Body/BaseVersion
十八
pepper连了两个网,一个有线,一个wifi,默认情况下,naoqi系统会优先使用有线的网络。
比如你的有线是上不了外网的,wifi可以上外网,如果你想让pepper能够上外网,那么需要把wifi的优先级调高于有线网线。
通过 connmanctl 命令可以查看网络优先级:
Pepper [0] ~ $ connmanctl services *AR Wired ethernet_0013951cb10e_cable *AR GKRobot_MY wifi_48a9d28c722f_474b526f626f745f4d59_managed_psk TP-LINK_2.4G_6F6F23 wifi_48a9d28c722f_54502d4c494e4b5f322e34475f364636463233_managed_psk HUAWEI-KPX7NU wifi_48a9d28c722f_4855415745492d4b5058374e55_managed_psk TP-LINK_5G_6F6F23 wifi_48a9d28c722f_54502d4c494e4b5f35475f364636463233_managed_psk china_unicom wifi_48a9d28c722f_6368696e615f756e69636f6d_managed_none local wifi_48a9d28c722f_6c6f63616c_managed_ieee8021x XF wifi_48a9d28c722f_5846_managed_psk Everest wifi_48a9d28c722f_45766572657374_managed_ieee8021x HUAWEI-KPX7NU_5G wifi_48a9d28c722f_4855415745492d4b5058374e555f3547_managed_psk Cooky-029_5G wifi_48a9d28c722f_436f6f6b792d3032395f3547_managed_psk SRYJ1606A-045 wifi_48a9d28c722f_5352594a31363036412d303435_managed_psk gzkfzx-master wifi_48a9d28c722f_677a6b667a782d6d6173746572_managed_psk wifi_48a9d28c722f_hidden_managed_psk chuangxinshiyan wifi_48a9d28c722f_636875616e6778696e73686979616e_managed_psk
将wifi优先级调高的命令如下:
connmanctl move-before wifi_48a9d28c722f_474b526f626f745f4d59_managed_psk ethernet_0013951cb10e_cable
参数可以看文档:
connmanctl --help
十九
如何查看 wav 音频文件,是不是四声道的,通过 file 命令:
kyle@MacBook-Air ~/Desktop> file 20170301_142155.wav 14:45:16 20170301_142155.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, 4 channels 16000 Hz
如果不是四声道的,输出结果就没有 4 channels
kyle@MacBook-Air ~/Desktop> file 20170301_145103.wav 14:51:29 20170301_145103.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 16000 Hz
二十
pepper在客户的内网环境中,禁用掉了22、23等端口,就没办法通过scp命令把文件发送给服务端,这时可以用nc命令来传输文件
在服务器上面,如 api.axmtec.com 执行命令:
nc -l 1234 > wav.tar.gz
然后在pepper系统里面,执行命令,上传文件 wav.tar.gz
cat wav.tar.gz | nc api.axmtec.com 1234
二十一
qicli info XXX –hidden 列出隐藏的方法
MixC-001 [0] ~ $ qicli info ALTabletService --hidden | grep Apk 180 _installApk Bool (String) 181 _installSystemApk Bool (String) 182 _launchApk Bool (String) 183 _removeApk Void (String) 184 _listApks String () 185 _stopApk Void (String) 186 _isApkExist Bool (String) 187 _getApkVersion String (String) 195 _stopApk Void () 197 _getApkVersionCode String (String) 216 onApkInstalled (String) 219 onSystemApkInstalled (String) 220 onSystemApkInstallError (Int32)
二十二
给NAOqi系统设置固定IP
用connman命令行,灵感来源于 https://community.ald.softbankrobotics.com/en/forum/critical-static-ip-configuration-bug-1829
AXM-06 [err 1] ~ $ /usr/lib/connman/test/set-ipv4-method wifi_48a9d24b4844_6e616f2d3467_managed_psk manual 192.168.8.250 255.255.255.0 192.168.8.1 Setting method manual for wifi_48a9d24b4844_6e616f2d3467_managed_psk New IPv4.Configuration: {'Netmask': dbus.String(u'255.255.255.0', variant_level=1), 'Gateway': dbus.String(u'192.168.8.1', variant_level=1), 'Method': dbus.String(u'manual', variant_level=1), 'Address': dbus.String(u'192.168.8.250', variant_level=1)}
其中wifi字符串 wifi_48a9d24b4844_6e616f2d3467_managed_psk 是通过如下命令行拿到的:
AXM-06 [0] ~ $ connman scan wifi AXM-06 [0] ~ $ connman services * AR Wired { ethernet_0013951a97fa_cable } * AR nao-4g { wifi_48a9d24b4844_6e616f2d3467_managed_psk } ChinaNet-RXA9 { wifi_48a9d24b4844_4368696e614e65742d52584139_managed_psk } zeusis-guest { wifi_48a9d24b4844_7a65757369732d6775657374_managed_psk } zeusis { wifi_48a9d24b4844_7a6575736973_managed_psk } DIRECT-43-HP M277 LaserJet { wifi_48a9d24b4844_4449524543542d34332d4850204d323737204c617365724a6574_managed_psk } Pactera-Visitor { wifi_48a9d24b4844_506163746572612d56697369746f72_managed_psk } Pactera { wifi_48a9d24b4844_50616374657261_managed_none } Cool Changer S1 { wifi_48a9d24b4844_436f6f6c204368616e676572205331_managed_psk } AXM-06 [0] ~ $
设置static IP之前,要确定nameservers设置正确,set dns:
/usr/lib/connman/test $ ./set-nameservers wifi_48a9d2969a97_627263622d7a7a_managed_psk 211.138.91.1
二十三
对1.8A版本Pepper原生平板进行Root
adb devices 显示 offline,adb kill-server 后不起作用。
原因是 adb 版本号不对,android版本为 5.1,adb为1.0.26,在 /home/nao/.local/share/PackageManager/apps 里面发现了一个 1.0.31版本的adb
AXM-02 [0] ~/.local/share/PackageManager/apps $ find -name adb ./j-tablet-browser/adb AXM-02 [0] ~/.local/share/PackageManager/apps $ ./j-tablet-browser/adb version Android Debug Bridge version 1.0.31
使用这个版本的adb就可以了,首先要在平板的设置中打开usb调试模式,然后用adb时,会弹出一个授权确认框。
调用平板设置界面:
qicli call ALTabletService._lanuchApk com.android.settings
然后在关于本机中,版本信息连续点击几次,就可以打开开发者模式。
不能使用adb root:
AXM-02 [0] ~ $ adb -s LPT200ARA00L5CC12345 root adbd cannot run as root in production builds
尝试安装 adb install adbd-insecure.apk ,运行后也报错,没有root。
下载 360 超级 root工具,安装后运行,进行系统root。之后进入shell,再运行 su ,就是root用户了。
二十四
修改NAOqi系统防火墙
查看NAO目录的防火墙模式:
nao [0] ~ $ /etc/init.d/firewall_mode show * robot mode: development
修改防火墙模式:
/etc/init.d/firewall_mode production 或 /etc/init.d/firewall_mode development
如果要修改当前模式为默认,也就是系统重启后也是这种模式,则要运行:
/etc/init.d/firewall_mode save
参考文档:http://doc.aldebaran.com/2-1/dev/tools/opennao.html
经过验证,当防火墙处于production模式时:
- choregraphe,无法连接到NAO,无论是用wifi网络还是有线的网络。
- ssh,通过无线网络无法连接,但是有线网络可以连接。
- 机器人配置页面,都无法访问。
二十五
在NAOqi中安装pip
在home目录下执行命令:
easy_install --prefix=$HOME/.local pip
会遇到报错:
error: can't create or remove files in install directory The following error occurred while trying to add or remove files in the installation directory: [Errno 2] No such file or directory: '/home/nao/.local/lib/python2.7/site-packages/test-easy-install-5607.write-test' The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was: /home/nao/.local/lib/python2.7/site-packages This directory does not currently exist. Please create it and try again, or choose a different installation directory (using the -d or --install-dir option).
然后手动创建目录
mkdir -p /home/nao/.local/lib/python2.7/site-packages/ easy_install --prefix=$HOME/.local pip
就行了