ようやく形になってきた

現在開発中の新しいVPLであるFluoが少しずつ形になってきた。
Fluoは、データフロー風のメッセージ送信をベースとしたビジュアルなプログラミング環境であり、さまざまな入力データを「流れ」として捉え、少しずつ加工しながら出力データを作り出して行くもの。
もともとフィジカル系のデバイスから得るデータの処理に困ったときに、よりハンドリングしやすい環境が欲しいと思って作りはじめた。
ROSがtopicを介して通信することにインスパイアされ、その仕組みをSmalltalkにおけるメッセージ送信で実現しつつ、Pharoの強力な開発環境も利用できるように改良を続けてきた。
初期の頃に書いたFluoの説明はこちら。
まだ開発は半ばで、どんなノードをどのように使うのがスマートなのか模索している。
ただ、当初思い描いていた機能の多くは実現できてきたように思う。
Fluo - TurtlesimBumperDemo
上のグラフはタートルの移動中の衝突時に行う動作を記述したプログラムである。これは動作テストのためのもので実際にはROS経由で何らかのロボットを動かすことを想定している。

  1. 画面左側に並んだボタンの中から→(Open)ボタンを選ぶとプログラムが起動する。
  2. 起動によってTimerがスタートし、1秒間隔で3つのDataPackBehaviorにtickメッセージを送る。
  3. それぞれのBehaviorはTurtleを前進、後退、右回転させるためのデータを生成し、Timerからのメッセージに従ってデータを送信する。
  4. Inhibitorは通常はラベルのないアークから受けとったデータを下流に垂れ流すだけだが、tickメッセージを受け取ると一定時間だけラベルの付いたアークからデータを流すようになる。
  5. 通常、左上のInhibitorは前進データをTurtleに送るが、左下のボタンが押されてtickメッセージを受け取ったときだけ、10秒間右下のInhivitorからのデータを送る。
  6. 右下のInhibitorは、通常は右回転し、tickメッセージ受信で5秒間後退するデータを送信する。
  7. ボタンからのtickメッセージは2つのInhibitorに同じタイミングで送られるので、実際にはTurtleは5秒間後退した後、残り5秒間右回転した後、前進を再開する。

ざっとこんな感じの動作内容である。
1つのノードから発せられるデータは、アークで接続された全てのノードに配信されるので、全体のノードが並列的に動作する。
途中に流れるデータの様子が知りたければTranscriptに出したり、グラフとして表示することができる。
まだいろんな応用で使えるようなBehaviorは不足しているが、今後少しずつ充実させていく予定である。

Raspberry piのインストール

以前に3台購入した後、1台のみセットアップしたのだが手順をすっかり忘れてしまったので、新たな1台のセットアップを兼ねて備忘として残す。

SDカードへのイメージ書き込み

SDカードをMacに差し込んだ後、

diskutil list

にて/dev/disk1以下にマウントされていることを確認。

diskutil unmount /dev/disk1s1

にてアンマウント後、以下にて最新のイメージを書き込む。

sudo dd if=2013-09-25-wheezy-raspbian.img of=/dev/disk1 bs=1m

config.txtの書き換え

書き込みが終わるとbootがマウントされるので、この中のconfig.txtを修正する。
(以下はHDMI対応オンダッシュモニタの設定。接続するディスプレイ毎に設定は異なるはず)

vi /Volumes/boot/config.txt

先頭に以下を挿入。

hdmi_mode=4
overscan_left=-32
overscan_right=-32
overscan_top=-32
overscan_bottom=-32

終わったら以下でSDカードをイジェクトしてRaspberry piへ挿入する。

diskutil eject /dev/disk1

接続

セルフパワーのUSBハブのPC側をRaspberry piのUSB-Aポートに接続し、USBハブのポート側をRaspberry piのmicro USBポートに接続する。
HDMIケーブルでHDMIポートとHDMIディスプレイとをつなぎ、ディスプレイの電源を入れておく。タイミングが悪いと起動後表示されないので注意する。
LANケーブルやキーボード、マウスを適当につないでUSBハブの電源を入れる。

起動

