VREPとRTCの接続方法

Windowsを対象にします.他のプラットフォームでも,SimulationManagerの使い方は一緒です.
下記のgmapping_testerを使って,SLAMアルゴリズムのテストを行ってみましょう.

gmapping_tester0.0.1

ダウンロードして展開してください.
この中にVREPのプラグインを試すためのプロジェクトやRTCが入っています.

0. Name Serviceの起動

まず,ネームサービスを起動してください.
RT System Editorも起動してください.OpenRTM-aist 1.1に同梱されているRCPバージョンはバグがあるので,
Eclpise全部入りのRC4版を使ってください.

1. VREP起動

次に,プラグインをインストールしてあるVREPを起動します.
スクリーンショット_2014-08-22_11_36_44

Simulator.idlというidlで定義されているサービスポートのみを持つRTCであることがわかります.
このIDLはシミュレーション全体を統括するインターフェースが備わっており,シミュレーション自体の起動や終了.
シミュレーションのプロジェクトの読み込み,シミュレーターの仮想空間内のロボットやセンサの名前からRTCを自動生成する機能が備わっています.

#include "BasicDataType.idl"
#include "ExtendedDataTypes.idl"
 
module ssr {
  enum RETURN_VALUE {
    RETVAL_OK,
    RETVAL_INVALID_PRECONDITION,
    RETVAL_OBJECT_NOT_FOUND,
    RETVAL_NOT_IMPLEMENTED,
    RETVAL_UNKNOWN_ERROR
  };
 
  typedef long OBJECT_HANDLE;
  typedef sequence<string> StringSeq;
 
  interface Simulator {
 
    /**
     * プロジェクトのロード
     */
    RETURN_VALUE loadProject(in string path);
 
    /**
     * シミュレーションの開始
     */
    RETURN_VALUE start();
 
    /**
     * シミュレーションの一時停止
     */
    RETURN_VALUE pause();
 
    /**
     * シミュレーションの一時停止からの再開
     */
    RETURN_VALUE resume();
 
    /**
     * シミュレーションの終了
     */
    RETURN_VALUE stop();
 
    /**
     * ロボットのRTCの起動
     */
    RETURN_VALUE spawnRobotRTC(in string objectName, in string arg);
 
    /**
     * レーザーレンジセンサのRTCの起動
     */
    RETURN_VALUE spawnRangeRTC(in string objectName, in string arg);
 
    /**
     * カメラのRTCの起動
     */
    RETURN_VALUE spawnCameraRTC(in string objectName, in string arg);
 
    /**
     * ロボットRTCの終了
     */
    RETURN_VALUE killRobotRTC(in string objectName);
 
    /**
     * すべてのRTCの終了
     */
    RETURN_VALUE killAllRobotRTC();
 
    /**
     * オブジェクトのポーズの取得
     */
    RETURN_VALUE getObjectPose(in string objectName, out RTC::Pose3D pose);
 
    /**
     * オブジェクトのポーズの設定
     */
    RETURN_VALUE setObjectPose(in string objectName, in RTC::Pose3D pose);
 
    /**
     * RTCの同期
     */
    RETURN_VALUE synchronizeRTC(in string rtcFullPath);
 
    /**
     * 同期中のRTCの取得
     */
    RETURN_VALUE getSynchronizingRTCs(out StringSeq fullPaths);
 
    /**
     * シミュレーションの時間ステップの取得
     */
    RETURN_VALUE getSimulationTimeStep(out float timeStep);
 
    /**
     * シミュレーションの現在時間の取得
     */
    RETURN_VALUE getSimulationTime(out float time);
 
 
  };
};

2. SimulationManager起動

上記のgmapping_testerに同梱の,start.batを実行します.

SimulationManager単体で動作させる場合は,まず,下記のリンクからSimulationManagerを入手します.
https://github.com/ogata-lab/SimulationManager

ダウンロードして展開したら,フォルダ内とidlcompile.batを実行します.
この時,Python版のOpenRTM-aistがインストールされていなければいけません.
インストール方法は公式ウェブサイトを参考にしてください.
これにより,Simulator_idl.pyというファイルが生成されるはずです.

ここでSimulationManager.pyを実行してください.

