materealを使うと、驚くほど簡単にインタラクティブなロボットアプリケーションを開発できます。記事カテゴリ「サンプル・コード」では、今後、その具体例をJavaのコードと共に紹介していきます。
まず初めにご紹介するのは、机上でロボットに物を押し運んで持ってきてもらうサンプル。実際にロボットをお持ちでない人のために、とりあえず“Hakoniwa”シミュレータ上で動作させるプログラムです。
- BringItHere.zip (Mac OSX, Linux用)
- BringItHere-exe.zip (Windows用)
実行可能なバイナリとアプリケーションのソースコードのセットをダウンロードできます。なお、ここで提供しているバイナリはライブラリの正式配布前のα版を利用して動作するもので、ライブラリ部分のソースコードがオープンソースでなく、また、完全に無保証である点にご注意ください。
プログラムを起動すると、青い四角で表された箱がいくつかと、黄色い丸で表されたロボットがフィールドに表示されます。これは俯瞰視点の映像で、実ロボットで動作させる場合はこの例のようにカメラ映像が投影されることを想定しています。
さて、まず初めに、物を押し運んで持ってきてもらう先をクリックで指定します。実ロボットで動作させる場合は、ユーザの目の前に相当する位置をクリックすることになるでしょう。
そして、持ってきてもらいたい箱をクリックすると、ロボットが物の後ろに回りこみ、目的地に向かって押し運び始めます。ロボットが物をまっすぐに押せることは少ないのですが、経路がずれてもリアルタイムで押す方向を調整し続けるので…
Hakoniwaシミュレータの初期化部分やGUIの可視化部分のコードはプログラムに添付したソース全文を確認していただくことにして、今回はアプリケーションの実用上のキモである「画面上でクリックした場所まで物を押し運ぶ」コードを紹介します。
JavaのGUIプログラミングではマウスのクリックをマウスリスナで受け取ります。以下に引用したのはマウスリスナの実装の一部です。ここに、今回紹介する全てのコードが含まれています。
public void mouseReleased(MouseEvent e) { // Stop the previously assigned task. final Task task = robot.getAssignedTask(WheelsController.class); if (task != null) task.stop(); // Set the goal position. final int x = e.getX(), y = e.getY(); if (goal == null) { goal = new ScreenPosition(x, y); return; } // Push the clicked object to the goal. final Entity entity = getClickedEntity(x, y); if (entity != null && entity != robot) { push = new Push(entity, hakoniwa.screenToReal(goal)); if (push.assign(robot)) push.start(); } } |
- 初めに、ロボットを表すオブジェクトrobotの車輪WheelsControllerに割り当てられたタスクを取得して、もしタスクがあれば停止します。
- そして、もしゴールが指定されていなければ、クリックされた場所をゴール地点として記憶します。
- 既にゴールが指定されている場合は、クリックされた場所にある物entityをソースコードの引用外の場所で定義されたgetClickedEntityメソッドを用いて取得します。
- クリックされたのがロボットでなければ、entityをgoalまで押し運ぶタスクpushをインスタンス化し、そのタスクをロボットに割り当てて実行します。
このように、materealではロボットやタスクをクラスとして定義し、そのインスタンス同士を組み合わせて実世界の作業を遂行します。
ネットタンサーやLEGO Mindstorms NXT、Roombaといった著名で安価な家庭用ロボットについてはロボットクラスが組み込みで用意されており、また、平面上での指定した位置への移動や物体の運搬といった移動に関する基本的なタスクも組み込みクラスMoveやPushとして用意されているため、ちょっとしたアプリケーションなら10分もあれば書くことができます。