読者です 読者をやめる 読者になる 読者になる

susutex’s blog

毎日更新を目指して自転車、電子工作、プログラミングとかについて書くかもしれないブログ

ローラー台の回転速度から負荷を推定するプログラムを書いた

プログラミング 自転車 python

パワーメーターを買ってローラー台こいでいるときのパワーが取れるようになったので、頭の体操として速度情報のみからローラー台の負荷の推定するプログラムを書いた。

 

モデル化

ローラー台はフルード式。つまりオイルの粘性で負荷をかけ、慣性はフライホイールの回転で再現する。摩擦による負荷もある。
よって、pを投入されるパワー、vをローラーの回転速度として、以下の簡単なモデルを仮定する

・p = (損失) + (速度の変化による回転体の運動エネルギー変化量)
・損失は摩擦と粘性抵抗を考慮することとすると、それぞれvとv^2に比例する。
・運動エネルギーはv^2に比例するため、その変化量はd(v^2)/dt = 2v*dv/dtに比例する。

以上からa1, a2, a3を定数として

f:id:susutex:20170209232325p:plain

雑に離散化すると

f:id:susutex:20170209232338p:plain

(前者と比較してa3には実際は1/Δtがかかっているがどうせ計算では定数倍は意味がないので気にしない)

この式に、実際にローラーを漕いで得られたデータをフィッティングすることで速度vのみからパワーpを推定する。

使用するデータはなるべく広範囲の速度におけるのデータがあること、なおかつ運動エネルギー周りを求めるために大きな加減速があるものが望ましいはず。インターバルトレーニングのデータは最適。

フィッティングは、とりあえずpythonを使ってプログラム書いてscipy.optimize.leastsq関数を使った。

 

計算結果

全体

f:id:susutex:20170209225042p:plain

Fitted lineとpe1は運動エネルギーを考慮しない場合、つまり純粋に速度に対する損失のみの曲線。pe2は運動エネルギーの変化も考慮した曲線。

開始直後

f:id:susutex:20170209230948p:plain

最初のあたりは推定されたパワーが低めに出ている。フルード型負荷装置の負荷は温度に依存して変化する。そのため、こぎ始めてしばらくは速度に対する負荷が大きく、温まってくると負荷が小さくなるようだ。

 

インターバル前のスプリント

f:id:susutex:20170209231004p:plain

900Wに届かない。弱い。

急激に加速と減速を行う部分のため、運動エネルギーを考慮したほうが実際のpに近づいているように見える。

 

インターバル後のおかしな部分

f:id:susutex:20170209231019p:plain

これはおかしな部分。パワーが0なのに推定されたパワーが上下に振れている。

パワー0ということはこいでいない状態。この時はラチェットの動作により負のパワーがかかっていることになる。ラチェットによるパワーはモデルに入っていないためこのようなことが起こるのだろうか。

 

いろいろそのうち調べたいこととか

  • leastsqの中身は何やってるんだろう
  • 離散化した際、dv/dtを求めるところを vn+1 - vn と vn + vn-1 のどちらにするか悩んだが、後者では運動エネルギーを考慮しない場合とほぼ差が見られなかったので前者にした。このあたりも大学の授業でやったような気がするが忘れた
  • なんでパワー0だと出力がおかしくなるのか
  • パーツ交換して同じことをやって計算結果の係数を比較すれば、よくチャリパーツの宣伝文句になってる「チェーンのフリクションロス低減により/ビッグプーリーにより/セラミックベアリングにより/etc. パワーのロスを??W低減!」とかがそれなりの精度で検証できそう