こんにちは。
お久しぶりの投稿です。
今までは剛体の回転運動についてしか書いてませんでした。
ここらで、実際のロボットの動作に少し絡めて
自分の学習の方向性を整理しておきたいと思います。
1. 目的
今回の目的は、以下の2つになります。
- PTP方式の動作指定によるティーチング・プレイバックにおいて、
実用上ユーザが求める動作コマンドの入力パラメータ例を挙げる - 動作コマンドに照らし合わせ、経路補間、回転運動計算の設計上の課題へと落とし込む
1.1. 目的内の用語
目的に書いてある用語を知っていれば、本節は読み飛ばしてください。
PTP(Pose To PoseまたはPoint To Point)方式とは、
JIS B 0134の用語によると
「ロボットが通過させる指令ポーズだけを指定し,
ポーズ間でたどるべき経路を指定しない制御方式」
のことをいいます。
ロボットを動作させるとき、
移動時間の細かい時間刻みで細かいポーズ変化をいちいち指定するのではなく、
開始点から、経由点、終端点のロボットのポーズと移動時間をざっくり数点指定すれば、
あとは自動で動作を作って補間してくれる方式です。
![PTP方式の図](http://kdaic.net/wp/wp-content/uploads/2019/08/PTP-1024x741.png)
対して、CP(Countinuous Path)方式というのがあります。
これはJISでは
「ロボットに指令ポーズの間でたどらせる経路を指定する制御方式」
と定義され、ユーザが経路を描いたり何かしら記録して指定し、
きっちり経路上にロボットの手先もしくは全身のポーズを沿わせる方式です。
ユーザがポーズ点だけで指定するのがPTP、
経路を指定するのがCP方式と覚えておきます。
ティーチング・プレイバックとは、
JIS B 0134の用語でいう
教示(ティーチング):
「ロボットのエンドエフェクタ又は模擬機構を
手で又はペンダントを用いて動かし,
ロボットに所望の位置を 1 ステップずつたどらせることによって
プログラムを作成すること」、
プレイバック運転:
「ロボットに,教示プログラミングによって格納したタスクプログラムを
繰り返し実行させる運転方法」
の両方を指しています。
「エンドエフェクタ又は模擬機構って?」
と疑問が重なりますが、ロボットの手のことです。
さらに「ペンダントって?」
と疑問が重なりますが、タブレットみたいな手持ちコントローラを指します。
鉄人28号を操作するために正太郎くんが持ってたあれとかペンダントっぽい気がします。違うか。
さらにさらに「タスクプログラムって?」
と疑問が重なりますが、編集・録画した動画データと同じかと。
記録された動作データのことです。
動作データをプレイバック、
つまり再生してロボットを動作実行させるのですね。
「ちょっと待って。プレイバック、プレイバック」です。違うか。
余談ですが、
ティーチング・プレイバックというロボットの使い方は、
産業用ロボットが出た大昔からずっと変わらず今も主流のままです。
プレイバックは再生するだけなので良いですが、
面倒なのはティーチングです。
「人類は、いつまでタスク(仕事)をロボットに教え続けなければいけないんだ!」
と皆もっと嘆いて
「できらぁっ!」
「いまなんていった?」
「ティーチレスのロボット用ソフトウェアを世に出してやるって言ったんだよ!」
と啖呵切って技術進化に参戦して欲しいです。
![](http://kdaic.net/wp/wp-content/uploads/2019/08/fig_super_kushinbo_vol07_dekirah.jpg)
( 出典 ©牛次郎, ビッグ錠『スーパー食いしん坊』)
1.2. 目的の動機
目的を読んでおよそ動機がわかった人は、本節を読み飛ばしてください。
PTP方式の動作指定は
大昔から産業用ロボットで使われている主流な機能です。
PTP方式の機能のない産業用ロボットを販売するロボットメーカーは
おそらく存在しないのではないかと勝手に思っています。
それくらい基本中の基本の機能ではないでしょうか。
では、
ティーチング時、このPTP方式を利用するために、
ユーザに対しどのようなコマンド入力が用意されていれば良いでしょうか?
この疑問が一つ目の目的の動機につながります。
JISにはSLIMというロボット用プログラム言語の規格があり、
動作コマンド(MOVEなど)のインタフェースが定めてありますが、
それで十分か不十分かは
ユースケースをほじくり出してみないとはっきりしません。
また、ユーザ入力のコマンドが定義されたとして、
具体的に計算上どのような問題を解く必要があるでしょうか?
ただし今回は解法までは触れません。
あくまで設計上の課題を明らかにしたいのです。
2. ロボットの動作コマンドの入力パラメータ例
以下にPTP方式で動作するロボットの図を描いてみました。
図中ニョロニョロ描いてある線が
ロボットの手先軌道だと思ってください。
軌道上にいくつか打ってある点が、
ユーザがコマンドのパラメータとして入力した各ポース点です。
![PTP動作の図](http://kdaic.net/wp/wp-content/uploads/2019/08/PTP_user_motion_command_01-1024x457.png)
ここではロボットの手先位置姿勢をポーズ点として軌道を描いていますが、
全関節軸の回転角度位置セットを一つのポーズ点として全軸の軌道を扱う場合もあるでしょう。
入力パラメータをユースケースとして考えてみます。
2.1. 目標移動時間による動作指定
PTP方式は、
開始点から、経由点、終端点のロボットのポーズと移動時間を数点指定すれば、
あとは自動で動作を作って補間してくれる方式、
と上の用語説明で書きました。
ならば
・移動時間
・目標のポーズ点
さえ入力パラメータとしてあれば良い気がします。
ということで、1つめの入力パラメータ例は以下になります。
- 移動時間、目標ポーズ点
ユーザがロボットに与えるコマンド(命令)は
「動け、この移動時間で、この目標ポーズ点へ」
といった感じでしょうか。
目標点と目標点の移動を、
[m/s]、[rad/s]…
といった単位による移動速度で指定したい場合もあるでしょう。
その場合、
開始点と終端点の2点の平均移動速度として速度指定できると嬉しいですね。
・平均移動速度、目標ポーズ点
「平均」移動速度としたのは、
開始点=速度0で停止している状態から、
終端点=速度0で停止した状態へと動作するとき、
あいだに加速と減速が加わり常に速度一定ではないケースを考慮したためです。
小学校で習うように、平均移動速度は移動時間へ容易に変換できます。
(移動時間) = (2つの目標ポーズ点間距離) / (平均移動速度)
なので結局、
移動時間と目標ポーズ点が入力パラメータとして設定可能であれば、
平均移動速度の入力もカバーできることになります。
2.2. 速度比率による動作指定
移動時間をいちいち設定するのは面倒で、
工場でサイクルタイムを気にするユーザは、
「速く!もっと速く!とにかく速く移動してタイムロスを減らすんだ!」
![もっと速く!の図](http://kdaic.net/wp/wp-content/uploads/2019/08/figure_of_Faster-1024x724.png)
という要望を持つことが大いにあるでしょう。
しかし速くといってもロボットにも限界があるはずです。
ならばユーザの要望は「限界まで速く」になります。
では「限界」とは何に基づいて決まるのでしょう?
例えば以下2つです。
・モータやモータドライバの限界
・安全上の限界
1つめについて、
軸の回転を速くするためモータやモータドライバの回路に電流をどんどん流すと、
ある大きさ以上電流が流れ続けると回路が発熱で壊れてしまう、
といったことがあります。
1つめの「モータやモータドライバの限界」とは、
長時間流しても壊れない程度の電流値、それに対応した最大加速度・速度にしておく、
といった限界です。
![モータとモータドライバをこんがり焼く](http://kdaic.net/wp/wp-content/uploads/2019/08/burned_motor_and_motor_driver-1024x741.png)
2つめについて、
ロボットがあまり速く動き過ぎると
周囲にある物や人に不意に接触したとき大事故につながる恐れがあります。
2つめの「安全上の限界」とは、
接触しても最悪の事故は避けられる程度の最大速度にしておく、
といった限界です。
![安全上の限界のイメージ](http://kdaic.net/wp/wp-content/uploads/2019/08/what_is_safety_speed-548x1024.png)
余談ですが、
モータやモータドライバの限界に関して、
従来の産業用ロボットは、大出力のモータを選定することで大電流を許容し、
使用する電流値の範囲は定格を超えないよう余裕をもたせ
かつ使用可能な速度・可搬重量の最大範囲を広げる、
というのが普通でした。
ただし大出力に伴いモータも大型かつ大質量になり、
それらを多数装備したロボットは設置場所を手軽に変えられず、
設置スペースや動作軌道も十分配慮しなければいけませんでした。
また安全上の問題に関して、
従来の産業用ロボットでは、
ロボットの周囲に安全柵を設けて人との接触をなるべく防いでいました。
ただしティーチングするにしても
自動運転中のアクシデントに対応するにしても、
ユーザは柵の内外を行ったり来たりしなければならず手軽ではありません。
最近では
これらの課題を克服する新たな形態の産業用ロボット・規格が出てきています。
それに関してはまたいつか書きましょう。
さて話を戻しますが、
「限界」を考慮した速度を指定できるようにするので、
動作コマンドの入力パラーメータとして
移動時間の代わりに限界を100%とした速度比率が用意してあれば、
ユーザの要望は満たされるでしょう。
- 限界に対する速度比率、目標ポーズ点
ユーザがロボットに与えるコマンド(命令)は
「動け、この速度比率(%)で、この目標ポーズ点へ」
といった感じでしょうか。
2.3. 経由点
2.3.1. 経由点を通る動作を考える
3次元空間上の2つの目標点を補間する方法には、
手先位置のポーズ点だと線形補間、
姿勢(回転方向)のポーズ点だと球面線形補間
といったものがあります。
・位置の点の補間:線形補間(Lerp: Linear interpolate)
・回転方向(姿勢)の補間:球面線形補間(SLerp: Spherical Linear interpolate)
![線形補間-球面線形補間の図](http://kdaic.net/wp/wp-content/uploads/2019/08/Lerp_SLerp-512x1024.png)
以前書いた「剛体の運動(2つの姿勢の補間)」は、上記でいう球面線形補間(SLerp)に当たります。
このLerp、SLerpの補間方法は、2つの点の補間を前提としており、開始点と終端点の間を最短距離で結びます。
Lerpだと2つの位置の点を直線状に結び、
SLerpだと2つの姿勢の点を、回転軌道を模した球面の測地線上に沿って結びます。
これが位置姿勢の位置空間軌道になります。
また速度の軌道について、
時間スケールを使い開始点で速度=0で停止した状態から、
終端点で速度=0で停止した状態に至るように補間計算します。
そのため、経由点が含まれても2つの点の間を一回一回加速・減速して停止するようになります。
つまり、経由点で毎回止まるのです。
経由点を使用するユーザの要望はこうでしょう。
「経由点で止まらず動作し続けて欲しい」
経由点で止まって欲しいならば、
2つの目標点間の経路を先のLerp、SLerp によって最短距離(直線、測地線)で結ぶことで実現できます。
止まって欲しくない場合、
実現すると、かわりに目標点間の経路を最短距離の直線、測地線上に結ぶことは難しくなります。
というのは、
同じ方向直線上に経由点が存在するならば問題ありませんが、
経路点で方向が変わると、方向成分の速度の大きさは失われるため、
直線の交点で結ぶと一瞬にしろ必ず経由点で停止することになります。
曲線で結べば常に方向成分は変化しますが速度の大きさを保つことができます。
経路点上で止まらないということは、
方向の変わり目に直線ではない何かしらの曲線で結ぶことになるのです。
高校数学Ⅱ「関数の連続性」で学んだ話を思い出します。
ということで、経由点で止まらない場合、
どのような補間経路が考えられるでしょうか。
2.3.2. 経由点補間の種類
以下図に3つのパターンを挙げてみました。
![経由点間を止まらない補間の種類](http://kdaic.net/wp/wp-content/uploads/2019/08/interpolating_type-1024x741.png)
左から1つめの補間タイプは、
・各目標点では動作方向を固定する
というものです。
「経由点を通過するとき、次の目標点方向に向かって動作して欲しい」
といった要望がある場合、この補間方法が使えるでしょう。
次節で挙げますが、
経由点通過時の方向(=目標点速度)をユーザに指定できるように、
入力パラメータを用意しても良いかもしれません。
補間された曲線は、つぎの目標点に近づくにつれ、
固定された動作方向に追従するように回り込んだ形状になります。
左から2つめの補間タイプは、
・動作速度に合わせて直線(測地線)から曲線度合いを増す
というものです。
「経由点を必ず通り通過時の速度はよしなに」
といった場合は、
このタイプの使い勝手が良いかもしれません。
最後の左から3つめの補間タイプは、
・経由点にたどり着く前に次の目標点への動作を始めてしまう
というものです。
前の動作が終わらないうちに次の動作を混ぜて連続動作させるのです。
図には「ショートカット(short-cut)」と書きましたが「合成(blend, mix)」といったりします。
LerpやSLerpの補間が合成される場合、
合成されるまでは直線や測地線上に沿った軌道となります。
なるべく直線性を保った経路が欲しい場合使い勝手が良いかもしれません。
ただし、速度が増すにつれて経路点をショートカットする度合いも増すため、
経由点と速度とのバランス調整をする必要が出て面倒くさい場合もあります。
以上をまとめると、ユーザがロボットに与えるコマンド(命令)の入力パラメータは、
- 目標点で止まる(Lerp、SLerp)
・移動時間(または速度比率)、目標ポーズ点 - 経由点(経由点で止まらない)
・各点間の移動時間(または速度比率)セット、目標経由点セット(複数)、補間の種類
となり、先に挙げた移動時間や速度比率との組み合わせになります。
2.4. 割り込み動作
最後の入力パラメータ例は、割り込み動作についてです。
![割り込み動作の図](http://kdaic.net/wp/wp-content/uploads/2019/08/PTP_user_motion_command_02-1024x381.png)
ある目標点へ移動している途中、
内部/外部センサなど割り込み入力(トリガー)に反応して
目標点や経路を止まらず急遽変更できるのが割り込み動作です。
ユーザがロボットに与える入力パラメータは以下のようになります。
- (割り込まれる側の元の動作に対し)割り込み動作を許容する/許容しない
- 監視する割り込み入力(トリガー)の指定
- トリガーがONになったら発動する割り込み動作(移動時間、目標ポーズ点などのパラメータ)
「移動する物体をキャッチしたい」
といったケースには、
時々刻々と目標点を変えて割り込み動作で追従すれば実現できそうです。
ただし、目標点も移動し続けているのであれば、
目標速度も指定できた方が良さそうです。
よって動作コマンドの入力パラメータに、目標ポーズ点での速度を加えたパターンも挙げておきます。
- 移動時間(または速度比率)、目標ポーズ点、目標点速度
目標ポーズ点が手先ポーズである場合、
目標点速度を与える代わりに、手先ポーズ点座標の基準座標系自体を移動させるという方法もあります。
入力パラメータは、以下となります。
- 目標ポーズ点の基準座標系の速度
この基準座標系の速度設定後、
・移動時間(速度度比率)、目標ポーズ点(基準座標系が移動中)
の入力コマンドで、
目標ポーズ点で目標速度を与えることができます。
2.5. PTP動作コマンドの入力パラメータのまとめ
さて以上により、
ユーザがPTP方式の動作コマンドで欲しいと思われる入力パラメータは、
おおかた出揃ったのではないでしょうか?
ここで、まとめておきます。
- 目標点に到達するたびに止まる(Lerp、SLerp)
・移動時間(または速度比率)、目標ポーズ点 - 経由点(で止まらない)
・各点間の移動時間(または速度比率)セット、目標経由点セット(複数)、補間の種類 - 割り込み動作
・(割り込まれる側の元の動作に対し)割り込み動作を許容する/許容しない
・監視する割り込み入力(トリガー)の指定
・トリガーがONになったら発動する割り込み動作(移動時間、目標ポーズ点などのパラメータ) - 目標点で止まらない
・移動時間(または速度比率)、目標ポーズ点、目標点速度
・目標ポーズ点の基準座標系の速度
→ 移動時間(または速度比率)、目標ポーズ点(基準座標系が移動中)
3. 設計上の問題
3.1. 【問題1】限界(速度比率100%)の定式化
「限界まで速く」といわれても機械は限界を知りません。
定式化してプログラムを組んで書き込んで上げないと、
ユーザから言われるがままに動き続け、
果ては壊れ、
もしくはケガでは済まない大事故を起こすことだってあります。
![「機械は限界を知らない」](http://kdaic.net/wp/wp-content/uploads/2019/09/robot_does_not_know_limit-724x1024.png)
定式化のために物理モデルを立てる必要があります。
モーターやモータードライバの限界だと
回路保護の観点から
モーターの回転運動と電流と発熱との関係をモデル化する必要があります。
短時間で一気にコゲつくくらいの電流値が一体いくらなのか知る必要があります。
燃えるまでいかなくても高い電流値であれば
時間経過とともに発熱温度が上がり、
基板の冷却装置の伝熱・放熱の限界を超えて壊れてしまうので、
温度上昇を避けられる限界の値がいくらなのか知る必要があります。
安全上の限界だと、
人がロボットのフレームに接触したら停止
つまりゼロ距離で停止するとし、
そこから近距離、遠距離へと距離を変化したときの、
相対的に停止できる各関節軸の回転速度の限界をモデル化する必要があります。
フレームとの距離なので関節一軸だけの問題ではなく、
ロボット全身の衝突モデルを立てる必要があります。
3.2. 【問題2】限界(速度比率100%)と関節-手先の変換
手先のPTP動作をある移動時間セットの経路点セットに沿って実行したいとき、
各関節軸はどのような回転運動をすれば良いでしょうか?
![手先の運動と関節角の運動の図](http://kdaic.net/wp/wp-content/uploads/2019/09/spraygun_robot-724x1024.png)
手先の移動速度はゆっくりでも
ある関節軸の回転速度は速くなってしまうことがあります。
手先と各関節軸との運動の変換式を考える必要があります。
また、手先のPTP動作を100%の速度指定で実行したいとき、
先の定式化の話によると、
手先動作の100%限界も各軸モーターの回転運動の制約や衝突モデルの制約に縛られます。
制約式から変換して手先の100%動作を生成する必要があります。
3.3. 【問題3】限界(速度比率100%)と球面上経路点補間
経路点を止まらずに滑らかに補間するとき、
前の章で補間の種類の例を上げてみましたが、
各種類の補間を球面上姿勢方向で実現するには一体どのような計算が必要でしょうか?
![ハンドカメラ姿勢の経路点100%補間動作](http://kdaic.net/wp/wp-content/uploads/2019/09/100per_PTP_orientation-724x1024.png)
止まらずに滑らかに補間するということは、
通過する経路点上で速度を持つということになります。
姿勢の方向変化、姿勢の回転の速度なので、いわゆる姿勢の角速度ですね。
ユーザは時間と方向くらいは指定しても、姿勢の角速度までは直感的に分かりにくいし面倒なので直接指定したくないでしょう。
すると経路上の姿勢の角速度は自動で割り振ってもらう必要があります。
位置空間の点運動と違い、姿勢の運動は複雑です。
速度の限界を関節軸や衝突モデルの制約に基づいて与えるとき、
姿勢の運動に対しどのような形でその制約式が表れるでしょうか?
3.4. 【問題4】割り込み動作を受け入れるシステム
最近のロボットは多数のセンサを監視したり、
脚や双腕や頭部で各部位別々に動作したり、
移動したり、
外部機器と連携したり、、
とマルチタスクであることが当たり前になってきました。
割り込み動作を使用可能にするということは、
ユーザの応用範囲が広がる反面、
ユースケースも増え、
あらゆるパターンに耐えるシステムの設計が求められることになります。
タスク実行の優先度やプリエンプション、リアルタイム処理などのシステム設計時に割り込み動作はあらかじめ考慮される必要があります。
だからといってしかし、
ユーザの割り込み動作の指定をなんでもかんでも許す必要はなく、
「そんなん無理じゃー」
といってエラーで落とす仕様もあって然りだと思います。
ただし割り込み動作がエラーで失敗するときは、
システムの安全性は担保されるべきですし、
後でそのエラー原因や回避方法をなるべくユーザに分かりやすく伝える機能が用意されてあるべきです。
一番よくないのは、中途半端なのに何でもできるように謳った仕様です。
できないならできないと明確に仕様を決めるべきです。
マニュアルにもはっきり書いておくべきです。
ユーザが使ってわけわからん挙動をするロボットは最悪です。
ソフトウェア品質を軽視するヒドい開発体制のメーカーだと非難するべきです。たった少人数で過剰労働させて設計し社内レビューもなく世に出したに違いありません。悪いのは一方的に命令している人間です。ロボットの開発現場の人間が一番ロボットみたいになっ・・・おっと関係ない話でしたね。自分の黒い部分がはみ出していました。
4. 今回はここまで
ふぅ〜。
今回はPTP方式の動作コマンドの具体的なユースケースを挙げました。
さらにそのコマンドを実現するために
クリアしなければならない問題も挙げました。
PTP方式のコマンド例はこの限りではないでしょうし、
本問題の解法も一通りではないでしょう。
しかし今回はこれだけ書いたらなんかもう満足したので終わります。
次回からまた、
問題を数式に落とし込んで解いていきたいと思います。
以上です。