パート3パート1では、PIC制御の背後にある理論を取り上げました。パート2では、走行距離計測の現実的な問題と正確なモバイルロボット操作のためのPIDの活用についてご説明しました。今回は、その他のコードと実際のローバー設計のその他の機能について見ていきましょう。NASA/JPL閉ループホイール速度制御システム私は、2つのパーツにシステムを実装しています。私の場合、組み込み制御向けのForth言語の方言であるFORTHdsPICで記述しています。このコードは、高度な「脳機能」を実行します。マスタプランに従ってモータを駆動させ、センサ入力を監視して対応します。マスタプランでは、穴に落ちたり壁面にぶつかったりしないようにしながら、地形の探索やマッピングなどを行うことができます。リスト1の基本的なデモンストレーションプログラムでは、ホイールのタコメータシステムから更新データが来るのを待ち、モータ駆動システムの新しい制御値を計算する以外の処理はあまり行いません。低水準ベアメタルコード。スロットディスクのタコメータから送られるパルスデータを使用して、ホイールの回転速度を決定します(パート2参照)。このコードは、割り込みサービスルーチン(ISR)の一部を形成しており、dsPICの入力キャプチャハードウェアを使用してタコパルスの時間間隔を測定します。時間間隔を速度に変換する必要はありません。エラーの計算に使用するセットポイント値が時間間隔としても使われているからです。ISRは、モータ制御ループ用に新しいエラー・I・DのRaw値を計算し(K係数はまだ適用しません)、高水準プログラムで読み取れるよう、それらの値をRAMに保存します。ISRコードは、タコパルスの立ち上がりエッジが割り込みをトリガしたときにのみ実行されます。RAMのRawデータ値は各タコパルスの発生後に更新されます。タコメータのISRは、PIDアルゴリズムの最も難しい部分をすべて実行します。Forthコードを抜けてK係数の適用と値のスケーリングを制御し、PWMサーボモータドライバの制御値を生成します。プログラムの柔軟性を最大限に高められるよう、次のように分割されています。ISRは、ターゲットシステムのフラッシュメモリの中にプログラムされた組み込みFORTHdsPIC環境の一部を形成します。ユーザーが提供する高水準Forthコードは、通常はテキストファイルとしてホストPCからRAMにダウンロードされます。ユーザーコードでは、使用するP・I・Dの組み合わせ、K係数、セットポイント値を指定できます。シンプルな高水準プログラムの詳細リスト1の最初の5行は、プログラムで使用する新しいワードの「コロン定義」です。LIMITは、上位スタックアイテムの数値の範囲を制限するために使用します。PROP、INTL、及びDERVはそれぞれ、Raw値のP・I・D変数のK係数のスケーリングと乗算を実行し、処理結果をスタックに残します。PIDは、この3つの成分を合計します。次に来るのが、高水準プログラムの定義です。この定義には、コマンドプロンプトでMAIN<return>と入力されると継続的に実行される制御ループが含まれています。MAINの最初の数行は1回しか実行されません。ループが「閉じる」60ms前に変数を初期化し、モータを起動します。下記の「現実的な問題」を参照してください。AGAINループ構造内にPID制御コードが含まれています。新しい制御値は、タコメータのISRから新しい値が返された場合にしか計算されないことに注意してください。UNTILループは、ISRがPULSEフラグをセットすると終了します。フラグをクリアした後、ワードPIDで新しい制御出力値の計算が実行されます。制御値が負の値や大き過ぎる値にならないようLIMITを実行してから、新しい値をPWM連続回転サーボモータのコントローラルーチンCSERVOに送信します。精度の向上モータとホイールの間で減速ギアボックスを使用すると、ホイールに搭載のタコメータを使用した比較的不正確な計測が劇的に改善する場合があります。タコセンサがホイール軸上ではなくモータ出力シャフト上にある場合、ホイール1回転につきn回転します。そのため、タコディスクにスロットが20個あり、ギア比が100対1の場合、ホイールが1回転するたびにパルスが2,000個生成されます。当然ながら、これはプロセッサがパルス割り込みの頻度に対応できることを前提としています。起動後最初の数パルスの無効なタコデータの影響は、短時間モータで開ループを実行することで軽減できます。この例では、タコデータを使用するまで60msあれば十分でした。起動に使用するモータ制御値は、セットポイント速度でモータが動作しているときは、PIDループで生成する必要があります。これは、特定の設定でモータの開ループを行う小さなプログラムを実行し、対応する速度をタコメータからPCに返すことでわかります。その後、「検量線」で制御入力の範囲を表すことができます。このデモンストレーションプログラムでは、セットポイント速度1,800に対し、制御値30がほぼ対応しています。起動時の空白をさらに減らすには、積分値をあらかじめ目標値に設定します。0となり、P・I・Dの中で値がゼロ以外の唯一の成分は積分となります。この場合、これはINTLが値30となることを意味します。Ki係数0.01を使用する場合、Rawデータ変数INTEGを3,000で初期化する必要があります。負荷がかかった状態での駆動デモプログラムで使われている数値を、「ジャッキアップ」してホイールが地面から離れているロボットに適用します。モータは少し又はまったく負荷がかかっていない状態で動いています。地面上では、モータはずっと高い負荷で動作する必要があります。ターゲット速度に到達するには、より大きな制御入力が必要です。パワーに余裕のある、用途に適した強力なモータを選択している場合、これは問題となりません。最初の設計における重要なタスクは、モータと駆動系の負荷を適切に保つことであり、正しく実装する必要があります(下記「駆動系の構築」を参照)。PIDコントローラは、選択可能な最大セットポイント速度を維持する場合に生じる可能性が高い最悪の障害に対し、モータのパワーを上げて対処できる必要があります。私のロボットは小型で、サイズに合わせてモータで駆動します。これらのモータは、連続回転向けに改造したホビー用サーボモータで、50Hzのパルス幅変調(PWM)信号で制御します。(PMDC)モータ・拡張ギアボックス・ドライブエレクトロニクスで構成されます。現時点では、「標準のサーボモータは既にフィードバック制御システムを搭載しているのでは?」と言いたくなるかもしれません。答えはイエスでそのとおりなのですが、0~180度の間の任意の位置に出力シャフトをセットできるだけです。操縦翼面(昇降舵や方向舵など)を動かすために設計されました。ほんの少し角度を付けることが目的で、ホイールを回転させ続けることは想定していませんでした。次のビデオチュートリアルは、ホビー用サーボモータとその駆動方法を的確に説明しています。何年も前、ポジションフィードバックポテンショメータをマニュアルポットと交換し、出力シャフトが完全に回転することを防ぐプラスチック製のストッパを折り取ることで、連続回転「サーボ」を作ることを誰かが思い付きました。現在、標準のPWM信号は、1msパルスの逆回転から、1.5msのゼロ移動、2msのフルスピード前進まで、シャフト回転速度を制御しています。これは大型で、組み込みのフィードバック制御が失われています。マニュアルポットは、制御入力に1.5msパルスが適用された場合に回転しないようにする「ゼロセットトリマ」です。良い面は、マイクロコントローラのGPIOピンに直接接続し、チップのオンボードPWMハードウェアを介して「デジタル」制御できるモータを手に入れたことです。ほとんどのマイクロコントローラは複数のPWMチャンネルを搭載しており、起動するのにわずかなコードしか必要としません。良いことに、「既製」の連続回転サーボモータは広く普及しています。大きなモータの使用より強力なPMDCモータを使用する場合、モータとマイクロコントローラの間に特別なドライバインターフェースが必要となります。ブラシ付きDCモータと約1~2Aの停動電流は、安価で広く普及しています。教育目的やパワーや費用を増やす前のコンセプトの試作には、このモータサイズが適しています。PMDCモータは特性が直線的であるため、扱いが容易です(図1)。無負荷のモータ速度と印加電圧が比例していることに注目してください。トルク、つまりモータの回転力は速度に反比例しています。モータに供給された電力に応じて最大トルクが得られるため、これはすばらしい特性です。モータの電流は同じラインを辿ります。モータが無負荷で最高速度に到達すると、モータの電流は最小(完全なゼロではありません)となります。多くの人がモータをホイールに直接接続し、固定の低いモータ電圧を使ってフィードバック制御なしで低速で動かそうとします。トルク曲線は、これをしたときにどうなるかを示します。実際、そこには考えられる電圧ごとに1本ずつ、青いトルク線が無数に存在します。電圧V1に対応する無負荷の速度S1で動かすことにした場合、最大トルクはT1になります。これは、フルスピードのモータ性能を同じ比率で縮小したものです。「静摩擦力」を越えるには停動トルクでも足りないため、ロボットはおそらく動きません。速い無負荷速度S2で動かし、減速ギアボックスを使って目標の走行速度を達成する方がよいでしょう。rpmで回転することにご注意ください。これは言わばウィンウィンの状態です。ギアボックスは減速させますが、同じ比率で、ホイールで利用できるトルクを乗算します。PID制御を使わずに動かすフィードバック速度制御を一切行わなければ、モータ電圧Vは一定の値を保ちます。ロボットが坂を上り始めると、ホイールで必要とされるトルク量が増え、電圧Vまで動作点がトルク線を上昇します。その結果、モータは減速します。傾斜がきつくなると、モータがその電圧の最大トルクに到達して「ストール」するまで減速し続けます。間違いなく、電圧を上げても定格の最大値を超えなければトルクは増えます。この負荷に依存した速度の変化は望ましくありません。PID制御の追加PID制御は、タコメータで速度を感知し、一定に保とうとすることにより、負荷の変化に応じて自動的に電圧を変える手段となります。速度の低下を計測して負荷の上昇を検出すると、制御ループは速度を安定させるために電圧を上げます。グラフで表すと、上昇した電圧値に対応する次のカーブに動作点が移動します。この新しいカーブは古いカーブの右にあり、同じ速度でより高いトルク値を示します。そのため、フィードバック制御では、特定のモータの性能を最大限に活かすことができます。PWM信号はホビー用サーボモータとは使用する形式が異なり、高電流インターフェースでPMDCモータの速度を制御しますが、好都合なことに、引き続きPWM信号を使用できます。この場合、パルス周波数はkHzレンジとなり、デューティサイクルはほぼゼロから100%まで変化します。PWM信号の平均DC電圧はパルスのデューティサイクルに比例するため、これは機能します。HブリッジICの操作を説明しています。上のビデオで説明しているとおり、PWMの原理は、パルスがオンの間モータに電力を供給し、サイクルの残りの時間は切断するというものです。PWM全体をオフすると、摩擦などの損失により停止するまで、モータは惰性走行を続けます。駆動系について見ていきましょう。惑星探査ローバーは高速で移動することはなく、大型で重いモータを搭載することもできません。ローバーが坂を上ったり、障害物を乗り越えたりできるよう、駆動系は非常に大きなトルクをホイールに供給する必要があります。未知の地形の探査では、遅くても正確に移動することが必要です。ブラシ付きDCモータを約6,000rpmの無負荷速度で使うことを提案するとします。ローバーが平地を走行する際、約1,500rpmの最小負荷速度で十分なトルクを出せるよう、この案は選択されます。ホイール速度は、ゆっくりしたペース、おそらく10rpm程度に落とす必要があります。この速度では150:1のギアボックス比が必要です。これにより、PWM信号で約50%の最小負荷デューティサイクルが可能となります。組み込まれているPID制御ループの「オーバーヘッド」は、速度を落とさずに坂を上り、障害物を乗り越えられるよう対処します。起動時は最大停動トルクの少なくとも半分で摩擦力(静摩擦力)を越えるようにします。当然ながら、完成したローバーのホイールで必要とされるトルクは、その値が有効であることを確認するために、モータ選択を行う前に予測する必要があります。ギアボックスについては、考慮すべき種類が3つあります。慣れ親しんだ並行軸形式、プラネットギア(遊星歯車)、ハーモニックドライブ(波動歯車)です。本当に火星探査車を作成している場合、最後の選択肢をプラネットギアで補助することをまず選ぶでしょう。ハーモニックドライブは比較的最近発明されたもので、小型で高い性能を備えていますが、費用を正当化するには宇宙局で働いている必要があるかもしれません。小型の研究用ロボットには、多数のモータギアボックスセットがより手頃な価格で市場に提供されています。ブレーキブレーキについてはどうでしょう?通常は、ローバーが非常に急な坂を下りようとしない限り、単にPWMをオフにすれば停止します。重力の影響が大きくなり始め、ロボットが制御不能でひっくり返りそうになったら、PMDCモータでダイナミックブレーキを使用します。「滑り落ちる」ではなく「ひっくり返る」と言ったことに注意してください。前者の場合はソフトランディングを祈るしかありません。L298など、一部のHブリッジモータの制御チップは、ダイナミックブレーキ機能を搭載しています。有効になるとPWMが切断され、モータ端子をショートさせます。モータはジェネレータとなり、非常に大きな電流が巻き線を通って逆方向に流れます。急激な磁束の反転は、アーマチュアを急停止させます。パーキングブレーキの機能を果たすことはできませんが、ショートしている間はそれ以上の動きをある程度止めることができます。効果がない場合は、探査車キュリオシティのようにメカニカルブレーキが必要となります。選択肢はさらにあります。減速ギアボックスでワームドライブを使用します。基本的なワーム/ピニオンギアセットは非反転式で、モータシャフトにワームを搭載しています。モータが停止すると、駆動部はロックアップします。最後に一番上の写真は、1315火星日(SOL)にNASAの探査車キュリオシティが撮影した「自撮り写真」です。ホイール「タイヤ」の中央に開いたギザギザの穴は損傷が深刻なことを示しています。打ち上げ前に地球で行ったテストでは、これらのホイールは非常に尖った硬い岩の上でも、穴が開くことなく走行できると考えられました。分析を重ねた結果、モビリティシステムに予期しない傷ができていたことが判明しました。詳細についてはこちらをご覧ください。パート4操縦がスムーズなものや戦車のようなただの「スキッドステア」など、いくつかのモビリティシステムを見ていきます。NASAの探査車はすべて「ロッカーボギー」サスペンションを搭載しているのはなぜでしょう?また、PID制御を使用して「photovore」(光を追いかけるモバイルロボット)を作成します。行き詰ってしまった場合は、是非Twitterで私の投稿をフォローしてください。新しいエレクトロニクスと関連技術、ロボットについて目星をつけた投稿のリツイート、宇宙探査などの興味深い記事にリンクしています。Marshallパート1では、PID制御の背後にある理論を取り上げました。PID制御は、アクチュエータの機械出力(速度や位置など)と制御プログラムが要求する値を一致させるために広く利用されている手法です。今回は、実践面を詳しく見ていきましょう。