前回は物理バランス方式による倒立制御の基本的な説明をしました。
選定したモーター・ギヤ・タイヤの組合せではこれだけでとりあえず立つことは出来たと思います。
ただし「その他の組合せでは動きがおかしい」といった現象に出くわしているかもしれません。
そこで、もう少し装置構造の影響を加味した制御方法について解説します。
関連:
・
ハード選定・
センシング準備・
諸元測定・
物理バランス基礎装置の基本構造
さて、当ブログでは以下の左図の様に本体が直接タイヤを駆動する構造の
倒立ロボットの制御を行っています。
大きさや重さに関わらず同じ原理で動かしたいところですが、大きさや重さを変えると
基礎編の方法だけでは立ったり立たなかったりします。
そこで少し各所に加わっている力をもう少し詳しく考えてみます。
車輪を押し戻す力
これは特に「モータートクルに対して車両が重い場合」に顕著な影響がみられます。
基礎編では転倒軸に対して直行する回転に影響する力のみ考えていましたが、
実際には軸と平行な方向の力も発生し、これをタイヤが支えています。
タイヤが支える力のうち地面と垂直な垂直抗力分はほぼ動作に影響がありませんが、
地面と平行な成分については影響を無視できない事があります。
サンプル機の様に装置質量に対して台車の駆動力が十分大きい場合はこの力は
気になりませんが、装置が重い場合やギヤ比やモータートルクが小さい場合は
この力に打ち勝たないと前進できません。
前進を阻害する力F_push=mg cos(θ)*sin(θ)
となるので、
acc_counterに
acc_push=
gravity *cos(
ang_sub)*sin(
ang_sub)
を上乗せすれば前進を阻害する力に打ち勝つことができます。
車両が軽い場合はこの値は0の方が安定します。
諸元測定の回での加速性能から求めた停動トルクとカタログスペックの停動トルクの違いが影響している可能があります。要調査。
車軸の反モーメント
基礎の方に少し話を追加しましたが、車両移動による倒立制御でも今回の様に
本体が直接タイヤを駆動する構造の場合、モーメントで本体が押し戻されます。
台車を加速する際にはボ
ディーからタイヤに対してモーメントが発生しますが、
このとき
ボディーはタイヤから捩じり返されています。
自動車の様に車両が水平であればこのモーメントをあまり気にすることはありませんが、
ほぼ垂直に立っていると車両が加速する前に車両角度へ影響します。
支点を動かして倒立制御を行う場合は力と加速度の計算式
F=M*Aから加速度を計算しました。
これを車軸の回転で発生させることを考えると車軸に発生するモーメント(反モーメント)は
軸に追加で発生するモーメント=
力×
タイヤ半径
となります。
本体が直接タイヤを駆動する構造の場合、傾きを
立て直すために加速すると
立て直す向きにモーメントが発生することになります。また、同じ加速度でもタイヤの半径でモーメント
の大きさが変わります。タイヤが大きい方が倒立制御しやすいのはこの影響です。
転倒モーメントのカウンターとして発生させようとしていた反モーメントおよび力は
反モーメント=質量×重力加速度×重心までの距離×sin(角度)
力=質量×重力加速度×tan(角度)
だったので、
最終的に回転軸に発生するモーメントは
合計モーメント=
反モーメント+
追加で発生するモーメント =質量×重力加速度×
重心までの距離×
sin(角度)+質量×重力加速度×
tan(角度)×
タイヤ半径となります。
これを整理すると
合計モーメント=
反モーメント +
反モーメント×(
タイヤ半径/
重心までの距離)×(
tan(角度)/
sin(角度))
更に
合計モーメント=
反モーメント×(1+
タイヤ半径/
重心までの距離/
cos(角度))
となり、この式からも重心までの距離に対してタイヤ半径が大きいと立て直すモーメントが
大きくなることが分かります。
倒立としては追加で発生するモーメントはありがたいのですが、車軸に押し戻される力等を
計算に加えるとモーメントが大きくなりすぎるので今回は装置構造の影響を軽減するため、
求まった加速度を
出力する加速度=
求まった加速度/(1+
タイヤ半径/
重心までの距離/
cos(角度))
として、追加で発生するモーメントの影響を抑える事にします。
ここまでのまとめ
前回の変数等を利用して
ベース速度の設定
spd_base=
spd_now;
角速度を打ち消す速度
spd_counter=
len_top*
gyr_sub /cos(
ang_sub);
転倒モーメントを打ち消す加速度
acc_counter =
gravity * tan(
ang_sub);
車体を押し戻す力を打ち消す加速度
acc_push=
gravity *cos(
ang_sub)*sin(
ang_sub);
速度カウンター出力
out_rate=
revision_rate(
spd2rate(
spd_counter+
spd_base));
モーメントカウンター出力
out_rate+=
acc2rate((
acc_counter+
acc_push)/(1+
radi_tire/
len_gra/cos(
ang_sub)));
これでより正確に
角度の状態を維持するようになるため
より走り続けるようになります。