オープンソースのロボット・ツールキット

仮想的な場を使ってロボット・アルゴリズムをテストする

ソフトウェア・ロボットとは ワシントン大学 (University of Washington) の研究者達は、ソフトウェアとロボットを組み合わせてSoftbot という言葉を作り出しました。またインテリジェント・エージェントという言葉は、特にインターネット対応のエンティティーという意味合いで、一般的に使われるようになってきています。1996 年、Franklin と Graesser は、初めてエージェント分類を導入し、ウィルスを自律エージェントに分類しました。

従来のロボットは多種多様ですが、ソフトウェア・エージェント (仮想ロボットに対応するもの) の登場によって、ロボットの種類はさらに増えました。物理的なロボットの特性の多くは、仮想領域でのロボットにも当てはまります。例えば、物理的なロボットの持つ可動性という特性は、何らかの移動運動を意味しています。一方、モバイル・ソフト・ロボット (あるいはエージェント) も、可動性を持つことができます。ここで言う可動性とは、ネットワーク上のホスト間を移動できる機能、という意味です。図 1 は、物理的な世界と仮想の世界での自律ロボットの大まかな分類を示したものです。この記事では、合成環境でのロボットをシミュレートする機構として、ソフトウェア・エージェントに焦点を当てます。

図 1. 自律ロボットの大まかな分類

ロボットの要素

物理的なロボットであれ、仮想的な (ソフト) ロボットであれ、基本的な概念は同じです。ロボットは、自分の置かれた環境を認識するためのセンサーや環境を操作するためのエフェクターを持ち、またロボットが意志を持った有益な動作をするためのコントロール・システムを持っています (図 2)。

図 2. すべてのロボット・システムの基礎となる要素

物理的な世界では、消火活動をするロボットは、温度センサーや赤外線 (IR: infrared) センサー、GPS (Global Positioning System) などを使って自分の置かれた環境を認識し、またモーターや、場合によっては消火器をエフェクターに使って環境を操作します。一方、仮想検索エージェントは、Web サーバーや HTTP インターフェースを使って環境 (インターネット) の認識、操作の両方を行い、またコンソールをエフェクターに使ってユーザーと通信を行います。

図 3 に示すシステムは、閉ループのシステムです。このシステムでは、センサーがコントロール・システムに入力を与え、コントロール・システムが環境に変化を与えます。もう 1 つの見方として、この図をフィードバックの点から考えることもできます。環境を変化させる動作をコントロール・システムが規定すると、センサーはその変化を検証し、新しい環境の状態をコントロール・システムにフィードバックします。オープン・ループのシステムでは、動作によって環境状態を無事変更できたものと想定せざるを得ませんが、それは望ましいことではありません。

図 3. 環境との間のループを閉じる

ロボットを構築する場合、センサーやエフェクター、そしてコントロール・システムを、全体として考える必要があります。この記事では、コントロール・システムについて、また物理的なロボットに組み込む前に、コントロール・システムのシミュレーションと検証をどう行うべきかを中心に説明します。

ロボット技術とシミュレーション

Linux とロボット技術 Linux は、ロボット技術用のオペレーティング・システムとして一般的ですが、これは Linux のルーツがロボット技術の歴史と似ているためです。つまりロボット技術は実験の世界であり、最適化をし、新しいことを試し、そして将来に向かって進化することでもあります。Linux も、その核心は非常に似ています。初期のロボットは単に風変わりなものであり、実際的なアプリケーションはほとんどありませんでした。Linux も同様に、ホビーストのオペレーティング・システムとして始まりましたが、小さな組み込みデバイスからスーパーコンピューターに至るまで (そして多くのロボットにも) 使われる、強力で安定したオペレーティング・システムに成長しています。

ロボット技術の分野では、シミュレーションは重要な役割を果たします。これは、他の方法では高価で時間のかかる可能性のある実験を、シミュレーションで済ませられるからです。シミュレーションでは、動的な合成環境の中で概念を実験できる一方、刺激への反応データを収集することによって、コントロール・システムの質を判断することができます。またシミュレーションでは、 (遺伝子アルゴリズムの場合でも見られたように) 何世代ものコントロール・システムをランダムに組み合わせることによって、ロボット用のコントロール・システムを進化させることができます。

