ロボットを自在に制御しよう!
ロボットを制御しよう!~速度制御編
ODEでは関節の速度制御が標準機能されており、ロボットの動作を制御することが非常に簡単です。このような制御は、シミュレーションの刻み時間ごとに計算する必要があるため、制御コードは「simloop」内(基本的には「dSpaceCollide」の前)に配置されます。
それでは、デモバギーを例にとって制御コードを見てみましょう。デモバギーの場合、制御される自由度は2つあり、前輪の車輪回転の自由度と左右旋回の自由度となります。
速度制御は前述した関節状態の設定と同様に「dJointSetHinge2Param」を使うことになります。前輪の車輪回転を例に考えると、「dJointSetHinge2Param」で「dParamVel2」モードを設定して回転速度値を入力することと、「dJointSetHinge2Param」で「dParamFMax2」モードを設定し速度制御するときの最大トルク値を設定することの2点だけで、速度制御が実現されます。なお最大トルク値の設定については、値が小さすぎると関節が動作しないため、ある程度大きい値を入力するよう注意して下さい。
また補足として、デモバギーでは変数speedはキーボード入力で決定される値となります。詳しくは「static void command」ルーチンを読み解いてください。
デモバギーにおいては前輪の左右旋回のための自由度も速度制御が使われております。ただし、「dJointGetHinge2Angle1」によりシミュレーション中に計測される関節角度値と目標値の差を速度としていることと、「dParamLoStop」「dParamHiStop」で関節の可動域を制限することで、大ざっぱな角度制御を実現しています(正式な角度制御については後述)。
ロボットを制御しよう!~トルク制御&位置制御編
デモバギーでは速度制御のみが利用されていますが、ODEでは、図3-1に示されるように、トルク制御・位置制御(角度制御)も使用できます。トルク制御は関節へ直接的にトルクを加える方法ですので、設定は非常に簡単です。
ただしトルク入力により関節を制御する場合、重力や慣性力の影響を大きく受けるため、制御は非常に難しいものとなります。ロボットを簡単に制御したいのであれば、速度制御・位置制御をお勧めします。
位置制御はODEの標準機能ではなく、プログラム作成者が独自に「速度制御」と「関節角度計測」を組み合わせてフィードバックループを構築する方法となります。
最も単純なP(比例)制御フィードバックループによる位置制御を説明しますと、「目標とする関節角度」と「現状で計測される関節角度(dJointGetHingeAngleを使用して計測)」の角度差を算出し、ゲイン値(モータ動作を調整するための定数)を掛けて、速度制御に入力する値とするものです。つまり、このような単純なフィードバックにより、図3-2に示すような次の制御ルールが構築されます。
1)関節の角度が目標角度との差が大きいほど、関節が目標角度に向かう速度は大きくなる。
2)たとえ関節が目標角度を通り過ぎたとしても、目標角度方向に向かうような速度が入力される。
3)そして差が小さいほど関節が目標角度に向かう速度が小さくなり、目標角度周辺に近づくとモータの動きが止まる。
なお、動作が滑らかとなる位置制御を行うためには、ゲイン値の調整が必要となるので、試しながら設定してみてください。また角度制御の質を高めるために、P(比例)制御だけでなく、I(積分)やD(微分)を導入したPD制御やPID制御を構築することをお勧めします。
今回は前回に引き続き、ODEのデモプログラム「demo_buggy.cpp」を参考にして、ロボットシミュレーションのプログラム構成・ロボットの構築方法と描画方法・モータ制御法を説明しました。これでキーボードを利用して、シミュレーション空間のロボット操作ができると思います。
しかし自律的に動くロボットを作るには、センサーの使い方やデータの取得方法も重要となります。そこで次回は、センサーの構築方法・センサーデータのファイルへ出力方法などを解説します。