実際に使える制御工学:ロボット編(6)「インピーダンス制御。ロボットの柔らかい動かし方。」
<この記事で伝えたい事>
インピーダンス制御は、ロボットに柔らかい動きをさせるのに向いている方法です
例えば、何らかの物体と接触したとき、それを壊さないよう力を逃がす動きをさせられます。
反面、高速高精度動作には向きません。
その目的なら、3重ループ制御を用いる方が良いです。インピーダンス制御は、直接的に力を制御する方法ではありません
インピーダンス制御は、間接的な力制御と言えます。
ただ、「ロボットと接触対象との間にかかる力を〇〇[N]に保ちたい」という目的には、あまり向きません。
直接的に力を制御したい場合、「アドミッタンス制御」と呼ばれる方法が向いています。
1. はじめに
自己紹介はこちらです。
この記事は、主にロボット制御に関わる学生や若手~中堅エンジニアに向けた技術紹介・解説記事シリーズの第6弾です。
今回は、ロボットの柔らかい動きを実現できるインピーダンス制御と、ついでにアドミッタンス制御について紹介・解説します。
2. インピーダンスとアドミッタンスとは?
インピーダンスとは、元々は電気分野の言葉です。
遠い昔は、電気の流れを妨げる抵抗成分と言えば、電気抵抗のことでした。(1800年代始めごろ)
しかし、それから時代は流れ、コイルのインダクタンスや、コンデンサのキャパシタンス(=静電容量)も、周波数によって大きさが変わる電気的な抵抗成分ということが分かってきました。
そこで、電気抵抗$${R}$$・インダクタンス$${L}$$・キャパシタンス$${C}$$をまとめて「インピーダンス」と呼ぶようになりました。
(1800年代終わりごろ)
これらを用いて、インピーダンス$${Z}$$は以下のように表されます。
($${s}$$はラプラス変数、$${V}$$は電圧、$${I}$$は電流)
$$
\begin{array}{ll}
Z&=\cfrac{V}{I}\\
&=R+s\cdot L+\cfrac{1}{s\cdot C}
\end{array}
$$
その後、電気と機械の類似性から、インピーダンスという概念は機械分野にも取り入れられました。
(1920年より少し前)
電気分野のそれと区別するため、機械的な抵抗成分は機械的インピーダンスとも呼ばれます。
機械的な抵抗成分の主なものは、摩擦$${D}$$・バネ$${K}$$・質量$${M}$$の3つです。
これらを用いて、機械的インピーダンス$${Z_m}$$は以下のように表されます。
($${F}$$は力、$${v}$$は速度)
$$
\begin{array}{ll}
Z_m&=\cfrac{F}{v}\\
&=D+s\cdot M+\cfrac{K}{s}
\end{array}
$$
「インピーダンス制御」のインピーダンスは、こちらの方です。
アドミッタンスというのは、インピーダンスの逆数です。
少なくとも電気分野では、アドミッタンスを使うと計算が楽になる場合があります。
使う頻度が多いため、ただの逆数でも名前が付いたのだと思われます。
3. インピーダンス制御
インピーダンス制御とは、
「こういう機械的インピーダンスがあるなら、ロボットはこう動くはず」
という動きを実現する制御方法です。
下図は、インピーダンス制御のブロック線図です。

$${M,D,K}$$は、それぞれ仮想的な質量・ダンパ・バネ(機械的インピーダンス)です。
仮想的な機械的インピーダンスは、アーム先端と接触対象の間に持たせたいケースが多いです。
このため、上図ではキネマティクス計算によって関節角度から求めたアーム先端位置・姿勢情報をフィードバックするようにしています。
$${\bm{X^{ref}}}$$はバネでいう自由長に相当します。
質量・ダンパ部分にも$${\bm{X^{ref}}}$$が関わるのは、過度な抵抗を抑えるためです。
そして、質量・ダンパ・バネのブロック出力は、アーム先端にかかる力やモーメントです。
これを仮想仕事の原理によって、トルクに変換してロボットに与えます。
ただ、重力や遠心・コリオリ力などの影響を抑えてロボットを動かすには、その補正トルクを足し込むのがベターです。
なお、関節ごとのインピーダンス制御も可能ですが、使いたい場面はあまり思い当たりません。
さて、おそらくブロック線図を見た瞬間に気づいた方もいるだろうことに言及します。
このインピーダンス制御におけるトルク計算式は、以下のとおりです。
($${M,D,K}$$は$${n\times n}$$対角行列、ただし冗長関節を持つ7軸ロボット等では$${n\times n}$$にならない場合も)
$$
\bm{\tau}=J_{(\theta)}(M\cdot s^2+D\cdot s+K)(\bm{X^{ref}-\bm{X_f}})+\bm{\tau_{gc}}
$$
直交座標から関節座標への変換や、重力&遠心・コリオリ力補正があるので分かりづらいかもしれませんが、インピーダンス制御のやっていることはPD制御+2階微分制御です。
なので、3重ループ制御の速度制御ループ積分ゲインをゼロにして、それを少しアレンジすればインピーダンス制御と同等の動きをさせられます。
(少なくとも、位置制御ループは直交座標対応にするアレンジが必要です)
それでもインピーダンス制御を使うメリットは、パラメータの意味が直感的に分かりやすい点です
例えば、ロボット動作にスポンジ並みの柔らかさを持たせたいなら、バネ$${K}$$をスポンジ並みの数値に設定すれば良いです。
3重ループ制御の延長でインピーダンス制御的な動きを実現しようとすると、直感的なパラメータ調整は難しいです。
なお、バネ$${K=0}$$にすると、バネによる復元力がなくなり、外部から加わる力に倣ってロボットが動くようになります。
これが協働ロボットによく見られるダイレクトティーチング機能を実現するアプローチの1つです。
(ダイレクトティーチング機能とは?→ロボットに人間が手で触って教示する機能)
インピーダンス制御は、3重ループ制御の積分制御に相当するものがないため、これまで紹介したような柔らかい動きが可能です。
一方で、積分制御がないことで、どうしても3重ループ制御ほどの高速高精度動作はできません。
(もし、積分制御を追加すると、動きの柔らかさが失われます)
一応、バネ$${K}$$を大きくすると、多少は動作を高速高精度にできます。
しかし、そうするとコントローラゲインが上がって、不安定化しやすくなる点には注意が必要です。
(コントローラゲインが上がると、ゲイン余裕が小さくなる傾向から)
このように、制御方法にはそれぞれに向き・不向きがあります。
それぞれの方法の特徴を把握した上で、用途・目的に応じて使い分けるのが良いと思います。
4. アドミッタンス制御
冒頭述べたように、アドミッタンス制御は直接的に力を制御するのに向いている方法です。
下図は、アドミッタンス制御のブロック線図です。

