ヤフー株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。LINEヤフー Tech Blog

テクノロジー

スマホの加速度センサーから車の運転特性を求める 〜 Yahoo!カーナビの挑戦

Yahoo! JAPAN Advent Calendar 2020の9日目の記事です。

こんにちは、Yahoo!カーナビのエンジニアをしている浅見宗広です。

Yahoo!カーナビは、自動車事故の少ない社会を実現すべく、ドライバーの皆さんの運転特性を把握し、より安全な運転を促す「ドライブ記録」機能を搭載しています。この「ドライブ記録」には、運転特性をスコア化する機能もあり、本稿では、スマホの加速度センサーを利用してどのように運転特性をスコア化しているかを紹介しようと思います。
なお、本記事は、パワーアップした「ドライブ記録」のスコアエンジン開発裏話(外部サイト)をエンジニア向けに、技術的な要素を掘り下げた内容になっています。

目次

  1. 運転特性とは?
  2. 車の加速度とスマホが計測する加速度の関係
  3. スマホの加速度センサーから取得できる加速度
  4. 課題を変換式で再定義する
  5. 変換式をオイラー変換で表現する
  6. 変換式を求める
  7. 運転特性スコアの求め方
  8. 検証アプリで走行テスト
  9. 今後の改良ポイント
  10. トンネル内での停止判定にも応用
  11. おわりに

1. 運転特性とは?

車を運転するドライバーには、アクセルをゆっくり踏み込んでやさしく加速していく人、その逆に、アクセルを深く踏み込んで急加速する人、また、ブレーキを早めにゆっくり踏み込んでやさしく減速する人、その逆にブレーキを踏み始めるのが遅く、常に強いブレーキになってしまう人など、ドライバーそれぞれ千差万別です。このように運転の仕方を特徴付けるものを運転特性といいます。

Yahoo!カーナビでは、この運転特性として、次の4つの項目を定義し、各25点満点で評価しています。

  1. 加速の安定性:車の加速に関する運転特性
  2. 減速の安定性:車の減速に関する運転特性
  3. 旋回の安定性:車の旋回に関する運転特性
  4. 直進の安定性:急ハンドルに関する運転特性

ドライブスコア詳細4

加速、減速、旋回の安定性は、それぞれ文字通りですが、直進の安定性は、急ハンドルを評価しています。急ハンドルと直進がどのように関連しているか不思議に思うかもしれませんね。
急ハンドルを切ると文字通り急に曲がりますが、これは直前まで直進が期待されるにもかかわらず、急なハンドル操作によって直進しなくなった状態である。つまり、直進の安定性が崩された状態と解釈できます。また、加速に相対するものは減速、では、旋回に相対するものは何だろうと考えたとき、直進という言葉が出てきました。4項目が2つずつ対称関係になってまとまりが良かったのも決め手です。

これらの運転特性は、車そのものの加速、減速、旋回などの動きに基づいていますが、どのように求めればいいでしょうか? もう少し現象を分解して見ていくと、加速、減速は、車のまっすぐ前に進む方向に対する加速度に対応し、旋回は車の真横方向に対する加速度に対応していると言えそうです。つまり、車の真っすぐ前に進む方向と真横方向の加速度成分を求める必要があります。

Yahoo!カーナビは、基本的にスマホのアプリであり、車とは直接つながっておらず、車からこれらの加速度情報は取得できません。従って、スマホが持っている情報からこれらの運転特性を求める必要があります。ほとんどのスマホには、加速度センサーが搭載されています。まず、これを利用することが自然な流れですが、スマホの加速度センサー情報からどうやって車の進行方向、真横方向の加速度を求めるかが課題です。

2. 車の加速度とスマホが計測する加速度の関係

車が加速したり、減速したり、カーブを曲がったりした時、その車に乗っている人にはどんな力が働くでしょうか?
車が加速する時は、シートに前から押さえつけられる力を、ブレーキをかけて減速する時は、前のめりになる、つまり、後ろから押される力を、それぞれ感じると思います。また、右カーブを曲がっている間は、左に体が傾き、左カーブの時はその逆の右に体が傾きます。このように、車の中の物体には、車に働く力とは逆向きの力が働きます。これを慣性力といいます。スマホには、この慣性力に対応する加速度が働くことになります。(ニュートンの運動方程式は、力=質量x加速度、と表現できます。つまり、力と加速度は働く方向は同じです)