SimulationManagerはPythonのRTCです.繰り返しますがPython版のRTMがインストールされていることが前提です.

これ,Java版があればもっとポータブルになりそうですね.リクエストがあれば作ってみます

SimulationManagerは上記のIDLで定義されるインターフェースを持つサービスポートに指令を送ることができるGUIです.

3. RTC起動

本来このタイミングでRTCを起動しますが,start.batですべて起動しています.

4. SimulationManagerとVREPRTCを接続してアクティブ化

ここで,SimulationManagerとVREPRTCを接続してアクティブにします.
この後は,SimulationManagerのGUIの操作になります.

5. SimulationManagerの操作

5.1 プロジェクトのロード

下記の[…]ボタンを押してファイルを選択します.今はSimulationManager.pyと同じフォルダにあるURG_TEST.tttを選んで下さい.
スクリーンショット_2014-08-22_11_32_29 2

Loadボタンを押すと,シミュレータがURG_TEST.tttをロードします.
ssr::Simulator::loadProject()関数を読んでいます.IDLを参照してください.
引数にプロジェクトファイルのフルパスを指定します.
(すなわちシミュレータが動作するファイルシステム上にプロジェクトがある必要があります)

5.2 SimulationRTCの起動

シミュレータ内のオブジェクトとRTCを関連づける操作です.
スクリーンショット_2014-08-22_11_32_29 3

5.2.1 RobotRTCの起動 (Spawn)

(1)起動方法

RobotRTCの左側のボックスに,「Pioneer_p3dx」と入力してSpawnボタンを押すと,RobotRTC0.rtcというRTCが起動します.RT System Editorで確認できます.
これは,VREP内のPioneer_p3dxというオブジェクトに関連づけられたRTCです.
IDLで定義されるssr::Simulator::spawnRobotRTC()関数を呼び出しています.

最初の引数が,シミュレータ内のオブジェクトの名前,二番目の引数がRTCに渡す引数です.
V-REPの場合は,オブジェクトはロボットを示すツリーの一番上の名前です.Pioneerの場合は,Pioneer_p3dxという名前になっていると思います.
この名前はV-REPでも変更できますが,その場合は,それにあわせて名前を変更する必要があります.

二番目の引数は,RTCに渡す引数です.これによって,実行周期やインスタンス名を変更することができます.
形式は,key1=value1&key2=value2です.
たとえば,実行周期を変更する場合は,exec_cxt.periodic.rateを変更します.すなわち,

exec_cxt.periodic.rate=50

のようになります.
インスタンス名を変更する場合は,

instance_name=MyRobot

となります.これでインスタンス名がMyRobot.rtcになります.
同時に二つ指定する場合は,

exec_cxt.periodic.rate=50&instance_name=MyRobot

になります.

(2)コンフィグレーション

さて,出来上がったRobotRTCのコンフィグレーションに,controlledJointsとobservedJointsという値があります.
これは,制御対象である関節と,状態取得対象である関節という意味です.
このPioneer_p3dxには,多数のJointオブジェクトとツリーの中に持っているので,最初はたくさんの値が入っていますが,
必要なのは左右のタイヤの状態だけなので,どちらもPioneer_p3dx_rightMotor,Pioneer_p3dx_leftMotorのみ残します.
Configurationは変更したらUpdateして,ちゃんと変更になっているか確認してください.

(3)データポート

入力は,targetForce, targetVelocity, targetPosition,
出力は,currentForce, currentVelocity, currentPosition
です.
すべてTimedDoubleSeq型です.すなわちDouble型の配列です.
controlledJointsコンフィグレーションや,observedJointsコンフィグレーションで指定した順序で,データが取得できます.
controlledJointsコンフィグレーションで設定したJointの個数と,入力ポートに到達するデータの個数に違いがあると,RTCはエラー状態になりますので,注意してください.

5.2.2 RangeRTCの起動 (Spawn)

(1)起動方法

同様にPioneer_p3dxのツリーの下に,Hokuyo_URG_04LX_UG01というオブジェクトがあり,これがレンジセンサRTCになります.
RangeRTCのボックスni,Hokuyo_URG_04LX_UG01と入力して,Spawnをクリックすると,RangeRTC0.rtcが起動します.
ssr::Simulator::spawnRangeRTC()を呼び出したことになります.引数は,RobotRTCの場合と同じです.

