rosbridge経由でPharo 2.0からROSに接続する

PharoからROSに接続するのに、以前はrospharoというパッケージを作っていたが、古いバージョン用(diamondback)でありアップデートも面倒臭いので、今回はrosbridgeを用いて接続することにした。rosbridge V2.0ではWebSocketを用いて接続するので、Pharo 2.0から接続するには両者のインストールが必要となる。

rosbridgeとWebSocketのセットアップは以下にある。

rosbridgeのサイトではChromiumブラウザのWebSocket接続機能を使って動作確認を行っているが、やはりPharoerとしてはPharoから動作確認したい。そこで、まずROS側で適当なTopicをPublishしておいて、それをPharo側でSubscribeして動作確認することにした。以下、ROS側とPharo側で分けて説明する。

ROS側の作業

前述のrosbridgeの導入の通り、roscoreおよびrosbridgeを起動しておく。

turtle_teleop_keyは、タートルグラフィックスシミュレータのタートルをカーソルキーで操作するためのNodeである。手近なところでPublishできるノードを思いつかなかったので、これを使うことにした。

別のターミナルなどを用いてturtle_teleop_keyを起動する。
rosrun turtlesim turle_teleop_key

更に別のターミナルなどで以下を入力する。
$ rostopic list
/rosout
/rosout_agg
/turtle1/command_velocity

/turtle1/command_velocityというトピックが現れているのがわかる。以下を入力してどんなメッセージかを調べる。
$ rostopic type /turtle1/command_velocity
turtlesim/Velocity

/turtle1/command_velocityトピックではturtlesim/Velocityというメッセージが使われている。より詳細に調べるには以下のようにする。
$ rosmsg show turtlesim/Velocity
float32 linear
float32 angular

turtlesim/Velocityメッセージは、2個のfloat32型変数linear, angularで構成されていることがわかる。

ちゃんとturtlesim/Velocityメッセージが来るかどうかチェックする。
$ rostopic echo /turtle1/command_velocity
ここで、turle_teleop_keyを起動したターミナルでカーソルキーを入力する。上下左右のカーソルキーを順に入力すると、ターミナルに以下のように表示される。
$ rostopic echo /turtle1/command_velocity
linear: 2.0
angular: 0.0
---
linear: -2.0
angular: 0.0
---
linear: 0.0
angular: 2.0
---
linear: 0.0
angular: -2.0
---

Pharo側の作業

WebSocketをインストールしたPharoを起動し、適当なワークスペースを開き、以下を入力する。なお、以下の説明ではrosbridgeの動いているPCのIPアドレスを192.168.254.68としている。

rs := ZnWebSocket to: 'ws://192.168.254.68:9090'.
rs sendMessage: '{"op": "subscribe", "topic": "\/turtle1\/command_velocity", "type": "turtlesim\/Velocity"}'.

1行目でrosbridgeへWebSocket経由で接続している。2行目では/turtle1/command_velocityトピックをSubscribeしている。このときメッセージタイプも指定している。なお、rosbridgeとのやりとりにはJSON形式のデータを送る。

上記をDo itすると、rosbridgeのターミナルに以下のようなログが出力される。
[INFO] [WallTime: 1363827799.919737] [Client 0] Subscribed to /turtle1/command_velocity

続いてワークスペースで以下を入力してPrint itする。
rs readMessage.

タイムアウトになる前にturle_teleop_keyのターミナルに戻って、上カーソルキーを押すとPrint itの結果が表示される。
'{"topic":"\/turtle1\/command_velocity","msg":{"linear":2.0,"angular":0.0},"op":"publish"}'

opコードにpublishが、msgにlinearとangularの値が入ったJSON形式のデータが返ってくる。

トピックのsubscribeをやめ、rosbridgeとの接続を解除するには以下のようにする。
rs sendMessage: '{"op": "unsubscribe", "topic": "\/turtle1\/command_velocity"}'.
rs close.

ちゃんとrosbridge経由で通信できることが確認できた。