リアルタイムロボット制御とは、指定された期限内に制限されたジッター付きで必要な計算とI/Oを完了させることを意味します。単に高い平均フレームレートを意味するわけではありません。時折数ミリ秒停止する1kHzループより、最悪時にも制御対象の期限を守れる低い周波数のループのほうが適する場合があります。
ROS 2 はリアルタイムシステムの一部となり得ますが、決定性はオペレーティングシステム、カーネル、スケジューリング、CPUおよび割り込みの配置、メモリ挙動、ドライバー、ミドルウェアパス、コントローラコード、ハードウェアインターフェースに依存します。非リアルタイムの知覚、ログ、サービスはクリティカルループ内で実行されるのではなく、境界付きインターフェースを通過すべきです。
このガイドをロボットの ジョイントネットワーク比較 および モーター・ドライバーアーキテクチャと組み合わせて活用してください。リアルタイムの主張では、最悪の信頼できる負荷と定義された故障応答下での測定が必要です。
締め切りと失敗の結果から始める
制御周期、開始時刻の許容ジッター、最悪実行時間、I/Oのタイミング、使用できるデータの経過時間の上限を定義します。次に、期限を1回守れなかった場合の対応を定めます。有界のコマンドを維持するか、性能を落とすか、コントローラーを停止するか、より安全な状態へ移るかを決めます。対応は、制御対象の動作速度と危険性によって異なります。
ソフト、ファーム、ハードリアルタイムは、締め切りの遅延が有用性や受容性にどのように影響するかを表しています。それらはパフォーマンスバッジではありません。ほとんどの一般的なロボットコンピュータにはシステム固有の証拠が必要です。タイミング契約とコントローラー設定を保持し、後のソフトウェア変更で静かに無効にされないようにしましょう。

ハードウェアループは読み取り・更新・書き込みの順に実行する
ros2_controlコントローラーマネージャーのドキュメントでは、コントローラーとハードウェアインターフェースを管理するコンポーネントについて説明し、決定性について論じています。共通ループはハードウェアの状態を読み込み、コントローラを更新し、コマンドを設定されたレートで書き込みます。
物理的なサンプリングとコマンド適用が実際に行われた時点にタイムスタンプを付けます。ソフトウェア関数に入った時刻は、センサーがデータを取得した時刻とは限りません。コントローラーが使う状態データの経過時間と、ドライブに届くコマンドの経過時間を記録します。ループは古いネットワークデータを消費しながらも定期的に実行できます。
| ループステージ | 締め切りの証拠 | 隠れた遅延 | チェック |
|---|---|---|---|
| ハードウェア読み取り | 取得から利用可能になるまでの時間 | デバイスまたはバスキュー | 物理的なタイムスタンプ |
| コントローラーの更新 | 最悪実行時間 | メモリ割り当てまたはロック | トレースで測った所要時間 |
| ハードウェア書き込み | コマンド適用時間 | ネットワークのスケジューリング | ドライブタイムスタンプ |
| データ交換 | 生成から利用までのデータ経過時間 | コールバックバックログ | シーケンスカウンター |
| 故障経路 | 検出から安全状態へ移るまでの時間 | サービスまたはライフサイクル処理 | 意図的に期限逸脱を発生させて確認 |
スケジューリングポリシーにはCPUと割り込み設計が必要です
リアルタイムスレッドは適切な権限を持つ固定優先度のスケジューリングポリシーを使用できますが、優先度だけでは隔離にはなりません。CPUの親和性や割り込み処理はシステム全体を念頭に置いて割り当てます。低優先度のロックを待つ高優先度スレッドでも、期限を逃す可能性があります。
ネットワーク、ストレージ、GPU、カメラ、バックグラウンドサービスからの干渉を測定します。重要なカーネルや安全作業を飢えさせないようにしましょう。スケジューラー、優先度、CPUアフィニティ、電源状態、ファームウェアを記録し、テスト機と展開機の条件を同等にします。
ページフォールトとメモリ割り当ては遅延の上位側を伸ばす
動的割り当て、ページフォールト、メモリの回収、無制限のコンテナ成長は変動遅延を引き起こすことがあります。バッファのプリアロケーション、適切な場所でのメモリロック、関連するコードやデータパスのウォーム、メッセージサイズの制限を管理します。証明された動作なしにタイトループ内でメモリを割り当てたり解放したりしないでください。
メモリ準備はキャッシュ競合やデバイスDMA干渉を解決しません。アプリケーション全体に負荷をかけ、テールレイテンシを点検してください。ループがアクティブな間、エラーパス、パラメータ変更、コントローラー遷移が予期せず割り当てられたりブロックされたりしないか確認してください。
ブロックI/Oとログ記録はループの外に置かれるべきです
ファイル書き込み、コンソール出力、同期サービス、DNS、動的ディスカバリー、一般的なコールバックの待ち時間は、特定の実装が境界を証明しない限り、ハードバウンド更新パス内で適切ではありません。リアルタイムセーフな仕組みを通じて、優先度の低い消費者にコンパクトな診断を送信します。
キュー長を制限し、新しいデータや古いデータをドロップするかを判断します。無制限ログはタイミングの問題をメモリの増加に移すことができます。診断が放棄された場合でもカウンターを保持し、証拠が破棄されたからといってシステムが健全に見えないようにしましょう。

