逆運動学API

ロボット逆運動学は産業ロボット制御システムの中核機能の一つであり、デカルト空間の位置と姿勢情報をロボット関節空間の角度情報に変換することができます。各ロボットメーカーはその制御装置において対応する逆運動学API関数を提供しており、これらの関数はユーザーが精密な運動制御と経路計画を実現するのに役立ちます。逆運動学APIの主な役割は、指定されたツール中心点(TCP)の位置と姿勢に基づいて、ロボット各関節が到達すべき角度値を計算することです。

ABB

ABBロボット制御装置は、逆運動学計算にCalcJointT関数(Calculate Joint Target)を提供しています。この関数は指定されたrobtargetデータからロボットアームと外部軸の関節角を計算するために使用されます。

CalcJointT関数:

CalcJointT(Calculate Joint Target)関数は、指定されたrobtargetデータに基づいてロボット各軸の関節角度を計算できます。この関数は計算過程においてTool、WObjなどの関連パラメータの規定を考慮する必要があります。有効なプログラム変位(ProgDisp)と外軸オフセット量(EOffs)実行期間中は、同じ座標系で入力robtargetデータを指定する必要があります。計算完了後、返されるjointtargetデータは校正座標系で表現されます。

MultiMoveアプリケーションタイプで協調ワークオブジェクトが協調または同期協調モードを形成する際、ワークオブジェクトが別のプログラムタスク内の機械ユニットによって移動される場合、特定の状況ではCalcJointT関数を使用してはいけません。これらの状況には以下が含まれます:別のプログラムタスク内の機械ユニットによって移動される協調ワークオブジェクトの現在位置を現在のユーザー座標系で計算する場合、別のプログラムタスク内の機械ユニットが静止している場合、および\UseCurWObjPosパラメータを使用する場合。

関数の戻り値はjointtargetデータタイプで、アーム側のロボットアーム各軸の角度(度(degree)単位)、外軸の値(直線軸はmm単位、回転軸は度(degree)単位)に関する情報を含みます。戻り値は常に校正位置に関連します。

CalcJointT関数の構文は:

CalcJointT ([\UseCurWObjPos] Rob_target Tool [\WObj] [\ErrorNumber])
パラメータ名 データタイプ 説明

[\UseCurWObjPos]

switch

オプションパラメータ、別のタスク内の機械ユニットによって移動される協調ワークオブジェクトの現在位置を計算に使用(現在のユーザー座標系)、その他すべてのデータはRAPIDプログラムから取得

Rob_target

robtarget

最外座標系でのロボットアームと外軸の位置で、有効なプログラム変位(ProgDisp)と外軸オフセット量(EOffs)実行期間中の指定ツールとワークオブジェクトに関連

Tool

tooldata

ロボットアーム関節角計算に使用するツール定義データ、ツール中心点(TCP)の位置と姿勢情報を含む

[\WObj]

wobjdata

ロボットアーム位置に関連するワークオブジェクト(座標系)。このパラメータを省略した場合、ワークオブジェクトwobj0が使用される。固定ツール、協調外軸、またはコンベアベルトを使用する場合、このパラメータを詳細に説明する必要がある

[\ErrorNumber]

errnum

エラー処理用。少なくとも一つの軸が関節制限区域外にある場合、または少なくとも一つの結合関節が制限を超えた場合、エラー数ERR_ROBLIMITの変数を保存;位置(robtarget)がロボット作業区域外にある場合、ERR_OUTSIDE_REACHを保存

プログラム実行:

入力Robtargetに基づいて、返されるjointtargetを計算します。\UseCurWObjPosパラメータを使用する場合、使用される位置はユーザー座標系を制御する機械ユニットの現在位置から取得されます。ロボットアーム関節角を計算するため、選択されたTool、WObj(協調ユーザー座標系を含む)、および実行期間中に有効なProgDispを考慮する必要があります。実行期間中の外軸位置を計算するため、有効なツールEOffsを考慮する必要があります。

計算は常に入力robtargetデータ内の指定された設定データに基づいてロボットアーム設定を選択します。命令ConfLとConfJはこの計算原則に影響しません。腕奇異点を使用する場合、ロボットアーム軸4を0度に設定します。

ロボット位置が保存される際に、有効なプログラム変位(ProgDisp)および/または外軸オフセット量(BOEEs)が存在する場合、CalcJointT実行時に同じプログラム変位および/または外軸オフセット量が有効である必要があります。

制限:

協調座標系を使用する場合、CalcJointTを使用する際に協調ユニットを所有している必要があります。

