【E2E連載企画 最終回】:自動運転データセットのためのセンサキャリブレーション技術
1. はじめに
こんにちは、End-to-End自動運転開発チーム(以降E2Eチーム)で自動運転システムを開発している嶋谷です。本記事はE2Eチームの取り組みを知ってもらう連載企画の最終回として、センサキャリブレーション技術とその精度を高めるための様々な工夫についてご紹介します。
2. キャリブレーションの必要性
自動運転の文脈において、キャリブレーションとはセンサ間の位置関係 (外部パラメータ) を求めたり、センサ自身のパラメータ(内部パラメータ)を推定し、センサの値を補正することを意味します。私達のデータ収集車両においてもカメラ、GNSS、IMU、LiDARといった多くのセンサが搭載されており、キャリブレーションを行っています。それではなぜ自動運転にはキャリブレーションが必要なのでしょうか?様々な理由がありますが、今回はLiDARとカメラに着目して代表的なものを解説します。
まず1つ目です。私達が現在開発に取り組んでいる機械学習モデルでは以前のブログでご紹介した、Bird Eye View (BEV) 特徴量を用います。BEV特徴量とは車両の周囲に取り付けられた複数台のカメラ画像から以下のようにあたかも上空から車両を見下ろしたような特徴量を生成することです。これを生成するには複数台のカメラが車両に対してどのような位置で取り付けられているかという外部パラメータが必要であり、これをキャリブレーションで求めることができます。
次に2つ目ですが、画像から三次元物体検出を行うための教師データ作成に必要となります。正確な教師データを作成するためにはカメラ画像と三次元情報を持つLiDARの点群をピッタリ一致させることが重要であり、こちらはLiDARとカメラ間の外部パラメータをキャリブレーションで求めることで実現できます。
LiDAR点群をカメラ画像に重ね合わせたもの (色は受光強度)
キャリブレーションが正確に行われていないと、BEV特徴量が実際とずれてしまったり、三次元物体検出の精度が低下してしまうといった事態を招くため、キャリブレーションを正確に行うことは自動運転において非常に重要なテーマです。それでは、これらのキャリブレーションを行うにあたり具体的に何が必要なのでしょうか?まず初めに大事なことはカメラ画像の歪みを補正することです。環境光はレンズを通してイメージセンサへと入力されるため、レンズの特性や製造誤差によって歪みが生じます。ここで歪み補正とは、本来直線である箇所が画像上でも直線で見えるように画像を補正することを意味し、カメラの内部パラメータ(焦点距離、光学中心、歪みパラメータ)を求めることができればソフトウェア的に補正が可能です。
歪みが生じた状態ですと、後述する外部パラメータがいかに正確であっても、LiDARの点群とカメラ画像をピッタリ合わせることはできません。歪み補正ができたら、次にLiDARとカメラ間の外部パラメータを求めていきます。これを求めることでLiDARの点群とカメラ画像を重ね合わせたり、カメラAとカメラB/C/D間の相対的な位置関係が求まることでBEV特徴量が作れます。
まとめると、LiDARと複数カメラを用いたシステムにおいては以下を正確に行うことが重要です。
- カメラの内部パラメータ推定
- LiDARと各カメラ間の外部パラメータ推定
ここからはこれらのトピックについて数式や理論を交えながらより詳細に解説を行います。
3. カメラの内部パラメータ推定
理想の状態(ピンホールカメラモデル)
カメラの歪み補正を行うにあたり、まずは歪みが無いピンホールカメラとよばれる理想的なカメラについて考えてみましょう。このカメラモデルにおいては、現実世界の直線箇所が画像上でも直線として写ります。
私達の生活する世界は三次元空間であり、とある一点の座標が(x, y, z)で表現されるとします。それをピンホールカメラで撮影したときの二次元画像上の座標を(u, v)とすると、その対応関係は以下の式で計算されます。
x, y, z:光学中心を原点とした3次元空間の座標
u, v:画像のピクセル座標
fx, fy:焦点距離
cx, cy:光学中心
詳しくはこちらのブログがわかりやすいです。
ピンホールカメラモデルとのズレ
しかし、実際のカメラ画像においては上述の式との誤差(歪み)が存在し、その影響で本来直線である箇所が画像上では湾曲して見えてしまいます。基本的な歪みはモデル化されており、opencvではカメラの画角に応じて3つのモデルが使えます。
- 一般的なカメラ (https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html)
- 魚眼カメラ (https://docs.opencv.org/4.x/db/d58/group__calib3d__fisheye.html)
- 全方位カメラ (https://docs.opencv.org/4.x/dd/d12/tutorial_omnidir_calib_main.html)
内部パラメータの推定
これらのモデルのパラメータを推定するため、Zhangの手法がよく用いられます。キャリブレーションボードを複数枚カメラで撮影し、最適化によって内部パラメータ(焦点距離、光学中心、歪みパラメータ)を推定します。これにより3次元空間と画像の対応関係が正確にわかるようになるため、画像を変形して歪みのない画像に補正することができます。
詳しくはこちらのブログがわかりやすいです。
より精度を高めるための工夫
内部パラメータをより正確に求めるためにはカメラでキャリブレーションボードをどのように写すかが非常に大事です。初期の段階ではA4サイズのボードを用意し、カメラは車体に組み込まれた状態でボードの撮影を行っていました。しかしこの方法には以下のような問題があり、高い精度でパラメータを求めることができず、歪み補正後も若干歪みが残った状態となっていました。
- カメラの画像内にボードをまんべんなく写すことが理想であるが、ボードが小さいため難しい
- 上記問題に対してはボードをカメラに近づければ良さそうであるが、近づけるとボードがピンぼけしてしまいボードを検出できない
- カメラが車体に組み込まれているため、車体が邪魔をして一部の領域においてはボードを見せることができない
そこで、巨大ボードを用意、車体にカメラを組み込む前の状態でボード撮影とパラメータの推定を行い、精度を飛躍的に向上させることができました。
4. 外部パラメータの推定
外部パラメータとは
カメラの歪み補正ができたら、次にLiDARとカメラ間の外部パラメータを求めます。LiDARから取得される点群データを画像に重ねて表示させたいときは点群データをカメラを原点とする座標に変換する必要があります。
R:3x3の回転行列、t:要素数3の並進ベクトル
このように並進と回転である座標系からある座標系へ変換するときの行列を外部行列もしくは外部パラメータと呼びます。外部パラメータの推定方法には様々な方法が提案されています。
LiDARとカメラ間の外部パラメータ推定
この外部パラメータは、LiDAR点群の点とそれに対応するカメラ画像のピクセルのペアを複数見つけて最適化問題(PnP問題)を解くことで推定する方法が一般的です。例としてはCalibrationToolsやSensorsCalibartionなどがあります。近年はdirect_visual_lidar_calibrationやLCCNetなどディープラーニングを用いて推定する手法も出てきています。基本的なアプローチは上記の方法と同様、LiDAR点群を画像化し、カメラ画像と点群画像がきれいに重なる外部行列を見つけるという方法が取られていることが多いです。
5. おわりに
E2E自動運転の連載企画の最終回として、キャリブレーションについてご紹介しました。キャリブレーションは自動運転を支える重要技術の一つです。常に高い精度が求められており、私達は現状に満足することなく更なる精度向上を目指しています。そのためには、センサの選定や、設定、データ収集車への組み込みといったセンサに関する深い知識、そしてコンピュータビジョンの知見が必要です。また、現状エンジニアがマニュアルで対応しなければならないオペレーションが多く、自動化も必須課題です。もしこのような仕事にご興味をいただけましたら、筆者のメール (嶋谷:hiroyuki.shimatani@turing-motors.com) にご連絡いただくか、弊社の採用情報をご覧ください。
Discussion