起動後、初回は自動的にraspi-configが起動する。Expand Filesystemで最初だけSDカードのパーティションを拡張する。
次にInternationalisation Optionsで、localeの変更を行う。en_US.UTF-8およびja_JP.UTF-8だけをセットし、デフォルトのlocaleはNoneにした。
TimezoneはAsia/Tokyoを選ぶ。HHK2 LiteのUSモデルなのでキーボードレイアウトは、Generic 101keyとし、レイアウトはUSにした。(テキトー)
Advanced Optionsでは、hostnameの設定とSSHの有効化を行う。
raspi-config終了後にrebootを促されるので再起動。

最新パッケージへのアップグレード

お決まりのアップデート&アップグレード。

sudo apt-get update
sudo apt-get upgrade

NesTalkでマリオを動かす

Pharo上でマリオが動くという。ウチのゼミではマリオゲームもどきを作っているだけに、どんなものかを試してみた。
NesTalkというパッケージがそれらしい。パッケージ名のとおりNESのエミュレータをPharoで実装したもののようである。
http://www.youtube.com/watch?v=b0Z2QNFB7jEを見るとちゃんと動いていることがわかる。
そのままインストールしようとするとパッケージが不足している旨の警告が出るため、BabyMockのインストールからはじめる。

MCHttpRepository
    location: 'http://ss3.gemstone.com/ss/BabyMock'
    user: ''
    password: ''

上記のレポジトリから、ConfigurationOfBabyMockをインストールする。続いて、

ConfigurationOfBabyMock loadDevelopment.

によってBabyMockをインストールする。
次に、以下のレポジトリからNesTalkをインストールする。

MCHttpRepository
	location: 'http://smalltalkhub.com/mc/zeroflag/NesTalk/main'
	user: ''
	password: ''

適当にロムイメージを入手して、以下のように起動する。パス名の指定のところは適当に変える必要がある。

nes := NesTalk new.
nes insertCartridge: (NtCartridge romFile: (FileSystem disk workingDirectory / 'mario_bros' / 'Mario Bros.nes') pathString).
nes powerOn.

終わったらビデオの通り、以下のようにシャットダウンする。

nes powerOff.

うちの環境(MacBookAir)では、8キーで左、0キーで右に移動できたが、その他のキーがよくわからないためクリアすることはできなかった。
どうやらキーコードの取り方の問題のようで、NesTalkWindow>>#handlesKeyDown:と#handlesKeyUp:を変更することで操作できるようになった。

handlesKeyDown: anEvent
	anEvent keyValue = 6 ifTrue: [joypad pressButtonAt: NtJoypad buttonA. ^ true].
	anEvent keyValue = 7 ifTrue: [joypad pressButtonAt: NtJoypad buttonB. ^ true].
	anEvent keyValue = 125 ifTrue: [joypad pressButtonAt: NtJoypad buttonDown. ^ true].
	anEvent keyValue = 126 ifTrue: [joypad pressButtonAt: NtJoypad buttonUp. ^ true].
	anEvent keyValue = 123 ifTrue: [joypad pressButtonAt: NtJoypad buttonLeft. ^ true].
	anEvent keyValue = 124 ifTrue: [joypad pressButtonAt: NtJoypad buttonRight. ^ true].
	anEvent keyValue = 36 ifTrue: [joypad pressButtonAt: NtJoypad buttonStart. ^ true].
	anEvent keyValue = 49 ifTrue: [joypad pressButtonAt: NtJoypad buttonSelect. ^ true].
	^ false
handlesKeyUp: anEvent
	anEvent keyValue = 6 ifTrue: [joypad releaseButtonAt: NtJoypad buttonA. ^ true].
	anEvent keyValue = 7 ifTrue: [joypad releaseButtonAt: NtJoypad buttonB. ^ true].
	anEvent keyValue = 125 ifTrue: [joypad releaseButtonAt: NtJoypad buttonDown. ^ true].
	anEvent keyValue = 126 ifTrue: [joypad releaseButtonAt: NtJoypad buttonUp. ^ true].
	anEvent keyValue = 123 ifTrue: [joypad releaseButtonAt: NtJoypad buttonLeft. ^ true].
	anEvent keyValue = 124 ifTrue: [joypad releaseButtonAt: NtJoypad buttonRight. ^ true].
	anEvent keyValue = 36 ifTrue: [joypad releaseButtonAt: NtJoypad buttonStart. ^ true].
	anEvent keyValue = 49 ifTrue: [joypad releaseButtonAt: NtJoypad buttonSelect. ^ true].
	^ false

