ROS上でV-REP内のモデルを動かす

@RyuYamamoto です。ROS Advent Calenderの20日目の投稿です。内容的には薄いですが、V-REPとROSの連携について軽く解説しようと思います。

環境はubuntu 12.10、ROS hydroです。全体的に少々古いです←。

##何故V-REP？
ROSを使っていてシミュレーションをするとなると「Gazebo」が主流です。何故「V-REP」なのか。まずV-REPとは、coppelia roboticsが提供しているフリーのロボットシミュレーションです。デフォルトで様々なシミュレーションモデルが提供されており、ほぼプログラミングなしで動かすこともできます。色々魅力的な部分が多いですが、私がV-REPを使用している一番の理由としては、「多言語で操作できる」というのが一番の理由です。デフォルトでLuaやC、またC++、Java、Pythonは勿論、計算ツールであるMATLAB,Octaveからも操作することが可能です。

##使い方
とりあえず、一番簡単な方法でROSとV-REPとを連携させてみたいと思います。まずターミナルを開き、

<pre>> roscore
</pre>

もう一つターミナルを開き、V-REPのダウンロードディレクトリにて

<pre>> ./vrep.sh
</pre>

としてV-REPを起動します。このとき、ronnode listで確認すると、

<pre>/rosout
/vrep
</pre>

と表示され、vrepノードが起動していることが確認できます。また、rosservice listとすると、

<pre>/rosout/get_loggers
/rosout/set_logger_level
/vrep/get_loggers
/vrep/set_logger_level
/vrep/simRosAddStatusbarMessage
/vrep/simRosAuxiliaryConsoleClose
.
.
.
/vrep/simRosSynchronousTrigger
/vrep/simRosTransferFile
</pre>

とサービスの一覧が表示されます。試しに、サービスをコールしてリモートでシミュレータをstart/stopしてみましょう。

<pre>> rosservice call /vrep/simRosStartSimulation //Start Simulation
> rosservice call /vrep/simRosStopSimulation  //Stop Simulation
</pre>

とすると、リモートでStart/Stopできるのが確認できます。では実際にsceneファイルを起動して試していきます。サンプルで「rosTopicPublisherAndSubscraber.ttt」というsceneファイルがあるので開くと、以下のようなsceneが表示されます。

![Screenshot_from_2014-12-21 13:04:04.png](https://qiita-image-store.s3.amazonaws.com/0/60952/5d98ab5e-c894-42f3-993a-6c8a88a45304.png)

これはscene内にあるVisionSensorアイテムからのデーをウィンドウ上に表示するというものです。この状態で既にV-REP内のスクリプトによってPublisher、Subscribeの設定が行われており、topicを通して外部のnodeからセンサーイメージを取得することができます、ベタにimage_viewノードで取得しましょう。
ではシミュレータをstartし、別ターミナルにて

<pre>> rosrun image_view image_view image:=/vrep/visionSensorData
</pre>

とすると、以下のようにウィンドウが出て、scene内のセンサーイメージが表示されます。

![Screenshot_from_2014-12-21 13:20:57.png](https://qiita-image-store.s3.amazonaws.com/0/60952/359e5b39-2fc9-5711-29b5-e8c6e884e120.png)

画面左側のウィンドウが普通にV-REP内のスクリプトによって取得したセンサー画像、右上のウィンドウがimage_viewによって得られたセンサー画像です。この状態でtopicとnodeを見てみると、

<pre>$rostopic list
/rosout
/rosout_agg
/tf
/vrep/info
/vrep/visionSensorData
/vrep/visionSensorData/compressed
/vrep/visionSensorData/compressed/parameter_descriptions
/vrep/visionSensorData/compressed/parameter_updates
/vrep/visionSensorData/compressedDepth
/vrep/visionSensorData/compressedDepth/parameter_descriptions
/vrep/visionSensorData/compressedDepth/parameter_updates
/vrep/visionSensorData/theora
/vrep/visionSensorData/theora/parameter_descriptions
/vrep/visionSensorData/theora/parameter_updates
</pre>

<pre>$rosnode list
/image_view_1419135954081575492
/rosout
/vrep
</pre>

一応システム図も

![rosgraph.png](https://qiita-image-store.s3.amazonaws.com/0/60952/184c9a59-b4c4-2480-3f09-1830c835ed22.png)

これでROSとV-REPの連携は成功です(一番簡単な方法)。もしROSからモータや歩行ロボットの関節を動かしたいという場合は、ROS用のAPIが用意されており、これらを使用することで可能になります(<http://www.coppeliarobotics.com/helpFiles/en/rosFunctionListAlphabetical.htm>)。V-REP自体様々なサンプルモデルが存在するため、それを動かすための公式パッケージも存在する様です(vrep_ros_bridgeとか)。ですが、独自で作成したモデルで動かしたい場合は自分で好きなようにパッケージを作成したほうがよいです。しかしドキュメントがGazeboと比べてほぼ無いに等しいため、色々大変です、私も現在独自モデルでシミュレータ用のpackageを作成しようとしているのですが、期日までに間に合いませんでした...。


今後は完成したら私のGithubアカウント上で公開しようと思います。

Github:<https://github.com/RyuYamamoto>。
Blog:<http://codebreak.com/blog/ryuyamamoto>