はじめに
最近、IoT関連に携わることになり、いろんなデバイスが繋がる仕組みを安心して使うために必要な監視機構が気になっている. そこでROSを使っている自動運転OSS Apolloの監視の仕組みについて調べることにした.
自動運転OSSのApollo
[Apllo][link-apollo]は、バイドゥが中心に開発している自動運転のソフトウェアで、先日2018/04/18にversion 2.5がリリースされた. 現在、自動運転OSSで一番人気のあるソフトウェアである. ROSをベースに作られており, 様々なデバイスと連携してる複雑なシステムである.
[link-apollo]:https://github.com/ApolloAuto/apollo
ROS (Robot Operating System)
[ROS][link-ROS] とは、ロボットなど様々なセンサーが複雑に絡み合うようなシステムの構築をサポートするミドルウェアで、各センサーデータやアルゴリズムの処理結果をpub/sub形式でやりとりできる仕組みである.
このようなミドルウェアに乗っかって開発することで、ハードウェアエンジニア、ソフトウェアエンジニアともに多数の独自インターフェースに悩まされることがなくなる.
[link-ROS]:http://www.ros.org/
Apolloの監視機構
それでは、本題のApolloの監視(modules/monitor
)の仕組みを見ていく.
ApolloのMonitorには...
- Hardware Monitor
- Software Monitor
- Process Monitor
- Topic Monitor
- Summary Monitor
- Reporters
- Static Information Reporter
- Vehicle State Reporter
の機能がある.
これらの監視がそれぞれ別々のスレッドで行われるようになっており、それぞれ個別に設定されたインターバル毎に監視(monitor/common/recurrent_runner.cc
)が行われるようになっている.
それぞれ監視の内容を見ていく.
Hardware Monitor
自動運転車両は、車(CAN), GPS(GNSS), LiDAR(距離計測センサー)やカメラなどいろんなデバイスとつながっているので、ハードウェアが必須である.
ApolloのHardware MonitorにはCANとGPSの監視が備わっている.
基本的には、監視名(string)、監視ステータス(int)、監視メッセージ(string)を返す.
CAN (Controller Area Network)
CANは車載ネットワークで、車両状態や車両の制御信号が流れている[1]. ブレーキやステアリングの信号を流すためにもCANと安定的に繋がっていることを監視することは非常に重要である.
監視内容
ESDとSocketに対応していて、それぞれ別の監視を行っている.
ESDは専用SDKを用いて、Socketは ioctl
を用いて、CANのドライバーから取得できる情報が安全かバリデーションを行っている.
監視間隔
デフォルトでは3秒置きとなっている.
GNSS(GPS)
位置特定には、スキャンマッチングやデッドレコニングというGPSを用いない手法もあるが、もちろんGPSも非常に重要な位置特定センサーである.
監視内容
緯度経度、高さの分散が50cm以上でWARNとなり、それが5秒続くとERRORにステータスが変化する. (50cmと5秒というのはデフォルト値であり、設定することが可能)
監視間隔
GPSもCANと同様に3秒置きという設定がデフォルトとなっている.
Software Monitor
Process Monitor
監視内容
プロセスの死活監視. プロセスの実行コマンドに文字列マッチでひっかけて見つかれば問題ないというようになっている.
同じ実行コマンドで複数プロセス動いているときに、何個以上生きていて欲しいといった設定はできない.
監視間隔
1.5秒置きというのがデフォルトの設定.
Topic Monitor
監視内容
各トピック毎にメッセージが届いているかどうか、各トピック毎に設定できる acceptable_delay
をチェックし、遅延時間を記録.
監視間隔
5秒置きというのがデフォルトの設定で、すべてのトピックが同じ頻度で監視される.
Summary Monitor
ハードウェア監視とソフトウェア監視(プロセスとトピック)の結果を集約しシンプルなステータス"OK", "WARN", "ERROR", "FATAL"で表現し、システムステータスのトピックにパブリッシュしログを残す.
監視間隔
8秒置きにブロードキャストする.
Reporters
Static Information Reporter
レポート内容
[車両情報やユーザー情報、ハードウェア・ソフトウェア情報など静的な情報][link-2]を記録.
[link-2]: https://github.com/ApolloAuto/apollo/blob/master/modules/data/util/info_collector.cc#L75-L83
レポート間隔
40秒置きにレポートする.
Vehicle State Reporter
レポート内容
位置や向きなど刻々と変化する情報をエンドポイントに送信する. 詳しくは[プロトコルバッファの定義][link-1] を参照.
[link-1]:https://github.com/ApolloAuto/apollo/blob/master/modules/common/vehicle_state/proto/vehicle_state.proto
レポート間隔
5秒置きにレポートする.
まとめ
自動運転OSSのApolloの監視機構について見てきた.
どの監視も頻度がデフォルトでは低いことがわかった. 実際の運用がどれくらいの頻度に設定され行われているか不明だが、仮に5秒置きの監視だと、低速である時速30km (自動運転で時速30kmはボチボチ早い) でも監視の間に約40mも進んでしまうことになる.
多数のモジュールが複雑に連携しており、リアルタイム性が求められるシステムの割には監視の頻度や柔軟性が乏しいと感じた.