CalcJointT実行時、TCPと協調関連の位置の場合、通常はワークオブジェクト内のユーザー座標系を制御する機械ユニットが利用可能であることを確認する必要があります。

CalcJointTは通常、RAPIDプログラムからのrobtarget、tooldata、wobjdataを使用してjointtargetを計算します。協調ワークオブジェクトの場合、機械ユニット位置をrobtarget内の外軸位置として使用しますが、機械ユニットが別のプログラムタスク(MultiMoveシステム)によって制御される場合、または機械ユニットが制御システム(コンベアベルト)によって制御されない場合は除外されます。コンベアベルト以外のMultiMoveシステムについて、機械ユニットがCalcJointT実行期間中に静止している場合、\UseCurwObjPosパラメータを使用できます。

エラー処理と実用例

システムは以下の回復可能なエラーが発生する可能性があり、エラーハンドラーでこれらのエラーを処理します。システム変数ERRNOは以下の値に設定されます:

エラーコード エラー原因

ERR_ROBLIMIT

位置に到達可能だが、少なくとも一つの軸が関節制限外にあるか、少なくとも一つの結合関節が制限を超えている

ERR_OUTSIDE_REACH

位置(robtarget)がロボット作業区域外にある

ERR_WOBJ_MOVING

ワークオブジェクト(ユーザー座標系)を制御する機械ユニットがCalcJointT \UseCurWObjPos実行時間内に静止していない

基本エラー処理例:

VAR errnum reach_error;
VAR jointtarget result_joints;

result_joints := CalcJointT(target_point, tool0 \WObj:=wobj0 \ErrorNumber:=reach_error);

IF reach_error = ERR_ROBLIMIT OR reach_error = ERR_OUTSIDE_REACH OR reach_error = ERR_WOBJ_MOVING THEN
    TPWrite "Position unreachable: " + NumToStr(reach_error, 0);
    ! エラー状況を処理 - エラーを記録するか新しい目標位置を要求
ELSE
    ! 正常な運動を実行
    MoveAbsJ result_joints, v1000, fine, tool0;
ENDIF

到達可能性チェック例:

FUNC bool CanRobReach(robtarget ToPoint, PERS tooldata Tool, \PERS wobjdata WObj)
    VAR jointtarget jdump;
    jdump := CalcJointT(ToPoint, Tool \WObj?WObj);
    RETURN TRUE;
ERROR
    RETURN FALSE;
ENDFUNC

FANUC

FANUCロボット制御装置は、逆運動学計算にPOS2JOINT内蔵関数を提供しています。このルーチンは逆運動学ルーチンを呼び出してデカルト位置(in_pos)を関節角度(out_jnt)に変換するために使用されます。

POS2JOINT関数の構文は:

POS2JOINT(ref_jnt, in_pos, uframe, utool, config_ref, wjnt_cfg, ext_ang, out_jnt, and status)

この関数は%ENVIRONMENT GroupのMOTN環境グループに属します。

パラメータ名 データタイプ 入力/出力 説明

ref_jnt

JOINTPOS

[in]

参照関節位置、逆解計算の初期解として使用

in_pos

POSITION

[in]

入力デカルト位置、変換対象となる目標位置と姿勢

uframe

POSITION

[in]

ユーザー座標系の定義、作業空間の基準座標系

utool

POSITION

[in]

ユーザーツール座標系の定義、ツール中心点(TCP)の情報

config_ref

INTEGER

[in]

設定参照パラメータ、ロボットの形態設定を指定

wjnt_cfg

CONFIG

[in]

腕関節設定、ロボットアームの特定の形態を指定

ext_ang

ARRAY OF REAL

[in]

外部軸角度配列、追加軸の角度値

out_jnt

JOINTPOS

[out]

出力関節位置、計算結果の各軸角度値

status

INTEGER

[out]

実行状態、関数実行結果の成功/失敗情報

YASKAWA

YASKAWAロボット制御装置は、mpConvCartPosToAxes関数を提供して指定された制御グループの直交座標位置(ロボット座標系)を角度位置に変換します。

mpConvCartPosToAxes関数の構文は:

int mpConvCartPosToAxes(
    unsigned int grp_no,
    MP_COORD* coord,
    unsigned int tool_no,
    BITSTRING fig_ctrl,
    long prev_angle[MP_GRP_AXES_NUM],
    MP_KINEMA_TYPE type,
    long angle[MP_GRP_AXES_NUM]
);
パラメータ名 データタイプ 説明

grp_no

unsigned int

