こんにちは、ティアフォーでAutowareのSimulator開発を担当している片岡と申します。
弊社ではSimulationや実車評価を通して様々な側面からAutowareの性能評価と開発へのフィードバックを行っております。
今回はその一環でIntelのRSS(Responsibility Sensitive Safety)という安全評価基準のライブラリを読み解きましたのでその中身について解説したいと思います。
また、ティアフォーでは「自動運転の民主化」をともに実現していく、Simulation EngineerやSafety Engineerを募集しています。
自動運転を実現するためには、極めて幅広い分野に対する研究開発や安全担保への取り組みを進めていく必要があります。もしご興味があれば以下のページからコンタクトいただければと思います。
Intel RSSとは?
Intel RSSはIntel (Mobileye) が提唱している自動運転車両の安全性を評価する基準です。評価基準の詳細な計算ロジックが記述されている論文はarXivにおいて公開されております。
RSSの概要
RSSはHD Mapと周囲のオブジェクトの動きから、自動運転車が取ってよい動作コマンド(縦方向、横方向加速度)の範囲を計算します。
公道において自動運転車両が出会う状況を数式で表現することで自動運転車両が取った行動の危険度を数値化することが可能になります。この機能は「この危険な状況は道路上にいる誰のせいで発生したのか」を表現することができるため、公道走行ログから危険なシナリオを抽出したり、様々なパラメータで実行されたSimulation Testの結果を分析するのに使うことができます。
このロジックは本質的にはAutoware等の自動運転システムに含まれるプランナーと等価なものであり、後述するad-rss-libのサポート対象からは外れているものの、障害物回避等の動きを行うことも可能なようです。
下の動画(CARLA 0.9.10のNew Feature紹介動画)においては実際にRSSに基づいて計算された制御入力を使ってUnstructuredな環境での障害物回避が行われています。
RSSは内部に状態機械を持っており、様々なシチュエーションに対して適切な評価関数を選択することで自動運転システムからの出力が適切かを評価することができます。
RSSと自動運転システムのIntegration
RSSは自動運転のサブシステムとして実装することを考慮して設計されており、認識結果からワールドモデルを構築して自動運転システムからの出力を制限するといった使い方が想定されています。
また、後述するad-rss-libは様々な外部ツールとインテグレーションされており、インテグレーションもやりやすい仕様になっていることが伺えます。
ad-rss-lib
今回紹介しますのは、この論文に有る内容をC++で実装したOSSです。
ライセンスはLGPL2.1となっていて、Ubuntu16.04、18.04、20.04で動作します。
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
├── 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の設定ファイルが入っており、こちらのドキュメントを生成するのに使われています。
generatedディレクトリには縦方向の反応時間といったRSSの計算で使われるデータ型を文字列等から作成するためのユーティリティが含まれています。
implディレクトリは更に4つのディレクトリに整理されており、それぞれ
- core : 下に記したディレクトリ群の中の関数を使うための関数群を収録
- situation:各situationにおいて実行されるロジックを収録
- unstructured:構造化されていないシーンでのロジックを収録
- world:レーン座標系への変換や現在のsituationの認識等のロジックを収録
に分割されています。
レーン座標系への変換等は特に加速度の連続性を維持するためにかなり工夫がなされているようです。このあたりの綺麗に実装するのが難しいロジックをオープンにしてくれるのは非常にありがたいですね!
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のモジュールをインテグレーションしています。
具体的な実装箇所は以下のものになります。
このドキュメントによるとApolloのEMプランナー(Apolloのプランニングアルゴリズム)は3つのカテゴリーのタスクが交錯する反復的なアプローチをとっており、この中のタスクの一種としてRSSのタスクが実装されているようです。
実装されている内容としては
- 認識系からきた情報とHD Mapの情報を合わせてWorld Modelを構築
- World Modelから現在のSituationを判断
- RSSの計算式に基づいて適切な応答を計算
- 実際の制御入力における適切な応答を計算
- 安全な車間距離を取っているかを評価
というロジックになります。
CARLAにおけるRSSのIntegration
CARLAにおいてはRSS SensorとRSS Restrictorの2種類のIntegrationがされています。
RSS Sensor
RSS Sensorは自車両の制御コマンドがRSSの基準を満たしているかをチェックするセンサーです。
上記の動画に有るとおり、様々な状況下でRSSをメトリクスとして自車両の危険な行動をチェックできています。
CARLAのver 9.10.0からはUnstructuredな環境での実行もサポートされており、市街地環境における本格的なSimulationの実現に向けて着々と進んでいる様子が見て取れます。
RSS Restrictor
RSS RestrictorはRSSのメトリクスを使い、NPC車両にその場面において危険な状況をうむ制御入力を入れないようにするためのモジュールです。
具体的な実装箇所はこちらになります。
この関数はPythonから呼び出せるようになっており、CARLAのPython APIで呼び出すことによってNPCが適切に振る舞うことができるようになるようです。
まとめ
今回は自動運転システムを支える評価基準の一種であるIntelのRSSとそのオープンソース実装について解説しました。今後はこのツールを活用しAutowareの性能評価をさらに加速させ、安全安心でオープンソースな自動運転システム開発を強力に押し進めていきたいと思います。