Intelのad-rss-libを大解剖!RSSのライブラリのアーキテクチャと中身を解説する!

こんにちは、ティアフォーでAutowareのSimulator開発を担当している片岡と申します。

弊社ではSimulationや実車評価を通して様々な側面からAutowareの性能評価と開発へのフィードバックを行っております。

今回はその一環でIntelRSS(Responsibility Sensitive Safety)という安全評価基準のライブラリを読み解きましたのでその中身について解説したいと思います。

また、ティアフォーでは「自動運転の民主化」をともに実現していく、Simulation EngineerやSafety Engineerを募集しています。

自動運転を実現するためには、極めて幅広い分野に対する研究開発や安全担保への取り組みを進めていく必要があります。もしご興味があれば以下のページからコンタクトいただければと思います。

tier4.jp

 Intel RSSとは?

youtu.be

Intel RSSIntel (Mobileye) が提唱している自動運転車両の安全性を評価する基準です。評価基準の詳細な計算ロジックが記述されている論文はarXivにおいて公開されております。

arxiv.org

RSSの概要

RSSはHD Mapと周囲のオブジェクトの動きから、自動運転車が取ってよい動作コマンド(縦方向、横方向加速度)の範囲を計算します。

公道において自動運転車両が出会う状況を数式で表現することで自動運転車両が取った行動の危険度を数値化することが可能になります。この機能は「この危険な状況は道路上にいる誰のせいで発生したのか」を表現することができるため、公道走行ログから危険なシナリオを抽出したり、様々なパラメータで実行されたSimulation Testの結果を分析するのに使うことができます。

このロジックは本質的にはAutoware等の自動運転システムに含まれるプランナーと等価なものであり、後述するad-rss-libのサポート対象からは外れているものの、障害物回避等の動きを行うことも可能なようです。

下の動画(CARLA 0.9.10のNew Feature紹介動画)においては実際にRSSに基づいて計算された制御入力を使ってUnstructuredな環境での障害物回避が行われています。

youtu.be

RSSは内部に状態機械を持っており、様々なシチュエーションに対して適切な評価関数を選択することで自動運転システムからの出力が適切かを評価することができます。

f:id:masaya-kataoka:20210315164514p:plain

https://intel.github.io/ad-rss-lib/images/ad-rss-map-situation_analysis.png

RSSと自動運転システムのIntegration

f:id:masaya-kataoka:20210315164013p:plain

https://intel.github.io/ad-rss-lib/images/ad-rss-lib-Integrate_Into_Sense-Plan-Act.png

RSSは自動運転のサブシステムとして実装することを考慮して設計されており、認識結果からワールドモデルを構築して自動運転システムからの出力を制限するといった使い方が想定されています。

また、後述するad-rss-libは様々な外部ツールとインテグレーションされており、インテグレーションもやりやすい仕様になっていることが伺えます。

ad-rss-lib

今回紹介しますのは、この論文に有る内容をC++で実装したOSSです。

ライセンスはLGPL2.1となっていて、Ubuntu16.04、18.04、20.04で動作します。

github.com

CARLAやBaiduのApolloといった自動運転業界で有名なOSSでもこのライブラリはインテグレーションされており、その使いやすさと注目度の高さが伺えます。

現在のversion(4.4.0)においては以下の内容がサポートされています。

  • 複数のマップバージョンをサポート(Map Integration)
  • 構造化されていない道路や歩道も扱える
  • 複数車線の道路、すなわち縦方向および横方向の安全距離と適切な対応の決定
  • 交差点、つまり、異なるジオメトリの2つ以上のルート、ルートの交差点のルール、優先権/通行権、および縦方向と横方向の適切な応答の決定

逆にサポート範囲外となっているのは以下の内容になります。

  • オクルージョンの考慮
  • 回避動作を生成するロジック
  • 横方向の衝突がない交差点の対応

ad-rss-libのパッケージ構成

ad-rss-libはC++とCMakeで書かれており、PythonのC APIを使用してPython Bindingsも製作されています。

ad-rss-libのコアライブラリは以下の2つのディレクトリに格納されています。

https://github.com/intel/ad-rss-lib/tree/master/ad_rss

https://github.com/intel/ad-rss-lib/tree/master/ad_rss_map_integration

ad_rssの中身

ad_rssは以下のようなディレクトリ構造になっています。

ad_rss

├── CMakeLists.txt
├── doc
├── generated
├── gtest-cmake.txt.in
├── impl

│   ├── ad_rss.cmake
│   ├── include
│   ├── src