なお、上記の変更を行えば、Mac以外の環境では動かないと思われるので注意。

古いIntel iMacにWindows8をインストールする

BootCamp 5.0では古いiMacにWindows8をインストールできない。そこでその対処方法。

必要なもの

  • Windows 8のインストールディスク
  • Windows 7のインストールディスク
  • 空のDVD-RWディスク
  • Windowsの動いているPC

手順1:WindowsAIKのインストール

後述のようにBootCampをインストールしてから、Windows8のインストールディスクを入れてブートしても、「Select CD-ROM Boot Type:」のように表示されるだけで先に進むことができない。
そこで、https://a.know-how.fc2.com/ja/30457/の手順に従ってWindowsAIK(自動インストールキット)により新たなインストールディスクを作成する。
AIKインストールの手順は省略。
Windows8のインストールディスクをドライブに挿入してから、「スタート-Microsoft Windows AIK-Deploymentツールのコマンドプロンプト」を選んでコマンドプロンプトを起動し、以下を入力する。
(なお、DVDドライブはR:とし、作成するisoファイルはC:のルートに格納するものとする)
oscdimg -n -m -bR:\boot\etfsboot.com R:\ C:\Win8.iso
isoファイルが作成できたら空きDVD-RWディスクにWin8.isoを書き込む。

手順2:MacでWindows8用のパーティションを作成する

とりあえずBootCampをインストールする。
Windows用のパーティションを作成するために、Windows7のインストールディスクを挿入する。
(Windows8のインストールディスクを入れても続行できなくなる)
自動的に再起動するタイミングでOptionキーを押したままにし、HDDからブートさせる。
(でないとWindows7がインストールされてしまう)
Windows7のインストールディスクを取り出し、Win8.isoを書き込んだ新しいディスクに入れ替える。
Macをリブートして、Optionキーを押したままにし、DVDドライブを選んで進む。
後は問題なくインストールを進めることができる。

PCのカメラで顔検出するまで

毎年の授業のネタとしてOpenCVで顔検出(face detection)をさせているが、せっかくなのでROS経由で顔検出させることにした。

カメラの設定

まずは、ノートPCについているカメラを使えるようにする。参考にしたのはこちらのサイト。
https://asukiaaa.blogspot.jp/2013/05/blog-post_14.html
カメラによって使えるカメラドライバは変わるが、うちの環境ではros-groovy-camera-umdを導入するだけでよかった。この導入により、https://www.ros.org/wiki/uvc_cameraのパッケージが利用可能となる。
sudo apt-get install ros-groovy-camera-umd

ちゃんと動作するかどうか、以下を起動して確認する。
rosrun uvc_camera camera_node
rosrun image_view image_view image:=/image_raw

前者でカメラノードを立ち上げ、後者でカメラ画像を表示している。なお、カメラからの画像は/image_rawトピックを通じて得ることができる。

OpenCVパッケージの導入

顔検出に必要なOpenCVのパッケージとして、 ros-groovy-mjpeg-server をインストールしておく。
sudo apt-get install ros-groovy-mjpeg-server

顔検出

顔検出には、OpenCVのHaar分類器を用いたhttps://www.ros.org/wiki/pi_face_trackerというノードを使うことにする。他にもface_detectorがあるがステレオ画像を対象としているようなのでpi_face_trackerにした。ただし、ubuntuのパッケージにはなっていないのでビルドする必要がある。
説明の都合上、~/workspaceでROSのワークスペースが作られているものとする。
先ほどのページの指示に従い、SVNから最新のpi_visionのソースを取り込んでビルドする。
cd ~/workspace/
svn co http://pi-robot-ros-pkg.googlecode.com/svn/trunk/pi_vision
rosws set ~/workspace/pi_vision/
. ~/setup.sh
rosdep install pi_vision

rosdep installでは以下のようなエラーが表示されてしまう。
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
pi_face_tracker_gui: Missing resource rosbridge
ROS path [0]=/opt/ros/groovy/share/ros
ROS path [1]=/home/itoh/workspace/pi_vision
ROS path [2]=/opt/ros/groovy/share
ROS path [3]=/opt/ros/groovy/stacks
ros2opencv: Missing resource uvc_cam
ROS path [0]=/opt/ros/groovy/share/ros
ROS path [1]=/home/itoh/workspace/pi_vision
ROS path [2]=/opt/ros/groovy/share
ROS path [3]=/opt/ros/groovy/stacks
pi_face_tracker: Missing resource uvc_cam
ROS path [0]=/opt/ros/groovy/share/ros
ROS path [1]=/home/itoh/workspace/pi_vision
ROS path [2]=/opt/ros/groovy/share
ROS path [3]=/opt/ros/groovy/stacks

