NAOの姿勢制御モジュールとスクリプト

キレキレダンスプロジェクトで、NAO用の姿勢制御モジュール WSSequenceと、それが解釈実行するスクリプト処理言語を作成した。

たとえば、以下のようなスクリプトを解釈して実行する。ポーズの実行、変数処理、ループ、センサー利用などができる。angles005_83などには、この間記載した全アングルの角度設定が入っている。ongroundは、指定の足の着地重量が指定された値以上になるまで待機するコマンドである。

#----------------------------------------------
# Walk005_2.mseq
# スクリプトバージョン 2 に対応
# ※ Stand or StandInit以外の態勢から
# walkなどの足の動作をすると、倒れる!
#----------------------------------------------
# 基本速度を設定
let,$spd,0.8
# 着地センサーのパラメータ設定
# 着地判定重量,判定時間[ミリ秒],時間ステップ[ミリ秒]
setparams,0.8,100,2
# 歩行可能初期状態を実現
execpose,speed,StandInit,$spd
# 50ミリ秒データによる歩行
# 歩行開始プロセス
execpose,speed,angles005_83,$spd
execpose,speed,angles005_84,$spd
execpose,speed,angles005_85,$spd
execpose,speed,angles005_86,$spd
execpose,speed,angles005_87,$spd
execpose,speed,angles005_88,$spd
# $1が 1,2,3 となる3回実行される(C++等とは異なる) 
loop,$i,1,3
    #歩行の1サイクルを記載
    println,第,$i,回、歩行ループ
    execpose,speed,angles005_141,$spd
    execpose,speed,angles005_142,$spd
    println,左足の着地チェック
    onground,left
    execpose,speed,angles005_143,$spd
    execpose,speed,angles005_144,$spd
    execpose,speed,angles005_145,$spd
    execpose,speed,angles005_146,$spd
    execpose,speed,angles005_147,$spd
    execpose,speed,angles005_148,$spd
    execpose,speed,angles005_149,$spd
    execpose,speed,angles005_150,$spd
    execpose,speed,angles005_151,$spd
    println,右足の着地チェック
    onground,right
    execpose,speed,angles005_152,$spd
    execpose,speed,angles005_153,$spd
end
# 歩行の停止プロセスに入る
execpose,speed,angles005_154,$spd
execpose,speed,angles005_155,$spd
execpose,speed,angles005_156,$spd
execpose,speed,angles005_157,$spd
execpose,speed,angles005_158,$spd
execpose,speed,angles005_159,$spd
execpose,speed,angles005_160,$spd
execpose,speed,angles005_161,$spd
execpose,speed,angles005_162,$spd
execpose,speed,angles005_163,$spd
execpose,speed,angles005_164,$spd
execpose,speed,angles005_165,$spd
execpose,speed,angles005_166,$spd
execpose,speed,angles005_167,$spd
execpose,speed,angles005_168,$spd
# 直立状態を回復する
execpose,speed,Stand,0.2

qibuild の警告とエラー g++のバージョンダウン

先の記事にも書いたように、デスクトップにLinux Mintの32ビットバージョンを入れて、naoqi のc++の開発環境を整えようとしている。Chregrapheの問題は、かんたんに解決した。

qibuildの関係で、昨日からすったもんだしている。前のMacのVirtualBoxのLinux Mint 32では、全く問題なく行っていたのだが、新しい状況でC++のモジュールをqibuildでコンパイルしようとすると、大量の警告とエラーが出てにっちもさっちもいかなくなる。

まずうまく行かなかったことを書いておく。

警告は、boostのポインタ絡みであることはわかった。これについては、naoqiのドキュメントのどこかに示してあった、
#define BOOST_SIGNALS_NO_DEPRECATION_WARNING
をおいておけば大丈夫のはずが、出るのだ。まず、boostが新しすぎるのではないかと思って、
sudo apt install libboost-all-dev
で入れ直したり、最初からコンパイルしてインストールしたり(膨大な時間がかかった)したが、だめだった。
結局、boostを全部削除しても、同じ警告だったので、boostではないことはわかった。

