ROS tutorial まとめ2 トピックとサービス

#ROSまとめ2

##1.ROSの基本単位##
- **ノード**  
rosにおけるソフトフェアの１つの単位。ノードを組み合わせてシステムをつくることで、プログラムの再利用性が高まり、ノード単位でのデバックが可能になる。

##2.ROSにおける送受信方式##
ROSにおける送受信方式には、大きく分けて、

>- トピックによる通信
>- サービスによる通信

の2つがある。

- **トピック**
    >- 一方向のメッセージの送信/受信。
    >- **非同期通信**なので、必要に応じてデータの送受信が可能。
    >- 一度の接続で**継続的にメッセージの送受信が可能**。
    >- トピックを提供する**パブリッシャ(publisher)**と、トピックを利用する**サブスクライバ(subscriber)**の2種類がある。

  

- **トピックに関するツール**
    **rqt_graph**

    ```bash
    $ rosrun rqt_graph rqt_graph
    ```

    で、ノードとトピックを可視化。
    これにより、トピックの名前もわかる。


    **rostopic -h**
    `rostopic -h`で`roptopic`に存在するサブコマンドを調べることができる。

    **rostopic echo**
    `rostpic echo`は、トピックから配信されているデータを表示する。

    使い方

    ```bash
    $ rostopic echo [topic]
    ```

     **topic list**
    `rostopic list`は、現在購読・配信されている全トピックのリストを返す。`rostopic list -h`で引数を検索。  
    verboseオプションで、起動しているトピックとその型についての詳細なリストを表示。

    ```bash
    $ rostopic list -v
    ```

    **rostopic type**
    配信されている全トピックのメッセージ型を返す。

    使い方

    ```bash
    $ rostopic type [topic]
    ```

    たとえば、turtlesimのノードに関して、

    ```bash
    $ rostpic type /turtle1/cmd_vel
    ```

    とすると、

    ```bash
    geometry_msgs/Twist
    ```

    と表示され、

    ```bash
    $ rosmsg show geometry_ms/Twist
    ```

    を実行すると、turtlesimが要求するメッセージの型がわかる。

    `rostopic type`と`rosmsg show`を結合して使うことも可能。

    例

    ```bash
    $ rostopic type /turtle1/cmd_vel | rosmsg show
    ```
    **rostopic pub**
    `rostopic pub`は現在立ち上がっているトピックへデータを転送する。

    使い方

    ```bash
    $ rostopic pub [topic] [msg_type] [args]
    ```

    例

    ```bash
    $ rostoic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
    ```

    `rostopic pub` : あたえられたトピックへメッセージを配信する。  
    `-1` : このオプションでrostopicは1つのメッセージを配信したあとに終了。  
    `/turtle1/cmd_vel` : 配信するトピックの名前。  
    `geometry_msgs/Twist` : メッセージの型。  
    `--` : これは後の引数を表示させなくするためのオプション。

    定期的に動かすためには、以下。

    ```bash
    $ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
    ```

    `-r`コマンドで1Hzごとに定期的にコマンドを使用できる。

    **rostopic hz**
    配信されたデータの更新頻度を調べます。

    使い方

    ```bash
    $ rostopic hz [topic]
    ```

    例

    ```bash
    $ rostopic hz /turtle1/pose
    ```

















- **サービス**
>- 双方向のメッセージの要求/応答。
>- **同期式通信**のため、要求があった時のみデータを送受信。
>- **一回限りのメッセージ送信**(サービスの要求と応答が完了すると、ノード間の接続は切断)。
>- 要求があった時に応答する**サービスサーバ**と、要求して応答を受信する**サービスクライアント**の２種類が存在する。

- **サービスに関するツール**
**rosservice -h**
ヘルプ
**rosservice list**
ノードが提供しているサービスを表示

    ```bash
    $ rosservice list
    ```

    ```bash
    /clear
    /kill
    /reset
    /rosout/get_loggers
    /rosout/set_logger_level
    /spawn
    /turtle1/set_pen
    /turtle1/teleport_absolute
    /turtle1/teleport_relative
    /turtlesim/get_loggers
    /turtlesim/set_logger_level
    ```  
**rosservice type**
使い方

    ```bash
    $ rosservice type [service]
    ```

    例

    ```bash
    $ rosservice type clear
    ```

    ```bash
    std_srvs/Empty
    ```

    これでclearサービスの型がわかる。

    ```bash
    $ rosservice type spawn
    ```

    とすると、

    ```bash
turtlesim/Spawn
    ```
    となり、Spawnサービスの型がわかる。

    **rossrv show**
    例えば、Spawnの型の詳細が見たいとき、

    ```bash
    $ rossrv show /turtlesim/Spawn
    ```
を実行すると、

    ```bash
(入力)
float32 x
float32 y
float32 theta
string name
---
(出力)
string name
    ```

    となり、型の詳細が確認できる。
 
    また、`rosservice type`と組み合わせて、

    ```bash
$ rosservice type spawn| rossrv show
    ```

    **rosservice call**
    使い方

    ```bash
    $ rosservice call [service] [args]
    ```

    例(引数なし)

    ```bash
$ rosservice call clear
    ```

    clearの型が空なので引数は付けない。
    これを実行すると、`turtlesim_node`の背景がクリアされる。


    例(引数あり)
    spawnサービスは、与えられた位置と向きに新しいturtleを誕生させる。名前フィールドは任意。

    ```bash
    $ rosservice call spawn 2 2 0.2 ""
    ```

    出力は、

    ```bash
    name: turtle2
    ```

    これで、新たしい亀が誕生する。