ROS2 How to use

ROS2で既にプログラミングされた実行可能ファイルを使うために勉強したメモです．

現状，勉強した使い方は以下の内容です．

- A.graph全般
    - launch
    - rqt
    - package
- B.node関連
    - node
    - parameter
- C.topicなど接続関連
    - topic
    - service
    - action

# A.graph全般

## launchを使う．

(既に`〜launch.py`ファイルは作成済みと仮定して)

#### launchファイルに記述したros2システムを起動

```
cd launch
ros2 launch <〜launch.py>
```
[Note]
起動ファイルはpackageで提供することもできる．

```
ros2 launch <package_name> <launch_file_name>
```
## rqtを使う．

#### ROS graphを表示する．

```
rqt_graph
```

## packageを使う．

#### packageを使う．
##### 1. packageを使う準備
新しいパッケージと実行可能ファイルを使用するために，workspaceのルートで以下を実行する．

```
. install/setup.bash
```
これで，workspaceがパスに追加されたので、新しいpackageの実行可能ファイルを使用できるようになる．

##### 2. 使う．
```
ros2 run <package_name> <node_name>
```
ここで，`<node_name>`は`pkg create`したとき，`--node-name`引数で命名した名前，あるいはpkgを調べたときに見つけたnode名を指す．

#### packageを調べる．

- `<workspace_name>/src/<package_name>`の中には，自動的に生成されたファイルとフォルダーが表示される．
- `<package_name>`フォルダの中には，python_nodeが存在します．

# B.node関連
## nodeを使う．
#### node一覧の取得
```
ros2 node list
```
そのノードと対話するsubscriber，publisher，service、およびaction（ROS graph接続）のリストを返します．
#### nodeの詳細情報の検索
```
ros2 node info <node_name>
```
## parameterを使う．
#### parameter一覧を取得
nodeに属するparameter一覧を取得する．

```
ros2 param list
```
#### 現在値を取得
nodeに属するparameterの現在値を取得する．

```
ros2 param get <node_name> <parameter_name>
```
#### 現在値を設定変更
実行時に，nodeに属するparameterの現在値を設定する．

```
ros2 param set <node_name> <parameter_name> <value>
```
#### parameter値をダンプ
nodeに属するすべてのparameterをファイルに保存するために，parameter値をダンプする．

```
ros2 param dump <node_name>
```
#### ファイルからロード
parameterをファイルからロードする．

```
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
```
フラグ`--ros-args`が追加され，`--params-file`オプションの後にロードするファイルが続く．

# C.topicなど接続関連

## topicを使う．

#### topic一覧を取得
システムで現在アクティブなすべてのtopicのリストを表示する．

```
ros2 topic list
```
`ros2 topic list -t`は同じくtopicのリストが返されますが，今回はtopicタイプが括弧の後に追加される．

#### pubしてるデータを取得
topicが公開しているデータを表示する．

```
ros2 topic echo <topic_name>
```

#### 送受信数を表示
topicが送受信されている数を表示する．

```
ros2 topic info <topic_name>
```

#### 手動でpubする．
コマンドラインから直接topicにデータをpubする．

```
ros2 topic pub <topic_name> <msg_type> '<args>'
```
- この引数`args`は，YAML構文で入力する必要があることに注意してください．
- `--rate 1`オプションは，コマンドを1 Hzの安定したストリームで発行するように指示します．
- `--once`オプションは，「1つのメッセージをパブリッシュしてから終了する」ことを意味する．

#### pubする周期を取得
topicがpublishされる周期を表示する．

```
ros2 topic hz <topic name>
```

## serviceを使う．

#### serviceの取得
システムで現在アクティブなすべてのserviceのリストを表示する．

```
ros2 service list
```
- service名がリスト表示される．
- `-t`オプションは，すべてのアクティブなサービスのタイプを確認する．

#### serviceのタイプを表示
```
ros2 service type <service_name>
```
- サービスの要求と応答の2つのデータがどのように構造化されているかを記述するタイプがある．
- `Empty`タイプは，サービスコールが要求を行う際にデータを送信していないし，応答を受信した場合にはデータを受信しないことを意味する．

#### 特定のタイプに該当するすべてのserviceを検索
```
ros2 service find <type_name>
```
- 例) `ros2 service find std_srvs/srv/Empty`
    - → `/clear, /reset`

#### serviceのインターフェイスの取得
```
ros2 interface show <type_name>.srv
```
`service name`および，それらの`type_name`は，`ros2 service list -t`で分かる．

#### serviceの実行(呼び出し)
```
ros2 service call <service_name> <service_type> <arguments>
```
- 例1) `ros2 service call /clear std_srvs/srv/Empty`
- 例2) `ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"`

## actionを使う．
#### action一覧を取得
ROSグラフのすべてのactionを表示する．

```
ros2 action list
```
- `-t`オプションは，actionのタイプも表示する．

#### client/server情報を取得
actionのclient/server情報を表示する．

```
ros2 action info <action_name>
```

#### actionのインターフェイスの取得
actionを実行するために必要な`<value>`の構成を取得する．

```
ros2 interface show <action_type>.action
```
`action_name`および，それら`action_type`は，`ros action list -t`で分かる．

#### actionの実行

```
ros2 action send_goal <action_name> <action_type> <values>
```
- `<values>`はYAML形式．
- 例) `ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {'theta: 1.57'}`
- `--feedback`オプションをコマンドの最後に追加すると，目標完了まで現在の状態をフィードバックとして受け取り続ける．

# 参考サイト
https://index.ros.org/doc/ros2/

# 更新履歴
2020.4.30 Init.