文章目录

    • inverseKinematics
      • 利用创建得到的ik对象进行解算
      • 例子
    • constraintAiming class
    • constraintJointBounds
    • constraintCartesianBounds
    • constraintOrientationTarget
    • constraintPoseTarget
    • constraintPositionTarget
    • 参考
 
逆运动学(IK)用于确定机器人模型的关节配置,以实现所需的最终效果位置。基于关节之间的转换,在rigidBodyTree机器人模型中指定了机器人运动学约束。您还可以指定外部约束,例如摄像机臂的瞄准约束或特定刚体链接上的笛卡尔边界框。使用机械手约束对象和generalizedInverseKinematics对象。

inverseKinematics

inverseKinematics系统对象创建一个逆运动学(IK)求解器,对于指定的刚体树模型为期望的末端执行器姿势计算各个关节角度。为您的机器人创建一个刚体树模型。该模型定义了求解器强制执行的所有联合约束。如果可能的话,请遵守机器人模型中指定的关节极限。 要指定除末端执行器姿势以外的更多约束(包括目标约束,位置范围或方向目标),请考虑使用generalizedInverseKinematics。通过此类,您可以计算多约束IK解决方案。 对于一个期望的末端执行器姿态,去计算各个关节的角度,这就是逆运动学问题,主要由以下步骤组成:
  • 创建inverseKinematics对象,并且设置相关属性;
  • 使用参数调用对象,就好像它是一个函数一样。
 
% 创建对象
% 创建逆运动学求解器。要使用求解器,请在RigidBodyTree属性中指定刚体树模型。
ik = inverseKinematics    
% Name-Value值对参数,根据例子去理解更深刻
ik = inverseKinematics(Name,Value)
  1 例子:  
% 指定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)
  3   得到的randConfig下的机器人构型   4   将randConfig下的末端位姿作为目标位姿,以home构型作为初始姿态,进行逆运动学计算,得到的逆解构型为:   5   6   7

constraintAiming class

创建瞄准约束以指向目标位置。constraintAiming对象描述了一个约束,该约束要求一个物体(末端执行器)的z轴瞄准另一个物体(参考物体)上的目标点。如果末端执行器坐标系的z轴在连接末端执行器原点和目标点的向量的任何方向均在角度公差内,则可以满足此约束。相对于参考物体定义了目标点的位置。 约束对象用于GeneralizedInverseKinematics对象中,以在机器人上指定多个运动学约束。  
% 返回一个constraintAiming对象,该对象表示对endeffector指定的物体的约束
aimConst = constraintAiming(endeffector) 
% 指定endeffector的同时,还利用Name-Value值对来指定一些性质
aimConst = constraintAiming(endeffector,Name,Value)
  这个类创建的对象具有如下几个性质:   8  

constraintJointBounds

创建机器人模型的关节位置约束。 constraintJointBounds对象描述机器人刚体树模型的关节位置约束。如果机器人构型矢量将所有关节位置保持在指定的边界内,则可以满足此约束。构造矢量包含了rigidBodyTree对象中所有非固定关节的位置。 约束对象用于generalizedInverseKinematics对象中,以指定机器人上的多个运动学约束。  
% 返回一个constraintJointBounds对象,该对象描述了robot这个刚体树模型的关节位置约束
jointConst = constraintJointBounds(robot)
% 利用Name-Value值对来指定一些性质
jointConst = constraintJointBounds(robot,Name,Value)
  9  

constraintCartesianBounds

创建约束以将body原点保持在笛卡尔范围内,该对象描述了一个物体(末端执行器)相对于固定于另一物体(参考物体)上的目标坐标系的位置约束。如果末端执行器原点相对于目标坐标系的位置保持在指定的范围之内,则可以满足此约束TargetTransform属性是将目标坐标系中的点转换为ReferenceBody坐标系中的点的齐次变换。 约束对象用于GeneralizedInverseKinematics对象中,以在机器人上指定多个运动学约束。  
% 返回笛卡尔边界对象,该对象表示对由endeffector指定的机器人模型的主体的约束
cartConst = constraintCartesianBounds(endeffector)
% 利用Name-Value值对来指定一些性质
cartConst = constraintCartesianBounds(endeffector,Name,Value)
  11  

constraintOrientationTarget

在body相对方向上创建约束。constraintOrientationTarget对象描述了一个约束,该约束要求一个主体(末端执行器)的方向与目标方向相匹配,不过两个方向向量之间允许存在任意方向上指定的角度误差。相对于参考物体的物体坐标系用来指定目标方向。  
% 指定body为endeffector,返回一个定向目标对象,该对象表示对由endeffector指定的机器人模型的主体的约束
orientationConst = constraintOrientationTarget(endeffector)
% 利用Name-Value值对来指定一些性质
orientationConst = constraintOrientationTarget(endeffector,Name,Value)
  12  

constraintPoseTarget

constraintPoseTarget对象描述了一个约束,该约束要求一个物体(末端执行器)的姿势任何方向上的距离和角度公差内匹配目标姿势。相对于参考物体的物体坐标系指定目标姿势。  
% 返回一个姿态目标对象,代表刚体树模型中endeffector的目标姿态约束
poseConst = constraintPoseTarget(endeffector)
% 利用Name-Value值对来指定一些性质
poseConst = constraintPoseTarget(endeffector,Name,Value)
  13  

constraintPositionTarget

constraintPositionTarget对象描述了一种约束,该约束要求一个物体(末端执行器)的位置任意方向上的距离公差内的目标位置相匹配。相对于参考物体的物体坐标系指定目标位置。  
% 指定body为endeffector,返回一个位置目标对象,该对象表示对由endeffector指定的机器人模型的主体的约束
positionConst = constraintPositionTarget(endeffector)
% 利用Name-Value值对来指定一些性质
positionConst = constraintPositionTarget(endeffector,Name,Value)
  14