--- #### 資料の使い方 - 説明を読む - 基本的に、灰色枠の中のコードを自分で試す(ただし、以下の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`) - 実行可能ファイルおよびその他の補助ファイルのコレクション <br> 既存パッケージの一覧と検索コマンド `rospack` ```bash rospack list rospack find <パッケージの名前> ``` パッケージディレクトリ ```bash rosls <パッケージの名前> roscd <パッケージの名前> ``` --- ## ノード ROSプログラム(ROSパッケージにある実行可能なファイル)を実行中のインスタンスは、**ノード**と呼ばれます 例: `turtlesim_node`と` turtle_teleop_key` <br> ### rosrun (指定したパッケージの)ノードを実行するコマンド ```bash rosrun <パッケージ名> <実行ファイル名> ``` > 上のデモンストレーションで既に使っています (実行可能ファイルを直接実行することもできますが、rosrunを使ったほうが簡単です) <img src="./v1_media/nodes.png" alt=""/> --- ### rosnode ノードの情報を得る、ノードの状況を制御するためのコマンド - 実行中のすべてのノードの一覧 ```bash rosnode list ``` - ノードに関する情報 ```bash rosnode info <ノードの名前> ``` - ノード停止 ```bash rosnode kill <ノードの名前> ``` > 通常、このコマンドは使用しません。ノードが実行されているコンソールを開き、Ctrl-Cを押してノードを停止します。 --- ## トピックとメッセージ ノード間の通信の主なメカニズムは、**メッセージ**の交換です - メッセージは**トピック**に送信されます - パブリッシャー/サブスクライバーの原理が使用されます(*配信-購読型モデル*)  - 【配信】 一つまたは複数のノード(パブリッシャー・配信者)がトピックにメッセージを送信します  - 【購読】 一つまたは複数のノード(サブスクライバー・購読者)がトピックに購読し、メッセージを受け取ります - コミュニケーションは多対多です <img src="./v1_media/topics.png" alt=""/> --- ### rqt_graph ノード、トピック、メッセージのグラフィックビュー ```bash rqt_graph ``` > 上のデモンストレーションが実行しているときに起動してみてください --- ### rostopic トピックの情報を得る、トピックにメッセージを手動で送信するためのコマンド - すべてのアクティブなトピックの一覧 ```bash rostopic list ``` - トピックに届いているメッセージをコンソールにプリント ```bash rostopic echo <トピックの名前> ``` - トピックに関する情報 ```bash rostopic info <トピックの名前> ``` - 手動でメッセージを送信 コンソールから直接トピックにメッセージをパブリッシュするには`rostopic`コマンドが使えます ```bash rostopic pub <トピック名> <メッセージタイプ> <メッセージの中身> ``` --- ## メッセージタイプ 各トピックは特定のタイプのメッセージをサポートします - タイプは .msg ファイルでの定義 <img src="./v1_media/messages.png" alt=""/> ### rosmsg メッセージタイプ情報を取得するためのコマンド ```bash rosmsg show <メッセージタイプの名前> ``` ### メッセージタイプの例 <img src="./v1_media/messages_example.png" alt=""> - 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ノードがメッセージを受け取ったのを確認してください。 <br> > #### ヒント > > *以上のようなコマンドを手打ちするのは厄介です。* > > *その時、自動補完機能が使えます。コマンドを途中まで書いたときに「タブ」ボタンを押すと、コマンド(の一部)が自動的に補完されます。ぜひ使ってください。* --- → [実習その2](v1_2.html) ← [イントロ](v1_intro.html) ↑ [ホームページ](index.html)