<?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/%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB/</link>
    <description>Recent content in 状態遷移 on Physical AI Hub</description>
    <generator>Hugo</generator>
    <language>ja-jp</language>
    <lastBuildDate>Tue, 16 Jun 2026 08:57:52 +0900</lastBuildDate>
    <atom:link href="https://physicalaihub.net/tags/%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ROS 2 Lifecycle Nodeの実践設計：起動順序・停止処理・異常復旧を状態機械で管理する</title>
      <link>https://physicalaihub.net/posts/ros2-lifecycle-node-state-management/</link>
      <pubDate>Tue, 16 Jun 2026 08:57:52 +0900</pubDate>
      <guid>https://physicalaihub.net/posts/ros2-lifecycle-node-state-management/</guid>
      <description>&lt;p&gt;実機では、ノードの状態とアクチュエータの物理状態を同じものとして扱わない設計が特に気になります。&lt;/p&gt;&#xA;&lt;h2 id=&#34;先に結論&#34;&gt;先に結論&lt;/h2&gt;&#xA;&lt;p&gt;ROS 2の実機システムでは、Lifecycle Nodeを単なる起動・停止フラグではなく、設定、実行、安全停止、再初期化を分ける状態機械として設計します。基本の起動経路は &lt;code&gt;Unconfigured → Inactive → Active&lt;/code&gt;、通常停止は &lt;code&gt;Active → Inactive → Unconfigured&lt;/code&gt;、最終終了は &lt;code&gt;Finalized&lt;/code&gt; へ進める構成です。遷移中の失敗や例外は &lt;code&gt;ErrorProcessing&lt;/code&gt; に分離します。&lt;/p&gt;&#xA;&lt;p&gt;ただし、Lifecycle Node単体が複数ノードの依存関係やプロセス再起動を管理するわけではありません。実機ではLifecycle Managerなどの外部オーケストレータで順序と監視を管理し、物理的な安全停止はハードウェアやコントローラ側にも実装します。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なぜ状態遷移が必要か&#34;&gt;なぜ状態遷移が必要か&lt;/h2&gt;&#xA;&lt;p&gt;通常のNodeでは、プロセス起動後に処理や通信が始まり、設定未完了のセンサーや、依存先が準備できていない制御器が動き出す可能性があります。Lifecycle Nodeは「設定済みだがまだ処理・出力を有効化していない状態」と「実際に動作する状態」を分離します。これにより、起動順序、段階的なアクティベーション、停止後の再初期化を外部から明示できます。&lt;/p&gt;&#xA;&lt;p&gt;状態照会と遷移要求には、&lt;code&gt;ChangeState&lt;/code&gt;、&lt;code&gt;GetState&lt;/code&gt;、&lt;code&gt;GetAvailableStates&lt;/code&gt;、&lt;code&gt;GetAvailableTransitions&lt;/code&gt; などの標準インターフェースを利用できます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;状態と標準遷移&#34;&gt;状態と標準遷移&lt;/h2&gt;&#xA;&lt;p&gt;Lifecycle Nodeの主要状態は次の4つです。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Unconfigured&lt;/code&gt;: 設定前、またはクリーンアップ後&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Inactive&lt;/code&gt;: 設定済みだが、処理や出力は未有効化&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Active&lt;/code&gt;: 処理と出力が有効&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Finalized&lt;/code&gt;: 終了処理後で、通常の再利用経路から外れた状態&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;移行中には &lt;code&gt;Configuring&lt;/code&gt;、&lt;code&gt;CleaningUp&lt;/code&gt;、&lt;code&gt;Activating&lt;/code&gt;、&lt;code&gt;Deactivating&lt;/code&gt;、&lt;code&gt;ShuttingDown&lt;/code&gt;、&lt;code&gt;ErrorProcessing&lt;/code&gt; があります。Configureは &lt;code&gt;Unconfigured&lt;/code&gt; から &lt;code&gt;Inactive&lt;/code&gt; へ、Activateは &lt;code&gt;Inactive&lt;/code&gt; から &lt;code&gt;Active&lt;/code&gt; へ進めます。Cleanupは &lt;code&gt;Inactive&lt;/code&gt; から &lt;code&gt;Unconfigured&lt;/code&gt; へ戻し、Shutdownは主要状態から &lt;code&gt;Finalized&lt;/code&gt; へ移します。&lt;/p&gt;&#xA;&lt;p&gt;遷移コールバックは成功、失敗、エラーの結果を返します。成功なら次の状態へ進み、失敗なら原則として遷移前の主要状態へ戻ります。エラーの場合は &lt;code&gt;ErrorProcessing&lt;/code&gt; に進み、エラー処理の結果で再初期化または終了へ分岐します。&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;Lifecycle Node単体の起動、段階的な停止、遷移エラー時の復旧経路を示す。通常の遷移失敗では遷移前の主要状態へ戻る場合があるため、ErrorProcessingへの分岐はエラー結果を表す。&#34;&gt;flowchart LR&#xA;  U[&#34;Unconfigured&#34;] --&gt;|&#34;Configure&#34;| C[&#34;Configuring&#34;]&#xA;  C --&gt;|&#34;成功&#34;| I[&#34;Inactive&#34;]&#xA;  I --&gt;|&#34;Activate&#34;| AT[&#34;Activating&#34;]&#xA;  AT --&gt;|&#34;成功&#34;| A[&#34;Active&#34;]&#xA;  A --&gt;|&#34;Deactivate&#34;| D[&#34;Deactivating&#34;]&#xA;  D --&gt;|&#34;成功&#34;| I&#xA;  I --&gt;|&#34;Cleanup&#34;| CL[&#34;CleaningUp&#34;]&#xA;  CL --&gt;|&#34;成功&#34;| U&#xA;  U --&gt;|&#34;Shutdown&#34;| S[&#34;ShuttingDown&#34;]&#xA;  I --&gt;|&#34;Shutdown&#34;| S&#xA;  A --&gt;|&#34;Shutdown&#34;| S&#xA;  S --&gt;|&#34;完了&#34;| F[&#34;Finalized&#34;]&#xA;  C -.-&gt;|&#34;エラー&#34;| E[&#34;ErrorProcessing&#34;]&#xA;  AT -.-&gt;|&#34;エラー&#34;| E&#xA;  D -.-&gt;|&#34;エラー&#34;| E&#xA;  CL -.-&gt;|&#34;エラー&#34;| E&#xA;  S -.-&gt;|&#34;エラー&#34;| E&#xA;  E --&gt;|&#34;復旧成功&#34;| U&#xA;  E --&gt;|&#34;処理失敗・継続不可&#34;| F&#xA;  classDef main fill:#e8f1ff,stroke:#3674c5,color:#111;&#xA;  classDef transition fill:#fff4d6,stroke:#c28a00,color:#111;&#xA;  classDef error fill:#ffe5e5,stroke:#c33,color:#111;&#xA;  class U,I,A,F main;&#xA;  class C,AT,D,CL,S transition;&#xA;  class E error;&lt;/pre&gt;&lt;figcaption&gt;Lifecycle Node単体の起動、段階的な停止、遷移エラー時の復旧経路を示す。通常の遷移失敗では遷移前の主要状態へ戻る場合があるため、ErrorProcessingへの分岐はエラー結果を表す。&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id=&#34;コールバックの責務を分ける&#34;&gt;コールバックの責務を分ける&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;主な責務&lt;/th&gt;&#xA;          &lt;th&gt;設計上の注意&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;on_configure&lt;/code&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;code&gt;on_activate&lt;/code&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;code&gt;on_deactivate&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;処理・出力の停止&lt;/td&gt;&#xA;          &lt;td&gt;Activeから安全に停止する&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;on_cleanup&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;確保済みリソースの解放&lt;/td&gt;&#xA;          &lt;td&gt;再Configureできる境界を作る&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;on_shutdown&lt;/code&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;code&gt;on_error&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;異常処理&lt;/td&gt;&#xA;          &lt;td&gt;再利用可能性を判定する&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;センサーの設定や通信資源の確保は &lt;code&gt;on_configure&lt;/code&gt;、データ処理や出力の開始は &lt;code&gt;on_activate&lt;/code&gt; に置きます。停止時は &lt;code&gt;on_deactivate&lt;/code&gt; で処理と出力を止め、再利用しない場合は &lt;code&gt;on_cleanup&lt;/code&gt; または &lt;code&gt;on_shutdown&lt;/code&gt; で資源を解放します。役割を混在させないことが、再初期化のしやすさにつながります。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