すったもんだした末、結局、g++のバージョンを7から4まで下げたことで、警告は出なくなった。VirtualBoxのバージョンと同じにしたのだ。

しかし、まだ、エラーが出る。これは、gccがバージョン7と新しすぎることが原因だと思って、gcc-5.4をコンパイルしたが、結局単なるプログラムミスだった。

結論的に、qibuildは、boostのインストールなしに、gcc-7.3とg++4.8.5で、正常に動いた。良かったよかった。

Choregraphe2.1.4 の32ビットバージョンをlinux mintに入れる

何しろ古いのである。SoftbankRoboticsさんは、pepperくんのsdkバージョンはどんどん上げていくが、私のようにNAO25のV5などをつかっているとまだ、5年前のSDKを使わざるを得ない。C++ライブラリなんか作っていると、NAOが32ビットなので、何かとそれが必要になるので、linuxもUbuntuがつかえず、Linux Mintになる。

今までは、MACのVirtualBoxにlinuxMintの32ビットをいれて、使っていたが、操作性が今ひとつだった。こんど、また色々開発するので、思い切って古いが結構早いデスクトップにまるごとLinuxmint32をいれた。それでChregrapheもいれたら、

/usr/local/ChoregrapheSuite2.1/bin/choregraphe-bin: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory

こんなエラーが出て起動しなくなった。たぶん、Linux Mintが新しすぎてライブラリの整合性がなくなっているのだ。いろいろさぐって、次のように対応した。

mint32:~$ wget -q -O /tmp/libpng12.deb http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_i386.deb
mint32:~$ sudo dpkg -i /tmp/libpng12.deb
mint32:~$ rm /tmp/libpng12.deb

また起きそうなので、記録のために書いておいた。

Choregrapheで連続的ポーズデータによる歩行のシミュレーション

先の記事で作成したポーズデータ(50センチ歩行の110セットのデータ)を使って、Choregrapheのバーチャルロボットでシミュレーションしてみた。ほぼ、きちんと歩行を再現している。

左下に実行しているポーズデータのログが出力されている。

次に生ロボットでうまくいくかどうかを試してみる。そうすれば、スピードが実際どうなるか、変えることができるかどうかがわかるだろう。

NAOの二足歩行の分析

サリーにキレキレのダンスを踊らせたいと思っている。Youtubeにも上がっているが、それは手の動きが中心で足はただゆっくりと動かしている。それでは、人を惹きつけられない。できれば、ジャンプしたり、ランニングマンなど、最低できなければならない。できるとは確信持てないが、NAOについているモータは相当性能が良いので、うまくコントロールできれば、そして、足の裏などが耐久性を持っていれば、できる可能性があるかもしれないと思う。

そのために、NAOの運動能力を徹底的に調べようと思った。その手始めに、プレインストールされている、NAOの二足歩行を調べる。NAOには、26個の関節があり、まず、歩行時にこの関節がどう動いているのかを調べた。NAOの歩行は、安全のためだと思うが、遅すぎる。尺を取りすぎて、ネタに組み込めないという弱点がある。もっともっと早く歩かせたいのだ。できると思う。調べた結果は以下の通りである。(パソコンから、pythonのnaoqi sdkを使って、ロボットのnaoqiにつなげて、関節データを取得するAPIを使用した)

見ての通り、歩行前の静止状態から、歩行準備態勢に入り、歩行(約50センチメートル)、そして、歩行終了の態勢から静止状態に入るプロセスの関節状態である。データは、50ミリ秒ごとにとっている。頭を動かす二つの関節(ピッチとロール)は、ほとんど動いていないので、外している。縦軸の数値は、ラディアンで見た角度である。0度の位置は、事前に決まっている。静止状態で、まっすぐに立って、両手をまっすぐ前に出した状態が、全ての関節が0度になっている状態である(下図を参照)。実際のモータの組み込み状況がわからなければイメージできないと思うが。

