ROS2最小構成プログラム:初級 -ROS1 style-

【[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)】
【[ROS2レクチャー:初級 -ROS1 style-](https://qiita.com/NeK/items/74e4bb9d1530e22a63fc)】

【前:[ROS2プロジェクトの作成]】
【次:[ROS2のpublisher/subscriber概要]】

[ROS2プロジェクトの作成]:https://qiita.com/NeK/items/067bc227f706d7b8a2f3
[ROS2のpublisher/subscriber概要]:https://qiita.com/NeK/items/bb21b9e24f89f3182d05

# 概要
ROS2プログラミングの第一歩として，何もしないnodeを使用したプログラムを作成する．

# 準備
## パッケージの作成
ROS風nodeによる最小構成プログラムを作成するため，パッケージを作成する．パッケージ名はminimal_target_ros1_likeとする．

```Bash:terminal
$ cd ~/ros2_studies_ws/
$ ros2 pkg create --build-type ament_cmake minimal_target_ros1_like --dependencies rclcpp
```

ros2のコマンドは以下のページに詳しい．
- [Introspection with command line tools](https://index.ros.org/doc/ros2/Tutorials/Introspection-with-command-line-tools/)

## プログラム作成
作成物:

- src/main.cpp

### プログラム

```c++:main.cpp
#include <rclcpp/rclcpp.hpp>

int main(int argc, char * argv[]){
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("minimal_target_ros1_like_test");
  RCLCPP_INFO(node->get_logger(),"minimal_target_ros1_like test's output.");
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}
```

- ROS2システムに関わるもの
    - 1行目:ROS Client Library for C++のライブラリを使用．
    - 4行目:ROS2システムの初期化．ノードの初期化ではなくROS2システムを使用するために必要なもの．
    - 8行目:ROS2システムの終了処理．
- nodeに関わるもの
    - 5行目:rclcpp::Node::make_sharedによる名前付き("minimal_target_ros1_like_test")nodeの作成．nodeは基本的にスマートポインタとして作成する．
    - 7行目:spin()によるnodeの実行
- その他
    - 6行目:画面出力．第一引数は，どのnodeの出力か区別できるようにしている．node->get_logger()によってロガー(記録者)の"名前"を渡している．

<details>
<summary>画面出力関数について</summary><div>
[rclcppのAPI](http://docs.ros2.org/crystal/api/rclcpp/index.html)によると，画面出力には以下のものがある．
- RCLCPP_DEBUG()
- RCLCPP_INFO()
- RCLCPP_WARN_ONCE()
- VERROR_SKIPFIRST()
</div></details>

### package.xml
編集しなくてよし．
下記のように\<depend\>rclcpp\</depend\>が追加されていることを確認．
これはビルド・テスト・実行するのに必要な依存関係である．古いバージョンでは自分で書く必要があったが，自動的に追加してくれるようになっている．
今回rclcppを使用しているので追加(ROS2システムは基本rclcppを使用する)．

```xml:package.xml
<package format="3">
  <depend>rclcpp</depend>

</package>
```

#### 旧情報
Eloquent Elusorまでの書き方．

<package format="3">タグの中に{build,test,exec}_dependのタグがあることを確認．なければ追加．
それぞれ，ビルド・テスト・実行するのに必要な依存関係を記載．
今回rclcppを使用しているので追加(ROS2システムは基本rclcppを使用する)．

```xml:package.xml
<package format="3">
  <build_depend>rclcpp</build_depend>
  <test_depend>rclcpp</test_depend>
  <exec_depend>rclcpp</exec_depend>

</package>
```


### CMakeLists.txt
基本的には重要なところや追加したところのみを表示．書く場所・順番の制限はゆるい．

```CMakeLists.txt
find_package(rclcpp REQUIRED)

add_executable(minimal_target_ros1_like_test
  src/main.cpp
)
ament_target_dependencies(minimal_target_ros1_like_test
  rclcpp
)
install(TARGETS
  minimal_target_ros1_like_test
  DESTINATION lib/${PROJECT_NAME}
)
```

- 1行目:他のパッケージ名を使用している場合に追加．rclcppライブラリは基本的に使用していると思うから必ず書くことになる．
- 3～5行目:ターゲット・実行ファイルを作成するための設定．3行目のカッコの中がターゲット名となり，4行目以下にターゲットを作成するために必要なソースファイルを続けて書く．分かりやすいように改行しているがスペース区切りで一行にまとめてもよい．
- 6～8行目:ターゲットをコンパイルするのに必要な依存関係を設定．スペース区切りで一行OK．
- 9～12行目:ターゲットをコンパイルした実行ファイルをどこにインストールするか指定．10行目がターゲット名．11行目がインストール先．複数のターゲットをコンパイルする場合，3～8行目を複数書くことになる．その上で10行目にあたるターゲット名を複数行書くことになる．スペース区切りで一行OK．

## ビルド・実行

```Bash:terminal
$ cd ~/ros2_studies_ws/
$ colcon build --symlink-install
$ . install/local_setup.bash
$ ros2 run minimal_target_ros1_like minimal_target_ros1_like_test
```

ビルドはワークスペースのトップディレクトリで[colcon build](https://qiita.com/NeK/items/33d62c61fc1a8c0c233e#colcon-build)．
3行目の. install/setup.bashはパッケージを新規で作成したとき以外は不必要．
4行目で実行しており，書式はros2 run [パッケージ名] [ターゲット名]


【前:[ROS2プロジェクトの作成]】
【次:[ROS2のpublisher/subscriber概要]】