pi_visionの使っているノードが見つからないというエラーなので、rosbridgeをrosbridge_server、uvc_camをuvc_cameraのように修正していく。
rosbridgeに関する修正は、pi_vision/pi_face_tracker_gui/manifest.xml に対して行う。下から4行目あたりのrosbridgeをrosbridge_serverに変更する。変更した後の内容は以下の通り。
<depend package="rosbridge_server"/>
uvc_camに関する修正は、pi_vision/ros2opencv/manifest.xmlとpi_vision/pi_face_tracker/manifest.xmlの2カ所に対して行う。どちらも、uvc_camをuvc_cameraに変更する。
<depend package="uvc_camera"/>
続いてrosmakeする。
rosmake pi_vision
この状態で起動することはできるのだが、uvc_cameraの画像トピック名が/image_rawであるのに対して、pi_face_trackerでは/camera/image_rawを使っている。そのため起動しても画面には何も表示されない。pi_vision/pi_face_tracker/launch/face_tracker_uvc_cam.launch の5行目にある/camera/image_rawを/image_rawに変更する。変更した後の内容は以下の通り。
<remap from="input_rgb_image" to="/image_raw" />
以上でビルドは完了。

使い方

roslaunch ros2opencv uvc_cam.launch
roslaunch pi_face_tracker face_tracker_uvc_cam.launch

uvc_cameraノードを起動しておき、face_trackerを起動する。
自動的にimage_viewが立ち上がり検出後の画像が表示される。
画面上でのショートカットキーは以下の通り。

  • q – 終了
  • c – 現在の特徴を削除する
  • t – テキスト表示のオン/オフ
  • f – 特徴表示のオン/オフ
  • n – ナイトモード(カメラ画像表示しない)のオン/オフ
  • a – 自動的な顔検出のオン/オフ

Pharo 2.0 でのサウンド

https://goonsh.blogspot.jp/さんのKhorosの正式リリースを心待ちにしているのだが、学生から音ゲーを作りたいとの要望がでて、Pharo 2.0で音関係がどうなっているのかを調べてみた。
Pharoの本体からは外されてしまっているが、外部パッケージとして昔と同じ(?)ものを使うことができる。

MCHttpRepository
	location: 'http://www.smalltalkhub.com/mc/PharoExtras/Sound/main'
	user: ''
	password: ''

上記をMonticelloで+RepositoryしてOpenし、ConfigurationOfPharoSoundを選んで最新版をロードする。
Workspaceを開いて以下をDo itすればOK。
ConfigurationOfPharoSound project load: #stable
動作確認は以下のようにする。
AbstractSoundSystem soundEnabled: true.
AbstractSound stereoBachFugue play.

バッハのフーガが演奏されればOK。止めたくなったら以下をDo itする。
SoundPlayer stopPlayingAll.
ちなみに上記はMac OS X 10.8.3(Mountain Lion)で確認した。Windows 7で同じように動くかどうかは要チェック。

ScorePlayerMorphへのパッチ

(2013.5.30追記)
Mac OS X, Windows 7ともに適切なMIDIポートを選べばMIDIファイルを演奏できる。ただし、MIDIファイルを選択する際にエラーが出るため、一部修正する必要がある。なお、以下を保存してFileInすれば対処できる。
ScorePlayerMorph-openMIDIFile.st

OpenJTalkの導入

TurtleBot1に喋らせるためにOpenJTalkを導入した。OpenJTalkとは、日本語で書かれた文書を読み上げるオープンソースのソフトウェアである。
http://open-jtalk.sourceforge.net/
例によってubuntu(12.04LTS)のレポジトリから入手できるバージョンは古いため、上記サイトから最新版を導入することにした。
導入の方法はhttps://www.geocities.jp/humanrace96/OpenJTalk.htmlが詳しい。ほぼ同じ手順でインストールした。

準備

