机器人与自主系统——机器人系统工具箱——逆运动学
constraintFixedJoint
constraintFixedJoint
对象描述了在同一个 rigidBodyTree
上继承体与前置体之间的闭环固定关节约束。该约束在没有相对方向且帧的原点重合时满足。这种约束在满足时不允许中间帧之间有相对运动。
fixedConst = constraintFixedJoint(successorbody,predecessorbody)
fixedConst = constraintFixedJoint(___,Name=Value)
fixedConst = constraintFixedJoint(successorbody,predecessorbody)
返回一个表示继承体 successorbody
和前置体 predecessorbody
之间约束的固定约束对象 fixedConst
。successorbody
和 predecessorbody
参数分别设置 SuccessorBody
和 PredecessorBody
属性。
fixedConst = constraintFixedJoint(___,Name=Value)
使用一个或多个名称-值对参数,除了之前语法中的所有输入参数外,还可以指定属性。
SuccessorBody
— 关节的继承体名称
字符串标量 | 字符向量
关节继承体帧的名称,指定为字符串标量或字符向量。当与 generalizedInverseKinematics
逆运动学 (IK) 解算器一起使用此约束时,该名称必须与 generalizedInverseKinematics
对象的 RigidBodyTree
中指定的一个身体匹配。
PredecessorBody
— 关节的前置体名称
字符串标量 | 字符向量
关节前置体帧的名称,指定为字符串标量或字符向量。当与 generalizedInverseKinematics
逆运动学 (IK) 解算器一起使用此约束时,该名称必须与 generalizedInverseKinematics
对象的 RigidBodyTree
中指定的一个身体匹配。
SuccessorTransform
— 相对于继承体帧的关节约束的固定变换
eye(4)
(默认) | 4x4 矩阵
PredecessorTransform
— 相对于前置体帧的关节约束的固定变换
eye(4)
(默认) | 4x4 矩阵
PositionTolerance
— 关节约束的位置容差
0
(默认) | 非负标量
OrientationTolerance
— 关节约束的方向容差
0
(默认) | 非负标量
Weights
— 约束的权重
[1 1]
(默认) | 两元素向量
约束的权重,指定为一个两元素向量。向量的元素分别对应于 PositionTolerance
和 OrientationTolerance
属性的权重。这些权重与 generalizedInverseKinematics
解算器中指定的所有约束的权重一起使用,以适当地平衡每个约束。
创建闭环关节约束
为简单的刚体树创建一个旋转、平移和固定关节约束。
使用 exampleHelperFourBarLinkageTree
辅助函数创建一个简单的机器人模型,以演示闭环约束。
rbt = exampleHelperFourBarLinkageTree;
show(rbt,Collisions="on");
view([0 0 pi])
xlim([-1 4])
旋转关节约束
为演示旋转关节约束,通过连接最后一个连杆 link3
和第一个连杆 link0
来创建一个四杆联动。
创建一个具有旋转关节约束和关节边界约束的广义逆运动学解算器。
gikSolverWithRevoluteJointConstraint = generalizedInverseKinematics(RigidBodyTree=rbt, ...
ConstraintInputs={'revolute','jointbounds'});
为确保可重复的 IK 解决方案,禁用随机重启。
gikSolverWithRevoluteJointConstraint.SolverParameters.AllowRandomRestart = false;
theta = pi/2+pi/4;
通过将 theta
设为最小和最大边界,固定第一个关节。
activeJointConstraint = constraintJointBounds(rbt);
activeJointConstraint.Weights = [1 0 0];
activeJointConstraint.Bounds(1,:) = [theta theta];
创建一个旋转关节约束,继承体和前置体分别设置为最后一个连杆 link3
和第一个连杆 link0
。指定前置体和继承体的变换,使中间帧在 X 轴上分别离它们的身体 1 米远。定义后,当 Z 轴对齐时,这些中间帧移动,使其帧原点重合。
cRev = constraintRevoluteJoint("link3","link0", ...
PredecessorTransform=trvec2tform([1 0 0]), ...
SuccessorTransform=trvec2tform([1 0 0]));
提供 [theta 0 0]
作为解算器的初始猜测以及约束。
qConst = gikSolverWithRevoluteJointConstraint([theta 0 0],cRev,activeJointConstraint);
可视化机器人以查看机器人作为四杆联动的行为。如果第一个关节旋转,解算器将尝试保持旋转关节约束的中间帧重合,作为一个关节动作,导致四杆运动。
figure(Name="Revolute Joint Constraint")
show(rbt,qConst,Collisions="on")
ans =
Axes (Primary) with properties:
XLim: [-2.5000 2.5000]
YLim: [-2.5000 2.5000]
XScale: 'linear'
YScale: 'linear'
GridLineStyle: '-'
Position: [0.1300 0.1100 0.7750 0.8150]
Units: 'normalized'
Use GET to show all properties
view([0 0 pi])
平移关节约束
使用平移关节约束创建一个滑块-曲柄。使用平移关节约束和关节边界约束创建一个新的解算器。
gikSolverWithPrismaticJointConstraint = generalizedInverseKinematics(RigidBodyTree=rbt, ...
ConstraintInputs={'prismatic','jointbounds'});
gikSolverWithPrismaticJointConstraint.SolverParameters.AllowRandomRestart=false;
创建平移关节约束,link3
和 link0
分别为继承体和前置体,并设置前置体变换,使前置体中间帧在 X 轴上离前置体帧 1 米远,并在 Y 轴上旋转 pi/2。
cPris=constraintPrismaticJoint("link3","link0",PredecessorTransform=trvec2tform([1 0 0])*eul2tform([0 pi/2 0]));
提供 [theta 0 0]
作为解算器的初始猜测以及约束。
qConst = gikSolverWithPrismaticJointConstraint([theta 0 0],cPris,activeJointConstraint);
可视化机器人以查看机器人作为滑块-曲柄的行为。如果第一个关节旋转,解算器将尝试保持平移关节约束的中间帧重合,作为关节动作,导致滑块-曲柄运动。
figure(Name="Prismatic Joint Constraint")
show(rbt,qConst,Collisions="on")
ans =
Axes (Primary) with properties:
XLim: [-2.5000 2.5000]
YLim: [-2.5000 2.5000]
XScale: 'linear'
YScale: 'linear'
GridLineStyle: '-'
Position: [0.1300 0.1100 0.7750 0.8150]
Units: 'normalized'
Use GET to show all properties
view([0 0 pi])
固定关节约束
为演示固定关节约束,使用连杆创建一个三角形,当第一个关节移动时保持三角形的形状。使用固定关节约束创建一个新的解算器。
gikSolverWithFixedJointConstraint = generalizedInverseKinematics(RigidBodyTree=rbt, ...
ConstraintInputs={'fixed'});
创建固定关节约束,link3
和 link0
分别为继承体和前置体,并设置继承体变换,使前置体中间帧在 X 轴上离前置体帧 1 米远。
cFix = constraintFixedJoint("link3","link1",SuccessorTransform=trvec2tform([1 0 0]));
将固定关节约束的方向约束权重设置为 0。
cFix.Weights = [1 0];
[qConst,solInfo] = gikSolverWithFixedJointConstraint([theta 0.1 0],cFix);
可视化机器人以查看固定关节约束如何作用在机器人框架上。如果第一个关节旋转,解算器将尝试保持固定关节约束的中间帧重合,作为固定关节动作。
figure(Name="Fixed Joint Constraint")
show(rbt,qConst,Collisions="on")
ans =
Axes (Primary) with properties:
XLim: [-2.5000 2.5000]
YLim: [-2.5000 2.5000]
XScale: 'linear'
YScale: 'linear'
GridLineStyle: '-'
Position: [0.1300 0.1100 0.7750 0.8150]
Units: 'normalized'
Use GET to show all properties
view([0 0 pi])