シミュレーションが最も力を発揮するのは、マルチ・ロボット環境の場合です。こうした環境の好例は、ロボット・サッカーです。ロボット・サッカーでは、シミュレーションあるいは物理的なロボットによって、あるロボット・チームが別のロボット・チームと、サッカーという世界的な人気スポーツで対戦します (そのため世界的なゲームとして理想的です)。ロボット達は自分のチームの他のロボットと (場合によっては通信によって) 協力しながら相手チームと戦い、また、相手チームのロボット達とは敵対して動作する必要があります。そのため、ロボット動作のテストとしては非常に高度なものです。

しかしシミュレーションには欠点もあります。現実の世界は整理されておらず、ノイズだらけのことが多く、また合成環境は基本的にモデル化が困難です。しかも、現実の世界のセンサーは非常に多様な、予期せぬ特性を示しがちなため、ロボットのシミュレーションは困難なことが普通です。こうした欠点はありますが、合成環境でロボットをシミュレーションを行うことで、多くを学ぶことができます。

Linux 用のオープンソース・ツールキット

ロボットによるコントロール・システムの構築に利用できるオープンソースのツールキットは、いくつかあります。この記事では、移動ロボット・シミュレーターと、物理計算のモデリング・システム、そして最後に、シミュレートされたコントロール・システムを物理的なロボットに組み込めるシミュレーターについて見ていきます。こうしたツールキットの圧倒的大部分は Linux 上で実行しますが、これはそれらが基本的にオープンソース・モデルに基づいているためです。オープンソース・ソフトウェアは、迅速に、かつ少ない手間でソフトウェアを開発できるプラットフォームであるため、ロボットには理想的です。また Linux では、他のオペレーティング・システムでは不可能なカスタム化 (例えばカーネルの最小化や拡張など) が可能です。こうしたツールキットや他のツールキットへのリンクは、この記事の最後にある 参考文献 のセクションを見てください。

ODE

Russell Smith による ODE (Open Dynamics Engine) は、連結剛体 (articulated rigid body) の動作力学をシミュレートできるオープンソースの物理計算エンジンです。これを利用すると、現実の世界の物体の力学をグラフィックス・ライブラリーとは独立にシミュレートすることができます (グラフィックス・ライブラリーとしては OpenGL を使うことができます)。ODE を使うと、合成環境におけるあらゆる種類の物体 (3 次元ゲーム環境での人物や、ドライビング・シミュレーションでの車など) をモデル化することができます。ODE は高速な上、リアルタイム・シミュレーション用の衝突検出もサポートしています。

連結剛体 (articulated rigid body) とは何か 連結剛体というのは、様々な種類のジョイントで接続された様々な形状からなる構造を言います。例えば、脚を構成する関節や、車のシャーシ、サスペンション、ホイールの要素を考えることができます。ODE はこうした要素を、摩擦モデルを含めて効率的にモデル化することができます。

ODE は現在、ジョイントとして、玉継手 (ball-and-socket)、ヒンジ (hinge)、スライダー、軸 (fixed)、角度モーター (angular motor)、ヒンジ 2 (hinge-2: 車のジョイント) などをサポートしています。また、様々な衝突要素 (球や平面など) や、いくつかの衝突空間もサポートしています。

ODE は主に C++ プログラミング言語で書かれていますが、アプリケーションとの統合用に、C と C++ によるクリーンなインターフェースを公開しています。ODE がさらに魅力的なのは、GNU LGPL ( Lesser General Public License) と BSD ライセンスの条件でライセンスされている点です。このライセンス条件に従う限り、商用製品にも ODE のソースを無料で使うことができます。そのため ODE は、様々な商用ゲームやフライト・シミュレーター、バーチャル・リアリティーのシミュレーションなどで使われています。

リスト 1 のソース例は、火星の重力と、現在ある速度で上昇している球、という単純な世界を示しています。この世界に重力があることを考えると、この上昇速度は長くは持続しません。やがて球は頂点に達し、下降を始めます。初期化が完了すれば (つまり、この世界で物体を作成し、それらの属性が設定されると)、この世界の物理学を、dWorldStep を呼ぶことでシミュレートすることができます。何が起きているのかを理解するには、定期的に dBodyGetPosition を呼び、その球の識別子を渡します。そうすると、その球の現在の位置を得ることができます。

リスト 1. 重力のある世界での球を使った、ODE による単純な実験

