机器人与自主系统——机器人系统工具箱——逆运动学
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])