運転のGと不快度を可視化する装置を作った
久しぶりにM5Stackで工作をしてみたので手動かしてみた感想と得た知見を書いていく。
筆者はドライブを趣味にしている。昔から人を乗せる機会が多く,普段から乗り心地のよい運転を心がけていて,それ自体もまた楽しみにしている。赤信号で停車するときにはなるべくカックンさせないようなブレーキ操作をするし,カーブでは減速していわゆる横Gを感じさせないようにしている。MT車なので,変速時の衝撃をいかに抑えるかということにもこだわっている。乗り心地の良さならそこらのドライバーに負けない自信がある。
ところが正直,運転する側は酔いづらいということもあって実際にはどのくらい快適な運転ができているか分からない。たとえ同乗者に聞いたとしても,乗せてもらう立場ゆえに遠慮して「酔っている」と言えていないだけかもしれない。 というわけで運転操作によるGと不快度を定量的に確認できる装置を作った。 (というのは建前で久しぶりになんか手動かして作ってみたかっただけです)
M5Stack GRAYで作成
大雑把な仕様
実現方法
- 加速度センサ,LCDディスプレイ,ボタンを搭載したM5stack GRAYを使用
- ジャーク(加速度の時間変化のこと,躍度,加加速度とも)を使った不快度推定
画面のイメージはこんな感じ。
矢印でGのかかる向きと大きさを、顔で不快度を表す。 pic.twitter.com/ThNcco8Y3y
— しんじ (@shinjimp3) 2021年1月22日
不快度の程度を4段階に分け,低い順に「ハッピーな顔」「普通の笑顔」「ぴえん顔」「げろ吐き顔」を表示するようにする。 ドライバーは装置画面を注視できないので,周辺視野でも顔を把握できるような図柄にした。特に「ぴえん顔」「げろ吐き顔」については顔の色を変えてヤバさを訴えることにした。(ブザー鳴らしても良かったかも)
Gは赤い矢印でその方向と大きさを示す。こちらも周辺視野で程度が分かるように,矢印の長さを伸ばすのではなく矢印自体を大きくするようにした。「なんか画面がめっちゃ赤くなってる」ように見えればそれはかなりのGを感じさせているということである。
不快度の定量化が吐きそうなほどしんどかった
ジャークが不快度に聞くという事前知識を持っていたので,「ジャーク,自動車,酔い」当たりのキーワードでヒットした文献『自動車の加減速と乗り心地の関係に関する研究』 を頼った。結論としては,直前3秒間の加速度のピーク値とジャークの実効値(二乗平均?)が効いていて,それらの重みづけ和が被験者実験で得た不快度をよく近似できるというものだった。この文献の式とパラメータをそのまま使えばすぐに実装できるだろうと思った。
しかしそこそこ開発を進めた段階で重みパラメータが文献中に明示されていないことに気づいてしまった。「加速度とジャークを標準化した後の重み」なら載っているが,どのようなデータを使って標準化したかもわからないので,結局不明のまま。
そこで重みパラメータを文献から取るのを諦めて,変数をジャーク1本に絞り,重みパラメータは実車を運転して実験しながらそれらしいものに合わせることにした。本当は同じ量のジャークでもその前後で不快度は異なるらしいが,ここも簡単のためジャークの実効値の絶対量だけ見ることにした。そもそも快不快なんて人やその人体調によって異なるので,もう目安にする程度のものができればいいのではとも思った。(やけくそ)
さて実験するにも筆者はそこまで酔いやすい体質ではない。とはいえ友人に協力してもらう時間もあまりなかった。ので,自ら酔いやすいコンディションを作り,実際に車を動かしながらパラメータを合わせることにした。具体的には直前にラーメンをしこたま食べてお腹いっぱいにし,酔いやすい状態を作った。(この時点でもう運転したくない)
この状態の自分が「気持ち悪いぴえん」となるタイミングで「ぴえん顔」が表示され,「吐きそう」と感じたタイミングで「げろ吐き顔」が表示されるように,パラメータを調整するのである。
急ブレーキの度合いで不快度が変わる。「ちょっとやだなー」くらいでぴえん顔に🥺 激し目にカックンさせるとゲロ吐く🤮(駐車場の安全な場所で実験してます) pic.twitter.com/1ou2fXgax3
— しんじ (@shinjimp3) 2021年1月22日
実際に車に乗り,駐車場内の安全な範囲で急な加減速,急ブレーキ,急ハンドルを試しながら調整した結果,それらしいパラメータを設定することができた。たとえ徐行でもブレーキを強く踏んで停車すればかなり不快であることが分かる。本当に不快,吐きそう。
公道を走ってみると路上の段差(橋のつなぎ目など)を踏むだけでもすぐに「ぴえん顔」「げろ吐き顔」が出てくる。辛口でシビアな設定に感じたが,段差踏んで吐きそうになるのは事実なのでなにも間違ってはいない。
1速から2速,2速から3速の切り替えでも意外と毎回ぴえんになる。ドライバーとしては操作で体が動いているためか気にならないが,同乗者からするとクラッチ踏んだ時の無加速状態もクラッチつないだ後の加速も不快に感じるのだろう。例えば路線バスに乗った時のことを思い出すと,確かに発進時シフトチェンジが激しくて酔いやすかった気がする。あんな感じだろうか。
というわけで,できたコードはこんな感じです。ドキュメントはおいおい書きます。
得た経験と知見
- 描画に数十ms時間がかかって,メインの加速度信号処理(100Hz)に支障が出る
- ESP32のマルチコア機能を使うとよい
- マルチタスクで実装 - m5stackで組込み!!
- 加速度を一定サンプルで取得しようとしたが,タイマ割り込みの機能と併用する(タイマ割り込み関数の中で加速度取得を行う)と「Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1)」みたいなエラーが発生して,再起動を繰り返してしまう
- Loopの中で処理時間を計測し,処理時間を差し引いたdelay()を置くことで,10ms(100Hz)置きにloopを動作させるようにした。
- IMU機能とタイマ割り込みは相性悪いのだろうか... 組み合わせた例もあまり無く,原因がよくわかっていない。
- IMUは今現在最新のライブラリではMPU6886を使うと良いらしい
- 前回使ったMPU9250ではsetupでエラーが発生する
- Arduino - M5Stack Gray スケッチサンプルのエラー|teratail
今後
- 毎ループM5.Lcd.fillScreen(BLACK)で画面を塗りつぶしてから描画をすることによる画面のちらつきを直す。
- 顔は変更時のみ描画すればよい
- 矢印の更新は差分だけ描画しなおすように変更すればよい
- 1ドライブ,または単位時間あたりに何回「ぴえん」「げろ吐き」を起こしたかをドライブ後にリザルト画面として出す。
- 友人のアイデア。交代で運転しながら旅行するとき楽しそう。