上から見ていこう。
(1)1番上の交互に動いているのは、左右の肩の、前後の揺らしである。手を振りながら歩いているのである。
(2)3番目は、肘の縦方向への回転である。ほとんど動かしていない。
(3)次の鋸の刃のような二つのデータは、膝の折りたたみである。0.2秒で1パルスの動きをして、非常に急で細かい。
(4)6番目の黄土色の上下のカーブは、右肘のRoll、人間では、大きく動く方向への変化である。これに対する左肘の動きは、下から2とか3番目にあるオレンジの曲線である。
(5)その下の鶯色とオレンジ色の水平な線は、肩の縦方向の回転と指の動きで関係ない感じだ。
(6)その下のオレンジと緑の綺麗な対照的な動きは、緑が右肘の動きで、オレンジが右の股関節の左右の動きである。
(7)その下の大きな鋸の歯のような動きは、二つの足の股関節の前後の動きである。
(8)一番下の鋸の歯型の動きは、くるぶしの動きである。

一つ気になったところは、歩行の終わり方である。なだらからに終わっていくかと思ったら、かなり唐突に動きを止めている感じである。

このアングルデータは、全て、Choregrapheのポーズデータに変換でき、それら一連のポーズをロボットに再現するモジュールをC++で作ってあるので、この歩行をほぼそのままNAOに再現させることができる。その動きは、再現するスピードを自由に変えることができるので、どこまで早くすることができるのか、さらには、早くするとき、何を調整すれば安定するのかを調べていきたい。

NAO V5の頭部を外して中を見る

ちょっと必要があって、大学においてあるNAO V5(ピッキー)の頭部を外して、中をチェックした。その時の記録映像は次のようなものである。(注:分解することは、破損の危険を伴いますので、自己責任でお願いします。メーカー保証とかがなくなりますので)

中を見た感想を書いておこう。
(1)ロボットの基本OSの入ったコンピュータが頭部に組み込まれているのだが、なぜ頭部なのかが不思議だった。倒れた時に一番ショックを受けるところなのだが、まあ、胴体はバッテリーやモーターなどで埋められているので、場所がなかったのだろうかと思ったりする。
(2)見た範囲では、コンピュータのケースに、冷却ファンが組み込まれているので、冷却ファンだけを取り替えるのはほぼ無理だろうと判断した。ネットオークションに、頭部ファンが回らないV5が出ていたが、その深刻さが評価できた。
(3)頭部の取り外しはとても簡単だった。現在はどうかわからないが、アルデバランの時は、頭部を取り替えるというのがユーザーフォーラムでよく議論されていた。
(4)相当密集して部品が組み込まれていたので、全体を綺麗に分解するのは、とても面倒な気がした。これ以上分解する気は今のところ起きない。

iBotシステムの改訂

ネタのために動かしているシステムは、iBotシステムである。この基本コンセプトは「ロボットは対話で動かす」というものだ。Naoを購入した一番最初からこの思想を貫いている。5年近く続けていることになる。iBotシステムは、wsibotというモジュールを中心に組み立てられている。複数(6、7個?)のモジュール(C++で書かれたライブラリ)がロボットに組み込まれている。

ただ、長年付け加えられたり変化してきているので、ほとんど使わなくなった機能もたくさんくっついている。そのために、全体が見えにくく、扱いにくくなっている面がある。

もう一度、整理して使いやすくしたい。全面的な改訂が必要になる。シーケンスのモジュールもできて、会話から動作、知的処理、ネタなどほぼ一通り揃えたので、この際、やってみようと思う。

シーケンスモジュールが出来た

シーケンスモジュールがロボットで問題なく動いた。意外と早く出来てしまった(笑)

シーケンススクリプトを実行する。シーケンスとは、多様なポーズを時間的につなげて、一つのモーションを作ることだ。(私の作った言葉。Choregraphe のタイムラインに似ているかな)

上の動画は、サリーちゃんに昔流行ったギャグ「だっちゅーの」をやってもらった。シーケンスファイルは、次のような感じのスクリプトになっている。これを指定場所に置いておく。私の場合は、ロボットのコンピュータのフォルダ、/home/nao/ibot/user/sequence だ。ここに同時に、Choregrapheで作った様々なポーズがファイル化してある、xapファイルも置いておく。

