Robotics System Toolbox学习笔记(四):inverseKinematics及逆运动学约束ConstraintInputs

逆运动学(IK)用于确定机器人模型的关节配置,以实现所需的最终效果位置。基于关节之间的转换,在rigidBodyTree机器人模型中指定了机器人运动学约束。您还可以指定外部约束,例如摄像机臂的瞄准约束或特定刚体链接上的笛卡尔边界框。使用机械手约束对象和generalizedInverseKinematics对象。

inverseKinematics

inverseKinematics系统对象创建一个逆运动学(IK)求解器,对于指定的刚体树模型为期望的末端执行器姿势计算各个关节角度。为您的机器人创建一个刚体树模型。该模型定义了求解器强制执行的所有联合约束。如果可能的话,请遵守机器人模型中指定的关节极限。 要指定除末端执行器姿势以外的更多约束(包括目标约束,位置范围或方向目标),请考虑使用generalizedInverseKinematics。通过此类,您可以计算多约束IK解决方案。

对于一个期望的末端执行器姿态,去计算各个关节的角度,这就是逆运动学问题,主要由以下步骤组成:

  • 创建inverseKinematics对象,并且设置相关属性;
  • 使用参数调用对象,就好像它是一个函数一样。
% 创建对象
% 创建逆运动学求解器。要使用求解器,请在RigidBodyTree属性中指定刚体树模型。
ik = inverseKinematics
    
% Name-Value值对参数,根据例子去理解更深刻
ik = inverseKinematics(Name,Value)

性质如下:

RigidBodyTree 刚体树模型 ridigBodyTree对象
SolverAlgorithm 逆运动学算法 求解逆向运动学的算法,指定为“ BFGSGradientProjection”或“ LevenbergMarquardt”。默认为"BFGSGradientProjection"有关每种算法的详细信息,请参见Inverse Kinematics Algorithms
SolverParameters 算法相关的参数 与指定算法关联的参数,指定为结构。结构中的字段特定于算法

例子:

% 指定rigidbodytree对象,建立该对象的ik逆运动学求解器
ik = inverseKinematics('RigidBodyTree',rigidbodytree)
% 更新刚体树模型
addBody(rigidbodytree,rigidBody('body1'),'base')

% 将刚体树重新分配给IK解算器。如果在修改刚体树模型之前调用了求解器或step函数,请使用release来更改属性
ik.RigidBodyTree = rigidbodytree;

利用创建得到的ik对象进行解算

% 根据预期的末端执行器位姿来逆解得到关节角度
% 为ik指定initialguess,并为姿势的六个组成部分的公差指定所需的权重。与算法执行相关的解决方案信息solInfo与联合配置解决方案configSol一起返回

% Inputs
% endeffector---末端执行器名称,必须在建立ik对象的刚体树模型中
% pose---末端执行器的位姿,指定为4*4齐次变换矩阵,表示想要达到的末端执行器末端位姿
% weights---姿态误差的权重,指定为6元素向量,前三个元素对应于所需姿势的方向误差上的权重。最后三个元素对应于所需姿势的xyz位置误差的权重
% initalguess---机器人各个关节构型的猜测值,作为ik解算器的初始值,要使用矢量形式,请将RigidBodyTree属性中分配的对象的DataFormat属性设置为'row'或'column'。

% OutPuts
% configSol---机器人关节构型的逆解,包含如下两个部分:
% 	- JointName:刚体树模型中的关节名称向量
% 	- JointPosition:各关节对应的角度,这是在公差范围内逆解得到的
% solInfo---解信息,包含下列五个部分:
% 	- Iterations:算法迭代的步数
% 	- NumRandomRestrarts:由于算法陷入了局部最小值而随机重启的次数
% 	- PoseErrorNorm:当前姿态与目标姿态之间的误差大小
% 	- ExitFlag:该代码提供了有关算法执行及其返回原因的更多详细信息。有关每种算法类型的退出标志,请参见退出标志
% 	- Status:描述解决方案是在容差范围内('success')还是算法可以找到的最佳解决方案('best available')的字符向量
[configSol,solInfo] = ik(endeffector,pose,weights,initialguess)

例子

% 加载机器人模型,puma1是一个六轴机器人刚体树模型
load exampleRobots.mat
showdetails(puma1)

% 获取puma1的一个任意构型
randConfig = puma1.randomConfiguration;

% 在randConfig随机构型下获取从末端执行器(L6)到base的齐次变换
% 使用此变换作为末端执行器的目标姿势
tform = getTransform(puma1,randConfig,'L6','base');
% 展示该目标姿态下的机器人构型
show(puma1,randConfig)

