質問: バタワースフィルタを併用した1回微分における領域エラーについて 私はmatlab simulinkを用いてロボットの動作シミュレーションを行っているのですが、微分器の影響でエラーが出てしまい困っています。 ロボットの運動方程式、インピーダンス制御則は式(1)(2)のように表されます。 ※ただし、ロボットの慣性mr・望みの慣性mdは、手先位置rから算出されるqの変数を含みます。 ・・・(1) ・・・(2) 現状は式(2)において、位置を1回微分して速度を算出する際に、simulinkのブロックの1つであるzero-poleを用いて微分を行っています。上記の図のように、zero-pole内では1回微分する際に2次のパターワースフィルタ(カットオフ周波数ωcは20 [hz])を用いてプロバーになるようにしています。それを用いると以下のようなエラーが出ます。 % 「領域エラーです。実数 x から複素数の結果を計算するには、'asin(complex(x))' を使用してください。」 ちなみにzero-poleを用いずに、加速度の積分により速度を算出する場合はエラーが出ずにコンパイルは正常に完了します。 また、zero-poleを用いてもエラーが出ずコンパイルが完了した条件は次の2つになります。 ・位置の2回微分で加速度を算出する場合 ・pid制御も用いているのですが、そこでのzero-poleによる微分を用いた場合 原因がわかる方はおられますでしょうか? ※現状は実機実験とほぼ同様のシミュレーションを作成したいため、zero-poleを用いて微分は行う必要があります。
回答: ひとまず、zero-poleブロックの使い方を間違えていることが分かりました。ただ、領域エラーが発生している理由はよく分かりません。 zero-poleブロックの「極」「零点」の項目には、極と零点の値を並べたベクトルを指定します。よってohashi様の指定の仕方だと (s - 0) * (2*pi*omega_c)^n(s - 0) * (s - 0) という伝達関数が出来上がります。これはただの積分になっています。 2次バターワースかつ微分をzero-poleブロックで表現するには、私の画像で示した指定方法を取らなければなりません。