Kinectセンサーを使ってSoftbank Pepperを動かす

Pocket

タイトルの通りです。

もくじ

  1.  概要
  2.  動画の紹介
  3.  手元で再現してみたい人へ
  4.  ソースコードに関する注意
  5.  質問とか

 

1. 概要

2014年に開発者向けに販売されて以来Softbank Pepperはソフトバンクから「自律したロボット」という特徴を前面に出して売られてますが、いっぽう開発者にとってはNAOqi Frameworkとセンサ/モーターが載ってるだけのLinuxという側面もあるので、例えばPepperを外部から手動操作するリモコン的なソフトを作れます。株式会社ネクストさんの「pepperくんをブラウザから動かすコントローラを作ろう」などはお手軽さがメリットとなる事例として参考になります(個人的にJSあまり書きたくないのでやりませんが…)。

 

しかし、普通のスマホやゲームパッドといったユーザーインターフェースでは操作の自由度に限界があり、Pepperの全身に仕込まれた15個前後のモーターに角度指示を自在に出すのは実質ムリです。

そこで今回使ったのがXbox One Kinectセンサー

このセンサーですが以前のKinectより段違いに性能が高く、Windows向けのAPIも良く整備されてます。APIの機能はいろいろあるのですが、今回は特に「ヒトを検出して各関節の姿勢情報を取得する」、つまりいわゆるモーションセンサ機能を用います。この姿勢情報というのは原理的にはPepperに再現させたい姿勢をほぼそのまま表したデータなので、このデータを適当に整形してPCとPepperで通信が確立できれば、人の動きをPepperにマネさせられそうな予感がします。ということで、実際にやってみましょう。

 

2. 動画の紹介

動いてる様子のデモをニコニコ動画に上げてます。動画中でも触れてますが撮影はアトリエ秋葉原で行っています。

上の動画では編集で顔を隠してますが、実際はPepperがきちんと動いてるか心配なので基本Pepperをガン見してました。

 

 

3. 手元で再現してみたい人へ

ここから先は具体的なプログラムの実行手順の話です。Pepperの開発環境であるChoregrapheの使い方を知っており、手元にPepperがある前提で話を進めます。アトリエ秋葉原のワークショップで言うと2つ目のワークショップ程度の知識を想定しています。

 

 

3-1. SDKのインストール

では、まずKinectセンサーを買う前にPCを用意し、SDKをインストールします。PCは何でもいいわけではないことに注意して下さい!特に以下の3点をクリアしてるかはポイントになります。

  • Windows 8/8.1(現状だとWin10は対応してなさそう?)
  • USB3.0端子(たぶん必須)
  • DirectX 11対応環境

SDKのダウンロード方法や手元のPCでKinectが使えそうか確認する具体的な手順は「Kinect for Windows v2 購入前に確認すべきことと、その方法」に詳しく書かれてますので、コチラを参考にSDKのインストールを済ませてください。この記事にもありますが事前チェックをサボってるとセンサーを買うだけ損になる可能性もあります。

 

3-2. センサーとアダプターの入手

PC環境が確認できたら「Xbox One Kinect センサー」および「Xbox One Kinect センサー PC用アダプター」を買います。アダプターが必要な事に注意です。

上にはAmazon(ニコニコ市場越し)のリンクで貼ってますが個人的にはMicrosoft公式かヨドバシカメラでの購入をオススメします。

 

3-3. プログラムの入手

実行ファイルとかソースはGitHubに置いてるので拾ってって下さい。ソースはMITライセンスで公開しています。