このように、車に働く加速度は、慣性力としてスマホに働く加速度に反映されるのです。スマホで計測される加速度(以下、スマホの加速度)と車の加速度が直接関係することがわかりましたので、スマホの加速度がわかれば、車の加速度も求めることができます。ただし、加速度の方向は、慣性力を計測しているので逆向きになることに注意しましょう。実は、このことはiOSのみに当てはまることが後で判明します。Androidではどうなるかは次節で説明します。

3. スマホの加速度センサーから取得できる加速度

スマホに働く加速度は、スマホの加速度センサーから取得できます。
ここでは、スマホの加速度センサーから取得できる加速度について簡単に説明します。スマホの2大OSである、AndroidとiOSでは、次のドキュメントに示されたAPIより加速度が取得できます。

OS API
Android SensorEvent(外部サイト)
iOS

CMAccelerometerData(外部サイト)

実装サンプルは、Androidは上記のリンク先、iOSは Getting Raw Accelerometer Events(外部サイト) にも記載されていますので参照してください。

スマホの加速度センサーから取得できる値は、下図のようなスマホに固定された3軸方向を定義し(これをスマホの座標系といいます)、x軸, y軸, z軸の成分として取得されます。この座標系は、AndroidとiOSとも同じようです。

スマホの座標系

次に、このAPIを利用するとどんな加速度の値を取得できるのかテストした結果を示します。想定どおりの値が取得できているか事前にテストすることは重要なことです。下図は、スマホの画面を上向きに水平なテーブルに置いて、x軸のマイナス方向に手で動かした際の結果です。左がiOS端末、右がAndroid端末の結果です。横軸は時間経過を、縦軸は加速度を示します。なお、重力加速度の大きさ 9.81 m/s^2 を単位にとっています。

加速度取得値のテスト-x方向

これは想定外の結果で驚きました。iOSとAndroidの結果が、全く符号が逆転することになるとは思いもしませんでした。
まず、z成分は重力加速度を計測していることになりますが、iOSは-1、Androidは+1となっています。また、スマホを手でx軸のマイナス方向に動かしていますので、最初、力はx軸のマイナス方向に働いています。従って、その逆方向に慣性力が働き、x軸のプラス側に加速度が観測されます。その後、手を離れて力がゼロに、さらに、摩擦力によりx軸のプラス方向に力が働き、つまり、慣性力としてはx軸のマイナス方向に働きますので、x軸のマイナス側に加速度が観測され、停止する。これはiOSの結果と一致します。
一方、Androidでは、全く逆になります。Androidは、慣性力ではなく、スマホ自体に加えられた力の方向、つまり、スマホが動く方向の加速度を観測しているようです。この結果は、スマホを水平に保ったまま少し自由落下させた実験でも同じでした。
次の図がその結果です。重力によりz軸のマイナス方向にスマホは落ちていくので、iOSの場合、その逆方向に慣性力が働く、つまり、加速度は元の値からz軸のプラス方向に振れます。その後、手でゆっくり受け止めるので上向きの力が大きめに働き、その逆方向の慣性力に対応して、加速度はz軸のマイナス方向に触れて、元の値に戻ります。Androidでは、全てが逆方向の振る舞いになっています。

加速度取得値のテスト_自由落下

これらの結果から、次のように解釈すれば良いと考えています。

  • 重力加速度は、iOSでは鉛直下向きに、Androidでは、その逆方向に常に働いていると定義する。
  • その他の加速度は、iOSではスマホに働く慣性力に対応する加速度を計測し、Androidではスマホそのものに加わる力に対応する加速度を計測する。

従って、一つ上の節で説明したことはiOSに限定することになるようです。いずれにしても、

  • iOSとAndroidでは、計測される加速度の値は符号が逆転する

このことは覚えておいてください。なお、下記で説明するロジックをそのまま適用するとiOSとAndroidでこの違いの影響として何が起こるか、一つ例をあげます。今回の運転特性には無関係ですが、右折と左折の関係が逆になります。このような差異が発生することには注意が必要ですので頭の片隅においてください。

4. 課題を変換式で再定義する

上記で、スマホの加速度センサー情報からどうやって車の進行方向、真横方向の加速度を求めるかが課題といいました。ここでは、この課題を解決に導くため、以下のように課題を再定義したいと思います。ただし、上で説明したようにiOSとAndroidでは、計測される加速度の振る舞いが異なりますので、ここではiOSを想定して説明します。

座標系のはなし

