逆运动学API
机器人逆运动学是工业机器人控制系统中的核心功能之一,它能够将笛卡尔空间中的位置和姿态信息转换为机器人关节空间的角度信息。各大机器人厂商在其控制器中都提供了相应的逆运动学API函数,这些函数帮助用户实现精确的运动控制和路径规划。逆运动学API的主要作用是根据指定的工具中心点(TCP)位置和姿态,计算出机器人各关节需要达到的角度值。
ABB
ABB机器人控制器提供了CalcJointT函数用于逆运动学计算。该函数用于计算来自指定robtarget数据的机器臂轴和外轴的接头角。
CalcJointT函数:
CalcJointT(Calculate Joint Target)函数能够根据指定的robtarget数据计算出机器人各轴的关节角度。该函数在计算过程中需要考虑Tool、WObj等相关参数的规定。在有效程序位移(ProgDisp)和外轴偏移量(EOffs)执行期间,应使用相同的坐标系指定输入robtarget数据。计算完成后,返回的jointtarget数据以校准坐标系表示。
在MultiMove应用类型与协调工件形成协调或同步协调模式时,如果工件通过位于另一程序任务中的机械单元来移动,在特定情况下不应使用CalcJointT函数。这些情况包括:在计算当前用户坐标系中使用由机械臂单元所移动的已协调工件的当前位置、位于另一程序任务中的机械单元静止不动,以及使用参数\UseCurWObjPos时。
函数的返回值为jointtarget数据类型,包含有关臂侧上机械臂各轴的角度(以度计),有关外轴的值(线性轴以mm计,旋转轴以度计)。返回值始终与校准位置相关。
CalcJointT函数的语法为:
CalcJointT ([\UseCurWObjPos] Rob_target Tool [\WObj] [\ErrorNumber])
参数名 | 数据类型 | 说明 |
---|---|---|
[\UseCurWObjPos] |
switch |
可选参数,用于将另一个任务中的机械单元所移动的协调工件的当前位置用于计算(当前用户坐标系),将从RAPID程序获取所有其他数据 |
Rob_target |
robtarget |
最外面坐标系中的机械臂和外轴的位置与有效程序位移(ProgDisp)和外轴偏移量(EOffs)执行期间的指定工具和工件相关 |
Tool |
tooldata |
用于计算机械臂接头角的工具 |
[\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] |
用户工具坐标系 |
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分量,单位度 |
b |
double |
转换后坐标系姿态在原坐标系中欧拉角表达的b分量,单位度 |
c |
double |
转换后坐标系姿态在原坐标系中欧拉角表达的c分量,单位度 |
欧拉角按照旋转所绕轴的次序不同,共有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分量,单位度 |
c |
double |
机器人工具姿态在当前工件坐标系中欧拉角表达的c分量,单位度 |
cfg |
int |
机器人轴配置。由于机器人可能存在几种不同的方式使TCP到达同一个位置,所以这里需要通过cfg参数(取值0-7,代表可能的8种方式,其中"beta"指代五轴倍数的角度)来指定其中一种方式,从而唯一确定一组机器人轴位置 |
turn |
int |
配合cfg用于确定反解的轴位置。这里只用到turn的第6个bit位,bit0表示1轴,bit1表示2轴,以此类推。当turn值为-1时,表示自动选取距离最近点最近的解;当turn值为1时,表示该轴选小于0的解;当turn值为0时,表示该轴选大于0的解。当轴的运动范围大于360度时可能会用到这个参数辅助选择,其他大部分情况下都不需要设置该值 |
ej1~ej6 |
double |
外1轴~外6轴的位置,直线轴单位为mm,旋转轴单位为度 |
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的数组。
常见问题
-
为什么CalcJointT返回ERR_ROBLIMIT错误,但机器人当前就在这个位置?
这是ABB用户经常遇到的问题。原因是配置参数不匹配。如果你使用配置[0,2,0,-1]调用CalcJointT会出错,但使用[0,1,0,0]配置就成功。解决方法是确保输入的robtarget配置与实际机器人配置一致。
-
Universal Robots出现"getInverse: Unable to find a solution"如何处理?
这通常发生在CB3程序加载到e-Series机器人时,由于机械差异(包括更高的底座、扩展的腕关节2和更长的工具板)影响了工具位置和关节角度的关系。解决方法是重新示教路径点,或者对于关节角度重要的点(如回零位置),选择"Use Joint Angles"选项。
-
FANUC的POS2JOINT函数什么时候无法工作?
FANUC用户报告POS2JOINT在遇到奇异点时无法进行转换,因为对于笛卡尔位置存在无限多个关节值(J4,J6)的可能性。解决方案是在调用前检查是否接近奇异点,或使用不同的参考关节位置。
-
如何预防逆运动学计算导致的安全问题?
Universal Robots提供is_within_safety_limits(pose)函数来检查姿态是否在安全限制内。在调用get_inverse_kin()之前使用此函数可以避免错误弹窗。对于其他厂商,建议在计算前验证目标位置是否在工作空间内。
-
为什么有时候逆运动学计算非常慢?
可能原因包括:目标位置接近奇异点、关节限制检查复杂、或者参考关节位置距离目标过远。建议优化参考关节位置的选择,避开已知的奇异点区域。