<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Executor on Physical AI Hub</title>
    <link>https://physicalaihub.net/tags/executor/</link>
    <description>Recent content in Executor on Physical AI Hub</description>
    <generator>Hugo</generator>
    <language>ja-jp</language>
    <lastBuildDate>Sun, 14 Jun 2026 01:15:54 +0900</lastBuildDate>
    <atom:link href="https://physicalaihub.net/tags/executor/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>リアルタイムなロボットAI基盤：推論・制御・通信の実行予算を設計する</title>
      <link>https://physicalaihub.net/posts/robot-ai-real-time-execution-budget-inference-control/</link>
      <pubDate>Sun, 14 Jun 2026 01:15:54 +0900</pubDate>
      <guid>https://physicalaihub.net/posts/robot-ai-real-time-execution-budget-inference-control/</guid>
      <description>&lt;p&gt;AI推論のベンチマーク値だけで、ロボット全体のリアルタイム性を判断できるのかが気になるテーマです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;先に結論&#34;&gt;先に結論&lt;/h2&gt;&#xA;&lt;p&gt;ロボットのAI処理に、制御30%、推論50%といった普遍的な固定比率はありません。先に制御ループの期限を予約し、センサー入力、アクチュエータ出力、ROS 2通信、スケジューリング干渉、安全余裕を見積もります。その残りをAIに割り当てるのではなく、AIにも独立した周期と期限を設定し、制御が推論の完了を同期的に待たない構成にするのが基本です。&lt;/p&gt;&#xA;&lt;p&gt;判断には平均推論時間ではなく、前処理、メモリ転送、GPU実行、同期、後処理、ROS 2メッセージ処理まで含むエンドツーエンドのp99.9、最大値、ジッター、期限超過率を使います。AIが期限に間に合わない場合は、直近の有効な結果を使うか、安全なフォールバックへ切り替えます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なぜ実行予算が必要か&#34;&gt;なぜ実行予算が必要か&lt;/h2&gt;&#xA;&lt;p&gt;ロボットでは、平均的に速い処理より、まれな期限超過をどう扱うかが重要です。AIが通常は短時間で完了しても、CPUやGPU、メモリ帯域、ドライバ、ログ処理などの競合で一部の周期が遅れれば、制御の決定性は崩れます。実行予算は、周期や締切の中で各処理が使える時間を明示するための枠組みです。&lt;/p&gt;&#xA;&lt;p&gt;ハードリアルタイム経路では、処理時間の上限を見積もり、動的メモリ割り当て、ページフォールト、無制限に待つロック、非リアルタイムなシステムコールを避けます。これらは平均値には表れにくい遅延要因です。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前提となる仕組み&#34;&gt;前提となる仕組み&lt;/h2&gt;&#xA;&lt;p&gt;ROS 2のExecutorは、待機集合から実行可能なサブスクリプション、タイマー、サービス、アクションなどを取り出してコールバックを実行します。SingleThreadedExecutorは単一スレッド、MultiThreadedExecutorは複数スレッドを使います。ただし、一般的なExecutorはハードな優先度順やFIFO実行を保証しません。&lt;/p&gt;&#xA;&lt;p&gt;Callback Groupには、同時実行を制限するMutually Exclusiveと、同時実行を許すReentrantがあります。これはコールバック間の関係を制御しますが、設定だけで締切やリアルタイム性が保証されるわけではありません。&lt;/p&gt;&#xA;&lt;p&gt;QoSにはReliability、History、Deadline、Lifespan、Livelinessなどがあります。通信の信頼性、キュー保持、更新期限、データ鮮度を設計できますが、QoSのDeadlineはデータ更新を監視する機能であり、Executorのコールバック開始時刻や処理完了時刻を保証するものではありません。&lt;/p&gt;&#xA;&lt;h2 id=&#34;予算の分け方&#34;&gt;予算の分け方&lt;/h2&gt;&#xA;&lt;p&gt;まず制御周期を定め、次の順で予算を予約します。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;制御計算、センサー入力、アクチュエータ出力&lt;/li&gt;&#xA;&lt;li&gt;リアルタイム通信処理&lt;/li&gt;&#xA;&lt;li&gt;スケジューリングや共有資源による干渉&lt;/li&gt;&#xA;&lt;li&gt;安全・ジッター余裕&lt;/li&gt;&#xA;&lt;li&gt;AIの前処理、推論、後処理&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;AIを制御周期の「残り時間」に詰め込むと、推論遅延が制御期限を直接圧迫します。制御スレッドまたはリアルタイム向けExecutorはAIの結果を待たず、利用可能な結果の鮮度を確認して使う構成にします。AIの前処理やROS 2通信は別の実行資源に分け、GPU推論は可能な範囲で非同期に投入します。&lt;/p&gt;&#xA;&lt;p&gt;設計上の仮置きとして、100 Hz、10 ms周期なら、制御とI/Oを2 ms、ROS 2通信処理を1 ms、AIのエンドツーエンド処理を6 ms、安全・ジッター余裕を1 msと置けます。ただし、これは標準値でも推奨値でもありません。対象のCPU、GPU、モデル、I/O、ROS 2構成を測定して再設定する必要があります。&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;制御とI/O、通信、安全余裕を先に確保し、AIを独立した期限で実行する予算設計の仮置き例。2・1・6・1 msは推奨標準値ではなく、対象ハードウェアでの計測後に再設定する。&#34;&gt;flowchart LR&#xA;  subgraph CYCLE[&#34;100 Hz・10 ms周期の仮置き例&#34;]&#xA;    CTRL[&#34;制御・I/O\n2 ms&#34;] --&gt; COMM[&#34;ROS 2通信処理\n1 ms&#34;]&#xA;    COMM --&gt; AI[&#34;AIエンドツーエンド処理\n6 ms&#34;]&#xA;    AI --&gt; MARGIN[&#34;安全・ジッター余裕\n1 ms&#34;]&#xA;  end&#xA;  SENSOR[&#34;センサー入力&#34;] --&gt; CTRL&#xA;  AI --&gt;|&#34;期限内に取得&#34;| FRESH[&#34;鮮度を確認して\n制御で利用&#34;]&#xA;  AI --&gt;|&#34;期限超過&#34;| FALLBACK[&#34;直近の有効値\nまたは安全なフォールバック&#34;]&#xA;  FRESH --&gt; ACT[&#34;アクチュエータ出力&#34;]&#xA;  FALLBACK --&gt; ACT&#xA;  CTRL -.-&gt;|&#34;AIの完了を同期的に待たない&#34;| FRESH&lt;/pre&gt;&lt;figcaption&gt;制御とI/O、通信、安全余裕を先に確保し、AIを独立した期限で実行する予算設計の仮置き例。2・1・6・1 msは推奨標準値ではなく、対象ハードウェアでの計測後に再設定する。&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id=&#34;何を測るべきか&#34;&gt;何を測るべきか&lt;/h2&gt;&#xA;&lt;p&gt;AIの計測点は、センサー取得、ROS 2受信、前処理開始、ホストからデバイスへの転送、GPUカーネルの開始・終了、同期、デバイスからホストへの転送、後処理、制御入力、アクチュエータ出力です。GPU処理は非同期に実行できるため、推論APIの呼び出し時間だけでは実際の完了時間を表しません。&lt;/p&gt;</description>
    </item>
    <item>
      <title>ROS 2のノード合成を使い分ける：コンポーネント、ゼロコピー、障害分離の設計</title>
      <link>https://physicalaihub.net/posts/ros2-node-composition-zero-copy-isolation/</link>
      <pubDate>Wed, 20 May 2026 08:53:24 +0900</pubDate>
      <guid>https://physicalaihub.net/posts/ros2-node-composition-zero-copy-isolation/</guid>
      <description>&lt;p&gt;ROS 2の「ゼロコピー」は、配置やミドルウェアの条件を分けて考える必要がある点が気になります。&lt;/p&gt;&#xA;&lt;h2 id=&#34;結論高速化と障害分離は処理チェーンごとに境界を決める&#34;&gt;結論：高速化と障害分離は、処理チェーンごとに境界を決める&lt;/h2&gt;&#xA;&lt;p&gt;ROS 2 Jazzyを前提にすると、カメラ画像やLiDAR点群のような大容量データを連続処理する場合、関連するComposable Nodeを同一プロセスのコンポーネントコンテナへ配置し、Intra-process Communicationを使う構成が有力です。通常のプロセス間DDS通信で必要になるシリアライズや外部トランスポート経由の処理を避けられるため、コピー回数、CPU負荷、通信経路上の待ち時間を減らす方向に働きます。&lt;/p&gt;&#xA;&lt;p&gt;一方、同一プロセス化は障害分離を弱めます。さらに、ゼロコピーは一律に保証されず、メッセージ型、QoS、RMW実装、基盤ミドルウェア、APIの対応状況に左右されます。したがって、通信量の大きい安定した処理チェーンは合成し、実験的なアルゴリズム、頻繁な再起動が必要なノード、障害時にも残したい機能は別プロセスまたは別コンテナへ分ける、という判断が現実的です。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なぜノードの配置が重要なのか&#34;&gt;なぜノードの配置が重要なのか&lt;/h2&gt;&#xA;&lt;p&gt;画像や点群の処理では、センサー取得、前処理、認識、記録など複数のノードがデータを受け渡します。このとき、通信方式や実装に応じた経路・保持領域が関係し、処理段数や購読者数は遅延、CPU負荷、メモリ使用量に影響します。&lt;/p&gt;&#xA;&lt;p&gt;別プロセスに配置したノード間では、通常、ROS 2のDDS/RMW通信経路を通ります。プロセス境界を越えるためのシリアライズやバッファリングが発生しますが、プロセス単位で影響範囲を分けやすい利点があります。逆に、低遅延だけを優先して多数のノードを一つのプロセスへ集約すると、あるノードのクラッシュで同じプロセス内の複数ノードが停止し得ます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前提となる用語&#34;&gt;前提となる用語&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Composable Node&lt;/strong&gt; は、ノードを共有ライブラリとしてビルドし、コンポーネントコンテナへ動的にロードする仕組みです。複数のノードを同一プロセスで動かせます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Intra-process Communication&lt;/strong&gt; は、同一プロセス内のPublisherとSubscription間で使える通信経路です。通常のプロセス間通信とは異なり、同一プロセス内でメッセージを受け渡し、シリアライズを避けられる場合があります。ただし、別プロセスの購読者へ配信する場合は、DDS経路が必要です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;loaned message&lt;/strong&gt; は、PublisherがRMWや基盤ミドルウェアからメモリを借りてメッセージを生成する方式です。同一プロセス内でメッセージの所有権を移動する方式とは異なります。&lt;/p&gt;&#xA;&lt;h2 id=&#34;内部の仕組みとデータ経路&#34;&gt;内部の仕組みとデータ経路&lt;/h2&gt;&#xA;&lt;p&gt;同一コンテナ内のPublisherとSubscriptionでIntra-process Communicationを有効にすると、メッセージは通常のプロセス間DDS経路を通らずに処理されます。その結果、プロセス間転送用のシリアライズ、デシリアライズ、外部トランスポート経由の処理を避けられます。これは遅延とCPU負荷を下げる方向に働きますが、ROS 2全体で共通する削減値が決まっているわけではありません。&lt;/p&gt;&#xA;&lt;p&gt;また、同一プロセス内でもコピーや保持領域が完全になくなるとは限りません。Intra-process Managerの保持領域、QoSの履歴深度、キュー長、購読者数、メッセージの所有権方式によって、メッセージの保持やコピーの挙動が変わります。プロセス間転送用の中間コピーを削減できても、同一プロセス化が常にRSSを減らすとは限りません。&lt;/p&gt;&#xA;&lt;p&gt;「ゼロコピー」を判断する際は、次の経路を区別します。第一は、同一プロセス内でメッセージの所有権を移動する経路です。第二は、RMWや基盤ミドルウェアからメモリを借りるloaned messageです。第三は、共有メモリトランスポートを利用するプロセス間通信です。これらは実装上の条件が異なり、一般に同じ意味でゼロコピーと呼べるわけではありません。第四の通常のシリアライズによるプロセス間通信は、ゼロコピー方式ではなく比較対象です。&lt;/p&gt;&#xA;&lt;p&gt;loaned messageは、RMW実装、基盤ミドルウェア、メッセージ型、Publisher APIが対応している場合に利用できます。条件を満たさなければ、通常のメッセージ確保やコピーへフォールバックします。共有メモリ転送も、実装・設定依存であり、ROS 2アプリケーション全体で自動的に有効になるものではありません。&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;同一プロセス化ではプロセス間転送を減らせる一方、クラッシュ時の影響範囲が広がり得ます。別プロセス化ではDDS/RMW経路が必要になりますが、障害境界を分けやすくなります。外部プロセスへの配信には、合成構成でもDDS経路が発生します。&#34;&gt;flowchart LR&#xA;  subgraph COMPOSED[&#34;同一プロセスのComposable Container&#34;]&#xA;    C[&#34;カメラ&#34;] --&gt;|&#34;Intra-process経路&#34;| P[&#34;画像前処理&#34;]&#xA;    P --&gt;|&#34;Intra-process経路&#34;| R[&#34;認識&#34;]&#xA;    P -.-&gt;|&#34;外部購読者へはDDS経路&#34;| E[&#34;記録・監視ノード&#34;]&#xA;    C:::inside&#xA;    P:::inside&#xA;    R:::inside&#xA;  end&#xA;&#xA;  subgraph SEPARATED[&#34;別プロセス構成&#34;]&#xA;    C2[&#34;カメラプロセス&#34;] --&gt;|&#34;DDS/RMW&#34;| P2[&#34;前処理プロセス&#34;]&#xA;    P2 --&gt;|&#34;DDS/RMW&#34;| R2[&#34;認識プロセス&#34;]&#xA;    R2 --&gt;|&#34;DDS/RMW&#34;| E2[&#34;記録・監視プロセス&#34;]&#xA;    C2:::process&#xA;    P2:::process&#xA;    R2:::process&#xA;    E2:::process&#xA;  end&#xA;&#xA;  X[&#34;プロセス障害&#34;] -.-&gt;|&#34;同一アドレス空間のノードへ波及し得る&#34;| COMPOSED&#xA;  Y[&#34;プロセス障害&#34;] -.-&gt;|&#34;プロセス単位で影響範囲を分けやすい&#34;| SEPARATED&#xA;&#xA;  classDef inside fill:#e8f3ff,stroke:#3777b8,stroke-width:1px&#xA;  classDef process fill:#f5f5f5,stroke:#666,stroke-width:1px&#xA;  style COMPOSED fill:#f2f8ff,stroke:#3777b8,stroke-width:2px&#xA;  style SEPARATED fill:#fafafa,stroke:#666,stroke-width:2px&lt;/pre&gt;&lt;figcaption&gt;同一プロセス化ではプロセス間転送を減らせる一方、クラッシュ時の影響範囲が広がり得ます。別プロセス化ではDDS/RMW経路が必要になりますが、障害境界を分けやすくなります。外部プロセスへの配信には、合成構成でもDDS経路が発生します。&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&#34;mermaid-figure&#34;&gt;&#xA;    &lt;pre class=&#34;mermaid&#34; role=&#34;img&#34; aria-label=&#34;技術構成図&#34;&gt;graph LR&#xA;  subgraph COMPOSED[同一プロセス：Composable Container]&#xA;    C[カメラ] --&gt; P[前処理]&#xA;    P --&gt; R[認識]&#xA;  end&#xA;  E[記録・監視ノード\n外部プロセス]&#xA;  R --&gt;|DDS/RMW\nプロセス間経路| E&#xA;  P -.-&gt;|Intra-process| R&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;図では、カメラ、前処理、認識を同一プロセスへ合成し、外部の記録・監視ノードEをプロセス境界の外に置いています。PからEへ出る経路は、同一プロセス内の受け渡しではなく、DDS/RMWなどを経由するプロセス間通信です。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