│   │   ├── core
│   │   ├── situation
│   │   ├── unstructured
│   │   └── world
│   └── test
└── python

 CMakeLists.txtはCMakeの設定ファイルであり、ビルド手順が記述されています。

docディレクトリにはDoxygenの設定ファイルが入っており、こちらのドキュメントを生成するのに使われています。

intel.github.io

generatedディレクトリには縦方向の反応時間といったRSSの計算で使われるデータ型を文字列等から作成するためのユーティリティが含まれています。

implディレクトリは更に4つのディレクトリに整理されており、それぞれ

  • core : 下に記したディレクトリ群の中の関数を使うための関数群を収録
  • situation:各situationにおいて実行されるロジックを収録
  • unstructured:構造化されていないシーンでのロジックを収録
  • world:レーン座標系への変換や現在のsituationの認識等のロジックを収録

に分割されています。

レーン座標系への変換等は特に加速度の連続性を維持するためにかなり工夫がなされているようです。このあたりの綺麗に実装するのが難しいロジックをオープンにしてくれるのは非常にありがたいですね!

f:id:masaya-kataoka:20210315165258p:plain

https://intel.github.io/ad-rss-lib/images/lanes_with_different_width.svg

PythonディレクトリにはPythonのC APIを利用してPythonからad-rss-libのロジックをラップして使えるようにするための関数が入っています。

ad_rss_map_integrationの中身

ad_rss_map_integrationは以下のようなディレクトリ構造になっています。

ad_rss_map_integration

├── CMakeLists.txt
├── doc
├── generated
├── impl
└── python

implディレクトリ以外はad_rssディレクトリと同様のコードが入っています。

implにはRSSの内部で使われているHD Mapに関連するコードが収録されています。

 ad-rss-libの使い方

ApolloにおけるRSSのIntegration

Apolloは自動運転車の行動計画部分にRSSのモジュールをインテグレーションしています。

japan.cnet.com

具体的な実装箇所は以下のものになります。

github.com

このドキュメントによるとApolloのEMプランナー(Apolloのプランニングアルゴリズム)は3つのカテゴリーのタスクが交錯する反復的なアプローチをとっており、この中のタスクの一種としてRSSのタスクが実装されているようです。

https://github.com/ApolloAuto/apollo/raw/master/docs/specs/images/class_architecture_planning/image008.png

f:id:masaya-kataoka:20210315130447p:plain

https://raw.githubusercontent.com/intel/ad-rss-lib/master/doc/images/apollo_integration.png

実装されている内容としては

  1. 認識系からきた情報とHD Mapの情報を合わせてWorld Modelを構築
  2. World Modelから現在のSituationを判断
  3. RSSの計算式に基づいて適切な応答を計算
  4. 実際の制御入力における適切な応答を計算
  5. 安全な車間距離を取っているかを評価

というロジックになります。

CARLAにおけるRSSのIntegration

CARLAにおいてはRSS SensorとRSS Restrictorの2種類のIntegrationがされています。

f:id:masaya-kataoka:20210315130404p:plain

https://carla.readthedocs.io/en/latest/img/rss_carla_integration_architecture.png

carla.readthedocs.io

RSS Sensor

RSS Sensorは自車両の制御コマンドがRSSの基準を満たしているかをチェックするセンサーです。

  1. SimulatorのAPIを使用してActorの一覧を取得
  2. RSSに基づいて適切な制御コマンドの範囲を計算、その値に自車両の入力が入っているかを確認

www.youtube.com

上記の動画に有るとおり、様々な状況下でRSSをメトリクスとして自車両の危険な行動をチェックできています。

CARLAのver 9.10.0からはUnstructuredな環境での実行もサポートされており、市街地環境における本格的なSimulationの実現に向けて着々と進んでいる様子が見て取れます。

youtu.be

RSS Restrictor

RSS RestrictorはRSSのメトリクスを使い、NPC車両にその場面において危険な状況をうむ制御入力を入れないようにするためのモジュールです。

具体的な実装箇所はこちらになります。

github.com

この関数はPythonから呼び出せるようになっており、CARLAのPython APIで呼び出すことによってNPCが適切に振る舞うことができるようになるようです。

まとめ

今回は自動運転システムを支える評価基準の一種であるIntelRSSとそのオープンソース実装について解説しました。今後はこのツールを活用しAutowareの性能評価をさらに加速させ、安全安心でオープンソースな自動運転システム開発を強力に押し進めていきたいと思います。