ティアフォーのエンジニアである石川が、9/9(火)に開催されたROSCon JP 2025で「CallbackIsolatedExecutor: 二重スケジューリングを不要にする新しいExecutorとスケジューリング理論」をテーマに講演を行いました。本記事では、その講演を振り返ります。
講演の概要
1. ROS 2のExecutor(ミドルウェアレイヤのタスクスケジューラ)の存在により、オペレーティングシステム(Operating System:OS)レイヤとの間で二重スケジューリングが発生し、リアルタイムスケジューリングが複雑化するという問題がありました。
2. この問題を解消するため、新しいExecutorであるCallbackIsolatedExecutor(CIE)を考案しました。
3. CIEによって二重スケジューリング問題が解消し、ROS 2のCallbackGroupに対して直接優先度やコアアフィニティを指定できるようになりました。
4. ティアフォーでCIEを導入したことにより、自動運転用のオープンソースソフトウェア「Autoware」を基盤としたロボットタクシーで、最悪時のレスポンスタイムが計測ベースで約5倍改善しました。
本発表は、リアルタイム系トップカンファレンスであるRTAS 2025に採択された論文「Work in Progress: Middleware-Transparent Callback Enforcement in Commoditized Component-Oriented Real-time Systems」の内容を含んでいます。論文のプレプリントはarXivで見ることができ、IEEEでも公開されています。
ティアフォーのGitHubでは、CallbackIsolatedExecutorの実装も公開されています。
ティアフォーが開発している自動運転システムは、「Autoware」というオープンソースの自動運転プラットフォームを基盤にしています。「Autoware」は、Robot Operating System 2(ROS 2)というミドルウェア上に構築されたアプリケーションで、ROS 2が提供するNodeというフレームワークに基本機能を担う各種のNodeが実装されています。例えば、点群データの歪みを補正するNode、障害物を避ける機能を担当するNodeなどがあります。

最小機能を実装した各種Nodeの集合体が、相互にPublish/Subscribe通信を行うことで、システム全体として自動運転の機能が実現します。以下の図が示す通り、機能単位であるNodeは複数のCallbackを持ちます。Callbackは、SubscribeしているTopicから受け取ったメッセージを引数に実行され、次のTopicへメッセージをPublishします。このPublish/Subscribeのリレーによって、システム全体で複数のデータフローが形成されます。これらのデータフローには一般的に時間制約があり、多くの場合End-to-end Response Timeと呼ばれます。End-to-end Response Timeとは、システムへの入力などのイベントの発生から、それに対するシステムの最終的な応答が完了するまでにかかる時間を意味します。

論理的な正しさだけでなく、時間制約も出力の正しさに考慮されるシステムであるリアルタイムシステムのうち、伝統的なものは単純なコントロールループだけで構成されていました。例えば、20ミリ秒ごとに起動する無限ループがあり、毎周期10ミリ秒以内に処理を終えなくてはならないといった形です。しかし、自動運転システムをはじめとする次世代サイバーフィジカルシステムでは、先に説明したような複数のサブタスク(ROS 2におけるCallback)から構成されるデータフロー型タスクの時間制約を扱わなくてはなりません。興味のある方は、「DAG Scheduling」や「Cause Effect Chain」といったキーワードで論文検索してみてください。
例に漏れず、「Autoware」も複数の時間制約付きDirected Acyclic Graph(DAG)から構成されます。以下の図は、「Autoware」を基盤にしたロボットタクシーが持つ時間制約付きDAGの集合を、一部詳細を省略して可視化したものです。私たちは主に、ピンク色のTop LiDAR Preprocessing、青色のLocalization、緑色のPerception、黄色のPlanning、橙色のControlの5つのDAGをボトルネックとして認識しています。赤い矢印は、時間制約付きのDAGではあるものの、時間制約に対して全体の実行時間が極端に小さく、ボトルネックにはなっていない部分です。ボトルネックとなっている5つのDAGのレスポンスタイムを最適化するために、各種Callbackに優先度やコアアフィニティなどのScheduling Attributesを設定する必要があります。DAG Schedulingと呼ばれる研究分野では、時間制約を満たすために、タスクを構成する各サブタスクに優先度やコアアフィニティを設定するのが一般的です。

しかし、ROS 2システムにおいてDAG Schedulingを実現するのは容易ではありません。それは、以下の図に示す通り、サブタスクであるCallbackの実行スケジューリングを担う主体が、ミドルウェアレイヤ(Executor)とOSレイヤ(Linuxなど)の2つに存在し、二重スケジューリングが発生するためです。つまり、Callbackの実行が進行するタイミングに関しては、まずミドルウェアレイヤがCallbackが実行可能になるタイミングを判断し、OSのスレッドに実行を依頼します。そして、そのスレッドの実行が進行するタイミングはOSレイヤのスケジューラが判断します。リアルタイムシステムの学術界は、この二重スケジューリングを前提として理論を構築してきましたが、この複雑さが伝統的なスケジューリングアルゴリズムの効果的な活用を妨げてきました。例えば、二重スケジューリングの問題が発生する以前に、ピュアなDAG Schedulingの研究が多く行われていましたが、その研究資産をそのまま活用することができません。ROS 2の二重スケジューリングに関する先行研究については、RTAS 2025に採択されたCallbackIsolatedExecutorに関する論文の参考文献を参照してください。