制御グループ番号、対象となるロボット群の識別子

coord

MP_COORD*

直交座標位置ポインタ、変換対象の位置と姿勢情報

tool_no

unsigned int

ツール番号、使用するツール定義の識別子

fig_ctrl

BITSTRING

設定制御パラメータ、ロボットの形態設定を制御

prev_angle

long[MP_GRP_AXES_NUM]

前の角度位置配列、参照となる各軸の角度値

type

MP_KINEMA_TYPE

運動学タイプ、計算に使用する運動学モデル

angle

long[MP_GRP_AXES_NUM]

出力角度位置配列、計算結果として得られる各軸の角度値

KUKA

KUKAロボット制御装置は、逆運動学計算にInverse機能関数を提供しています。この関数はデカルト位置から付加軸角度で適切なロボット軸角度を計算します。ここではデカルト位置に状態と回転角値を指定する必要はありません。

Inverse機能は細かなブロック時にPTPでアプローチして計算される点に使用できます。この機能で回転角値の有効性をチェックし、必要に応じて目標点で調整できます。

Inverse関数の構文は:

result = INVERSE(position, start_axis, err_status)
パラメータ名 タイプ 渡し方 説明

result

E6AXIS

戻り値

渡された位置での軸角度、計算結果として返される各軸の角度値

position

E6POS

INパラメータ

ベース座標系に基づくデカルト位置(必要に応じて付加軸角度付き)、この位置でロボット軸角度を計算

start_axis

E6AXIS

INパラメータ

運動開始点でのロボット軸角度、計算の参照点として使用

err_status

INT

OUTパラメータ

渡された軸角度(start_axis)をソフトウェア制限スイッチでチェックするかどうかを設定

開始点start_axisの使用

以下の場合に開始点start_axisが必要です:

  • 目標点に状態値がない。システム変数$TARGET_STATUSで目標点が得るべき状態値を定義:

状態設定 説明

$TARGET_STATUS=#SOURCE

目標点は開始点と同じ状態を得て、start_axisの軸角度から状態を計算

$TARGET_STATUS=#BEST

目標点はロボットが軸空間で開始点から目標点までできるだけ短くする状態を得る

  • 目標点に回転角値がない。特定軸で許可される、目標点が開始点への最短経路を持つ回転角値を計算。ここで、回転角がソフトウェア制限スイッチを超えることが許可される。

  • 目標点が奇異点付近にある。軸角度を確定し、これより大きな値を計算する必要がある。システム変数$SINGUL_POS[1…​3]で目標点が保持すべき角度を設定:

設定値 説明

$SINGUL_POS[1…​3]=0

軸の角度を0度に確定

$SINGUL_POS[1…​3]=1

角度を開始点から目標点まで変更せずに保持

エラー処理と実用例

変数err_statusは計算結果の伝送に使用されます。計算が成功しない場合、この変数はエラーコードに相当する値を伝送します:

説明

-4

プリセット変数$TOOLが無効

-3

プリセット変数$BASEが無効

-2

err_statusにまだ有効値がない

-1

すべての主要なposition変数成分が定義されていない、SとTは定義する必要がない

0

計算成功、エラーなし

1

規定の軸角度について、ソフトウェア制限スイッチを超えた

2

デカルト目標位置に到達可能な軸角度がない

3

デカルト目標位置に到達可能な軸角度があるが、規定の回転角によりソフトウェア制限スイッチを超える

KUKA逆運動学計算例:

DEF safe_inverse_calculation()
  DECL E6POS target_pos
  DECL E6AXIS start_joints, result_joints
  DECL INT error_status

  target_pos = {X 100.0, Y 200.0, Z 300.0, A 0.0, B 90.0, C 0.0}
  start_joints = $AXIS_ACT

  result_joints = INVERSE(target_pos, start_joints, error_status)

  SWITCH error_status
    CASE 0
      ; 計算成功、運動実行
      PTP result_joints
    CASE 1, 2, 3
      ; 位置到達不可または制限超過
      $MSG_T = {MSG_T: "Position unreachable, error code: " [] error_status []}
    DEFAULT
      ; その他のエラー
      $MSG_T = {MSG_T: "Calculation error: " [] error_status []}
  ENDSWITCH
END

ROKAE

ROKAEロボット制御装置は、CalcJointT関数を提供して指定されたrobtarget変数に対応する関節角度を計算します。この関数は入力位置に対応する関節角度と外部軸位置を返します。関節角度の単位は度(Degree)、直線外部軸の単位はミリメートル(mm)、回転外部軸の単位は度(Degree)です。

