無題

自動運転車はどうやって現在地を把握してるのか? GPSだけじゃない

自動運転のナカミ⑤【状況判断編】

この記事の目的

事故や渋滞が無くなる!運送業が効率化する!時間が節約できる!…という明るい話から、事故の責任は誰が負うの?車がハッキングされたら?AIとかロボットに運転任せるの怖い…という心配になる話まで、色々な議論がされている自動運転技術。しかしそう言った自動運転が来る来ないという議論を盛んにしている一方、自動運転がどのようにして動いているのかなどと言った中身の深いところまで詳しい方は少ないのではないでしょうか。私はというと、数年前にこの技術を知って以来すぐに進路を変え自動運転研究室に入ったり、研究室入る前から有料オンライン講座(計約30万円…汗)で学んだりと、この業界のキャッチアップに勤しんできました。そこでこの記事を通して自動運転技術の中身を噛み砕いて紹介することで、より一層深い議論ができたり、この産業に張るか張らないかを考えて頂けたらなと思います。

第5回目の本記事では、前々回の【仕組み編】で出て来た 2. 状況判断 の特に自己位置推定の技術についてもう少し掘り下げて行こうと思います。カメラ等で捉えた周辺状況から今自分が置かれている状況を判断するので、人間に例えると”脳”の役割ですね。

1. 周辺認識
2. 状況判断 ← 今ココ
3. 車体制御

自車の現在地を推定

”推定”って単語を使っている通り、自己位置はあくまで確率で出します。「え、確実な数値じゃないの…? 確率とか怖っ…」と思われるかもしれませんが、この世に絶対的な精度を持ったセンサーなぞ存在せず、センサーには大なり小なり誤差がつきものなのでどこまでいっても確率で出すしかないのです。ルンバだって「自分が今家の中のどの辺りにいるのか」は確率で計算してます。

ロボットの位置を確率的に計算するイメージについてスーパーわかりやすい記事があるので、まずはそちらから読んでみるのもオススメです↓

現在自動運転で使用されている手法は主に3手法あります。

① デッドレコニング
② GNSSを使用
③ 地図を使用
   ├── フィルタリング
   ├── マッチング
   └── [おまけ]SLAM

① デッドレコニング

いきなり聞いた事ない単語ですが、これは一瞬前の位置から今回どれくらい動いたかをどんどん足していって現在地を予想する事です。A地点から1m動いたから今は(A+1)m、更にそっからまた1m動いたから次は(A+1+1)=(A+2)m、ちょっと加速して2m走ったから今度は(A+1+1+2)=(A+4)m……みたいな感じで現在動いた量を逐一足して行けばそりゃ総走行距離、つまり現在地と同じ値になるはずだよねって考えです。しかしそれは理想論であって、実際は毎回毎回現在動いた量を正確に測る事はできないので、段々と誤差が溜まっていっちゃうという弱点があります。

例えば、家からコンビニに歩いて行く時を想像して下さい。コンビニは玄関を出て右に10m先にあります。家の玄関をスタート地点とし、右向いてから真っ直ぐ10m歩けばコンビニに着くはずですがここであなたは目が見えないとします。アイマスクか何かして玄関先に立ちます。そしてまずは右向いたと想像して下さい(もうこの時点で本当にちゃんと90° 右向けたか定かじゃありませんね汗)。そしてそのまま真っ直ぐ1m(と思われる)距離だけ前に歩いて一度止まって下さい。はい今あなたが立っているその位置が(玄関+1)mです、あと9m歩けば目的地のコンビニに着きます。

……と言われてもなんだか信憑性ないですよね?そもそもちゃんと90° 右向けたかもわからなければ(もしかしたら95° くらいだったのかもしれない)、本当に1m進んだかもわからない(もしかしたら0.9mしか進んでなかったのかもしれない)。正確に測れない状態でまた同じことを何回も繰り返していったら、毎回毎回の小さな誤差やズレが最終的にはとんでもない量になってしまって、到底コンビニに辿り着けそうにないということがわかりますよね。そこでこのデッドレコニング法だけに頼るのではなく、他の手法も一緒に用いることで誤差を少なくして行こうという算段です。

例えば後輪の回転数を測定して車の移動距離を計算

② GNSSを使用

GNSSとはいわゆるGPSです。衛星から地球を俯瞰して位置を測るというシステム全体をGNSSと言い、その中でアメリカがやっているGNSSの名前がGPSです。他にもロシアがGLONASSという名前でやってたりしますが、GPSの名前が有名になり過ぎてみんなそう呼んじゃってるってだけです(本当はコークって名前の飲み物なのに、コカコーラが有名過ぎてみんなコーラって呼んでるのと同じです)。位置特定に関しては万能に見えるGNSSも、実は数メートルという自動運転する上では許容できない誤差があります。これは市街地ではGNSSの電波がビル群等に当たって反射するせいで起きてしまう誤差です。更にトンネル内などそもそもGNSSの電波が届かない箇所もあります。なので、自動運転ではGNSSからの情報は参考程度にしか用いません。

市街地では反射波が多い

③ 地図を使用