既に、スマホの座標系についてはお話ししました。
改めて下図左に示しましたが、スマホの加速度センサーから得られる情報は、3つの方向の成分です。ここでは、小文字のx, y, zで軸方向を区別することにします。例えば、スマホの画面が上側を向き、水平になるように固定すると、そこには重力加速度Gのみ、z軸の負の方向に働くので、(0, 0, -G)という3成分が得られます。また、図のように縦長方向を鉛直にして真っすぐ立たせると、y軸の負の方向に重力加速度が働くので、(0, -G, 0)という加速度成分が観測されます。

スマホと車の座標系

スマホの座標系を定義しましたが、車にも座標系を設定しましょう。
上図右のように、車の進行方向をZ軸、真横の右方向をY軸、鉛直上方向をX軸と定義します。スマホの座標系では小文字を使いましたが、車の座標系では大文字を使っていることに注意してください。このように定義すれば、車の加速、減速については、車に働く加速度のZ軸方向の成分に注目し、車の旋回については、車に働く加速度のY軸方向の成分に注目すればよいことになります。

Yahoo!カーナビの利用については、運転中の操作は違法でもあり、控えるようにお伝えしています。また、多くの方はスマホホルダーを利用されているので、スマホは車に固定されていることを前提に話を進めます。

スマホの加速度から車の加速度を求める

これで課題を再定義する準備ができました。課題を改めて記すと、

  • スマホの加速度センサー情報からどうやって車の進行方向、真横方向の加速度を求めるか?

でした。これを、上記で説明した座標系という言葉を使って言い換えると、

  • スマホの加速度センサーで計測される加速度情報は、スマホの座標系での3成分値であるが、これを車の座標系の3成分値として表すにはどう変換するか?

となります。つまり、下図で示したような変換式を求めることになります。

座標変換

ここで、変換が簡単な例を紹介します。
下図は、車の座標系とスマホの座標系の軸がそれぞれ平行になるようにスマホが車のダッシュボードに設置されている例です。この場合、車が真っすぐに進む方向の加速度(Z成分)は、スマホの加速度センサーのz成分値の符号を逆転したものであり、車の真横方向の加速度(Y成分)は、スマホの加速度センサーのy成分値の符号を逆転したものです。

簡単なスマホ設置例

しかし、一般的にはスマホが車にどのような姿勢で設置されているかは千差万別です。従って、どんな設置姿勢でも対応可能な変換式を求める必要があります。
これを示したのが、次の図です。青はスマホの座標系、赤は車の座標系を表しています。黒矢印で示した加速度に対応する一つのベクトルは、これら二つの座標系で表現すると、全く異なる3成分を持つことになります。これらの3成分間の変換式を求めることができれば、スマホから得られる加速度情報を車の加速度情報にすぐさま変換して、車が今加速しているのか、減速しているのか、左折しているのか、などリアルタイムに求めることができるようになる訳です。

座標系の重ね合わせ表示

5. 変換式をオイラー変換で表現する

ここでは、上記で再定義した課題を定式化して、変換式を求めたいと思います。変換式は次のように変換行列C(図ではCにv/sが上付になっていますが、本文中では省略してCとします)を用いて表現できます。左辺が車の座標系での3成分であり、右辺がスマホの座標系での3成分に変換行列Cが左からかけられています。

変換式

変換行列は、さらにオイラー角による3つの単純回転を用いると次のように3つの回転行列の積で表現できます。

オイラー変換

ここで、各回転行列は具体的には次のようになっています。

オイラー変換詳細

最終的には、変換式を求めるということは、これらの三角関数を求めることになります。

6. 変換式を求める

変換式に興味がない方は、この節は、読み飛ばしてください。

では、具体的に変換式を求めてみましょう。ただし、スペースの関係で途中計算など詳細までは記載できませんので、求め方の概要と結果のみ紹介したいと思います。

変換式を求めるには、次の二つのステップをたどります。

  • ステップ1:重力加速度方向がx軸と一致するようにスマホの座標系を回転させて変換する。
  • ステップ2:車の進行方向がz軸と一致するようにスマホの座標系をx軸回りの回転により変換する。

ステップ1

車が水平に停止している時、重力加速度Gは、車の座標系のX軸と一致します。スマホの座標系のx軸を車の座標系のX軸に一致させるため、重力加速度G方向がx軸と一致するようにスマホの座標系を回転させます。これはz軸、y軸回りの回転の操作で実現できます。この変換をC1と表現することにします。左図の中でG = (gx, gy, gz)と表現した重力加速度は、C1による変換により、y, z成分がゼロとなり右図に示したようにG1 = (-G, 0,0)と表現できます。