この関数の定義形式は:

CalcJointT(Rob_Target, Tool, Wobj)
パラメータ名 データタイプ 説明

Rob_Target

robtarget

指定されたデカルト空間目標点、点定義時に使用するツールとワークオブジェクトはCalcJointT命令で使用するツール/ワークオブジェクトと一致させる必要があり、そうでなければ誤った結果になる可能性がある

Tool

tool

関節角度計算時に使用するツール、定義で使用したrobtarget時に使用したツールと一致させる必要がある

Wobj

wobj

ワークオブジェクト座標系、作業空間の基準座標系を定義

UR

すなわちUniversal Robot、制御装置はget_inverse_kin関数を提供して逆運動学変換(ツール空間から関節空間)を計算します。qnearが定義されている場合、qnearに最も近い解を返します。そうでなければ、現在の関節位置に最も近い解を返します。tcpが提供されていない場合、制御装置の現在アクティブなtcpを使用します。

パラメータ名 タイプ 説明

x

tool pose

ツール姿勢、変換対象となる目標位置と姿勢

qnear

list of joint positions

関節位置リスト(オプション)、計算の参照となる関節角度配列

maxPositionError

numeric

最大許容位置誤差(オプション)、位置計算の許容誤差

maxOrientationError

numeric

最大許容方向誤差(オプション)、姿勢計算の許容誤差

tcp

tcp offset pose

tcpオフセット姿勢(オプション)、ツール中心点の定義

関数戻り値は関節位置です。例コマンドは:

get_inverse_kin(p[.1,.2,.2,0,3.14,0], [0.,3.14,1.57,.785,0,0])

例パラメータ:x = p[.1, .2, .2, 0, 3.14, 0]は位置がx=100mm、y=200mm、z=200mm、回転ベクトルがrx=0度、ry=180度、rz=0度の姿勢を表します。qnear = [0., 3.14, 1.57, .785, 0, 0]は解が関節角度j0=0度、j1=180度、j2=90度、j3=45度、j4=0度、j5=0度に近いことを表します。maxPositionErrorのデフォルトは1e-10メートル、maxOrientationErrorのデフォルトは1e-10ラジアンです。

PEITIAN

PEITIANロボット制御装置も対応する逆運動学計算機能を提供しています。そのframe構造体タイプは位置と姿勢情報の完全な記述を含んでいます。

メンバー名 データタイプ 説明

x

double

変換後座標系原点の元座標系でのx成分座標、単位ミリメートル

y

double

変換後座標系原点の元座標系でのy成分座標、単位ミリメートル

z

double

変換後座標系原点の元座標系でのz成分座標、単位ミリメートル

a

double

変換後座標系姿勢の元座標系でのオイラー角表現のa成分、単位度(degree)

b

double

変換後座標系姿勢の元座標系でのオイラー角表現のb成分、単位度(degree)

c

double

変換後座標系姿勢の元座標系でのオイラー角表現のc成分、単位度(degree)

オイラー角は回転する軸の順序の違いにより、計12種類の異なるオイラー角表現方式があります。ここで採用するのはZYX型オイラー角で、すなわち初期座標系姿勢から変換座標系姿勢への変換順序は、まずz軸回りにa角度回転、次に新しいy軸回りにb角度回転、最後に新しいx軸回りにc角度回転です。

getjoint関数:

getjoint関数はあるTCP姿勢に対応するロボット軸位置、すなわち運動学逆解を取得するために使用されます。関数プロトタイプは:

joint getjoint(pose p, tool t, wobj w)
パラメータ名 データタイプ 説明

p

pose

ロボット姿勢、セクション2.4.4参照

t

tool

指定のツール、セクション2.4.6参照

w

wobj

参照のワークオブジェクト座標系、セクション2.4.7参照

この関数はjointタイプを返し、対応するロボット軸位置情報を返します。

使用例:

pose p = {x 763.869, y 207.323, z 1422.841, a 129.538, b 0.480, c 92.084, cfg 0}
print getjoint(p, $FLANGE, $WORLD)

pose構造体は位置と設定情報を含みます:

メンバー名 データタイプ 説明

b

double

ロボットツール姿勢の現在ワークオブジェクト座標系でのオイラー角表現のb成分、単位度(degree)

c

double

ロボットツール姿勢の現在ワークオブジェクト座標系でのオイラー角表現のc成分、単位度(degree)

cfg

int

