PyLoT

AboutBlogSupport UsContact

🤖

ROS2の基礎

Koki Muramoto

2025/9/21

ROS2の概念

ROS 2の概念について簡単に説明します。Node(ノード)・Topic(トピック)・Rviz2(描画ソフト)・Service(同期通信)・Action(非同期通信)・Rosbag2(ログデータ)・TF2(座標系管理)加えてイメージセンサ、LiDARセンサを使うなら、component、Interface、lifecycle、Gazeboなどなど色々な概念があります。これらを解説していきます。

特にComponentを使えるとデータ通信に関わる通信負荷や実行負荷が減ります。わからなければ、ネットの資料をみてもらえればと思います。

ノード

ノードとは、計算を実行するプロセスです。トピック・サービス・アクション・パラメータなどを通じて他のノードと通信するグラフの一部です。原則として、一つのノードに一つの機能を載せることが推奨されています。(が、現実はそううまくいかない...)

機能で分けると言う点では、現在の夏ロボの実装のようなmbedでのスレッドに近い概念ですが、厳密には異なります。(なぜならノードをマルチスレッドで処理することもできるため。)

また、各ノードは一意のノード名を持ちます。また、ノードを階層的に整理するための名前空間を使うこともできます。

これにより、同種のノードを複数台構成するとき(例:複数ロボット)、/robot1/camera や /robot2/camera のように名前で区別できます。

ノード間通信とグラフ構造

これから個々の通信の説明に入る前にノード間通信の概要について話します。

ROS 2 システムは、複数のノードがネットワークグラフとしてつながるように構成されています。ノードが持っているインターフェースは次の4つあり、

・トピック(Topic)

・サービス(Service)

・アクション(Action)

・パラメータ(Parameter)

それぞれのノードは、これらのインターフェースを通じてデータを交換します。

このため、ノード同士が直接接続されていなくても、「同じトピック名」や「同じサービス名」を共有していれば通信できます。

この仕組みにより、システムは疎結合(loose coupling)を実現します。たとえば、カメラノードを別メーカーのものに置き換えても、同じトピック名でメッセージを発行していれば、下流の画像処理ノードはそのまま動作します。

トピック

ROS 2 において、トピック(Topic) は、ノード同士がメッセージを受け渡すための公開/購読型(publish / subscribe)インターフェースのひとつです。

ノード間で非同期にデータをやりとりするための手段として使われます。 主にやり取りするデータは、連続データで、だいたい時系列が関係あるものだったり、センサーデータなどが挙げられます。

実際に使用するものとしては、realsenseのカメラ画像であったり、LiDARの点群データや、速度指令、オドメトリ、などなど。 以下のGIFは公式ページから取ってきたものです。こんな感じで通信しています。

Rviz2

ROS Visualizer 2の略でRviz2という名前になったそうです。ROSが提供している標準のメッセージ型であれば表示できます。 基本的には、LiDARのデータ、自己位置、経路生成の描画とかで使用することが多いです。 自分でプラグインを作成して、新たなVisualizerを作ることも可能ですが、jsk_visualizerのような、オープンソースで優秀な描画プラグインもあるので、そのようなものを利用するのが良いと思われます。

画像と例ロボットのセンサ一位置表示とか..

点群表示とか

各部分の使い方はこちらの外部記事を参照してください。

Service

同期通信(用)。サーバーとクライアントが存在し、確実に通信が返ってくることを保証しています。

サーバ リクエストを受け取り、処理してレスポンスを返す

クライアント リクエストを送信して、レスポンスを待つ

srvファイル 通信で使用するデータ型(RequestとResponse)を定義する

Action

非同期通信(用)。処理中の経過に関する情報が欲しい場合は、Actionサーバーに関して実装する。例えば指定地点まで移動などがあります。

サーバ リクエストを受け取り、処理中は、フィードバックを返し処理してレスポンスを返す

クライアント リクエストを送信して、レスポンスを待つ

Actionファイル 通信で使用するデータ型(RequestとfeedbackとResponse)を定義する

