<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>通信設計 on Physical AI Hub</title>
    <link>https://physicalaihub.net/tags/%E9%80%9A%E4%BF%A1%E8%A8%AD%E8%A8%88/</link>
    <description>Recent content in 通信設計 on Physical AI Hub</description>
    <generator>Hugo</generator>
    <language>ja-jp</language>
    <lastBuildDate>Sun, 18 Jan 2026 08:02:39 +0900</lastBuildDate>
    <atom:link href="https://physicalaihub.net/tags/%E9%80%9A%E4%BF%A1%E8%A8%AD%E8%A8%88/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ROS 2通信設計の基本：Topic・Service・Actionをどう使い分けるか</title>
      <link>https://physicalaihub.net/posts/ros2-topic-service-action-selection/</link>
      <pubDate>Sun, 18 Jan 2026 08:02:39 +0900</pubDate>
      <guid>https://physicalaihub.net/posts/ros2-topic-service-action-selection/</guid>
      <description>&lt;p&gt;Topic・Service・Actionは、名前を覚えるより通信契約の違いから考えると整理しやすいテーマです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;先に結論&#34;&gt;先に結論&lt;/h2&gt;&#xA;&lt;p&gt;ROS 2の通信方式は、処理時間だけでなく、クライアントが何を必要とするかで選びます。基本的な判断は次のとおりです。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Topic&lt;/strong&gt;：センサー値や状態など、継続的に流れるデータ&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Service&lt;/strong&gt;：短時間で完了する単発の要求と応答&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt;：進捗・結果・キャンセルを扱う長時間の処理&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;「何秒以上ならAction」というROS 2共通の時間閾値はありません。完了通知、途中経過、キャンセル、再実行、複数Goalの扱いまで含むインターフェース契約で判断するのが基本です。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なぜ使い分けが必要なのか&#34;&gt;なぜ使い分けが必要なのか&lt;/h2&gt;&#xA;&lt;p&gt;ロボットでは、カメラ画像やオドメトリのように継続的に届く情報と、リセットやモード変更のような一度きりの操作が同時に存在します。さらに、ナビゲーションや軌道実行では、開始後も処理が続き、状態を確認したり途中で中断したりする必要があります。&lt;/p&gt;&#xA;&lt;p&gt;これらを一つの通信方式で表すと、通信の意味と実装が合わなくなります。長時間処理をServiceにすると進捗やキャンセルを表現しにくくなり、単純な状態配信をActionにすると構成が過剰になります。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前提となる3つの用語&#34;&gt;前提となる3つの用語&lt;/h2&gt;&#xA;&lt;h3 id=&#34;topic継続的なデータ配信&#34;&gt;Topic：継続的なデータ配信&lt;/h3&gt;&#xA;&lt;p&gt;Topicは、ノード間でメッセージを交換する名前付きの通信チャネルです。Publisherが発行し、Subscriberが受け取るPublish/Subscribeモデルで、複数のPublisherとSubscriberを疎結合に接続できます。&lt;/p&gt;&#xA;&lt;p&gt;センサー値、画像、関節状態、自己位置、オドメトリなど、継続的に更新されるデータが代表例です。通常は、個々のメッセージに対する完了応答ではなく、到着したデータを継続的に利用します。&lt;/p&gt;&#xA;&lt;p&gt;ただし、Topicを選んだだけで通信品質が決まるわけではありません。Reliability、Durability、History、DepthなどのQoSをデータの性質に合わせて設定し、PublisherとSubscriberの互換性も確認する必要があります。&lt;/p&gt;&#xA;&lt;h3 id=&#34;service短時間の要求と応答&#34;&gt;Service：短時間の要求と応答&lt;/h3&gt;&#xA;&lt;p&gt;Serviceは、クライアントがRequestを送り、サーバーがResponseを返す通信です。基本的に一つの要求に対して一つの応答を返すため、短時間で完了する単発処理に向いています。ROS 2の公式ドキュメントも、長時間実行される処理ではなく、短時間で完了する計算にServiceを使うよう説明しています。&lt;/p&gt;&#xA;&lt;p&gt;移動ロボットのリセットやモード切替、マニピュレータの設定変更、即時に返せる状態照会などが適用例です。&lt;/p&gt;&#xA;&lt;p&gt;なお、「Serviceは同期通信」という説明では、通信モデルとクライアントの待機方法を区別しなければなりません。通信契約はRequest/Responseですが、rclpyには応答をFutureで受け取る&lt;code&gt;call_async&lt;/code&gt; APIもあります。呼び出し側が非同期APIを使っても、Serviceの契約自体は変わりません。&lt;/p&gt;&#xA;&lt;h3 id=&#34;action長時間タスクの実行管理&#34;&gt;Action：長時間タスクの実行管理&lt;/h3&gt;&#xA;&lt;p&gt;Actionは、長時間実行される処理を対象とします。クライアントはGoalを送り、実行中にFeedbackを受け取り、最後にResultを取得できます。Goalのキャンセル要求も扱えます。&lt;/p&gt;&#xA;&lt;p&gt;ROS 2のActionプロトコルは、Goal送信、Result取得、キャンセル要求の3つのServiceと、FeedbackおよびStatusの2つのTopicで構成されます。利用者はAction ClientとAction Serverを通じて、タスクのライフサイクルを扱います。&lt;/p&gt;&#xA;&lt;figure class=&#34;mermaid-figure&#34;&gt;&#xA;    &lt;pre class=&#34;mermaid&#34; role=&#34;img&#34; aria-label=&#34;処理時間だけでなく、継続配信、応答、進捗、結果、キャンセルといった通信契約を基準に方式を選択する。&#34;&gt;flowchart TD&#xA;  A[&#34;通信対象を確認&#34;] --&gt; B{&#34;継続的にデータを配信するか&#34;}&#xA;  B --&gt;|&#34;Yes&#34;| C[&#34;Topicを選ぶ&#34;]&#xA;  C --&gt; D[&#34;QoS設定と通信相手との互換性を確認&#34;]&#xA;  B --&gt;|&#34;No&#34;| E{&#34;短時間で一つの応答を返す単発処理か&#34;}&#xA;  E --&gt;|&#34;Yes&#34;| F[&#34;Serviceを選ぶ&#34;]&#xA;  E --&gt;|&#34;No&#34;| G{&#34;長時間タスクで進捗・結果・キャンセルのいずれかを扱うか&#34;}&#xA;  G --&gt;|&#34;Yes&#34;| H[&#34;Actionを検討する&#34;]&#xA;  H --&gt; I[&#34;キャンセル、複数Goal、Goal切替のポリシーを確認&#34;]&#xA;  G --&gt;|&#34;No&#34;| J[&#34;必要な通信契約を再整理&#34;]&lt;/pre&gt;&lt;figcaption&gt;処理時間だけでなく、継続配信、応答、進捗、結果、キャンセルといった通信契約を基準に方式を選択する。&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id=&#34;3方式の比較&#34;&gt;3方式の比較&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;観点&lt;/th&gt;&#xA;          &lt;th&gt;Topic&lt;/th&gt;&#xA;          &lt;th&gt;Service&lt;/th&gt;&#xA;          &lt;th&gt;Action&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;通信モデル&lt;/td&gt;&#xA;          &lt;td&gt;Publish/Subscribe&lt;/td&gt;&#xA;          &lt;td&gt;Request/Response&lt;/td&gt;&#xA;          &lt;td&gt;Goal/Feedback/Result&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;主な対象&lt;/td&gt;&#xA;          &lt;td&gt;継続的なデータ、状態&lt;/td&gt;&#xA;          &lt;td&gt;短時間の単発要求&lt;/td&gt;&#xA;          &lt;td&gt;長時間のタスク&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;完了応答&lt;/td&gt;&#xA;          &lt;td&gt;標準的には持たない&lt;/td&gt;&#xA;          &lt;td&gt;一つのResponse&lt;/td&gt;&#xA;          &lt;td&gt;Resultを取得&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;進捗通知&lt;/td&gt;&#xA;          &lt;td&gt;標準機能として持たない&lt;/td&gt;&#xA;          &lt;td&gt;標準機能として持たない&lt;/td&gt;&#xA;          &lt;td&gt;Feedbackを扱える&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;キャンセル&lt;/td&gt;&#xA;          &lt;td&gt;契約に含まれない&lt;/td&gt;&#xA;          &lt;td&gt;契約に含まれない&lt;/td&gt;&#xA;          &lt;td&gt;キャンセル要求を扱える&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;移動ロボットの例&lt;/td&gt;&#xA;          &lt;td&gt;センサー、オドメトリ&lt;/td&gt;&#xA;          &lt;td&gt;リセット、モード切替&lt;/td&gt;&#xA;          &lt;td&gt;ナビゲーション、ドッキング&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;マニピュレータの例&lt;/td&gt;&#xA;          &lt;td&gt;関節・センサー状態&lt;/td&gt;&#xA;          &lt;td&gt;設定変更、状態照会&lt;/td&gt;&#xA;          &lt;td&gt;把持、搬送、軌道実行&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;主な注意点&lt;/td&gt;&#xA;          &lt;td&gt;QoS互換性&lt;/td&gt;&#xA;          &lt;td&gt;長時間処理に不向き&lt;/td&gt;&#xA;          &lt;td&gt;停止やGoal管理は実装依存&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;ロボット機能への適用&#34;&gt;ロボット機能への適用&lt;/h2&gt;&#xA;&lt;p&gt;移動ロボットでは、センサーノードから認識・制御ノードへ送るセンサー情報、オドメトリ、関節状態などをTopicにします。操作画面からのリセットやモード切替は、短時間で結果を返せるならServiceが候補です。目的地までのナビゲーション、ドッキング、経路追従は、実行中の状態や中断を扱うためActionが適しています。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