この問題を解決すべく、私たちは新しいExecutorであるCallbackIsolatedExecutorを考案し、それによって二重スケジューリング問題を回避できると考えました。以下の図では、従来のExecutorであるSingleThreadedExecutorとMultiThreadedExecutorの設計と、新しいExecutorであるCallbackIsolatedExecutorの設計を比較しています。SingleThreadedExecutorは、複数のCallbackに対して1つのスレッドが対応しているため、Callbackごとに独立したScheduling Attributesの設定ができませんでした。MultiThreadedExecutorは、Callbackの実行の進行が可能になるたびに複数のスレッドからランダムに割り当てられるため、特定のScheduling Attributesを設定することができませんでした。CallbackIsolatedExecutorは、CallbackGroupとスレッドが一対一に対応する設計になっています。

DAG SchedulingのサブタスクにあたるCallbackに対して直接Scheduling Attributesを設定できることが望ましく、それはCallbackごとに独立したCallbackGroupを割り当てることで実現できます。CallbackIsolatedExecutorの登場によって、Linux上でのROS 2システムのスケジューリング問題は、以下の図のように定式化できます。Executor層はリアルタイムスケジューリングのモデル上で無視できるようになり、実務的な面では、二重スケジューリングの研究の重要性は小さくなりました。

CallbackIsolatedExecutorにおける各CallbackGroupのScheduling Attributesの設定は、システム全体で1つのYAMLファイルを書くことで完了します。配列構造になっている設定フォーマットの1つのエントリが、1つのCallbackGroupの設定に相当します。設定ファイルの詳細な説明は、READMEに記載されています。

CallbackIsolatedExecutorと類似した取り組みとして、REP-2017があります。これは以下の図のように、ROS 2のアプリケーションからrclに対してYAML設定ファイルを渡せるようにし、この設定をExecutorが読み取ってScheduling Attributesを設定できるようにするものです。CallbackIsolatedExecutorとは異なり、YAMLファイルによる設定は1エントリが1Executorに対応します。以下のサンプルコードのように、CallbackGroupごとにSingleThreadedExecutorを作成し、それぞれを別スレッドで実行させると、CallbackIsolatedExecutorと同等の機能を実現できます。

REP-2017と比較したCallbackIsolatedExecutorの利点は、第一にrclやrclcppへの変更が一切不要で、独立したパッケージをインストールするだけで済む点です。REP-2017は2025年9月現在、まだマージされておらず、今後マージされるかどうかも分かっていません。また、SCHED_FIFOなど、Linuxにおけるリアルタイムスケジューリングポリシーを設定するためには、通常CAP_SYS_NICEなどの特別な権限をプロセスに与える必要があります。しかし、CallbackIsolatedExecutorの場合はThread Configurator Nodeと呼ばれる1プロセスのみに設定すればよいため、権限範囲を最小化できるセキュリティ上の利点もあります。
CallbackIsolatedExecutorは現在「Autoware」に導入されつつあり、ティアフォーのロボットタクシーで先行評価されています。以下の図は、CallbackIsolatedExecutorを導入して5つのDAGのレスポンスタイムを最適化した際に、デフォルトのLinuxスケジューラであるCFSを特別な調整なしで実行した場合(灰色線)と比較して、どれだけレスポンスタイムが改善したかを示しています。これはロボットタクシーを公道上で走行させた際の計測結果であり、横軸は経過時間(秒)です。結果として、最悪時のレスポンスタイムが約5倍改善され、実測ベースで大幅なリアルタイム性能の向上が確認されました。優先度やコアアフィニティの割り当てなどのスケジューリングアルゴリズムは依然としてヒューリスティックに基づくものですが、理論的な研究も進めています。

CallbackIsolatedExecutorの導入は容易であり、その方法はREADMEに記載されています。2025年9月現在はソースビルドでのみ提供されていますが、ROSビルドファームからの配布に向けた準備も進められています。CallbackIsolatedExecutorは単独パッケージとしてだけでなく、ティアフォーが開発しているROS 2互換のゼロコピーミドルウェアであるAgnocastにも実装されています。Agnocastに関する発表は、ROS Japan UG #59で実施され、ROSCon 2025でも行われる予定です。ROSCon JPと同様に録画が残るので、ご興味のある方はぜひご覧ください。
CallbackIsolatedExecutorおよびAgnocastは、オープンソースソフトウェアの「Autoware」への導入が進められており、ティアフォーの製品にも取り入れられています。ティアフォーでは、挑戦的な研究開発を製品へ導入する姿勢を大切にしています。
Takahiro Ishikawa | 石川 貴大
システムソフトウェア部
マイクロオートノミー本部 システムソフトウェア部部長。2022年4月入社。2020年から学生エンジニアとして勤務。東京大学大学院・情報理工学系研究科修士課程修了後、現在は社会人博士課程に在籍。専門分野はオペレーティングシステムとリアルタイムシステム。
ティアフォーでは、「自動運転の民主化」というビジョンに共感を持ち、自らそれを実現する意欲に満ち溢れた新しい仲間を募集しています。
多くの職種で採用をしています。詳細は、ティアフォーの「求人ページ」をご覧ください。カジュアル面談をご希望の方は、応募する際に「カジュアル面談希望」と記載してください。
「どの職種で自分の経験を活かせるかが分からない」「希望する職種が見つからない」などの場合は、ぜひ「キャリア登録」をお願いします。
お問い合わせ先
- 採用に関するお問い合わせ: recruit@tier4.jp
- メディア取材やイベント登壇のご依頼:pr@tier4.jp
- ビジネスや協業のご相談:sales@tier4.jp
ソーシャルメディア
X (Japan/Global) | LinkedIn | Facebook | Instagram | YouTube
関連リンク