ロボット軸設定。ロボットはTCPが同じ位置に到達する複数の異なる方式が存在する可能性があるため、ここではcfgパラメータ(取値0-7、可能な8種類の方式を表し、その中の「beta」は5軸倍数の角度を指す)でその中の一つの方式を指定し、これによって唯一のロボット軸位置グループを確定する

turn

int

cfgと協力して逆解の軸位置を確定。ここではturnの第6ビット位のみを使用し、bit0は1軸、bit1は2軸を表し、以下同様。turn値が-1の場合、最近点に最も近い解を自動選択することを表す;turn値が1の場合、その軸は0未満の解を選択することを表す;turn値が0の場合、その軸は0より大きい解を選択することを表す。軸の運動範囲が360度より大きい場合、このパラメータを補助選択に使用する可能性があり、その他の大部分の状況では該当値を設定する必要がない

ej1~ej6

double

外1軸~外6軸の位置、直線軸単位はmm、回転軸単位は度(degree)

ELITE

ELITEロボット制御装置はget_inv_kinematics関数を提供して逆運動学計算を行います。この関数は目標点姿勢と参照点関節角度に基づいて目標点の関節角度を計算できます。

逆解関数get_inv_kinematics:

関数構文は:

table get_inv_kinematics(table var1, table var2)

パラメータ説明:var1はpose型の目標点姿勢;var2はjoint型の参照点関節角度で、参照点は目標点に近い必要があります。記述しない場合は現在点を参照とみなします。関数は逆解結果空またはtable:joint型の目標点関節角度を返します。

使用例:

pose={378.538,212.504,134.055,-2.712,-0.791,2.553}
joint={10.081,-75.007,105.449,-70.694,98.434,89.481,0.000,0.000}
Inv_data=get_inv_kinematics(pose,joint)

pose={x,y,z,rx,ry,rz}、sizeが6の配列、poseのrx,ry,rzはすべてラジアンです。joint={j1,j2,j3,j4,j5,j6,j7,j8} sizeが8の配列。

正解関数get_fwd_kinematics:

ELITEは正運動学計算用の正解関数get_fwd_kinematicsも提供しています:

table get_fwd_kinematics(table var1)

パラメータvar1はjoint型の目標点関節角度です。関数は正解結果またはtable:pose型の目標点姿勢を返します。

使用例:

joint={10.081,-75.007,105.449,-70.694,98.434,89.481,0.000,0.000}
fwd_data=get_fwd_kinematics(joint)

データ構造説明:pose={x,y,z,rx,ry,rz} sizeが6の配列;joint={j1,j2,j3,j4,j5,j6,j7,j8} sizeが6~8の配列。

よくある質問

  1. CalcJointTがERR_ROBLIMITエラーを返すのに、ロボットが現在この位置にあるのはなぜですか?

    これはABBユーザーがよく遭遇する問題です。原因は設定パラメータの不一致です。設定[0,2,0,-1]でCalcJointTを呼び出すとエラーになりますが、[0,1,0,0]設定では成功します。解決方法は入力robtarget設定と実際のロボット設定が一致することを確保することです。

  2. Universal Robotsで「getInverse: Unable to find a solution」が出現する場合はどう処理しますか?

    これは通常CB3プログラムをe-Seriesロボットにロードする際に発生し、機械的差異(より高いベース、拡張された腕関節2、より長いツールプレートを含む)がツール位置と関節角度の関係に影響するためです。解決方法は経路点を再教示するか、関節角度が重要な点(ゼロ復帰位置など)について「Use Joint Angles」オプションを選択することです。

  3. FANUCのPOS2JOINT関数がいつ動作しないのですか?

    FANUCユーザーはPOS2JOINTが奇異点に遭遇した際に変換できないと報告しています。デカルト位置に対して無限多の関節値(J4,J6)の可能性が存在するためです。解決策は呼び出し前に奇異点に近いかどうかをチェックするか、異なる参照関節位置を使用することです。

  4. 逆運動学計算による安全問題をどう予防しますか?

    Universal Robotsはis_within_safety_limits(pose)関数を提供して姿勢が安全制限内にあるかをチェックします。get_inverse_kin()を呼び出す前にこの関数を使用することでエラーポップアップを避けることができます。その他のメーカーについては、計算前に目標位置が作業空間内にあるかを検証することを推奨します。

  5. なぜ逆運動学計算が非常に遅い場合があるのですか?

    可能な原因には:目標位置が奇異点に近い、関節制限チェックが複雑、または参照関節位置が目標から遠すぎることが含まれます。参照関節位置の選択を最適化し、既知の奇異点区域を避けることを推奨します。