http://open-jtalk.sourceforge.net/より、以下のファイルをダウンロードする。

  • open_jtalk-1.06.tar.gz
  • open_jtalk_dic_utf_8-1.06.tar.gz
  • hts_voice_nitech_jp_atr503_m001-1.05.tar.gz

また、http://hts-engine.sourceforge.net/より、以下のファイルをダウンロードする。

  • hts_engine_API-1.07.tar.gz

上記を適当なフォルダに保存しておく。ここでは説明の都合上、~/Downloads に保存したものとする。

ビルド

手順としては、

  1. hts_engine_APIのビルド
  2. open_jtalk-1.06にパッチを当てる
  3. open_jtalk-1.06のビルド

の順でビルドを行う。
例によって ~/workspace フォルダに上記ファイルを展開していくものとする。

hts_engine_APIのビルド

cd ~/workspace
tar xzf ../Downloads/hts_engine_API-1.07.tar.gz
cd hts_engine_API-1.07
./configure
make
sudo make install

open_jtalk-1.06にパッチを当てる

何もせずにopen_jtalkをビルドすると、文章によっては読み上げの途中でものすごく間延びすることがある。これを解決するにはソースにパッチをあてる必要がある。

*** jpcommon/jpcommon_label.c.orig      2012-12-24 17:18:53.000000000 +0900
--- jpcommon/jpcommon_label.c   2013-05-27 16:35:45.195252424 +0900
***************
*** 284,289 ****
--- 284,290 ----
        if (index == a)
           break;
     }
+    if (i > 3) i = 3;
     return i;
  }
***************
*** 383,388 ****
--- 384,390 ----
     for (i = 0, index = m->next; index != NULL; index = index->next)
        i++;
+    if (i > 10) i = 10;
     return index_mora_in_utterance(m) + i;
  }

上記を適当なファイルmanobi.patchにコピー&ペーストしてworkspaceフォルダに保存する。その後以下を実行する。
cd ~/workspace
tar xzf ../Downloads/open_jtalk-1.06.tar.gz
cd open_jtalk-1.06/
patch -p0

open_jtalk-1.06をビルドする

パッチが成功したら続けてビルドする。
./configure --with-charset=UTF-8
make
sudo make install

各種データファイルの設定

辞書ファイルおよび音声ファイルを展開する。
tar xzf ../Downloads/hts_voice_nitech_jp_atr503_m001-1.05.tar.gz
tar xzf ../Downloads/open_jtalk_dic_utf_8-1.06.tar.gz
sudo mkdir /usr/local/share/open_jtalk
sudo mv hts_voice_nitech_jp_atr503_m001-1.05/ open_jtalk_dic_utf_8-1.06/ /usr/local/share/open_jtalk/

実行

open_jtalk -m /usr/local/share/open_jtalk/hts_voice_nitech_jp_atr503_m001-1.05/nitech_jp_atr503_m001.htsvoice -ow output.wav -x /usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.06/
上記を実行すると入力待ちになるので、適当な日本語文章を入力してEnterを押す。すると、その文章を読み上げたファイル(output.wav)が生成されるため、適当なプレイヤー(mplayer等)で再生すればよい。
パラメータが長いので適当なシェルスクリプトを作っておいた方がいいだろう。

Juliusの導入

TurtleBot1で音声認識をさせるべく、Juliusをインストールしてみた。
http://julius.sourceforge.jp/によると、Juliusは以下のような音声認識エンジンである。

Julius は,音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジンです. 数万語彙の連続音声認識を一般のPC上でほぼ実時間で実行できます. また,高い汎用性を持ち,発音辞書や言語モデル・音響モデルなどの音声認識の各モジュールを組み替えることで,様々な幅広い用途に応用できます. Julius はオープンソースソフトウェアで,ソースコードを含めてどなたでもフリーで入手することができます.

ubuntu(12.04LTS)のレポジトリのものは4.1.5と古かったので、最新のソースからビルドすることにした。

準備

http://julius.sourceforge.jp/から以下のファイルをダウンロードする。

  • julius-4.2.2.tar.gz
  • dictation-kit-v4.1.tar.gz

dictation-kit-v4.1(Juliusディクテーション実行キット)にはJulius本体が同梱されているが、バージョンが古いため最新のエンジンを用意しておく。
なお、説明の都合上、~/Downloadsに保存したものとする。

