2014年5月14日

MultiWiiでヘリコプター(5)  予測補正でテールホールドばっちり!

PIDをつきつめる前に、予測補正(predictive compensation)に手を出してしまいました。

PIDはどんなに頑張ってもしょせんフィードバックです。BLHeliのマニュアルにも書いてありますが、テールが動いてしまってからそれを感知して元に戻そうとするより、動く前に何が起こるか知っていてテールが動きにくいようにテールローターを制御する方が良いに決まっています。


もちろん量的に完璧な予測をできるわけはありませんが、予測補正の良いところは、フィードバック補正と組み合わせて使ってもまったくお互いに悪影響を及ぼさず、純粋にお互いの苦手分野をカバーできるところです。


ごたくを並べましたが、たいしたことではありません。コレクティブピッチを入れたらその量に応じてテールローターの出力をアップする、というだけです。

式で書くと、multiWiiのoutput.c内にあるYAWサーボの値を決めてる箇所で
servo[5] = (axisPID[YAW] * SERVODIR(5,1)) + conf.servoConf[5].middle + abs(collective)/2;
と、コレクティブの絶対値に適当な係数(うちの場合は0.5にしました)をかけて足します。
absで絶対値を取りましたがまだ背面してないのでマイナスピッチ時は未検証です。

テールローター出力とサーボの関係は機体によっていろいろなので、今回入れた係数0.5の部分は本当はあとから微調整できるようになっているべきです。しかし予測補正は正確な補正量じゃなくても予測無しよりたいていマシなので、ソースコード内にdefineで係数を定義する程度でも大丈夫かもしれません。


たったこれだけで、大幅にテールの挙動が改善されました。昨日のムービーとピッチポンプの様子を比較すると良く分かります。

昔からある技として、プロポ側でピッチを入れたらミキシングで右ラダーを少し打つようにする、というのがありますが、3軸ジャイロから見るとかなり違いがあります。

プロポミキシングの場合、3軸ジャイロさんには右に少しノーズを向けろ、という指令が伝わり、彼はテール推力を少しアップさせますが、ピッチを同時にいれられちゃったせいで不幸にもその命令は十分に実行できず、彼はかろうじて左を向かずには済んだ、と思っています。しつこいヘッドロック機能をもったジャイロなら、その後負担が軽くなったところでぐいっと本来向きたかった右を向くかもしれません。

対して予測補正の場合は、3軸ジャイロには回頭指令は全くはいらず、彼テールに対して特に何もしません。ただ彼の部下のサーボさんが、勝手に上司の指示を無視してテール出力を増量しているのが目に入るだけです。
彼は「あーあ、知らないよ」と内心思いますが、責任感がある性格なので、部下の不始末が原因であっても機首がおかしな方向を向いたらちゃんと修正してやろうと思ってます。結果的にテール出力の増量は同時に起こったピッチ負荷と相殺してテールはあまりぶれず。それでも少しピッチ負荷が勝ってゆらゆらと左を向きそうになったりしたら、3軸ジャイロさんは本来の仕事をして、ホバリング時と同じようにそれを淡々と修正します。

つまりレートジャイロ(Iゲインが0)の場合を除いて、プロポミキシングの補正と機体側での予測補正は違いがあり、機体側での補正の方がずっと有利です。




ついでにnobさんから指摘のあったD補正もいろいろ変えてみました。しかしD補正は機体の「回転速度が急激に変化した時」しか効かないので、これ単体でテール負けを防ぐ効果はほとんどありませんでした。ピッチポンプでのテール負けはmultiWiiの世界ではそう速い変化ではない、ということだと思います。

D補正が効くのは本当に速度が急激に変化し続ける場合で、つまり手でピルエット入れたり機体を傾けたりした後に、操作を止めたところでおつりが出てぶるぶるっと振動するところをダンピングさせる効果があります。
そもそも振動が出なきゃ出番が無いわけですから、かなり強めのPゲインがかかっていることがDゲイン活躍の前提ということになります。


また、Iゲインは少なくともmultiWiiの世界ではテールや機体の傾きを保持する効果はほとんど発揮できませんでした。Iゲインが働く時間周期が0.5sec程度なので、こんな周期でテールがゆらゆら大きくワグられてもうざいだけです。
なので、Iゲインはゆらゆらワグが無くなるところまで減らして、「無くてもいいけどあれば機体の向きがゆーっくりドリフトして動くのを少し軽減できるかな?」程度のものだと思っておく方が良いです。


ただこれは機体の大きさや、ジャイロセンサのローパスフィルタ周波数等によっても変わるかもしれないので、あくまで今回のマイクロヘリの場合、という結果です。

今日の時点で最も良い感触だったパラメータを載せておきます。上のムービーの時よりDゲインを増やしておつり振動がなくなったので、ムービーよりも気持ちよくすぱっすぱっと傾けられます。


2 件のコメント:

  1. Sachihoさん、こんにちわ!
    う〜!楽しそうですね!
    PIDは倒立振子をやろうと思ってた時に勉強してみたもんですが、積分とかもう忘れてしまい挫折しました(笑)
    ヘリは倒立振子より更に複雑でしょうねぇ!
    ソースはCですよね?ワタシが話せるのはVHDLとかVerilogでしてこーゆーのの開発の時にはいつもソフト屋さんが羨ましいんですよね…。

    返信削除
    返信
    1. なかなかうまく行かないですけど楽しいですよー!
      PID自体は枯れた技術なんでパラメータいじりだけじゃ限界がありますが、入力として何を与えるかの方は無限に可能性がありますからねー。

      multiWiiソースは生Cですね。
      ていうかハード屋さんでしたかー。羨ましいです。
      私はFPGA/CPLDは趣味で少し遊んだだけで、仕事ではほとんど関わる機会が無いです。
      そもそもCなんて、verilogを簡単にしたようなものじゃないですかー!(笑)

      削除