ステップ1

ステップ2

まず、車が真っすぐ加速した時のスマホの加速度aを求めます。ステップ1で求めた変換C1をaに施します。変換後のベクトルをyz平面に射影した方向(図左でA1と表現しました)が車が真っすぐ進んだ方向を示します。この方向が車の座標系のZ軸方向であり、次に、その方向にスマホの座標系のz軸方向が一致するように変換をします。これはステップ1の後に、スマホの座標系のx軸回りの回転により実現できます。この変換をC2と表現することにします。左図のA1は、C2により右図のA2のようにx, y成分がゼロ、z成分のみ有限の値を持つようになります。

ステップ2

変換式

上記のステップにより変換行列を求めると次のようになります。ここで、C1、C2は、それぞれステップ1、ステップ2の変換行列を示します。また、各回転角の添字は、どちらのステップに対応するか示しています。

変換行列の結果

改めて、各回転行列を示すと次のようになります。

各回転行列の結果

解は、これらの三角関数が具体的にどのように表現されるかということですが、入力情報としてはスマホで計測された次の二つの加速度情報になります。

入力情報

これらの情報から、ステップ1により次の解が得られます。

各回転行列の結果

残るはx軸回りの回転に関するロール変換部分ですが、これはステップ2から導かれます。まず、aにステップ1の変換をかけます。

aのステップ1変換後

この変換後の座標値を用いて次のように導かれます。

各回転行列の結果

以上により、変換行列を導くことができました。

ここで、入力情報を改めて確認すると、

  • スマホが計測する重力加速度 : G
  • 車が真っすぐ加速した時のスマホの計測する加速度 : a

でした。これらをどのように実際に計測するのか疑問に思われたかもしれませんが、これは秘密とさせてください。ぜひ、みなさんで考えてみていただければと思います。

7. 運転特性スコアの求め方

さて、これでようやくスマホで計測された加速度情報から車の加速度情報を導くことができました。これを4つの運転特性のスコアにどのように反映させるか概要をお話しします。説明の理解を助けるため車の座標系の図を再掲します。

車の座標系

a. 加速の安定性

車の直進方向(車の座標系のZ軸方向)の加速度は、スマホが計測した加速度を上記の変換式により変換したz成分(これを改めてZ成分とします)です。上記で説明したとおり車の加速時に発生した方向をZ軸の正の方向に設定しましたので、Z成分が正の時は車が加速、負の時は減速していることを意味します。従って、加速の安定性では、Z成分が正の時のみ、その大きさを評価します。そして、一回の加速動作の最大値をカウントしていき、大きな加速度の割合が大きいほどスコアを減少するようにしています。

b. 減速の安定性

これは加速の安定性の逆で、Z成分が負の時のみ、その大きさを評価します。そして、一回の減速動作のZ成分の絶対値の最大値をカウントしていき、絶対値が大きな加速度の割合が大きいほどスコアを減少するようにしています。

c. 旋回の安定性

これは車の真横方向の加速度を評価しますので、スマホが計測した加速度を変換したy成分(これを改めてY成分とします)に注目します。実際は、左右方向も区別できますが、旋回の安定性は、それを区別しません。従って、Y成分の符号が同一の間の一回の旋回動作のY成分の絶対値の最大値をカウントしていき、絶対値が大きな加速度の割合が大きいほどスコアを減少するようにしています。

d. 直進の安定性

これは、急ハンドルを評価していることを既に述べました。急ハンドルにより車の横方向の加速度が増加しますので、車の横方向の加速度を評価するのは旋回の安定性と同じです。ただし、「急」という条件として、一定時間加減速がない、つまり、Z成分の絶対値があるしきい値の範囲内であるという条件を付加しています。これにより、通常の、減速してから右左折する動作は対象外になるようにしています。

実際の評価式は、100点満点としたら70点ぐらいが平均になるように試行錯誤して決めています。

8. 検証アプリで走行テスト

実際にロジックが正しく想定通りに動作するか確認するために検証アプリをAndroidで作成しました。下図は、検証アプリを起動した画面です。
詳細な説明は省きますが、リアルタイムに車の進行方向の加速度や横方向の加速度がぱっと見でわかるようにレベル表示されるようになっています。また、加速時は上矢印、減速時は下矢印、右旋回時は右矢印、左旋回時は左矢印、と表示され、さらにそれらの大きさがプログレスバーでアナログ的にも変化するようになっています。

検証アプリ