ROS 2でよく使用するCLI

ROS 2環境の設定

ROS 2のコマンドやCLIのエントリポイント登録。ひとまずおまじないと思っておけば良い。

source /opt/ros/jazzy/setup.bash

自分がコードを書いているレポジトリのエントリポイント登録。初めての場合はスキップして良い。

source ~/your_ws/install/setup.bash 

ROS 2 CLI Topic(一番使うだろうもの)

現在このCLIから見れているトピックのリストを表示する。

ros2 topic list

指定したtopic名のデータの中身を表示する。

ros2 topic echo トピック名

指定したtopic名にデータを送る。

ros2 topic pub トピック名 データ型 "データの中身"

指定したtopic名から受け取ったデータが何hzかを表示する。

ros2 topic hz トピック名

指定したtopic名のデータ型が何であるかを表示する

ros2 topic info トピック名

指定したtopic名のデータ型の中身が何であるかを表示する

ros2 interface show データ型

指定したtopic名のbandwidthがどれぐらいであるかを表示する。

ros2 topic bw トピック名

指定したデータ型がどのトピックで使用されているかを表示する。

ros2 topic find トピック名

Node

パッケージからノードを実行する

ros2 run パッケージ名 実行ノード名

起動中のノード名

ros2 node list

パラメータのremapping

ros2 run パッケージ名 実行ノード名 --ros-args --remap 変えたい値:=変更した値

ex)

ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

ノードが持つPublisherやSubscriber、SeviceやActionの情報を表示する

ros2 node info ノード名

service

同期通信

利用可能なサービスサーバーの表示

ros2 service list

オプションで-tを加えるとサービスtypeが表示される

ros2 service list -t

指定したサービスサーバーの型を表示する

ros2 service type <サービス名>

指定したサービス名の情報を表示クライアント名とサービス名が返ってくる。

ros2 service info <サービス名>

指定したサービス型を持っているサービス名を表示する

ros2 service find <サービス型名>

指定したサービスを呼び出す。

ros2 service call <サービス名> <サービス型> <呼び出す時のデータの中身>

Parameter

ノードごとにどのようにどんなパラメータがあるのかを表示する。

ros2 param list

指定したノード内の指定したパラメータ名の値を表示する

ros2 param get ノード名 パラメータ名

指定したノード内の指定したパラメータ名の値を、指定した値に設定する。

ros2 param set <ノード名> <パラメータ名> <設定する値>

あるノードに設定されているパラメータを一覧で表示する。

ros2 param dump <ノード名>

tipsとしてyamlに書き出すこともできる。例

ros2 param dump /turtlesim > turtlesim.yaml

指定したノードにパラメータ設定ファイルからパラメータを設定する。

ros2 param load <ノード名> <パラメータファイルのパス>

実行時にパラメータをパラメータ設定ファイルから設定する

ros2 run <パッケージ名> <実行ノード名> --ros-args --params-file <ファイルパス>

Action

起動しているactionサーバーを表示

ros2 action list

指定したactionサーバー(クライアント)のアクションの型名を確認する

ros2 action type アクションサーバー名

指定したactionを受け付けるサーバーとそのクライアントを情報を表示する

ros2 action info アクション名

指定したアクションサーバーを呼び出す。

ros2 action send_goal <アクション名> <アクションの型> <値>

アクションの型の定義を確認する

ros2 interface show 型名

便利コマンド

返り値に実行可能なエントリポイント名が返ってくる。

ros2 pkg executables パッケージ名

現在登録されているパッケージ名を調べることができる。開発中ワークスペースでsourceを忘れているとこちらのコマンドでパッケージ名を見ることができないので注意。

ros2 pkg list

ros2のパッケージを作るコマンド

こちらを参照することをお勧めする。 https://qiita.com/naga-karupi/items/f7e1dc4cfe65e5783181

ros2 pkg create パッケージ名 --dependencies 依存しているパッケージたち --node-name ノード名 --build-type ament_cmakeかament_python --library-name ライブラリの名前