0. 準備
デフォルトで表示される環境に移動ロボットとセンサを配置します.
また,モデルブラウザから,”components” > “sensors” > “Hokuyo_URG_04LX_UG01″を床の適当な位置にドラッグ&ドロップします.
モデルブラウザから,”robots” > “mobile” > “Pioneer p3dx”をHokuyoの横らへんにドラッグ&ドロップします.
ここで,Pioneer_p3dxのモデルに紐づいているLuaScriptを消去します.スクリプトのアイコンをダブルクリックしてエディタを開いたら,全て選択してDeleteすれば良いです.Hokuyo_04LX_UG01の方は消しません!
次に,モデルを組み立てます.Pioneerの上にURGを載せます.
モデルツリーから,Pioneer_p3dxを選択し,ツリーの左にある四角のアイコンをクリックしてツリーを開き,「Pioneer_p3dx_connection1」を選択します.これはちょうど車軸の直上かつタイヤの間であり,ロボットの原点の真上にあるコネクタです.
次に,モデルツリーから,Shiftキーを押しながらHokuyo_URG_04LX_UG01をクリックして,前述のPioneer_p3dx_connection01とHokuyo_URG_04LX_UG01の両方が選択されている状態を作ります.この時,Pioneer側を先に選択すると,3Dシーン上の選択要素の名前が黄色くなります.Pioneer_p3dx_connection01の文字が黄色だと思います.こちらに白い色の側,今はHokuyo_URG_04LX_UG01が乗っかります.乗っかると言ってもコネクタの上に乗ると言うよりは,同じ原点を共有する形で重なります.
最後に,ツールバーのAssemble/Disassembleボタンをクリックすると搭載されます.
こちらに定義済みのファイルを置いておきます.CoppeliaSim4.1.0で作りました.
coppeliasim_test_scene01
1. Name Serviceの起動
まず,RTミドルウェアのネームサービスを起動してください.
OpenRTPも起動してください.OpenRTM-aist 1.2.2に同梱されているRCPバージョンが良いでしょう.
2. RTCの作成
メニューを使った簡易的な方法
メニューから,”RTCPlugin” > “addRobotRTC”を選択します.すると,モデル名を選択するダイアログが表示されるので,「Pioneer_p3dx」と打ちます.
次に,RTコンポーネントに渡す引数を入力するダイアログが出ますので,「instance_name=PioneerRTC0」と打ちます.これで,PioneerRTC0.rtcというRTCが作成されます.
デフォルトではlocalhost:2809/${ホスト名}.host_cxt/PioneerRTC0.rtcという名前になると思います.
この引数は,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
になります.
同様に”RTCPlugin” > “addRangeRTC”を選択し,モデル名には”Hokuyo_URG_04LX_UG01″とします.
このRTCはHokuyo_URG_04LX_UG01にのみ対応しています.他のモデルに対応するRTCは別途作成するつもりですが,
他のモデルだとLuaスクリプトも編集しなくてはならなくなりそうなので,このHokuyo_URGを適宜変更しながら使う方が簡単です.
Argumentには”instance_name=HokuyoRTC0″とすると良いでしょう.
HokuyoRTC0が表示されたと思います.
Lua Commanderを使った方法
CoppeliaSimにはLua関数をインタラクティブに実行できるLua Commanderがあります.これを使うとダイアログボックスよりも簡単にモデルを作成できます.
simExtRTC.addRTC(“Pioneer_p3dx”, “instance_name=PioneerRTC0”)
と打つと,Pioneer_p3dxモデルをターゲットとしたRobotRTCが作成されます.
ver2.0.2より追加:TwoWheelMobileRobotRTCの追加
Pioneer_p3dxでシミュレーションを使うことが多いので,このタイプのロボットにRTミドルウェアの標準的な速度データを受け付けるタイプのRTCを追加しました.
LuaCommanderからaddTwoWheelMobileRobotRTCを使えば良いです.基本的な使い方はRobotRTCと同じです.
rtc.confで設定
ロガーの設定などを変更したければ,CoppeliaSimの実行ファイルがあるフォルダにrtc.confを配置します.
通常はC:/Program Files/CoppeliaRobotics/CoppeliaSim**です.(Educational版なら**にはEduが入ります)
3. RTCの設定
RobotRTC
ここではPioneerRTC0という名前にしてあります.
RobotRTC (Pioneer) のコンフィグレーション
さて,出来上がったPioneerRTCのコンフィグレーションに,controlledJointsとobservedJointsという値があります.
これは,制御対象である関節と,状態取得対象である関節という意味です.
このPioneer_p3dxには,多数のJointオブジェクトとツリーの中に持っているので,最初はたくさんの値が入っていますが,
必要なのは左右のタイヤの状態だけなので,どちらもPioneer_p3dx_rightMotor,Pioneer_p3dx_leftMotorのみ残します.
Configurationは変更したらUpdateして,ちゃんと変更になっているか確認してください.
データポート
入力は,targetForce, targetVelocity, targetPosition,
出力は,currentForce, currentVelocity, currentPosition
です.
すべてTimedDoubleSeq型です.すなわちDouble型の配列です.
controlledJointsコンフィグレーションや,observedJointsコンフィグレーションで指定した順序で,データが取得できます.
controlledJointsコンフィグレーションで設定したJointの個数と,入力ポートに到達するデータの個数に違いがあると,RTCはエラー状態になりますので,注意してください.
version2.0.2からはRT System Editorを使ってGUIのチェックボックスで簡単に変更できるようになりました.
コンフィグレーションビューから「編集」を選ぶとGUIで変更ができます.
RangeRTC
ここではHokuyoRTCという名前にしたと思います.
コンフィグレーション
センサの位置,すなわちオフセットの値や,距離の最大値 (maxRange) をコンフィグレーションで変更できます.
データポート
データ型はRTC::RangeData型のデータポートです.
4. 起動
シミュレーションを開始するとRTCがActive化されてデータポートからデータが出ます.
シミュレーションを停止するとDeactivateされるはずです.
(deprecated) SimulatorManagerを使った方法
Windowsを対象にします.他のプラットフォームでも,SimulationManagerの使い方は一緒です.
下記のgmapping_testerを使って,SLAMアルゴリズムのテストを行ってみましょう.
ダウンロードして展開してください.
この中にVREPのプラグインを試すためのプロジェクトやRTCが入っています.
0. Name Serviceの起動
まず,ネームサービスを起動してください.
RT System Editorも起動してください.OpenRTM-aist 1.1に同梱されているRCPバージョンはバグがあるので,
Eclpise全部入りのRC4版を使ってください.
1. VREP起動
次に,プラグインをインストールしてあるVREPを起動します.
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を選んで下さい.
Loadボタンを押すと,シミュレータがURG_TEST.tttをロードします.
ssr::Simulator::loadProject()関数を読んでいます.IDLを参照してください.
引数にプロジェクトファイルのフルパスを指定します.
(すなわちシミュレータが動作するファイルシステム上にプロジェクトがある必要があります)
5.2 SimulationRTCの起動
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の終了時にエラーが起こるかもしれません.上手く調整しづらいところで,しばらくは我慢して使ってください,としか言いようが無いです.すみません.