スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

慣性のリアルタイム更新と加速度フィードフォワード

今日はイナーシャ推定の続き.
マイコンに先の同定アルゴリズムを実装し,パラメータ等を変えながらモータ駆動実験を繰り返す.

推定したイナーシャを元に,加速度フィードフォワード値をリアルタイムに変化させてみる.
フィードバックゲインは変えない.
イナーシャ推定は逐次最小二乗法を用いた.



この例では,イナーシャをおよそ9倍に変化させたときの速度応答を見ている.

ここで,イナーシャが更新される図の赤線(100msec経過)あたりでサーボ動作が乱れ,一時的に速度誤差が大きくなっている.
その後は誤差はゼロに収束し,同定が完了した2回目以降はほぼ速度誤差はゼロで安定している.

このことから,同定しながらFF値更新すると,一時的にイナーシャ値を固定したときよりも追従特性が悪化する場合があることが分かった.
フィードバックをいじらなければもっと素直な応答(誤差が同定の進行と共に漸減)になると予想したが,意外な結果だ.
今回の例でいうと,もともとイナーシャが真値よりも小さい状態から駆動を開始するため,起動直後はFF制御量が足りずFBの負担が大きいためサーボは振動的になる.
その状態の時にイナーシャ推定値更新すると,フィードフォワードトルクが急激に増加しますます不安定になる,ということだろうか.
もしそうだとしたら,フィードバックの振動が十分収まってからイナーシャ値を更新すれば,少しはマシになるかもしれない.
スポンサーサイト

リアルタイム慣性同定のテスト

今週末はリアルタイム同定アルゴリズムの実装準備を行う.

やりたいのは加速度と電流値の測定値からシステム全体のJ/Kt=[慣性モーメント/トルク定数]を逐次推定することである.
この定数は電流とトルクを結びつけるサーボの最も基本的なパラメータであり,
ここからフィードバックゲインやフィードフォワード量を決定することができる.
これをリアルタイム推定できれば,例えばロボットが急に重いものを持ったりしても,持つ前と全く同じ動きをするシステムが実現できる.
マイコンに実装する前に確認のため,エクセルで計算し感じをつかむ.
入力値はモータをSinカーブの速度目標値で駆動させた時の加速度と電流値である.


上記の加速度と電流値はともに50Hz程度のローパスをかけてノイズを下げてある.
このデータに対し,最小二乗法(RLS),固定トレース法(FTA)でJt/Ktを逐次推定した結果が以下である.

逐次最小二乗法(Recursive Least Square=RLS)は忘却係数により新しい値にどのぐらい重みを付けて推定するかを選ぶことができる.
忘却係数を1.0にすると,その時までの過去データをすべて均等に使った区間平均と等価になる.
通常は1.0よりわずかに小さい値に設定し,イナーシャ変動に追従できるようにする.

固定トレース法(Fixed Trace Algolism=FTA)では加速度が大きいときは重みが増加し,加速度が小さい=S/N比が悪いときは新しいデータの重みが下がって前回値を保持する特徴がある.
このため有効なデータがノイズに埋もれ,推定値がノイズの平均値に引っ張られるのを回避することができる.

上記のグラフで,速度が小さい時はエンコーダ分解能の不足による推定精度の劣化が見られる.
ここは瞬時速度オブザーバで精度UPするか,単純に低速域の重みを下げるかで対応すればよい.
しかし,いろいろいじる中で気になったのは外乱の影響である.
上記は外乱ゼロで,摩擦負荷は事前に同定した値を使っているので安定しているが,実際には負荷変動や摩擦の変動影響があると推定値が大きく振られてしまう.
この文献によると,外乱に強くするには加速度の微分を使いDCカットする方法,外乱オブザーバで推定した推定外乱トルクを組み込む方法が有効らしい.
なるほど!ということでさっそくやってみたところ,加速度の微分=躍度のデータを入力にした場合はノイズが大きすぎて推定値はほぼゼロに収束してしまった.
外乱代入による方法も試したが,瞬時速度オブザーバのイナーシャ値が発散してしまい,こちらもうまくいってない.
何かやり方がまずいのかもしれない.