#include <iostream> #include <ode/ode.h> #define time_step (float)0.1 int main() { dWorldID myWorld_id; dBodyID mySphere_id; dMass sphereMass; const dReal *pos; float time = 0.0; /* Create a new world */ myWorld_id = dWorldCreate(); /* Create a sphere in the world */ mySphere_id = dBodyCreate( myWorld_id ); /* Set the world's global gravity vector (Mars) -- x,y,z */ dWorldSetGravity( myWorld_id, 0, 0, -3.77 ); /* Set the Sphere's position in the world -- x,y,z */ dBodySetPosition( mySphere_id, 0, 0, 100 ); /* Set the Sphere's mass (density, radius) */ dMassSetSphere( &sphereMass, 1, 2 ); dBodySetMass( mySphere_id, &sphereMass ); /* Give the sphere a small amount of upward (z) velocity */ dBodySetLinearVel( mySphere_id, 0.0, 0.0, 5.0 ); /* Run the simulation */ while (time < 5.0) { /* Simulate the world for the defined time-step */ dWorldStep( myWorld_id, time_step ); /* Get the current position of the sphere */ pos = dBodyGetPosition( mySphere_id ); std::cout << "position (" << pos[0] << ", " << pos[1] << ", " << pos[2] << ")

"; /* Next time step */ time += time_step; } /* Destroy the objects */ dBodyDestroy( mySphere_id ); dWorldDestroy( myWorld_id ); return 0; }

つまり、移動ロボットや無人航空機を現実的な環境でシミュレートするための (Linux や他のプラットフォームで動作する) 産業グレードの物理計算エンジンが必要な場合には、ODE は理想的な選択肢なのです。ODE を OpenGL API (application program interface) と組み合わせると、リアルな物理計算によってリアルなグラフィックスを作り出すことができます。

Simbad ロボット・シミュレーター

Simbad は、Java ® プログラミング言語で書かれた 3 次元ロボット・シミュレーターです (つまり JVM (Java virtual machine) をサポートするプラットフォームであれば、Linux、およびその他のプラットフォームで実行することができます)。しかしこのシミュレーターには、(Jython によって) Python スクリプト言語のサポートも含まれているのです。Simbad は自律ロボットのための人工知能 (AI: artificial intelligence) アルゴリズムを学ぶために作られたものであり、その表現力豊かな GUI (graphical user interface) は、ロボットの動作だけではなく、ロボットの視点から見た様子も視覚化することができます。

Simbad の興味深い点は、使い方が単純なこと、そして新しいロボット動作を素早く作成できることです。しかし、Simbad の開発は単純なだけではなく、実はロボット・シミュレーションのための拡張可能なフレームワークでもあるのです。

このシミュレーターでは、環境を作成したり調整したりすることができる上、様々なセンサーを使ってロボット・コントローラーを開発することができます。利用可能なセンサーとしては、視覚センサー (カラー単眼カメラ)、レンジ・センサー (ソナーと IR 検出器)、また衝突検出用のバンパーがあります。

センサー用の API は簡潔で、直感的に使うことができます。リスト 2 に示す例は、ソナーの使い方と、衝突検出の仕方 (検出された物体) を示しています。

リスト 2. ソナーの使い方のシミュレーションを示すコード・スニペット

int sonar_id, total_sonars; // If at least one sensor has a hit if (sonars.oneHasHit()) { // Find out how many sonars are on the robot total_sonars = sonars.getNumSensors(); // Iterate through each sonar for ( sonar_id = 0 ; sonar_id < total_sonars ; sonar_id++ ) { // Does this one have a hit? if (sonars.hasHit(sonar_id)) { // Emit the details (angle, range) System.out.println( "Sonar hit at angle " + sonars.getAngle(i) + " at range " + sonars.getMeasurement(i) ); } } }

Simbad で利用可能な他のセンサーも同じパターンに従っており、直感的な API を構成しています。

Simbad で特筆すべき点は、そのロボット・シミュレーションと視覚化のためのコンソールです。図 4 を見るとわかるように、Simbad コンソールは世界の様子をリアルタイムで表示します。このコンソールのインスペクター・パネルは (カメラも含めて) ロボットの詳細を示し、またコントロール・パネルではシミュレーションを管理することができます。

図 4. Simbad のロボット・シミュレーターと視覚化コンソール

また Simbad には的確なドキュメンテーションやチュートリアルも用意されており、Java を使った場合でも Python を使った場合でも、すぐに使いこなすことができます。また、1 つのロボットのシミュレーションだけではなく、複数のロボットを同時にシミュレートすることもできます。全体として、 Simbad シミュレーターは、インテリジェントなロボット・アルゴリズムの概念テストには素晴らしい環境と言うことができます。 Simbad は GPL オープンソース・ライセンスの条件で使用することができます。

TeamBots