ビルド

上記のファイルを適当なフォルダ(ここでは~/workspaceとする)で展開する。
cd ~/workspace
tar xzf ../Downloads/julius-4.2.2.tar.gz
tar xzf ../Downloads/dictation-kit-v4.1.tar.gz

julius本体をビルド&インストールする。
cd julius-4.2.2
./configure
make
sudo make install

実行

以下のコマンドでJuliusを起動すると、連続的に音声認識を行い、認識結果がUTF-8で表示される。
julius -C ~/workspace/dictation-kit-v4.1/fast.jconf -charconv EUC-JP UTF-8

moduleモード

以下のコマンドではmoduleモードで起動する。
julius -C ~/workspace/dictation-kit-v4.1/fast.jconf -module -charconv EUC-JP UTF-8
moduleモードにするとJuliusはポート10500番でlistenし、TCPで接続してきたクライアントに認識結果がXML形式で送られる。
なお、JuliusBookには連続的な接続・切断をサポートするようなことが書かれているが、実際には切断するたびにJuliusが終了するので注意。

注意点

マイクの種類や音量には敏感なようなので微調整が必須。ディクテーションキットの辞書ではそれほど認識精度も高くない。ちゃんと認識させるにはそれなりの学習が必要と思われる。

ROS経由でKinectの骨格情報を得る(groovy)

以前、ROSでkinectを動かす。という記事で、Kinectの骨格情報をROS経由で得る方法について述べた。しかし、相当に古い情報なので、現在のgroovyではうまく動かないようだ。
そこで、groovyで動かす方法を再度まとめてみた。
2013/10/3追記:この件に関してまとまっているサイトを見つけたので追加しておく。
http://www.technolabsz.com/2013/06/how-to-solve-opennitracker-error-find.html
基本的には、https://www.ros.org/wiki/openni_trackerというパッケージを導入することで骨格情報が扱えるようになるらしい。
sudo apt-get install ros-groovy-openni-tracker
上記のようにインストールし、
roslaunch turtlebot_bringup 3dsensor.launch
でKinectを動作させた後で、先ほどのページに記述されているようにtrakerを起動した。すると、
rosrun openni_tracker openni_tracker
[ERROR]: Find user generator failed: This operation is invalid!

のようなつれないメッセージとともに終了してしまう。
適当にググって探してみると同じ現象についての報告がされていた。
http://answers.ros.org/question/42654/openninite-incompatible-in-fuertegroovy-on-precise/
要はNITEのバージョンが異なるためらしいのだが、5番目のコメントの方法を試してみたらうまくいった。
まず、https://www.openni.org/openni-sdk/openni-sdk-history-2のページから、NiTE v1.5.2.21のパッケージをダウンロードする。(うちの32bit版ubuntu12.04の場合、NITE-Bin-Linux-x86-v1.5.2.21.tar.zipとなる。)
ダウンロードしたZIPファイルを展開すると、bz2形式の圧縮ファイルが得られるので、さらにtar xjfコマンドで展開する。展開したフォルダの中にinstall.shというスクリプトがあるので、以下のようにインストールする。
sudo ./install.sh
これで先ほどのrosrun openni_tracker openni_trackerを実行するとエラーを吐かなくなった。
しかし、Kinectの前でPSIポーズを取ってみてもウンともスンとも言わない。アヤしいと思って、roslaunch turtlebot_bringup 3dsensor.launchを止めて別のlaunchを試したらうまくいった。
roslaunch openni_launch openni.launch
まとめると、以下の手順でKinectが骨格情報を生成するようになった。

  1. ros-groovy-openni-trackerをapt経由で得る
  2. NiTE v1.5.2.21をダウンロードする
  3. roscoreなりturtlebot_bringupしておく
  4. roslaunch openni_launch openni.launchを起動する
  5. rosrun openni_tracker openni_trackerを起動する

上記のパッケージは骨格情報を認識すると、/tfトピックにデータを流すようになる。そこで、/tfをsubscribeして適当にデータを得ればいいのだが、気をつけなければならないのは、child_frame_idに現れるのは、trackerのページにあるような/headではなく、認識したUserの番号が付加された/head_4のようなものとなることである。後は0〜1の範囲にあるx, y, zから値を得れば良い(はず。まだやってない。)