人がGoogle Map見ながら歩くように、車にも地図を持たせてあげようというごく自然な考えです。しかし現在のカーナビに搭載されているような地図ではなく、よりもっと高精度な自動運転用の地図が必要です。高精度地図が既に用意されていると仮定した場合、その地図を利用した自己位置推定には主にフィルタリングとマッチングの2種類があります。

③-1 フィルタリング

フィルタリングとは、車両が取り得る位置を何候補か予測し、車両が動く度に(何かセンサーで周辺状況の新しい情報をゲットする度に)予測位置の候補を確率的に絞っていくという手法です。候補点を"絞って"いくので、"フィルタ"リングなんですね。今回は自律移動ロボット分野においても有名な、パーティクルフィルタリングを例に説明します。

上の動画では、最初は地図上に均等にランダム配置された青点(候補点)達が、ロボット(×印)が動く度にどんどん1箇所(ロボットの真の位置)に集約されていくのがわかります。

ロボットが進めば青点達も全員同じ方向へ進むのですが、その度にロボットがセンサーで観測した情報(例えば目の前の壁まで後何mなど)と青点自身が見てる周辺状況と照らし合わせて「あれ、なんか俺の見てる情景とロボットが見てる情景違くね?」ってなったらその青点は削除されます。逆にロボットから見えてる情景と似てる青点は、ロボットの位置と近い可能性が高いと見なされて生き残ります。これを繰り返して最初無数にあった青点達をどんどん"絞り込んで"選抜していけば、最終的にはロボットの地図上の位置と同じになるはずだよね、という考え方です。

③-2 マッチング

Tinderの事じゃありません笑。これは、車両から見えてる周辺情報を直接地図上の情報と照らし合わせればよくね?って考え方です。今見えてる情景とマッチする箇所が地図上にあるってことは、つまり今その箇所にいるってことに他ならないですよね。車両から見えてる風景とそのままマッチングができるような地図を作る為には、自動運転車が"目"の役割として使ってるセンサーと同じのを用いて地図の方も作製しなければいけません(当然ですが)。例えば当初のGoogleカーでは、Googleカーの車載カメラから得た画像情報と、Google map ストリートビュー上の画像情報とを照らし合わせてマッチングしていたらしいです。ですが現在の主流はLIDARですね。車載LIDARから得た点群情報と、同じくLIDARで作製された地図上の点群情報とを照らし合わせて自己位置推定を行います。

カラー部分:車載LIDARから得た点群
灰色部分:(走行前に作製された)地図上での点群

上の画像を見ると、地図上の点群情報(灰色部分)では遠くの建造物や木までもカバーしているのがわかります。何故なら自動走行前に、ただ地図を作製する為(=LIDARデータをかき集める為)だけの目的でテストコース全体を1周走らせたからです。そしてそこに車載LIDARからの点群情報(カラー部分)を上から当てはめて、例えば建造物の壁の沿い具合などから計算して車両の自己位置を推定しています。このマッチングの際の計算方法にも色々な手法があり、少しでも正確にかつ速く計算する手法を日々研究者達は研究しているのです……。

③-[おまけ] SLAM

フィルタリングもマッチングも地図が既に用意されてる前提で話しましたが、じゃあどうやって地図を作製するのかというと、1つにSLAMと言う技術があります。自己位置推定と地図作製は厄介な事に、

・自己位置推定は地図がないとできません
・地図作製は自己位置がわかってないと作れません

と言うある種にわとりたまごな関係なのです。なら自己位置推定と地図作製を両方同時にやっちゃおう(Simultaneously Localization and Mapping)と言うのがこのSLAM技術の考えです。例えばSLAMの中でも有名なグラフSLAMと言う技術は、デッドレコニングから推定された車両がこれまで辿ってきた経路(誤差あり)と、車両が移動する度にセンサーが見た観測情報から推定された車両経路(こちらも誤差あり)の両者を擦り合わせることによって一番それっぽい車両経路(→自己位置推定)と周辺観測情報(→地図作製)を同時に一気に計算することができる優れものです。

左:SLAMによる最適化前 → 右:SLAMによる最適化後

最適化前では(センサーの誤差により)左右に別れていた真ん中の廊下が、グラフSLAMによる最適化後には綺麗に元通りの1本となっていることがわかりますね。

今回は自動運転の"脳"の役割である、自己位置推定について深掘りしました。ちょっと数学的なことが多かったですかね。それでは次回は【車体制御編】を書こうと思います。

文:川西発之 / 陳発暉 (Twitter/note)
プロフィール:Deep4Drive開発メンバー。高専情報科(C/C++)→大学機械科→HWエンジニアインターン at ドローンベンチャー(Python)→SWエンジニアインターン in NY(PHP)→ニートしながらアプリ開発(React Native)→大学院で自動運転の研究(C++)。日本生まれの純血中国人🇯🇵🇨🇳

私たちはモビリティ分野でのオープンイノベーションを通じ、技術者を育成するコミュニティです。自動運転レースへの挑戦や、JR東日本様等との共同プロジェクト、新規価値創造等を行っています! モビリティに関するイベントも適宜開催中!