文章目录

    • 准备工作
    • generalizedInverseKinematics
      • 利用创建得到的gik对象进行解算
      • 例子
    • 参考

准备工作

Robotics System Toolbox学习笔记(四):Inverse Kinematics相关函数

generalizedInverseKinematics

创建多约束逆运动学求解器。 generalizedInverseKinematics系统对象™使用一组运动学约束来计算由rigidBodyTree对象指定的刚体树模型的关节角度,以此完成逆解计算。其使用非线性求解器来满足约束或达到最佳逼近。在调用对象之前,请指定约束类型ConstraintInputs,调用release(gik),来更改约束输入。   各类的约束输入在上一篇博客Robotics System Toolbox学习笔记(四):Inverse Kinematics相关函数都介绍了,用到翻来看看就行,此处就不多说了。如果只是对机器人末端执行器的位置和姿态进行约束,则使用上一篇博客中提到的ik函数即可。   一般来说,使用该函数解决广义逆运动学约束问题,分为如下两步:
  • 创建一个generalizedInverseKinematics对象,并设置该对象的相关属性;
  • 带参调用对象,就像它是一个函数一样。
 
% 不指定刚体树模型,返回一个广义逆运动学求解器对象。需要注意的是在使用这个求解器对象之前需要指定刚体树模型以及约束输入性质
gik = generalizedInverseKinematics

% 指定刚体树模型和期望的约束输入,然后返回一个广义逆运动学求解器对象
gik = generalizedInverseKinematics('RigidBodyTree',rigidbodytree,'ConstraintInputs',inputTypes)

% 返回一个广义逆运动学求解器,其中每个指定的属性名称通过一个或多个“名称/值”对参数设置为指定的值。名称必须出现在单引号('')中。您可以按任意顺序指定多个名称-值对参数,例如Name1,Value1,...,NameN,ValueN。
gik = generalizedInverseKinematics(Name,Value)
  2 3  

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

% 根据初始猜测关节角和约束描述对象的逗号分隔列表,找到联合配置configSol与算法执行相关的解决方案信息solInfo。约束描述的数量取决于ConstraintInputs属性
% Input:
% - initialguess:机器人各个关节构型的猜测值,作为gik解算器的初始值,要使用矢量形式,请将RigidBodyTree属性中分配的对象的DataFormat属性设置为'row'或'column'
% - constraintObj,...,constraintObjN:约束描述,由gik的ConstraintInputs属性定义的约束描述,指定为这些约束对象中的一个或多个:
% 	- constraintAiming
% 	- constraintCartesianBounds
% 	- constraintJointBounds
% 	- constraintOrientationTarget
% 	- constraintPoseTarget
% 	- constraintPositionTarget
% 上述约束概念均在上一篇博客中,此处不再赘述

% Outputs:
% - configSol:机器人关节构型的逆解,包含如下两个部分:
% 	- JointName:刚体树模型中的关节名称向量
% 	- JointPosition:各关节对应的角度,这是在公差范围内逆解得到的
% solInfo---解信息,包含下列五个部分:
% 	- Iterations:算法迭代的步数
% 	- NumRandomRestrarts:由于算法陷入了局部最小值而随机重启的次数
% 	- ConstraintViolation:有关约束的信息,以结构数组形式返回。数组中的每个结构都具有以下字段:
% 		* Type:对应的约束输入的类型,如ConstraintInputs属性中所指定
% 		* Violation:对应约束类型的约束违规向量。0表示满足约束
% 	- ExitFlag:该代码提供了有关算法执行及其返回原因的更多详细信息。有关每种算法类型的退出标志,请参见退出标志
% 	- Status:描述解决方案是在容差范围内('success')还是算法可以找到的最佳解决方案('best available')的字符向量
[configSol,solInfo] = gik(initialguess,constraintObj,...,constraintObjN)
 

例子

我直接拿的刘勋博士师兄翻译的例子……感谢感谢`  
% lesson_8_generalizedInverseKinematics 建立多约束逆运动学求解器

% 创建一个广义逆运动学求解器,该机器人将机器人手臂固定在特定位置并指向机器人基座
% 创建约束对象以将必要的约束参数传递到求解器中
% 加载预定义的KUKA LBR机器人模型,该模型指定为刚体树对象
load exampleRobots.mat lbr
gik = generalizedInverseKinematics;
gik.RigidBodyTree = lbr;
showdetails(lbr)
show(lbr)
  4   5  
% 创建两个约束对象
gik.ConstraintInputs = {'position','aiming'};
% tool0为末端执行器坐标系
% 名为tool0的物体的原点相对于机器人的base,位置坐标为[0.0 0.5 0.5]
posTgt = constraintPositionTarget('tool0');
posTgt.TargetPosition = [0.0 0.5 0.5];
% 名为tool0的刚体z轴指向机器人base系下的某个点,也就是末端tool0的Z轴指向[0 0 0.8]这个点
aimCon = constraintAiming('tool0');
aimCon.TargetPoint = [0.0 0.0 0.8];
% 找到一个满足约束的配置。必须按照在ConstraintInputs属性中指定的顺序将约束对象传递到系统对象
% 同时指定机器人配置的初始猜测关节角
q0 = homeConfiguration(lbr); % Initial guess for solver
[q,solutionInfo] = gik(q0,posTgt,aimCon);

% 可视化求解器返回的配置
show(lbr,q);
title(['Solver status: ' solutionInfo.Status])
axis([-0.75 0.75 -0.75 0.75 -0.5 1])
% 从目标位置到aim点绘制一条线段。tool0系的原点与线段的一端重合,其z轴与线段对齐。
hold on
plot3([0.0 0.0],[0.5 0.0],[0.5 0.8],'--o')
hold off
    6