(2)コンフィグレーション

センサの位置,すなわちオフセットの値や,距離の最大値 (maxRange) をコンフィグレーションで変更できます.

(3)データポート

データ型はRTC::RangeData型のデータポートです.

5.2.3 カメラRTCの起動 (Spawn)

(1)起動方法

カメラRTCはこのチュートリアルでは使いませんが,kinect_visionSensorというカメラがPioneer_p3dxに含まれているので,これを使ってカメラを取得できます.

(2)データポート

RTC::CameraImage型のデータ出力ポートです.
Windows版のCameraViewerコンポーネントで表示させることも出来ます.

6. システムの接続

では,gmappingやMapperViewerを接続します.
まず,RobotRTC0.rtcは,関節角度レベルでしか操作できませんので,MobileRobotKinematicsというRTCを使って,移動ロボットの運動学計算をさせ,オドメトリをとります.
RobotRTC0.currentPositionポートを,MobileRobotKinematics0.currentWheelAngleポートと接続します.
また,MobileRobotKinematics0.targetWheelVelocityを,RobotRTC0.targetVelocityに接続します.

次に,マッピングをします.Mapper_gmappingというRTCを使います.gmappingというライブラリを使ったSLAMが可能なRTCです.
MobileRobotKinematics.currentPoseポートを,Mapper_gmapping.odometryに接続します.これでロボットのオドメトリを取得します.
また,RangeRTC.rangeを,Mapper_gmapping.rangeに接続します.これでレンジセンサ入力を取得します.

マッピングは,Mapper_gmappingだけではできません.このRTCのサービスポートを使って,制御するRTCが必要になります.
MapperViewerというRTCを使います.

Mapper_gridmapping.gridMapperポートを,MapperViewer.mapperServiceポートに接続します.どちらもサービスポートです.
また,ロボットの現在位置を取得できるMapper_gmapping.estimatedPoseを,MapperViewer.currentPoseに接続します.
MapperViewer.rangeポートにRangeRTC.rangeを接続すると,レンジセンサのデータをオーバーレイして表示させることができます.

MapperViewerには,targetVelocityというポートがあり,後述する仮想ジョイスティックで速度指令を送ることができます.
これをMobileRobotKinematics.targetVelocityポートに接続します.

これで準備完了です.

この状態で,一度システムを保存します.
rtSystem.xmlと名前をつけるとよいでしょう.
OpenRTM-aist C++版に付属しているRCP版のRT System Editorにはバグがあります.Eclipse全部入りをダウンロードして,そちらのRT System Editorを使うべきです.

7. シミュレーションの開始

シミュレーションを開始すると,RobotRTCやRangeRTCは自動的にアクティブ化します.さらに,RT System Editorから,rtSystem.xmlに参加しているRTCをすべてアクティブ化します.これでシミュレーション開始です.

8. マッピングの開始

マッピングは,MapperViewerのメニューから,Menu > Mapping > start Mappingを選択すると開始されます.
Mapping > enable Auto Update を選択すると,周期的にマップ情報を取得して,MapperViewerに表示できます.
Control > Controllerでコントローラを表示します.これを使うと,MapperViewerから速度指令を送ることができます.
ロボットが一定距離動くと,マップが表示されるのがわかります.

9. SimulationManagerの高度な使い方

9.1 同期機能

シミュレータ内のシミュレーション時間と同期してRTCを動作させることが出来ます.
<書き途中>

9.2 コンフィグレーション設定による自動シミュレーションセットアップ

以上をSimulationManager.confに設定することで,GUIを使わず,VREPRTCとSimulationManagerを接続してアクティブ化するだけで,シミュレーション開始まで自動で行うことができます.

<書き途中>

10. まとめ

以上が,V-REPでシミュレーションを使う流れです.

V-REPの終了時にエラーが起こるかもしれません.上手く調整しづらいところで,しばらくは我慢して使ってください,としか言いようが無いです.すみません.

もくじにもどる

Responses to “VREPとRTCの接続方法”

  1. No comments yet.
  1. No trackbacks yet.

コメントを残す