ROS2導入&レクチャー

# 概要
主に研究室の学生教育用して作成する．
このページは全体の構成をあらわし，各所へのリンク集とする．
ソースコードをのせ行指定での説明(〇行目は~という意味，みたいな説明)をしているので"[Qiitaをより便利にするChrome拡張機能をつくりました](https://qiita.com/howdy39/items/e6136b8454099ebfef29#-%E6%8F%90%E4%BE%9B%E6%A9%9F%E8%83%BD)"を見ながら拡張機能を入れて行表示できるようにしておくと見やすいかも．

## 公式チュートリアル
[公式チュートリアル]がROSのそれと同レベルになり，「これやっとけば大丈夫」になった．特に概念を理解するためのgifが非常によいので，[公式チュートリアルのBeginner: CLI Tools]くらいは一読することをすすめる．

## 目標レベル
本ページは，ROS2はじめての人が順々に勉強していくことを想定している．または，気になって調べた情報を個別にまとめたものでもある．特に[初級](#初級)に書かれているものは学習途中のもので，最終的には[コンポーネント](#中級-:共有ライブラリとコンポーネントについて)を作成・利用できるようになればよい．．．ですね．

## 更新履歴
2025/05/24:[環境](#環境)にKilled Kaijuを追加．ament_target_dependencies is deprecatedの廃止は結構大きいのでは．
2024/12/29:[ROS2 Parameter](#ROS2_Parameter)のところの[ROS2におけるパラメータ変更に対するcallback関数の設定](https://qiita.com/NeK/items/97c2e07e2f76f178351a)を追記．
2024/12/29:[自分向け](#自分向け)のところに[githubに置いたプログラム作成時の雛形・テンプレート](https://github.com/nek009/ROS2_information/tree/main)を記載
2024/12/29:[環境](#環境)にJazzyJaliscoを追加．．．していたことのお知らせ

# 対象
## 対象読者
- 学部学生(B3)
    - ROSの存在を知らず，C++言語の知識も不定
- 学部学生(B4)
    - ROSの演習([公式チュートリアル](http://wiki.ros.org/ROS/Tutorials))済
- 大学院生(M1,M2)
    - ROSを用いた研究を遂行中

いずれもROS2は知らない学生を対象とする．

## 環境
それぞれの違い・変更点は[Distributions]を参考のこと．結構重要．

<details open><summary>現行</summary>

- ROS2 Rolling Ridley
    - 開発バージョン
- ROS2 Killed Kaiju
    - 2026/12月までサポート
    - *年*月より使用開始
        - for 24.04 LTS
    - [新規機能や変更点: from Jazzy Jalisco to Killed Kaiju](https://docs.ros.org/en/kilted/Releases/Release-Kilted-Kaiju.html#changes-since-the-jazzy-release)
        - [ament_target_dependencies is deprecated](https://docs.ros.org/en/kilted/Releases/Release-Kilted-Kaiju.html#ament-target-dependencies-is-deprecated)
            - 個人的に大きな変更
- ROS2 Jazzy Jalisco
    - 2029/5月までサポート
    - 2024年12月より使用開始
        - for 24.04 LTS
    - [新規機能や変更点: from Iron Irwini to Jazzy Jalisco](https://docs.ros.org/en/jazzy/Releases/Release-Jazzy-Jalisco.html)
- ROS2 Humble Hawksbill
    - 2027/5月までサポート
    - 2022年7月より使用開始
        - for 22.04 LTS
    - [変更点: from Galactic Geochelone to Humble Hawksbill](https://docs.ros.org/en/humble/Releases/Release-Humble-Hawksbill.html#changes-since-the-galactic-release)
- Ubuntu on Raspberry Pi
    - Ubuntu Serverで十分
        - [Ubuntu 20.04 on Raspberry Pi 3/4](https://qiita.com/NeK/items/a16cbc33dd3195226940)
        - [Ubuntu Desktop 18.04 LTS on Raspberry Pi 3B/3B+](https://qiita.com/NeK/items/849c6d1e05fb05314fc6)
</details>

<details><summary>以前使用していたもの</summary>

- ROS2 Iron Irwini
    - 2024/11月までサポート
    - 2023年6月より使用開始
        - for 22.04 LTS
    - [変更点: from Humble Hawksbill to Iron Irwini](https://docs.ros.org/en/foxy/Releases/Release-Iron-Irwini.html#new-features-in-this-ros-2-release)
- ROS2 Eloquent Elusor
    - 2020/11月までサポート
    - 2020/1月より使用開始
        - for 18.04 LTS
- ROS2 Dashing Diademata
    - 2021/5月までサポート
    - 2019年6月より使用開始
        - for 18.04 LTS
</details>


## 知っといてほしい知識
詳しくは習うより慣れよ．ただ「見たことある」くらいにはしておいてもらい，「どんなものか」という概要を知り自学出来るようになっておいてもらえればよい．

<details><summary>クラス</summary>

- 継承・コンストラクタはROS2でとても重要である．
- 例えば[C++の基礎：クラス](https://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/class.html)を参照．
</details>

<details><summary>テンプレート</summary>

- <>の書き方はよく使用する．
- 例えば[適当なC++テンプレート入門](https://qiita.com/hal1437/items/b6deb22a88c76eeaf90c)を参照．
</details>

<details><summary>名前空間</summary>

- スコープ解決演算子::はよく使用する．
- 例えば[namespaceの賢い使い方](https://qiita.com/_EnumHack/items/430da105a541f9ecd774)を参照．
</details>

<details><summary>スマートポインタ</summary>

- unique・shared・weakあるよ．
- 例えば[C++11スマートポインタ入門](https://qiita.com/hmito/items/db3b14917120b285112f)を参照．
</details>

<details><summary>lambda関数</summary>

- 例えば[cpprefjpのラムダ式](https://cpprefjp.github.io/lang/cpp11/lambda_expressions.html)，[C++11 ラムダ式、std::function](https://qiita.com/rokuta96/items/13e69bdab0eacfa33940)，[本の虫: lambda 完全解説](https://cpplover.blogspot.com/2009/11/lambda.html)
</details>

<details><summary>std::bind</summary>

- 例えば[【C++】std::bindの使い方](https://qiita.com/tkyaji/items/1aa7bb01658e848d3ef4)
</details>

<details><summary>Modern C++．．．っぽいなにか</summary>

- [おっさんのためのModern C++入門ガイド](https://zenn.dev/dec9ue/books/8c59757478a547)
- 特にGalacticからC++17になってModern C++勉強のいいタイミングとなる．あと書いているひとがおっさんだから．
</details>

<details><summary>Future</summary>

- 非同期処理でのパターンで，Parameterで関係する．
- 他に仕事を非同期で任せて結果をもらうので，「今はまだ結果をもらえていない．が仕事は任せ終わった．任せたプロセスから『仕事が終わったらこのオブジェクトに入れとくね！』ってオブジェクトをもらった．だから近い『未来』にこのオブジェクトに結果が入ってるはず．それがFutureオブジェクト！」というイメージのもの．
- 例えば[マルチスレッドプログラミングのFutureパターン](https://zawapro.com/?p=704)を参照．
</details>

# ROS2基本情報＆準備
## なぜROS2か
未執筆

- なぜROSか
- ROS/ROS2の特徴:メッセージを使った分散処理

## ROS2設定
### 管理者向け
- [ROS2インストール・初期設定](https://qiita.com/NeK/items/4ce04a2aa2b5eae3488b)

### 一般ユーザ向け
- [ROS2初期設定](https://qiita.com/NeK/items/64196305ba9dc90c26e4)
- [同一ネットワーク内で複数人がROS2を使用する場合](https://qiita.com/NeK/items/6163d5a307665a3c9c1c)

### 自分向け
- [githubに置いたプログラム作成時の雛形・テンプレート](https://github.com/nek009/ROS2_information/tree/main)

# ROS2レクチャー
それぞれの項目に対して以下を目標に作成

- 読むのに5分以内
- やるのに15分以内
- 入り組んだ話は後に．
    - ただ，すぐに読めるようにリンクで対処

## 初級
- [初級 -ROS1 Style-](https://qiita.com/NeK/items/74e4bb9d1530e22a63fc)
    - ROS風の書き方．クラスを極力使わない書き方で，とりあえずこちらから？
- [初級 -class style-](https://qiita.com/NeK/items/14db31ff784a0bfafe3d)
    - クラス化したnodeを使用した書き方．ROS2で推奨するコーディングスタイルへの第一歩．
<details><summary>内容一覧</summary>

1. ROS2に関する基本情報
1. ROS2プロジェクトの作成
1. ROS2の最小構成プログラム
1. ROS2のpublisher/subscriber概要
1. ROS2の最小構成subscriber
1. ROS2における時間管理・Rate系とTimer系
1. ROS2の最小構成publisher
1. ROS2独自メッセージの作成
1. 独自メッセージを用いたROS2 publisher/subscriber
1. ROS2の最小構成service/client
1. ROS2の最小構成parameter
1. YAMLファイルによるROS2のパラメータ設定
</details>

- Tips
    - [ROS2 + pipenv install](https://qiita.com/NeK/items/196783d7125a3fabf372)

## 中級
中級以降は，基本的には「class style」を対象とする．

### 共有ライブラリとコンポーネントについて
初級では分かりやすさから「ROS1 style」と「class style」の二種類の方法で説明した．実用的にはコンポーネントを作成し使用する．
コンポーネントについては，classでのnode作成(初級のclass style)し，それを共有ライブラリ化，共有ライブラリをコンポーネント化する流れで説明する．
コンポーネントは共有ライブラリとしても使用できるので，とりあえずコンポーネント化しておけばよい．

- [ROS2における共有ライブラリ](https://qiita.com/NeK/items/48c55bd473091d41cc75)
- [ROS2の共有ライブラリを使用したプログラムの作成](https://qiita.com/NeK/items/dfeb32b7762864641e42)
- [ROS2におけるコンポーネントの作成](https://qiita.com/NeK/items/775c0ddb4e10ed091068)
- [ROS2のコンポーネントの利用](https://qiita.com/NeK/items/72cc4fe44e563533b67b)


### ROS2 Parameter

- [ROS2におけるパラメータのdeclareとundeclareに関わる諸事](https://qiita.com/NeK/items/1dc66a9e8a09d746471a)
- [ROS2における個々のパラメータの詳細設定 - ParameterDescriptorの使用 -](https://qiita.com/NeK/items/74f5d45b01a277f40d1c)
- [ROS2におけるパラメータ変更に対するcallback関数の設定](https://qiita.com/NeK/items/97c2e07e2f76f178351a)
- [ROS2の非同期parameterクライアントについて](https://qiita.com/NeK/items/042ee2e7461347c9a8e7)
    - 書きかけ・未整理


### その他
- service/client，publish/subscribe関係
    - [ROS2におけるservice/client，publish/subscribeのネスト](https://qiita.com/NeK/items/4ed4c46c1087d1089b57)
- [ROS2におけるメッセージ -common_interfacesの活用](https://qiita.com/NeK/items/f78ea928cbb459ffe76e)
- [ROS2の単一ターゲット内での複数nodeの実行](https://qiita.com/NeK/items/aadb89da577e3706e674)
- [NodeOptionsによるROS2ノードの初期化について](https://qiita.com/NeK/items/a377a3af935ba5494ff6)
- [ROS2におけるQoS](https://qiita.com/NeK/items/7409c4c48966392568ad)
- [ROS2 launchの使用](https://qiita.com/NeK/items/434d88e2ac7f428cbdc9)

## 応用

- ROS2 + Raspberry Pi
    - [ボタンを押してLチカ](https://github.com/nek009/ROS2_on_RaspPi_lecture01_Settings_OnOffSISO/blob/main/README_JP.md)に移転
    - 旧情報
        - [ROS2でpigpioの利用 -準備・情報-](https://qiita.com/NeK/items/da429f8c001476ec4544)
    - [ROSとpigpioによるモータ制御](https://qiita.com/NeK/items/e7e2fcab57705818a46b)
    - 以下参考程度
        - [Ubuntu + Raspberry PiでGPIOアクセスのための設定](https://qiita.com/NeK/items/ea3a8158646ded95ad7e)
            - 現状，pigpioでは使用できていないので注意
- [ROS2でのキー入力専用nodeの作成](https://qiita.com/NeK/items/9a0b4d231ec8ad568690)

### ROS2 + Raspberry Pi

1. 準備
   * [Raspberry Pi 3/4にUbuntuをインストール](https://qiita.com/NeK/items/a16cbc33dd3195226940)
   * [ROS2インストール・初期設定](https://qiita.com/NeK/items/4ce04a2aa2b5eae3488b)
1. 

## まとめた一般的な情報
その他の異なるテーマで書いた情報庫は以下の通り．

- [ROS2に関する基本情報](https://qiita.com/NeK/items/18ff9e9c443295d5d805)
- [ROS2コマンド一覧
](https://qiita.com/NeK/items/33d62c61fc1a8c0c233e)
    - [ROS2コマンド一覧:ros2 pkg create](https://qiita.com/NeK/items/9312f3bca2854a82db2e)
- [ROS2 package.xmlとCMakeLists.txtのチートシート](https://qiita.com/NeK/items/eb4777936d95e2c25956)
- [ROS2における名前空間・ノード名の使い方](https://qiita.com/NeK/items/7bbb59f63aae318d87e6)
- [独自ルール:ROS2における名前付け](https://qiita.com/NeK/items/1a2d4b0067faec5f83e4)
- [独自ルール:GitLab上でのROS2のドキュメント](https://qiita.com/NeK/items/d382149355b2b340de87)
- [ROS2のsetup.*とlocal_setup.*](https://qiita.com/NeK/items/868bfba543100badbf16)
- [ROS2でEigen3を使う](https://qiita.com/NeK/items/5b98f6880bc74a157f11)

## future work
- actionについて
- launchについて

# 参考
- [公式チュートリアル]
    - 重要なことはここに集約されている．集約されてすぎてROSを知らない人には分かりにくい気がするが．
    - Tutorials-BasicにあるUsing Amentは多分古いので読まなくてよい(と当該ページに書いてある)
    - メッセージの型一覧は[About ROS 2 Interfaces](https://index.ros.org/doc/ros2/Concepts/About-ROS-Interfaces/)にある
- [docs.ros2](http://docs.ros2.org/)
    - 現在非公式みたいだが[rclcppのoverview]も参考になる．
- 公式の細々した情報
    - 特にc++用のAPIである[rclcppのapi]が参考になる．
    - [Introspection with command line tools](https://index.ros.org/doc/ros2/Tutorials/Introspection-with-command-line-tools/)
        - ros2コマンド一覧
    - [ros2/common_interfaces](https://github.com/ros2/common_interfaces)
- [ROS Japan ユーザグループ 講習会 ～ ROS 2 の紹介 ～](https://gbiggs.github.io/rosjp_ros2_intro/index.html)
    - 講習会の資料で分かりやすい．
- [ros.youtalk.jp](https://ros.youtalk.jp/)
    - 分かりやすい．特に読んでおきたいページを以下に記載しておく．
    - [rclcpp (ROS Client Library for C++) を読み解く (1)](https://ros.youtalk.jp/2017/06/15/rclcpp.html)
    - [rclcpp (ROS Client Library for C++) を読み解く (2)](https://ros.youtalk.jp/2017/06/16/rclcpp2.html)
    - [rclcpp (ROS Client Library for C++) を読み解く (3)](https://ros.youtalk.jp/2017/12/25/rclcpp3.html)
    - [ROS 2のパラメータを使う](https://ros.youtalk.jp/2017/06/20/ros2-parameter.html)
- [Exploring the performance of ROS2](https://dl.acm.org/citation.cfm?id=2968502)
    - ROS1とROS2の比較の話．ROSよりもう少し広い視点から説明していて分かりやすい．
- [An Introduction to Modern CMake](https://cliutils.gitlab.io/modern-cmake/)
- [CMakeスクリプトを作成する際のガイドライン](https://qiita.com/shohirose/items/5b406f060cd5557814e9)

[Distributions]:https://docs.ros.org/en/humble/Releases.html
[rclcppのapi]:https://docs.ros2.org/latest/api/rclcpp/
[rclcppのoverview]:https://docs.ros.org/en/humble/Concepts/About-ROS-2-Client-Libraries.html
[公式チュートリアル]:https://docs.ros.org/en/humble/Tutorials.html
[公式チュートリアルのBeginner: CLI Tools]:https://docs.ros.org/en/humble/Tutorials.html#beginner-cli-tools