<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Lifecycle Node on Physical AI Hub</title>
    <link>https://physicalaihub.net/tags/lifecycle-node/</link>
    <description>Recent content in Lifecycle Node on Physical AI Hub</description>
    <generator>Hugo</generator>
    <language>ja-jp</language>
    <lastBuildDate>Wed, 04 Nov 2026 15:01:42 +0900</lastBuildDate>
    <atom:link href="https://physicalaihub.net/tags/lifecycle-node/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ROS 2実行時パラメータ設計：動的変更・検証・適用境界をどう決めるか</title>
      <link>https://physicalaihub.net/posts/ros2-runtime-parameter-safety-design/</link>
      <pubDate>Wed, 04 Nov 2026 15:01:42 +0900</pubDate>
      <guid>https://physicalaihub.net/posts/ros2-runtime-parameter-safety-design/</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の実行時パラメータ変更は、再起動なしの運用に役立ちます。ただし、変更できることと、安全に運転中へ即時反映できることは別です。影響範囲が限定された値だけを動的変更の対象にし、型・値域・単位・相互依存関係を検証したうえで、関連パラメータを原子的に更新します。&lt;/p&gt;&#xA;&lt;p&gt;制御ゲイン、速度・加速度上限、衝突判定閾値などは、安全な制御周期境界、またはLifecycle NodeのInactive状態で反映する設計が基本です。資源の再確保、通信設定、QoS、コンポーネント構成の変更を伴う値は、Lifecycle遷移や再起動を適用境界にします。認証・認可、監視、監査、ロールバックまでを一つの運用フローとして設計することが、運用性と安全性を両立する条件です。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なぜ適用境界が必要か&#34;&gt;なぜ適用境界が必要か&lt;/h2&gt;&#xA;&lt;p&gt;ROS 2のパラメータはノードに関連付けられ、ノードのパラメータサービスから取得・設定できます。変更はParameterEventとして通知できるため、再起動せずにセンサー閾値や診断設定を調整し、変更を監視できます。&lt;/p&gt;&#xA;&lt;p&gt;一方、パラメータ機構が支援するのは、主に型やAPIレベルの整合性です。制御安定性、機械的安全、停止距離、センサー間の依存関係まで自動判定するわけではありません。数値として正しいゲインでも、ロボットの機構や制御周期との組み合わせによって安全とは限らないため、「変更可能か」と「運転中に反映できるか」を分けて判断します。&lt;/p&gt;&#xA;&lt;h2 id=&#34;パラメータ変更の仕組み&#34;&gt;パラメータ変更の仕組み&lt;/h2&gt;&#xA;&lt;p&gt;パラメータは宣言して使用し、宣言時に型や説明を付与します。ParameterDescriptorでは、&lt;code&gt;read_only&lt;/code&gt;、動的型付け、整数・浮動小数点の範囲、追加制約などを記述できます。ただし、メタデータだけでドメイン固有の安全条件が満たされるわけではありません。必要な値域や組み合わせ条件は、対象ディストリビューションのAPI仕様を確認し、ノード側の検証処理でも明示します。&lt;/p&gt;&#xA;&lt;p&gt;ノードにはパラメータ変更コールバックを登録できます。コールバックは値が確定する前に候補を検証し、要求を受け入れるか拒否する場所です。ここでアクチュエータを操作したり、再帰的に別のパラメータ変更を呼び出したりせず、検証と実際の適用を分離します。&lt;/p&gt;&#xA;&lt;p&gt;複数のパラメータが関係する場合は、通常の&lt;code&gt;set_parameters&lt;/code&gt;ではなく&lt;code&gt;set_parameters_atomically&lt;/code&gt;を使います。&lt;code&gt;set_parameters&lt;/code&gt;は非原子的で、各パラメータの結果を個別に返します。これに対し、&lt;code&gt;set_parameters_atomically&lt;/code&gt;は候補のいずれかが失敗した場合、パラメータ全体を変更しません。ゲインと上限値など、組み合わせの整合性が必要な変更に適しています。&lt;/p&gt;&#xA;&lt;p&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;パラメータの受付、検証、原子的更新、適用、監視、監査、異常時の復旧を分離した安全な変更フロー。&#34;&gt;flowchart LR&#xA;  A[&#34;変更要求&#34;] --&gt; B[&#34;認証・認可&#34;]&#xA;  B --&gt; C[&#34;型・値域・単位・相互依存を検証&#34;]&#xA;  C --&gt; D{&#34;検証に成功?&#34;}&#xA;  D -- &#34;いいえ&#34; --&gt; E[&#34;変更を拒否して記録&#34;]&#xA;  D -- &#34;はい&#34; --&gt; F[&#34;set_parameters_atomicallyで候補を更新&#34;]&#xA;  F --&gt; G{&#34;適用境界を満たす?&#34;}&#xA;  G -- &#34;いいえ&#34; --&gt; H[&#34;安全な制御周期境界またはInactiveまで保留&#34;]&#xA;  H --&gt; I[&#34;実値へ適用&#34;]&#xA;  G -- &#34;はい&#34; --&gt; I&#xA;  I --&gt; J[&#34;動作・制御状態・異常を監視&#34;]&#xA;  I --&gt; K[&#34;ParameterEventと外部監査ログを記録&#34;]&#xA;  J --&gt; L{&#34;異常を検知?&#34;}&#xA;  L -- &#34;いいえ&#34; --&gt; M[&#34;変更後状態を継続監視&#34;]&#xA;  L -- &#34;はい&#34; --&gt; N[&#34;旧設定へ復元、停止、または再起動&#34;]&#xA;  K --&gt; M&#xA;  N --&gt; O[&#34;復旧結果を記録&#34;]&lt;/pre&gt;&lt;figcaption&gt;パラメータの受付、検証、原子的更新、適用、監視、監査、異常時の復旧を分離した安全な変更フロー。&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id=&#34;lifecycleと適用タイミング&#34;&gt;Lifecycleと適用タイミング&lt;/h2&gt;&#xA;&lt;p&gt;Lifecycle Nodeには、Unconfigured、Inactive、Activeなどの状態と、configure、activate、deactivate、cleanupなどの遷移があります。どの状態でパラメータを適用し、どの資源を再構成するかはノード実装が定義します。Inactive状態だから自動的にアクチュエータ出力が停止する、という保証もありません。&lt;/p&gt;</description>
    </item>
    <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>