リアルタイムセーフバッファはタイミング領域を分離します
非リアルタイムプランナーはコマンドや軌道をロックフリーまたは有界ハンドオフに公開でき、コントローラーはプロデューサーを待たずに最新の完全オブジェクトを読み取ることができます。状態は別の有界スナップショットを通って外側へ移動できます。データの所有権と有効期間を明確にする必要があります。
コマンドシーケンス、タイムスタンプ、タイムアウトを検証します。もしプロデューサーがストールした場合、インナーループは古いトルクを永遠に繰り返してはいけません。パラメータの更新やモードスイッチも、部分的に更新された構成がアクチュエーターに届くことがないように、原子的または段階的な適用が必要です。
| 動作 | クリティカルループ? | 推奨パターン | 故障ポリシー |
|---|---|---|---|
| 関節状態を読み取る | はい | バウンデッドハードウェアインターフェース | 古くなったサンプルを検出する |
| 制御則の更新 | はい | 処理量とメモリ使用量を一定の範囲に制限 | 期限逸脱を監視 |
| アクチュエーターコマンドを書きます | はい | 有界インターフェース | ローカルタイムアウト |
| セーブログ | いいえ | ワーカーへの境界キュー | ドロップ・アンド・カウント |
| サービスまたはパラメータ処理 | いいえ | 変更を準備してから一括で切り替える | 無効な状態遷移を拒否する |
DDS は役に立ちますが、モーター電流ループはデフォルトではありません
DDS および ROS 2 通信は設定可能なサービス品質や分散アプリケーションをサポートできますが、内部の電流ループはしばしばドライブや専用コントローラ内で動作します。ネットワークとエグゼキューターを通る経路を、厳しい関節制御の期限内に組み込む前に測定する必要があります。
タイミング証拠が合う場合には、オーケストレーション、軌道、状態、そして上位層には ROS 2 を活用しましょう。破損につながる過電流への高速保護は、ローカルに実装します。ミドルウェアの選択は、ドライブレベルの決定論的制御やハードウェア安全回路の代替ではありません。
トレーシングは稀なスケジューリングやコールバック遅延を露呈します
ROS 2 ドキュメントには、実行分析のための トレースガイダン スが含まれています。コントローラー周期、コールバック、I/O、期限監視を、負荷が小さく影響を把握した計測手段で記録します。トレースをドライブログやネットワークログと整合させます。
短期平均ではなく、長期的なヒストグラムや最大値を収集しましょう。CPU、ネットワーク、ストレージ、熱スロットリング、グラフィックス負荷を再現します。各テールの前にどのイベントが先行したかを特定しましょう。痕跡のない単一の最大値は修正が困難ですが、最大値を欠くパーセンタイルは危険な見逃しを隠すことがあります。
リアルタイムカーネルは一部のシステムでは必要ですが、十分ではありません
プリエンプティブ可能なリアルタイムカーネルはスケジューリング遅延を削減できますが、アプリケーションのロック、ドライバー、ファームウェア、電源管理、実行時間に上限のないコードによる遅延は残ります。逆に、タイミング要件が比較的緩やかな制御対象では、十分に測定した非リアルタイム構成で期限を守れる場合もあります。要件と証拠が決定します。
BIOS、CPUの電源状態、熱挙動、ドライバーのバージョンを検証してください。カーネル、ミドルウェア、コントローラー、ハードウェアのアップデート後に再テストしてください。本番イメージと展開設定は、タイミングレポートとともにバージョン設定されるべきです。
ストレステストにはミスと回復が含まれなければなりません
最大コントローラ数、フルネットワークトラフィック、センサーストリーム、ログ記録、そして現実的なアプリケーション負荷を実行しましょう。サーマルソーク、ストレージアクティビティ、エラー処理を追加しましょう。制御周期、実行時間、センサー取得から制御までの経過時間、コマンド適用までの経過時間、連続した期限逸脱の回数を測定します。
サポートされている場合は、ステールステート、コントローラーエラー、ハードウェアタイムアウト、クロック変更を注入します。意図された非稼働モード、停止モード、または劣化モードを確認してください。リアルタイムループは、その故障挙動が制限されている場合にのみ運用的に有用です。
- 制御周期、ジッター、データの経過時間に関する要件を明記します。
- 読み取り・更新・書き込みの経路の実行時間に上限を設けます。
- メモリを事前確保し、処理を止め得る作業はループの外へ移します。
- フル稼働時のテールレイテンシをトレースします。
- 古いデータや欠落したサイクルの挙動を定義し、テストします。
よくある質問
ROS 2自体がリアルタイムオペレーティングシステムなのでしょうか?
いいえ。ROS 2 はミドルウェアやライブラリを提供します。OS、スケジューリング、コード、ドライバー、ハードウェアを適切に設計・測定して初めて、リアルタイムシステムの一部として利用できます。
DDSを使えば関節制御ループのタイミングは決定論的になりますか?
自動的に保証されるわけではありません。QoSは通信の振る舞いを制御するのに役立ちますが、エンドツーエンドの遅延、エグゼキューターのスケジューリング、ハードウェアでのコマンド適用時間については、なお計測による根拠が必要です。
高い制御周波数が常に良いのでしょうか?
いいえ。プラント、センサー、アクチュエーター、計算は十分な余裕を持ってそれを支えなければなりません。締め切りを逃す速いループは性能が悪くなることがあります。
Pythonはハードリアルタイムのモーターループを実行できますか?
典型的なPythonの実行には非決定性の原因があり、通常は最もタイトなループの外に置かれます。測定された要件とアーキテクチャが許す場合のみ使用してください。
まずどのタイミングを測定すべきでしょうか?
キャプチャからコマンドまでの全チェーンを測定し、周期、最悪実行、ジッター、状態年齢、コマンド-適用遅延、ミスサイクル回復などが含まれます。
リアルタイム制御境界注記
ROS 2 とリアルタイムカーネルだけでは決定性が保証されません。スケジューリング、メモリ、ドライバ、通信、コントローラコード、ハードウェアI/Oを最悪のケース負荷下で検証し、関連するすべての故障遷移を行います。