% 创建puma1模型的ik对象
ik = inverseKinematics('RigidBodyTree',puma1);
% 指定姿势不同分量的权重,为啥要设这个权重,目前我也不太清楚,估计和具体算法相关
% 对于方向角分量来说,使用比位置分量小的权重
weights = [0.25 0.25 0.25 1 1 1];
% 将机器人的home构型用作初始猜测的关节角
initialguess = puma1.homeConfiguration;

% 根据预期的末端执行器位姿来逆解得到关节角度
[configSoln,solnInfo] = ik('L6',tform,weights,initialguess);

% 显示逆解得到的关节构型
% 逆解得到的关节构型与目标构型有着细微的差别,因为存在误差
% 多次调用ik对象可以提供相似或非常不同的关节构型
show(puma1,configSoln)

在这里插入图片描述

得到的randConfig下的机器人构型

在这里插入图片描述

将randConfig下的末端位姿作为目标位姿,以home构型作为初始姿态,进行逆运动学计算,得到的逆解构型为:

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

constraintAiming class

创建瞄准约束以指向目标位置。constraintAiming对象描述了一个约束,该约束要求一个物体(末端执行器)的z轴瞄准另一个物体(参考物体)上的目标点。如果末端执行器坐标系的z轴在连接末端执行器原点和目标点的向量的任何方向均在角度公差内,则可以满足此约束。相对于参考物体定义了目标点的位置。

约束对象用于GeneralizedInverseKinematics对象中,以在机器人上指定多个运动学约束。

% 返回一个constraintAiming对象,该对象表示对endeffector指定的物体的约束
aimConst = constraintAiming(endeffector) 
% 指定endeffector的同时,还利用Name-Value值对来指定一些性质
aimConst = constraintAiming(endeffector,Name,Value)

这个类创建的对象具有如下几个性质:

endeffector 末端执行器名称 字符串
ReferenceBody 参考物体坐标系的名称 默认为空,表示约束是相对于机器人模型基系的
TargetPoint 目标相对于参考物体的位置 指定为[x, y, z],默认为[0, 0, 0]。约束使用EndEffector坐标系的原点和此目标点之间的向量来维持指定的AngularTolerance
AngularTolerance 末端执行器坐标系的z轴与将末端执行器原点连接到目标点向量之间的最大允许角度,以弧度表示为数字标量,默认为0
Weights 约束权重 指定为数字标量,默认为1。该权重与在generalizedInverseKinematics中指定的所有约束的Weights属性一起使用

constraintJointBounds

创建机器人模型的关节位置约束。

constraintJointBounds对象描述机器人刚体树模型的关节位置约束。如果机器人构型矢量将所有关节位置保持在指定的边界内,则可以满足此约束。构造矢量包含了rigidBodyTree对象中所有非固定关节的位置。 约束对象用于generalizedInverseKinematics对象中,以指定机器人上的多个运动学约束。

% 返回一个constraintJointBounds对象,该对象描述了robot这个刚体树模型的关节位置约束
jointConst = constraintJointBounds(robot)

% 利用Name-Value值对来指定一些性质
jointConst = constraintJointBounds(robot,Name,Value)

该类创建的对象有如下性质:

Bounds 构型向量的范围 指定为n×2矩阵。矩阵的每一行对应于机器人模型上的一个非固定关节,并给出该关节的最小和最大位置。默认情况下,边界是根据输入的刚体树模型机械手中每个rigidBodyJoint对象的PositionLimits属性设置的
Weights 约束权重 约束的权重(指定为n元素矢量),其中每个元素对应于边界中的一行,并给出每个边界的相对权重。默认值为1的向量,以赋予所有关节位置相等的权重。这些权重与generalizedInverseKinematics中指定的所有约束的Weights属性一起使用,以正确平衡每个约束

constraintCartesianBounds

创建约束以将body原点保持在笛卡尔范围内,该对象描述了一个物体(末端执行器)相对于固定于另一物体(参考物体)上的目标坐标系的位置约束。如果末端执行器原点相对于目标坐标系的位置保持在指定的范围之内,则可以满足此约束TargetTransform属性是将目标坐标系中的点转换为ReferenceBody坐标系中的点的齐次变换。 约束对象用于GeneralizedInverseKinematics对象中,以在机器人上指定多个运动学约束。

% 返回笛卡尔边界对象,该对象表示对由endeffector指定的机器人模型的主体的约束
cartConst = constraintCartesianBounds(endeffector)

% 利用Name-Value值对来指定一些性质
cartConst = constraintCartesianBounds(endeffector,Name,Value)