そもそも,外乱負荷と全イナーシャ変動の違いって区別できるものなんだろうか?
例えばモータに力を加えた時にモータ軸が前よりも「動きにくい」という状態だった場合に,それが一時的に加わった負荷によるものなのか,それともシステムの慣性が増加したものなのか,どうやって判別すれば良いものか.
例えばロボットアームの先端におもりをぶつけた場合と,おもりを取り付けた場合の差は何か.
差があるとしたら,負荷変動は作用時間が短く,慣性変動は長い,ということだろうか.
だとしたら,イナーシャの推定速度は外乱負荷の推定速度よりも十分遅くしないといけないことになる.
追従が遅いのではイナーシャ値を逐次更新するメリットがあまりないのではないか.
それだったらいっそのこと,イナーシャの逐次推定はやめて初期値固定にしておいて,外乱オブザーバで慣性誤差も外乱負荷もまとめて全部出力しちゃったほうが手っ取り早い気もしてくる.
でもそうなると今度は,イナーシャが長い間オフセットしたままになった場合にフィードフォワード量が実システムに合ってないので恒常的に精度が悪くなるなぁ・・・
ニワトリが先か,タマゴが先か・・
うーん・・・実はこのあたり,まだ全然イメージがつかめてない.
いずれにしても,実験をやりながら少しずつ解決していこうと思う.

瞬時速度オブザーバ,イナーシャ同定など

だいぶ更新が止まってしまったが,ここ最近はモータ制御アルゴリズムの改良に取り組んでいる.
追値制御の速度精度はリアルタイムのエンコーダ誤差補正でかなり滑らかになったが,低速域の残留振動が気になっていた.
 これまでにエンコーダパルスの極性反転を無視する不感帯を入れたり,超低速までカバーできる大容量のInput-Captureタイマを使用するなどして改善を試みてきたが,駆動慣性が極端に小さい場合やエンコーダが1制御サイクルに1pulseも来ないような低速ではどうしても振動が生じてしまう.
この原因はエンコーダパルスの分解能が不足していることにある.
先の実験で、エンコーダ分解能を上げれば改善することは分かっているが,そうすると要求される計算リソースがそれに比例して大きくなってしまう.(また,エンコーダの値段も当然上昇する.)
あるいは低速時にカクカクになる速度信号を滑らかにしようと,安易にLPFを挿入したりすると追従速度も遅くなってしまい,せっかくのコアレスモータの機敏な応答が失われてしまう.
なんとか応答速度は高速をキープしたままもっと滑らかな速度値を得られないものか・・・

そこで,制御周期内にパルスが来ない区間の速度をモデル推定する 瞬時速度オブザーバ を実装してみた.
以下がその実験結果の一部.


グラフはSin波形で目標速度を変化させた時のモータ速度の追従精度を表している.
瞬時速度オブザーバ(Instantaneous Speed Observer =ISO)をONにすると,低速域の速度リプルが小さくなっていることがわかる.
とくに制御周期の2~4倍の間エンコーダのパルスが来ないような超低速域で,速度がカクカクになって振動してしまうのを防ぐ効果がある.
このことは,例えば同じイナーシャに対して速度F/Bのゲインを高くした場合の振動抑制にも効果があることを示している.
また,制御周期をDSP等でさらに高速化すれば低速だけでなく中速,高速域でも速度制御を滑らかにする効果がある.

瞬時速度オブザーバでは,パルスが来ない区間の速度を電流の積分値から計算した速度推定値で補うことができる.
つまりいつでも好きなタイミングで「当たらずしも遠からずの速度の瞬時値」が得られる.
ただし,この電流積分から得られる推定速度は外乱等の影響でどんどんドリフトするので,エンコーダパルスが来た瞬間に真値に近づくように補正してやる必要がある.
推定値の修正はパルス発生ごとに行う方法と,制御周期ごとに行う方法があるが,パルス発生ごとに割り込み等で行ったほうがより正確な値に近くなる=そのぶんより低速まで安定して推定できる.

ISOを使うには①電流検出精度と,②イナーシャや摩擦抵抗の正確な同定が重要になる.
今回①は自作のモータドライブ基板に差動アンプや高精度ADCをフル活用して精度を確保しているため問題ない.
②は今のところ台形速度駆動や一定速度駆動時の電流値などからオフラインで算出しているが,少々面倒なので今後はオンラインで同定できるように,逐次最少2乗法などを実装していきたい.

プロフィール

もやね

Author:もやね
長野県在住の会社員(メカニカル・エンジニア).
ロボットは完全な趣味としてやってます.
E-mail:
mo_ya_ne[a]yahoo.co.jp
[a]⇒@

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
FC2カウンター
ブログ内検索
RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。