みなさんこんにちは,この4月に大学院に入院いたしました,11年度入学のところです.

「忙しい」を理由になかなかブログを書かない罪悪感に苛まれながら $n$ ヶ月を過ごしておりましたが,今回それを挽回すべく,私が現在開発している,ロボットのシミュレーションデータを簡単に3次元可視化するソフトウェアである torqml の開発状況についてご紹介しようと思います.
ついでに数値シミュレーションとはどういうものか,なぜやるのかということも書こうと思います.

1. なぜシミュレーションをするか?

「机上の空論」という言葉は皆さんご存知だと思います.
いくら机の上でゴリゴリやってても内容がないよぅじゃ意味がないということですね.
私の専門分野(制御理論)のように机の上での計算に多くの時間を費やす研究分野では,現実から乖離していく方向に進まないよう,これに十分注意する必要があります.

そのため多くの場合は,提案した手法をいくつかの具体的な例に適用して効果を検証するということを行います.
学術の世界で言うシミュレーションは,数値計算によってこの検証を行うことを指します.
ほとんどの場合はコンピュータを使って想定する条件を作り出し,扱うものや手法の数式に従って計算を行います.
数値で結果や効能が見えるということは大変重要なことです.
例えば,スーパーに並ぶ日用品や食品に「20%増量」とか「30円引き」とかが明確に書いてあることで,お得だと感じて皆さんが手に取るわけです.
つまりは説得力があるのです(ゆえに気をつけなければなりませんが).

また,ロボットの場合は1台作るだけでも高価になることが多いので,予めシミュレーションでうまく行くことを確認しておいてから実機に適用することで,プログラムの不具合による暴走や故障を未然に防ぐことができます.

2. なぜ可視化する必要があるか?

しかし,数値というものは説得力と引き換えに,実際の量との直感的な関連付けがしづらいという側面を持っています.
例えば砂糖20グラムと言われても,それがどれぐらいの量かイメージしづらいでしょう.
また,砂糖をひとつかみ手にとってそれが何グラムか正確に分かる人も多くないと思います.
すなわち,数値という記号の世界と実際に見える・感じる量の世界は,お互いになかなか行き来できないことがわかります.

そこで人間は可視化するための道具を開発してきたわけです.
  • はかり
  • 定規
  • 時計
身近にあるこれらはすべて数値の世界と量の世界を行き来するのに使われています.

ロボットのシミュレーションの話に戻しましょう.
シミュレーションを行うと,東に何メートル・北に何メートル・左回りに何度・… みたいなデータがたくさん得られるわけですが,数字を眺めていてもロボットがどういう状況にあるのかさっぱりわかりません.
したがって,数値を何らかの形式で表現し直すことで,可視化することを考えます.
下に挙げたのはその一例です.

--
方法①:グラフやプロット
scrot_20150310_02:57:22_AM

グラフは,ある量と別の量の関係や規則性,割合などを見るのにとても便利な表現方法です.
しかし,グラフから直接長さや速さといった量を読み取って,物理的な感覚をイメージするのは簡単ではありません.

方法②:静止画や動画
pendulum_quad

静止画や動画…つまり絵で表現すれば,見てそのままですのでかなり直感的です.
しかし,関係や規則性を見つけるのは難しくなります.
--

このように,見せる方法によって,見やすくなる情報と見にくくなる情報があることがわかります.
全てを1つの方法で見せるのは大変難しいことなので,通常これらの方法をうまく組み合わせることをします.

ロボットのシミュレーションでは,ExcelやMATLABを使ったり,場合によっては専用のソフトウェアを自分で作って数値計算をします.
これまでは,数値計算した結果は大抵①に示したようなグラフを作成して満足してしまうことがほとんどでした(少なくともロ技研では).
これでは,出てきた結果が直感的に正しそうなものかチェックする手がかりがありませんし,ほかの人に見せる際にわかりづらいものになってしまいます.
そこで,出てきた数値を簡単に画像として出力できる環境を作れないだろうかという動機のもと,torqmlを開発しています.

3. なにができるのか?

torqmlでは,QMLと呼ばれる言語を用いてロボットなどの対象物の構造を記述し,数値シミュレーションのデータを読みこませることで,アニメーションの再生と静止画・動画への出力ができます.

scrot_20150502_02:52:16_PM


例えば,ビューワに直方体(TQBox)を表示するには次のように記述します:
import TorQML 0.1
import TorQML.Shapes 0.1
import TorQML.Views 0.1

TQBasicView {
models: TQModel {
TQBox { }
}
}
frame_1


基本的な記法はJSONに似ています.形状には様々なプロパティがあり,
TQBox {
xLength: 0.5
yWidth: 0.1
zDepth: 0.1
}
と指定することで,TQBoxの $x, y, z$ 軸方向の幅を設定できます.
frame_1


コンポーネントの入れ子構造を利用することで,構造の従属関係を記述します.
torqmlが主にサポートする,リンクで構成されたロボットマニピュレータの記述に適した形になっています.
回転や並進はtransformプロパティで指定します.
TQBox {
xLength: 0.5
yWidth: 0.1
zDepth: 0.1
TQBox {
color: "green"
xLength: 0.4
yWidth: 0.2
zDepth: 0.2
transform: [
Rotation3D { angle: 30; axis: "0,0,1" }
]
TQBox {
color: "blue"
xLength: 0.3
yWidth: 0.1
zDepth: 0.1
transform: [
Rotation3D { angle: 30; axis: "0,0,1" }
]
}
}
}
frame_1

アニメーションはtransformやその他のプロパティを更新することで実現しています.
次回以降で詳しく説明していこうと思います.

このように,torqmlではQMLを使用して3次元構造を直感的に記述することができます.
XMLをベースにしたものに比べてコンポーネントとそのプロパティ,コンポーネント間の関係がわかりやすく記述できます.
また,QMLを使用することで高い拡張性が実現できており,簡単にビューや形状などのコンポーネントを継承したカスタムコンポーネントを作成することもできます.
工夫すればtorqmlの上でちょっとしたゲームなんかも作れたりするのではないでしょうか.
詳しい記述方法や,ソフトウェアの使用方法についてはリリース後にこのブログの方に書いていこうと思います.


4. 今後の展望

torqmlはまだ正式バージョンをリリースしていませんが,Bitbucketで現在開発中のコードを閲覧・使用することができます.
https://bitbucket.org/tokoro10g/torqml
(ブラッシュアップできていないため現状すごくコードやディレクトリ構造が汚いです)

リリースは5月末ごろを予定しており,それまでにドキュメントを整備したりしながらこちらのブログで宣伝をしていこうと考えています.
また,将来的にはJavascriptやRubyで記述したシミュレーションプログラムを組み込んでの表示や,外部のシミュレーションプログラムからのデータパイプにも対応しようと考えています.

使用しているライブラリの都合上,Mac OS Xと各Linuxディストリビューション(Arch LinuxとUbuntu 14.04で動作確認)のみの対応となりますのでご承知ください.

torqmlの応援,よろしくお願いします!