---
#### 資料の使い方
- 説明を読む
- 基本的に、灰色枠の中のコードを自分で試す(ただし、以下のROSインストールは行わないでください)
```bash
コードがこんな枠に入っています
```
---
# ROSを使ってみる
---
## ROSのインストール方法
自分のPCにROSをインストールしたければ、以下は基本的な手順です。(Ubuntu 20.04、ROS Noeticの場合)
> 実習では配布さられたPCを使います。ROSのインストールは不要です。
- こちらの説明に従ってください: https://wiki.ros.org/noetic/Installation/Ubuntu
### デモンストレーション
- 以下の3つのコマンドを実行してみてください
- 各コマンドを違うコンソールで実行します(コンソールを開くためのUbuntu上のショートカットはCtrl-Alt-Tです)
```bash
# コンソール1で実行
roscore
```
> roscoreコマンドについて下で説明します
```bash
# コンソール2で実行
rosrun turtlesim turtlesim_node
```
> 簡単なロボットシミュレータが開きます(亀ロボット)
```bash
# コンソール3で実行
rosrun turtlesim turtle_teleop_key
```
> キーボードを使ってシミュレータ内の亀ロボットを操作できますので、試してみてください
起動したままにしておいてください
---
# ROSの基本コンポーネント
---
## ROSマスター
- ROSを使用するために実行する必要がある中央プログラム
- ROSを使っている間に必ずROSマスターを実行しないといけません
- 実行するコマンド: `roscore`
- ROSのすべての部分間の通信など、基本的な機能を提供します
---
## パッケージ
ROSは**パッケージ**で編成されています (例:`turtlesim`)
- 実行可能ファイルおよびその他の補助ファイルのコレクション
既存パッケージの一覧と検索コマンド `rospack`
```bash
rospack list
rospack find <パッケージの名前>
```
パッケージディレクトリ
```bash
rosls <パッケージの名前>
roscd <パッケージの名前>
```
---
## ノード
ROSプログラム(ROSパッケージにある実行可能なファイル)を実行中のインスタンスは、**ノード**と呼ばれます
例: `turtlesim_node`と` turtle_teleop_key`
### rosrun
(指定したパッケージの)ノードを実行するコマンド
```bash
rosrun <パッケージ名> <実行ファイル名>
```
> 上のデモンストレーションで既に使っています
(実行可能ファイルを直接実行することもできますが、rosrunを使ったほうが簡単です)
---
### rosnode
ノードの情報を得る、ノードの状況を制御するためのコマンド
- 実行中のすべてのノードの一覧
```bash
rosnode list
```
- ノードに関する情報
```bash
rosnode info <ノードの名前>
```
- ノード停止
```bash
rosnode kill <ノードの名前>
```
> 通常、このコマンドは使用しません。ノードが実行されているコンソールを開き、Ctrl-Cを押してノードを停止します。
---
## トピックとメッセージ
ノード間の通信の主なメカニズムは、**メッセージ**の交換です
- メッセージは**トピック**に送信されます
- パブリッシャー/サブスクライバーの原理が使用されます(*配信-購読型モデル*)
- 【配信】 一つまたは複数のノード(パブリッシャー・配信者)がトピックにメッセージを送信します
- 【購読】 一つまたは複数のノード(サブスクライバー・購読者)がトピックに購読し、メッセージを受け取ります
- コミュニケーションは多対多です
---
### rqt_graph
ノード、トピック、メッセージのグラフィックビュー
```bash
rqt_graph
```
> 上のデモンストレーションが実行しているときに起動してみてください
---
### rostopic
トピックの情報を得る、トピックにメッセージを手動で送信するためのコマンド
- すべてのアクティブなトピックの一覧
```bash
rostopic list
```
- トピックに届いているメッセージをコンソールにプリント
```bash
rostopic echo <トピックの名前>
```
- トピックに関する情報
```bash
rostopic info <トピックの名前>
```
- 手動でメッセージを送信
コンソールから直接トピックにメッセージをパブリッシュするには`rostopic`コマンドが使えます
```bash
rostopic pub <トピック名> <メッセージタイプ> <メッセージの中身>
```
---
## メッセージタイプ
各トピックは特定のタイプのメッセージをサポートします
- タイプは .msg ファイルでの定義
### rosmsg
メッセージタイプ情報を取得するためのコマンド
```bash
rosmsg show <メッセージタイプの名前>
```
### メッセージタイプの例
- geometry_msgs/Point
- 3つのfloat変数しか含まれていません
- sensor_msgs/Image
- タイムスタンプなどを含むメッセージ std_msg/Header が含まれています
- 画像ピクセルのデータはdata配列に入っています
- geometry_msgs/PointStamped
- より複雑な例
---
## 色々試してみよう
### 話し手ノード
まず、デモンストレーションなどで使っていたノードを全て停止してください。
ROSマスターが停止しているなら、起動します。
```bash
roscore
```
次に、`rospy_tutorials`パッケージの`talker`ノード
```bash
rosrun rospy_tutorials talker
```
### talkerノードを分析してみましょう
以下のを試してください。
実行中ノードのリスト
```bash
rosnode list
```
> 注意: /rosout はROSシステムが使われているノードです。roscoreを実行するときに作成されます。基本的にそのノードを無視していいです。
talkerノード情報
```bash
rosnode info /talker...
```
> Publications = どのトピックに配信しているか
> Subscriptions = どのトピックに購読しているか
chatter というトピックに投稿しているはずです。
### トピックchatterについて調べましょう
トピックに関する情報
```bash
rostopic info /chatter
```
> Type = どのメッセージタイプですか
> Publishers = どのノードが配信しているか
> Subscribers = どのノードが購読しているか
タイプ
```bash
rostopic type /chatter
```
> メッセージタイプをプリント (std_msgs/String)
メッセージの中身
```bash
rostopic echo /chatter
```
> トピックに購読して、配信されたメッセージを連続的にプリントします
> (ひつのメッセージだけをプリントするためコマンドに `-n 1` を追加できます)
メッセージ配信頻度
```bash
rostopic hz /chatter
```
### 聞き手ノード
ノード `listener`を加えて実行しましょう
```bash
rosrun rospy_tutorials listener
```
> 受信したメッセージ(とタイムスタンプ)がプリントされます
### 詳しく見てみましょう
ノードのリスト
```bash
rosnode list
```
> listenerノードも一覧に入っているはずです。
chatterのメッセージの情報を確認しましょう
```bash
rostopic info /chatter
```
> Subscribers にlistenerノードが入っています。
### 手動のメッセージを送信する
まずは、talkerノードを停止してください。
その後、以下のコマンドでメッセージを送信しましょう。
```bash
rostopic pub /chatter std_msgs/String "data: 'Kyoto loves ROS'"
```
> listenerノードがメッセージを受け取ったのを確認してください。
> #### ヒント
>
> *以上のようなコマンドを手打ちするのは厄介です。*
>
> *その時、自動補完機能が使えます。コマンドを途中まで書いたときに「タブ」ボタンを押すと、コマンド(の一部)が自動的に補完されます。ぜひ使ってください。*
---
→ [実習その2](v1_2.html)
← [イントロ](v1_intro.html)
↑ [ホームページ](index.html)