こんにちは、kazuです。
去年の交流ロボコンで有限回転独立ステアリングの制御を極めつつあったのでそれを紹介します。
ハード
ブラシDCモーターx2で操舵と駆動を動かすいつものやつを作ってもらいました。
当時3年の先輩が元の設計を作成し、当時2年のチームリーダーが改良、加工組み立てをしました。
最終的にはステアが1回転したらロリコンが1回転する、1:1にすることができたので制御的には嬉しい限りです。
また原点取り用に半円をインタラプタで検知できるようにしてありました。
Dぷりで作成し固定が甘かったのとたまにインタラプタに引っかかりインタラプタを5個破壊しました。
回路
代々伝わる黒MDなるものを足回りだけで8枚使用しました。
何度か逆接などして死にかけでしたがなんとか動かすことができました。
初期の制御
原点取り
- ロリコンをリセットし、現在の位置を0にします
- 180度分回転させます(ギア比を考慮したロリコンの値を使用)
- 回している途中でインタラプタの値が変化したらそこでロリコンをリセットし、回転を止めます
- 180度回りきってもインタラプタが変化しなければ逆回転を始めて、-360度分回転させます
- 1の場所から-180度の位置まで回転する間にインタラプタが変化したらロリコンをリセットし逆回転を止めます
- -180度まで回っても反応しなかったら回路エラーなので一時停止し操縦者に信号を送ります
PID
8つのPIDを動かしたらメモリが足りなかったのでPCでPIDをしてその結果を動かすようにしました。
mROS 2を使ってマイコンと直接ROS 2で通信することで高速通信が実現できたのでPIDで問題は起こりませんでした。
(どちらかというとMD内部の台形制御が時間かかってた)
結果
- インタラプタの故障が多かった
- 原点がDプリの精度に依存していたため良くなかった
- PIDはいい感じだが通信切れたらいろいろまずい
2度目の正直
原点取り
- ロリコンをリセットします
- 1秒間回転させます
- 回転している途中でZ層(1周に一回反応する層)が反応したらロリコンをリセットし、値のオフセットを考慮したPIDを開始します
- 2秒間逆回転させます
- 3と同じようにZ層を使い原点を取ります
- すべての原点が3秒以内に取れなかった場合、一時停止します
PID
駆動のモーターの回転数の差が大したことなく、操舵の精度が終わっていたため操舵だけマイコンでPIDしました。
時間がなかったので限界感度法を試しました。
各操舵のターゲットは1回転のねじれまで許容するようにして、それを超えたら180度戻す形にしました。
こだわり
coutを魔改造し、以下のような出力にしました
結果
- 操舵モーターおそすぎる!!
- デバッグはしやすかった
- 操舵の最適化に成功した
僕の考える最強の有限回転独ステ制御
実際に制御してみて以下の実装は必須だと考えました。
- 原点取りはZ層を使う
- 機構班にはエンコーダー1回転でステア1回転以上に設計してもらう
- 初回電源投入時はケーブルのねじれを解消しておく
- ねじれ過ぎたら180度回転
- ケーブルの長さから許容できるねじれを考える
- 駆動モーターの回転方向を逆にする
- 90度以上回転しようとした場合の最適化
- 目標値±180度して90度いないに収める
- 駆動モーターの回転方向を逆にする
- 制御電源を切るときにステアを原点に戻す