運転特性のスコアもリアルタイムに表示されます。図中の「加」、「減」は、それぞれ「加速の安定性」、「減速の安定性」を意味していることはすぐに想像できると思いますが、「コ」と「ハ」は「旋回の安定性」と「直進の安定性」を意味しています。検証当時は現在の項目名称とは異なっていました。ちなみに、「コ」「ハ」は、それぞれ「コーナリング」「ハンドリング」の頭文字のことです。

走行テストは、

  • 路線バスを利用する
  • レンタカー、あるいは、カーシェアリングを利用する
  • 外部に委託する

などの方法があります。私は、コストパフォーマンスがよく、何より自分が運転する必要がなく画面をずっと見ることができるので、路線バスをよく利用していました。路線バスの一番後ろの席の窓際に座り、窓枠にスマホを置いた状態で検証していました。ソースを改修してバス検証をする、というステップを何度もおこなってブラッシュアップしていったのを覚えています。もちろん、これらは業務時間内に実施し、バス料金は会社負担です。

ヤフーはWebの会社でオフィス内で黙々と仕事をしているイメージがあると思いますが、カーナビに関しては、実地検証のためオフィスの外に出て仕事もする珍しいサービスの一つです。

9. 今後の改良ポイント

ここまでの話で、この運転特性のスコア計算の弱点もお気づきになった方もいらっしゃると思います。ここでは、この弱点も念頭におき、今後の改良ポイントを示したいと思います。

  • 車が水平面内を走行していることが前提になっています。坂道や山道など傾斜がある道路では水平面からの傾きにより重力加速度がZ成分、Y成分に現れてしまい誤差が発生することが課題です。従って、スマホのジャイロセンサーによって車の傾斜具合を計測し、補正することでスコア計算の精度向上をする。
  • スマホが固定されていることも前提になっています。途中、手にとられたり、スマホホルダーにしっかり固定されず揺れがあると正しく加速度が計測されないため、これらを反映させる仕組みを導入する。
  • 一般に大排気量の車種の方が軽自動車よりパワーがありますので、加速の仕方が全く異なります。このように、車種により運転特性がどのように影響をうけるか調査をし、スコア計算に反映させる。
  • 都会の道路と郊外のワインディングロードでは車の走り方が全く異なります。このように、走行する道路環境により運転特性がどのように影響をうけるか調査をし、スコア計算に反映させる。
  • 現在は加速度のみ注目してスコア計算していますが、制限速度を大幅に超えた運転は安全運転とは言えません。速度も反映したスコア計算も導入する。

など、まだまだ改良ポイントはありそうです。これらは全て難易度は高いですが、Yahoo!カーナビでは、これらの課題解決に向けて挑戦を続けていきたいと考えています。

10. トンネル内での停止判定にも応用

スマホの加速度センサーは他にも応用が可能です。トンネル内では、衛星利用測位システム(GPS)の電波が届かないため、車がどこにいるか判定することが困難になりますが、Yahoo!カーナビでは、トンネル内でも自車位置を進ませることができます。
しかし、渋滞などで車が実際に停止したら自車位置も停止させなければなりません。その車の停止判定に、上記のようなスマホの加速度を車の座標系に変換した値を入力とする機械学習を利用しています。これはスマホの加速度をそのまま入力値とするより判定精度を高くする効果があると考えています。

11. おわりに

本稿では、Yahoo!カーナビの「ドライブ記録」に搭載された運転特性をスコア化する機能について、どのような原理、方法で実現しているかの概要を紹介しました。特に、スマホの加速度センサーから計測される値のOSによる違いや、座標変換式の求め方、そしてその解など、加速度センサーの利用を検討している方には参考になるのではと思います。

また、Yahoo!カーナビの開発の側面も紹介しましたが、Yahoo!カーナビをご利用いただいた際には、開発エンジニアに対する叱咤激励として下記のリンクよりフィードバックをいただければ幸いです。

■Yahoo!カーナビ - お問い合わせフォーム

自動車事故の少ない社会を実現するために、加速度のようにスマホのセンサーから取得できる情報、他デバイスで取得できる情報、その他の統計情報などあらゆる情報を活用し、ヤフーにしか解決できない大きな課題を技術の力で解決すべく、引き続き私も挑戦していきたいと思っています。

こちらの記事のご感想を聞かせください。

  • 学びがある
  • わかりやすい
  • 新しい視点

ご感想ありがとうございました


浅見 宗広
Yahoo!カーナビエンジニア

このページの先頭へ