勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

マイコンと加速度センサでタコメータを作る - 6. 回転数推定

前回の加速度ログを取ったとき、一緒にGPSのログをスマホのアプリで取っていました。
エンジンの回転数は速度と比例関係にあるかと思います(クラッチを切っているときを除く)。
これを使って、回転数の推定が正しいかどうか確認してみます。

GPSログ

いつもこのアプリでツーリングのログを取っています。

ZweiteGPS

ZweiteGPS

  • SENSYUSYA
  • ナビゲーション
  • 無料
apps.apple.com

いくつか設定項目がありますが、今回大事なこととして、

  • 速度も記録する
  • 記録の間隔はできるだけ短く(最短1秒まで設定できました)

という2点があります。

f:id:nokixa:20200912194433j:plain:w300 f:id:nokixa:20200912194437j:plain:w300

速度は、GPSの位置情報さえ記録できていれば計算はできると思いますが、計算しておいてもらえればそれが楽です。

GPSログデータ

ZweiteGPSで取ったログは、いくつかの形式で出力できます。

等々。

CSV形式が一番簡単に解析できますが、出力したものを見てみると、位置情報しか残っていませんでした…

KML形式データをCSV変換するのが一番やりやすそうでした。

変換は以下のサイトを使わせてもらいました。

www.chizroid.info

こんな感じでCSVデータが得られました。

f:id:nokixa:20200912223036p:plain

ここから、時刻と速度のデータを取り出します。

f:id:nokixa:20200912223203p:plain

テキストエディタでとりあえず開きました。
<br />をカンマに置換すれば処理しやすそうです。

f:id:nokixa:20200912223912p:plain

置換後、エクセルで開きました。
ここから時刻と速度の列だけ取り出します。

色々と加工して、最終的に以下のようなCSVデータを作成しました。

t[sec],速度[km/h]
0,0
14,1.1
18,1.1
21,1.8
24,1.8
29,1.4
34,2.5
35,4
36,7.2
37,7.6
38,6.8
39,7.2
40,5
42,14.8
43,19.1
44,21.6
...

グラフにするとこんな感じ。

f:id:nokixa:20200913195354p:plain

※このGPSログは、目的地(いつも行くカフェ)からの往路全体を記録しています。前回の加速度ログは、この往路の一部だけで記録しています。

停止しているところは1秒間隔ではデータ記録していないようです。

このデータと回転数データを比較していきます。

回転数と速度の関係

エンジンが回転してから動力がホイールに伝わるまで、色々とギヤ等が間に入ってきます。タイヤの径も速度に影響してきます。
幸い、車種ごとに回転数 ⇔ 速度の変換表を出してくれるサイトがありました。

nokubi.jp

この表から、ギアごとの回転数 ⇔ 速度の関係が出てきます。

ギア 速度[km/h] / 回転数[rpm]
1速 5.01 x 10-3
2速 7.85 x 10-3
3速 1.05 x 10-2
4速 1.32 x 10-2
5速 1.61 x 10-2

グラフ作成


※9/28記載
以下のグラフ作成は間違いがありました。
読まないでください… (´;ω;`)
次回の記事で正しくグラフ作成&検証しています。


前回までのFFT結果から、時間ごとのピーク周波数を抜き出してみます。これが回転数に対応ことになるかと思います。

まずは前回と同様のデータ取り込み。

>> [gData ovrn] = read_adxl345_log_bin_2byte("adxl345_log_002.bin");
Header detected, Ver:1, Size:8
Rate:1600[Hz], Range:2[G]
>> gFFT = fft_slice(gData(:,2), 512);
>> x = gData(512:512:end,1);

次に、maxを使って、時間ごとのピーク周波数を出します。
maxは、2次元配列に使うと、列ごとの最大値を持った行ベクトルを返します。
今回で言うと、gFFT(freq, t)からgPeak(t)が生成できます。
最終的に列ベクトルにしておきたいので、.'を付けて転置します。

>> gPeak = max(abs(gFFT)).';

plotでプロットします。

>> plot(x, gPeak);
>> xlabel("t[s]");
>> ylabel("freq[Hz]");

f:id:nokixa:20200916013242p:plain

ちょっと汚いですね…
とりあえずこれで進めることとします。

これに、先ほどの回転数→速度の係数を全ギアについてかけてみます。

>> gear1 = gPeak * 60 * 5.01*10^-3;
>> gear2 = gPeak * 60 * 7.85*10^-3;
>> gear3 = gPeak * 60 * 1.05*10^-2;
>> gear4 = gPeak * 60 * 1.32*10^-2;
>> gear5 = gPeak * 60 * 1.61*10^-2;

60を掛けているのは、[Hz] → [rpm]の変換のためです。

これに速度グラフを重ねます。
まず先ほど作ったGPS速度データのcsvファイルを読み込みます。

>> vel = dlmread("20200816-154637.json_exp_2.csv", ",", 1, 0);

ギアごとの推定速度と、GPSからの速度をplotでグラフ化します。

>> plot(x, gear1, x, gear2, x, gear3, x, gear4, x, gear5, vel(:,1), vel(:,2));

f:id:nokixa:20200918000143p:plain

色々気になるところがありますが、まず時間軸範囲を加速度データがある部分だけにします。

>> axis([0 400 0 300]);

f:id:nokixa:20200918000808p:plain

時間軸の基準を特に合わせるようなことをしていないので、調整が必要です。
グラフを見たところ、なんとなく走り出しの時刻で合わせられそうな気がします。
グラフを拡大して見てみます。

>> plot(x, gear1, "*-", x, gear2, x, gear3, x, gear4, x, gear5, vel(:,1), vel(:,2), "*-");
>> axis([0 50 0 100]);
>> xticks([0:1:50]);

f:id:nokixa:20200918013021p:plain

マーカーも付けるようにしました。
また、グラフウィンドウの"グリッド"をクリックして、グリッド表示もしました。横軸刻みも変えました。
加速度データでは21秒、GPS速度データでは40秒に動き始めているようなので、GPS速度データの時刻を19秒分引いてやれば良さそうな感じです。

>> plot(x, gear1, "*-", x, gear2, x, gear3, x, gear4, x, gear5, vel(:,1) - 19, vel(:,2), "*-");
>> axis([0 400 0 300]);

f:id:nokixa:20200918013806p:plain

こんなグラフになりましたが、1速での推定からしGPS速度データを超えています。

原因として今考えられるのは、

  • 加速度センサIC(ADXL345)のタイミングで加速度サンプリングしてもらっていますが、これがどれほどの周期精度を持つのか、要確認です。
    グラフを見ても、最初のほうの時刻では加速度データとGPSデータが合っているようですが、後半の急に落ち込んでいるところの時刻がずれているように見えます。 CPUクロックはちゃんとした水晶を使っているので、これで補正することを考えます。
  • Vツインだから? ドラッグスター250のエンジンはVツインなので、ピーク周波数が実際の回転数の2倍のところに出るのかもしれません。

それでもギア5速としたときの推定速度が200km/hまで行っているのが不可解…

続く

まだ解析の余地があると思うので、同じデータで引き続き解析してみます。