TeamBots は、移植可能なマルチエージェント・ロボット・シミュレーターであり、動的環境でのマルチエージェント・コントロール・システムを視覚的にシミュレーションすることができます。TeamBots が Simbad など他のシミュレーターと比べてユニークな点は、コントロール・システムが移植できることです。つまり、コントロール・システムを開発してシミュレーター上で検証した後、そのコントロール・システムを、(Nomadic Technologies 社の Nomad 150 ロボットを使って) 実際の移動ロボットでテストできるのです。

TeamBots の API には、コントロール・システム用の抽象化レイヤーが用意されています (図 5)。そのためコントロール・システムは、自分が合成環境 (TBSim) でのシミュレーター上で実行しているのか、あるいは現実の環境でのロボット・プラットフォーム (TBHard) 上で実行しているのか、まったくわかりません。

図 5. コントロール・システムに対する TeamBots API の抽象化レイヤー

TeamBots のシミュレーション環境は非常に柔軟であり、様々な物体や他のロボットを持つ合成環境を容易に構築することができます。壁や任意の物体、道路などの追加も容易であり、また同じ、あるいは異なるコントロール・システムを実行する他のロボットを追加することも容易にできます。これを利用して、(1 つの例として) 追跡者と獲物というシミュレーションを構築することができます。また、物体は静的である必要はありません。環境の中を動き回る物体や、ロボットに軽く押されると動く物体 (例えばボールなど) を使うこともできます。

TeamBots を利用すると、様々なタイプのロボット・シミュレーターをモデル化することができます。例えば 1997 年にジョージア工科大学 (Georgia Tech) は、TeamBots を使って動的環境で獲物を探す 2 台の Nomad 150 ロボットをシミュレーションし、AAAI (American Association for Artificial Intelligence) の移動ロボット・コンテストで優勝しました。このコンテストのゴールは、2 台のロボットが環境を検索し、青色の物体を拾って青色の入れ物に戻し、またオレンジ色の物体を拾ってオレンジ色の入れ物に戻す、というものです (図 6)。少し複雑にするために、オレンジ色のボールは動的であり、常に環境の中を動き回ります。

図 6. 獲物探し動作を TeamBots でシミュレーションする

図 6 では、移動ロボット 1 は青色の物体を持っており、青色の入れ物に物体を入れようと、その方向に移動しています。ロボット 0 は検索を行っています。

TeamBots は、ロボット・サッカー・プレーヤーの開発にも使うことができます。サッカーは国際的な人気スポーツなので、国際的な大学間、グループ間でのコンテスト用のプラットフォームとして理想的です。ロボット・サッカーのルールは、(特に、2 足か Sony Aibo かなど、移動ロボットのプラットフォームを考慮すると) 異なるかもしれませんが、ゲームの基本的なモデルは共通です。

図 7 で、ロボット 1 (黄色と白) は、ゴールに入れようとボールに向かって移動しています。ロボット 0 (青と赤) は、相手のゴール・キーパーであり、ボールをブロックしようとしています。ロボット・サッカーは実際に見ても楽しく、TeamBots の配布には、いくつかのチームが用意されているため、それらを使ってゲームを展開したり新しい戦略を実験したりすることができます。

図 7. SoccerBots ドメインで TeamBots をデモする

TeamBots にはサッカー用の Java API が用意されており、それを使うとプレーヤーの「頭脳」に集中することができます。エフェクター API を使うと、ロボットの向きを変えたり、あるスピードで移動したり、ボールを蹴ったり、あるいは単純にボールを移動したりすることができます。センサーは上位レベルで作られており、ボールに向かうベクトルや、他のプレーヤー (自分のチームと相手チーム) に向かうベクトル群、現在の方向、相手ゴールへのベクトルなどを判断するための API を提供しています。

TeamBots Soccer API のレベルがどんなものかを知るために、非常に単純な戦略を示したリスト 3 を見てください。この戦略 (Tucker Balch による SoccerBots のソースから引用したものです) は、単純にボールを探してその方向に向かい、そして (ゴールの方向は無視して) ボールを蹴ります。これはランダムな戦略ですが、この API の単純さを示しています。

リスト 3. TeamBots の SoccerBots APIを使った、単純なサッカー・プレーヤーのスニペット