力を制御するのに向く理由は、力・モーメント指令$${\bm{F^{ref}}}$$とアーム先端にかかる力・モーメント$${\bm{F}}$$との差に基づいたフィードバック制御だからです。
アドミッタンス制御では、機械的インピーダンス$${M\cdot s^2+D\cdot s+K}$$の逆数を用いて、
「アーム先端でこれだけ力を出したいなら、ロボット位置はこうなる」
というのを計算します。
こうした仕組みの都合で、アドミッタンス制御はその内部に位置を制御する仕組みを持っている必要があります。
(上図中では、位置・速度制御がそれです)
また、検出トルクには、重力や遠心・コリオリ力成分が含まれます。
そこから、アーム先端にかかる力・モーメント$${\bm{F}}$$を計算するには、検出トルクから重力や遠心・コリオリ力成分を差し引く必要があります。
仮想仕事の原理($${\bm{\tau}={J_{(\theta)}}^T\bm{F}}$$)から、トルクを直交座標での力・モーメントに変換する計算式は以下と分かります。
(行列サイズの都合で$${{J_{(\theta)}}^{-1}}$$が求められない場合、擬似逆行列で代替)
$$
\bm{F}=({J_{(\theta)}}^T)^{-1}\bm{\tau}
$$
ただし、ロボットモデルにパラメータ誤差があると、完璧な重力&コリオリ遠心力補正ができず、計算で求めたアーム先端にかかる力・モーメント$${\bm{F}}$$に誤差が出ます。
力制御の精度を追及する場合、アーム先端に3軸or6軸力センサを取り付けるケースが多いです。
センサを使えば誤差なく力・モーメントを検出できるので、高精度な力制御が可能です。
(それでもセンサノイズやドリフト現象への対策は必要ですが)
なお、アドミッタンスはインピーダンスの逆数だけあって、パラメータ調整感覚も逆です。
インピーダンス制御の場合、バネ(インピーダンス)を大きくすると、コントローラゲインが上がりました。
アドミッタンス制御でバネ(インピーダンス)を大きくすると、コントローラゲインが下がります。
($${1/K}$$なので、$${K}$$が大きいほどゲインが下がる)
よって、バネを小さくすると、かえって不安定化しやすくなる点は注意が必要です。
また、アドミッタンス制御の場合、3重ループ制御の外側に、更にもう1つ制御ループを持つことになります。
そのため、応答周波数が上げにくいことは知っておいた方が良いです。
5. おわりに
この記事では、インピーダンス制御とアドミッタンス制御について紹介・解説しました。
これで、全6回のロボット編は終了です。おつかれさまでした。
ロボット編で紹介した知識・技術+ある程度のプログラミングスキルが身につけば、産業用ロボット業界でもどうにかやっていけるくらいにはなると思います。
(AIによれば、ロボット編の知識・技術を深く理解し、自在にコードへ落とし込めるなら、メーカの制御開発・R&D部門の即戦力レベルだそうです)
インピーダンス制御やアドミッタンス制御の注目度が上がってきたのは、協働ロボットが流行り出した2015年ごろからと思います。
しかし、これらが体系化されたのは1980年代くらいなので、実はそれほど目新しい技術ではないです。
ただ、インピーダンス制御やアドミッタンス制御は直交座標で実行することが多く、キネマティクスやヤコビアン、動力学計算といったロボティクス知識との組合せがほぼ必須です。
そうしたことから、ロボット編の締め括りにちょうど良いと思いました。
最後になりますが、次シリーズの構想もなくはないです。
しかし、しばらくは「実際に使える制御工学:寄り道編」を充実させていこうと思います。
前回:ロボット編(5)「ニュートン・オイラー法」はこちら
次回:未定
