NAOqi开发一些技巧

当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

就行了