该类创建的对象的一些性质:

EndEffector 末端执行器名称 字符串
ReferenceBody 参考物体坐标系名称 默认为’ ',表示约束是相对于机器人模型基系的
TargetTransform 目标坐标系相对于参考物体坐标系的姿态变换 默认为eye(4)
Bounds 相对于目标坐标系的末端执行器位置范围 指定为3×2向量,[xMin xMax; yMin yMax; zMin zMax]。每行分别定义xyz坐标的最小值和最大值。
Weights 约束权重 指定为[x y z]向量,默认为[1 1 1]。向量的每个元素分别对应于xyz坐标的权重。这些权重与generalizedInverseKinematics中指定的所有约束的Weights属性一起使用,以正确平衡每个约束

constraintOrientationTarget

在body相对方向上创建约束。constraintOrientationTarget对象描述了一个约束,该约束要求一个主体(末端执行器)的方向与目标方向相匹配,不过两个方向向量之间允许存在任意方向上指定的角度误差。相对于参考物体的物体坐标系用来指定目标方向。

% 指定body为endeffector,返回一个定向目标对象,该对象表示对由endeffector指定的机器人模型的主体的约束
orientationConst = constraintOrientationTarget(endeffector)

% 利用Name-Value值对来指定一些性质
orientationConst = constraintOrientationTarget(endeffector,Name,Value)

该类创建的对象的一些性质:

EndEffector 末端执行器名称 字符串
ReferenceBody 参考物体坐标系名称 默认为’ ',表示约束是相对于机器人模型基系的
TargetOrientation 末端执行器相对于参考体的目标方向 指定为4元素向量来表示单位四元数,默认为[1 0 0 0],末端执行器相对于参考体的方向是将末端执行器坐标系中指定的方向转换为参考体坐标系中指定的相同方向的方向。
OrientationTolerance 最大允许旋转角度 标量,默认为0。该值是使末端执行器方向与目标方向匹配所需的旋转角度的上限
Weights 约束权重 标量,默认为1。该权重与generalizedInverseKinematics中指定的所有约束的Weights属性一起使用,以正确平衡每个约束。

constraintPoseTarget

constraintPoseTarget对象描述了一个约束,该约束要求一个物体(末端执行器)的姿势任何方向上的距离和角度公差内匹配目标姿势。相对于参考物体的物体坐标系指定目标姿势。

% 返回一个姿态目标对象,代表刚体树模型中endeffector的目标姿态约束
poseConst = constraintPoseTarget(endeffector)

% 利用Name-Value值对来指定一些性质
poseConst = constraintPoseTarget(endeffector,Name,Value)

该类创建对象的一些性质:

EndEffector 末端执行器名称 字符串
ReferenceBody 参考物体坐标系名称 默认为’ ',表示约束是相对于机器人模型基系的
TargetTransform 目标坐标系相对于参考物体坐标系的姿态变换 默认为eye(4)
OrientationTolerance 最大允许旋转角度 标量,默认为0。该值是使末端执行器方向与目标方向匹配所需的旋转角度的上限
PositionTolerance 距离目标位置最大允许距离 标量,默认为0。该值是末端执行器原点与目标位置之间距离的上限。
Weights 约束权重 2元素向量,默认为[1 1]。两个元素分别对应于PositionTolerance与OrientationTolerance的权重。

constraintPositionTarget

constraintPositionTarget对象描述了一种约束,该约束要求一个物体(末端执行器)的位置任意方向上的距离公差内的目标位置相匹配。相对于参考物体的物体坐标系指定目标位置。

% 指定body为endeffector,返回一个位置目标对象,该对象表示对由endeffector指定的机器人模型的主体的约束
positionConst = constraintPositionTarget(endeffector)

% 利用Name-Value值对来指定一些性质
positionConst = constraintPositionTarget(endeffector,Name,Value)

该类创建的对象的一些性质:

EndEffector 末端执行器名称 字符串
ReferenceBody 参考物体坐标系名称 默认为’ ',表示约束是相对于机器人模型基系的
TargetPosition 目标相对于参考物体的位置 指定为[x y z],默认为[0 0 0],目标位置是在参考物体坐标系中指定的点。
PositionTolerance 距目标的最大允许距离 标量,默认为0。该值是末端执行器原点距离目标位置的最大值。
Weights 约束权重 标量,默认为1。该权重与generalizedInverseKinematics中指定的所有约束的Weights属性一起使用,以正确平衡每个约束。

参考

Inverse Kinematics

猜你喜欢

转载自blog.csdn.net/qq_26565435/article/details/104555085