本プログラム(Kinect for Pepper)は3つのプログラムで構成されています。これらは”programs”フォルダに入ってますが、その中で直接触るのは以下の3ファイルです。

  • “PC/KinectForPepper.exe”(C#プログラム)
  • “Server/kfp_server.py”(Pythonスクリプト)
  • “Pepper/KinectForPepper.pml”(Choregrapheプロジェクト)

もしPythonが入ってないのあればPython公式ページから2.7系の最新版をダウンロード、インストールしておいてください。たぶんPython3.4では動きません。

また実行するだけなら不要なハズですが、C#プログラムの作成にはVisual Studio 2015 Communityが用いられており”src”フォルダ以下がC#プロジェクトの中身です。

 

3-4. 実行前の準備: IPアドレスの確認と下準備

プログラム実行前にネットワーク環境を確認します。コマンドプロンプト(スタート画面で”cmd”と打って出てくるやつ)を起動し、”ipconfig”と打ち込んで自分のIPアドレスを確認します。

ipconfig_example

上の例だと”192.168.1.2″がIPアドレスになります。IPアドレスが確認できたら”programs/Server/kfp_server.py”を適当なテキストエディタで開き、下記の”host”変数として確認したIPアドレスを入れます。文字列として代入するのでシングルクオーテーションかダブルクオーテーションで囲って下さい。

 

またChoregrapheで”programs/Pepper/KinectForPepper.pml”を開き、root階層の”Realtime”および”Monomane”ボックスについて設定を開き(左下のスパナマークをクリック)、”serverIP”の部分にさっき確認したIPアドレスを書き込みます。

choregraphe_kfp
設定画面(※最新版ではボックス設定がちょっと変更されています)

 

3-5. プログラムを順番に実行

やっと準備が整ったので実行してみましょう!

まずPythonプログラムを実行します。コマンドプロンプトを立ち上げて”kfp_server.py”のあるディレクトリまで移動し、下記のコマンドでスクリプトを実行します。

見かけ上なにも起きてないように見えるかもしれませんが、サーバープログラムは起動できてるので問題ありません。コマンドプロンプト画面はそのまま閉じずに放置します。

 

次にPCへKinectセンサーを接続し、C#プログラムを動かします。”KinectForPepper.exe”をダブルクリックで実行し、出てきたウィンドウの下側で”IP Address”のテキストボックスに先ほど確認したIPアドレスを書き込みます。アドレスを書き込めたら「接続」ボタンを押します。Kinectの正面に人が立つと、黒いウィンドウの中にヒトの姿勢情報が映るようになります。

kfp_csharp
KinectForPepper.exeの実行画面(※最新版ではちょっとGUIの見た目が変わってます)

蛇足ですが、こちらのプログラムは描画部分に関してKinect for Windows SDK 2.0のサンプルである”BodyBasic-WPF”のソースを一部使っています。サンプルコードはSDKに付属でついてきてるので元コードの方も是非ご覧下さい。

 

この時点でPC上では2つのプログラムが実行中になっているかと思います。最後にChoregrapheでPepperと接続し、さきほど開いた”KinectForPepper.pml”のプログラムを実行します。

このプログラムはPepper App Challengeに出して落選したやつなのですが、指示に従ってタブレットをタッチしたり頭を触ったり音声認識をさせつつPepperが動く、というアプリになっています。詳細な挙動については実際に動かして確認してください。

注意としてヒトの姿勢によってはPepperがうまく姿勢を再現できなかったり手首があらぬ方向に曲がったりしますが、まあそのへんはご勘弁ください。完成度はそこまで保障してないので…

 

4. ソースコードに関する注意

注意点というか改善点を二つ。

 

4-1. たのしいさんすう

本記事の最初の方に「原理的にはKinectから得られる姿勢データってPepperに再現させたい姿勢とほぼ等価ですよ」的な事を書きましたが、これはあくまで「原理原則がそうだ」という話であって実際の計算は割と泥臭いことになってます。例えば手首のひねり角度計算はこんな感じ。

こうした「ヒトの姿勢情報をロボットの角度値に変換する」という計算は全てC#プログラムの中でも”BodyToJointAngles.cs”中で定義されています。

計算の詳細は追わなくて構いませんが、座標変換とか外積・内積とか使った上で逆三角関数に通して角度を得るコードが現れます。ナゼこんなのが出てくるかというと、Kinectが姿勢表現に使っているクオータニオン(四元数)をPepperが使ってるオイラー角(ロール・ピッチ・ヨー)表現に直さなければいけないからです。このあたりは座標変換とかの基礎知識やPepperの角度方向定義を調べながらのけっこう面倒な作業になります。

 

これらの計算は「まあ動けばいいかな」程度に作ったので完成度がそこまで高くありません。自分でよりよい方法が思いついたら書き換えて使ってください。なおKinectのクオータニオンを変換して捌く際にはこちらのQ&Aを見ておいた方がやりやすいかなーと思います。

 

4-2. サーバープログラムをサーバーPCへ

このプログラムをわざわざ「クライアント」「サーバー」「Pepper」の3段階構成に分割したのは、この構成でサーバーをグローバルな場所に置いてしまえば数百km離れたイベント会場とかにもモーションをモーションを送り込めますよ、という将来的なメリットを見越しての設計です。

ただし今回やった範囲ではサーバープログラムはローカルPCで実行してるのでそういったメリットは特にないです。もしお手元にドメインとってるサーバ計算機があればサーバ経由でPepper動かすのも面白いかもしれません。

 

5. 質問とか

質問やバグ報告についてはここのコメントに書くかnjslyr.trpg@gmail.comへのメール、あるいはTwitterへお願いします。

また時期によりますが2015年度中であればアトリエ秋葉原にそこそこ通ってるので、「アトリエ秋葉原で動かすとこ見たい!」というお話もあればぜひどうぞ。

“Kinectセンサーを使ってSoftbank Pepperを動かす” への4件の返信

  1. 初めまして。介護施設で働いている者です。
    pepperでラジオ体操をプログラム化したあと考えているのですが、コレグラフで作成するよりもキネクトの方が滑らかな動きになるのではないかと考えております。そこで、お聞きしたいのですが、まず、キネクトで操作した動きを保存することは可能でしょうか?また、pepperで繰り返し運用したいと考えておりますが、ラジオ体操の音源とキネクトで保存した動きをリンクさせることは可能でしょうか?以上の2点につきまして、ご教授頂ければ幸いです。よろしくお願い致します。

    1. コメントありがとうございます。順にお答えいたしますが、まずKinectで操作した動きの保存については、例えば2人組で作業する場合なら
      ・1人目がKinectでPepperを操作
      ・2人目はChoregrapheのタイムラインボックスを開き、Pepperの動きを見ながらF8キー押してキーフレーム登録
      みたいにするのが割と簡単な方法になります。

      また2点目のラジオ体操との同期ですが、Pepperのタイムラインを信用するなら単純に
      「ラジオ体操ぜんぶの動き」と「ラジオ体操の音楽再生」をボックスで並べればいいと思います。
      ただし実際にはタイムラインが徐々に音楽とずれていってしまうハズなので、
      下記のような対策を検討してください。
      ・音源を細かくちぎり、決まった時間間隔(たとえば4小節)ごとにPepperの動きと音源を同期する
      ・Pepperの動作を少し早めにしておいて、Waitボックスで余った時間を調整するように作る

      ご都合さえ大丈夫であれば対面でのご相談でも歓迎していますので、ご興味ありましたらお問い合わせください。

  2. こんにちはー

    この文を見て、Pepperの動作をカスタマイズをやってみたいです
    例えば、同じ動作で、速くするとゆるくするの変化をしたいので、キネクトで操作した動きを保存したデータをsetAnglesのパラメータを調整したら、できると思いますが。再現する時、動作が動かなくなりました。delayでデータを送る時間を遅らせたら、Pepperは動作ができたけど、動作がすごく遅くなりました。 delaytimeとsetAnglesのパラメータfractionMaxSpeedも調整したですけど、本来の速度は出てないです。
    キネクトで操作した動きの保存したデータを読み込み時、特別気をつけるところがありますか?

    もう一つやってみたいことは保存した動きを大きくすると小さくすると思いまして、計算の詳細をよくわからないとなかなか書き直しつらい。コードを見てて、計算の詳細を導出せなかったです。
    もしばくさんが時間あったら、SKYPEででも計算のコンセプトを教えていただければ幸いです

    たぶん日本語の間違えもありまして、長い文ですが、よろしくお願いいたします 

    1. ご質問ありがとうございます。
      Thank you for the question, excuse me but I answer in Japanese.
      (Google translation would be a great help.)

      2つの項目に分けて回答します。

      1. Kinectの保存データ使用について

      すみません、実はKinectの保存データを用いた方法は試していません。
      動作が思い通りにならない可能性として考えられるのは以下の通りです。

      1.1 Pepper上のsetAngles

      Pepperを素早く動かしたい場合、setAnglesのfractionMaxSpeedを1.0に近い値にしてください。
      もし1.0にしても望んでいるスピードに届いていないのであれば、それはPepperの性能の限界だと思ってください。

      1.2 データの間引き

      珍しい場合だと思いますが、Kinectのデータが30fps以上の高い頻度で送られているかもしれません。
      その場合、Pepperの処理がうまくいかないかもしれません。
      たとえば30fpsのデータを3倍の速度で送る場合、90fpsでデータを送る代わりに、
      データを3個あたり1つだけ送って30fpsを維持した方が動作が安定するように思います。

      2. 計算詳細について

      計算はForward Kinematicベースです。
      だいぶ昔に作成したプログラムなので詳細を覚えていない部分もありますが、
      計算のコンセプトは次の4つに分かれます。

      2.1. ShoulderPitch, ShoulderRoll

      これらの2自由度は肩と肘のベクトル方向をもとに計算できます。
      基準の座標系として、肩の姿勢を使っています。

      2.2. ElbowRoll

      肩から肘へのベクトルと、肘から手首へのベクトルのあいだでなす角を計算すると
      肘の曲がり度合いが求められます。

      2.3. ElbowYaw

      Kinectで取得した姿勢について、いったんElbowYaw相当の角度が0だと仮定して
      ShoulderPitch, ShoulderRoll, ElbowRollを使って手首の位置をもとめると、
      実際の手首位置には一致しません。

      このずれの分量を説明する変数としてElbowYawを導入し、
      ずれが無くなるようにElbowYawを求めています。

      2.4. WristYaw

      これはそのまま手首のひねり角度として取得できます。

      ご参考になれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です