public int TakeStep() { Vec2 ball; long T; T = abstract_robot.getTime(); // Get the vector to the ball ball = abstract_robot.getBall(T); // Point ourselves to it abstract_robot.setSteerHeading(T, ball.t); // Go to it (maximum speed) abstract_robot.setSpeed(T, 1.0); // If we can kick it, do so! if (abstract_robot.canKick (T)) abstract_robot.kick(T); return(CSSTAT_OK); }

TeamBots の配布は、移動ロボットのプロトタイプ化にもシミュレーションにも、また TBHard 環境と実際のロボットを使って移動ロボットを実行するためにも素晴らしい環境です。TeamBots はオープンソースであり (ジョージア工科大学の Tucker Balch と、カーネギー・メロン大学によって開発されました)、教育用や研究用として自由に使うことができます。このシミュレーターは Java 言語で開発されており、完全なソースコードといくつかのサンプルが付属しているため、すぐに使いこなすことができます。

他のツールキット

最もよく知られた移動ロボット・プラットフォームの 1 つであり、無数のシミュレーターが作られているものとして、Khepera があります。残念ながら Khepera は商用ソフトウェアへと進化し、オープンソースではなくなりました。しかし幸いなことに、KControl などは、Khepera 用のコントロール・システムをLinux で開発するためのツールキットとして、まだ入手が可能です。

動作力学をサポートした興味深い 3 次元ロボット・シミュレーターとして入手可能なものが、Gazebo です。Gazebo は標準のロボット・センサー (慣性測定ユニットや GPS レシーバー、単眼カメラなど) をモデル化するだけではなく、現実の世界の剛体物理もロボット環境でモデル化することもできます。Gazebo はプラグイン・モデルをサポートしており、新しいロボット・センサー・モデルを環境の中に動的にロードすることができます。

最後に、便利なロボット・ナビゲーション・ツールキットとして、Carmen (Carnegie Mellon Robot Navigation Toolkit) があります。Carmen は、障害回避や経路計画、マッピングなど、基本的なナビゲーション要素を提供するモジュラー・アーキテクチャーを実装しています。Carmen は 2 次元のシミュレーターを提供しているだけではなく、Linux を実行する物理的なロボット・プラットフォームも、いくつかサポートしています。

Linux ロボットを構築する

Linux ベースのロボットの構築は、想像するほど難しくはありません。実際、一部の高校の理科の授業では、Linux と普通に入手可能なハードウェアとを Linux ベースのロボットのコアとして使っています。例えば、システム・コアとして古い PC マザーボードを使い (古いラップトップならもっと良いですが)、USB ドライブ (消費電力は CD-ROM やハードディスク、フロッピー・ドライブなどに比べ圧倒的に少ないです) から Linux をブートすることができます。オンボードのパラレル・ポートは、手軽に様々なデバイスに変身させることができます (例えばディスクリートの入出力、ステッパー・モーターの駆動など)。シリアル・ポートは、GPS 座標の取り込み用に、あるいはA/D (Analog to Digital) や D/A (Digital to Analog) コンバーターなどの外部デバイス用に使うことができます。そして最後に、安価な USB Web カメラを購入すれば、ロボットに見る機能を与えることができます。

しかし、この領域での Linux の最大の魅力は、環境を単純化できることです。つまり Python のような上位レベル言語を使えば、誰でもロボット・コントロール・システムを設計できるのです。メイン州にある Greater Houlton Christian Academy の Michael Surran は最近、高校の 2 年生用に、Linux と手軽に入手できるハードウェアを使ったロボット・コースを教え始めました。このカリキュラムの中核には、Python が使われています。Python はインタープリター言語なので、長いコンパイル・サイクルは必要なく、非常に容易にアルゴリズムを実験することができます (これこそ正にインタープリター型のスクリプト言語が便利な点です)。

自家製の Linux ソリューション以上のものを望む場合には、カーネギー・メロン大学の MRPL (Mobile Robot Programming Lab) が最近、2.6 Linux カーネルを実行する「Qwerkbot」プラットフォームを紹介しました。この「Qwerk」は、ARM9 ベースのボードに 8 MB のフラッシュと 32 MB の SDRAM、それに 4 つのオンボード・モーター・コントローラー、16 のサーボ・コントローラー、16 のディジタル I/O、8 つの 12 ビット・アナログ入力、等々が載っています。

まとめ

ロボット・シミュレーターによって、物理的なロボットの構築作業を大幅に単純化することができます。シミュレーターを使うことによって、考え方や戦略を、実際のハードウェアに載せる前にテストすることができます。幸いなことに、Linux とオープンソースのコミュニティーにはいくつかの選択肢が用意されており、どれも使い方が容易なだけではなく、ハードウェア・プラットフォームと直接リンクできるものさえあります。

ダウンロード可能なリソース

関連トピック