# ------------------------------------------------------------
#
# msweq だちゅーのポーズ(サリーちゃん用)
#
# #から始まる行、空白行はスキップ
# コマンド、スピード制御、ポーズ名、スピード(最速を1とした割合)
# 時間は全て、ミリ秒であらわす
# ------------------------------------------------------------

# ゆっくり立ち上がる(スピード制御、数字は1.0が最大)
execpose,speed,Stand,0.2
# 1秒立った姿勢を維持する
sleep,1000
# ゆっくり「だっちゅー」のポーズをとる
execpose,speed,Dachuno,0.2
# そのポーズを3秒維持する
sleep,3000
# ポーズを時間制御に変更する
# 4秒かけてスタンドゼロのポーズを取る
#execpose,time,StandZero,4000
# 4秒かけてStandinitのポーズを取る
execpose,time,StandInit,4000
sleep,1000
# 3秒かけて座るポーズにはいる
execpose,time,Sitdown,3000
# 座ると、自動的にstiffnessが0.0にセットされる:モータの加熱回避で必要
#sleep,1000

このスクリプトは、ロボットの内部モジュールwsmotionライブラリによって読み取られ実行される。呼び出すためには、まず、qichatのスクリプトの良きところで、$motion_getposes_1="sally_pose.xap"という、メモリイベントを発生させる。=の右側に、Choregrapheのポーズリストファイルを指定する。全てのポーズが名前と、関節角度付きで入っている。これを実行したのち、$motion_sequence_1="dachuno.mseq" というシーケンスファイル(=の右側)の実行のためのメモリイベントを発生させる。どちらも、変数は、これで確定していて、変更は不可である。

テストに次のようなトピックファイルを用意した。

topic: ~wsmotion-181224 ()
language: jpj

# モーションテスト

u:({サリーちゃん} やってください) はいわかりました $motion_getposes_1="sally_pose.xap" データ読み込みました $motion_sequence_1="dachuno.mseq" \pau=7000\ だっちゅーの 

「だっちゅーの」の前の\pau=7000\(7秒停止)が気になる。呼び出しているNAOQIのAPIには、ブロッキングコールと書いているので、実行終えるまでは次に進まないと思っていたら、どんどん次を読んで実行してしまうので、だっちゅーのという言葉とギャグがかみ合わなくなってしまっているので、つけたが、いやに長く必要になっている。

Choregrapheで作成したポーズをC++モジュールで実行する

ポーズや動作を作成するのは、Choregrapheが優れている。動作は、ポーズの時間的なつながりであるとも考えるので(本当は違うが)、同じものとして考えよう。

Choregrapheでポーズを作ると、xapファイルとして出力できる。これについては、別の投稿に書いた。このファイルからポーズデータを読み込んで、NAOQIのAPIのALMotionのangleInterpolationWithSpeedメソッドで実行させる。

xapファイルは、xmlファイルなので、これを読み取らなければならない。これについては、wsibotでも使用している、tinyxml2というのを使う。これは、ヘッダーファイルとcppファイルなので、とても軽いし使いやすい。実行ライブラリ化していると組み込みがまた面倒になるから、数年前には、ほぼ、これ以外の選択肢はないように思えた。(今は、別にいいのがあるかもしれないが調べる気はない)

読み込んで、そのポーズを実行させるところまではほぼできた。その際、xapファイルに書かれている角度について少し困った。StandやStandInit、StandZeroのサーボ角度は度で書かれているのだが、新たに作った、あるいは登録した角度はラディアンで書かれているようなのだ。同じ、positionエレメント内に入っているのに、この違いは面倒臭い。両者を区別することはできないかと思ったら、どうも、version要素が2の時はラディアンと考えて問題が起きなさそうなのである。正しい回答かどうかはわからないが、まあ、これで当面矛盾は起きそうにないので、position要素の中でversionの値が2になっていたら、そのまま、angleInterpolationWithSpeedに食わせて、そうでなければ度からラディアンに変更するというようにしている。

ここまで終わったので、次は、ポーズを連続して動作させることと、それを変数のイベント化して、会話の中で呼び出せるようにしたい。