constraintPositionTarget
对身体的相对位置进行约束
描述
的constraintPositionTarget
对象描述一种约束,该约束要求一个主体(末端执行器)的位置在任何方向的距离公差内与目标位置匹配。目标位置相对于参考体的主体框架指定。
中使用约束对象generalizedInverseKinematics
对象来指定机器人上的多个运动学约束。
有关使用多个约束对象的示例,请参见规划一种具有多重运动学约束的到达轨迹.
创建
语法
描述
返回位置目标对象,该对象表示对机器人模型主体的约束positionConst
= constraintPositionTarget (endeffector
)endeffector
并设置EndEffector
财产。
返回一个位置目标对象,其中每个指定的属性名称由一个或多个名称-值对参数设置为指定的值。positionConst
= constraintPositionTarget (endeffector
,名称=值
)
属性
EndEffector
- - - - - -末端执行器的名称
字符串标量|特征向量
末端执行器的名称,指定为字符串标量或字符向量。当使用此约束时generalizedInverseKinematics
,名称必须与机器人模型中指定的身体相匹配(rigidBodyTree
).
例子:“left_palm”
数据类型:字符
|字符串
ReferenceBody
- - - - - -参考主体框架的名称
”
(默认)|特征向量
引用主体帧的名称,指定为字符向量。默认的”
表示约束相对于机器人模型的基座。当使用此约束时generalizedInverseKinematics
,名称必须与机器人模型中指定的身体相匹配(rigidBodyTree
).
例子:
TargetPosition
- - - - - -目标相对于参考体的位置
(0 0 0)
(默认)|[x y z]
向量
目标相对于参考体的位置,指定为[x y z]
向量。目标位置是参考体坐标系中指定的点。
例子:
PositionTolerance
- - - - - -距离目标的最大允许距离
0
(默认)|数字标量
距离目标的最大允许距离(以米为单位),指定为数值标量。这个值是末端执行器原点和目标位置之间距离的上界。
例子:
权重
- - - - - -约束的权重
1
(默认)|数字标量
约束的权值,指定为数值标量。此权重与权重
中指定的所有约束的generalizedInverseKinematics
适当地平衡每个约束。
例子:
例子
规划一种具有多重运动学约束的到达轨迹
这个例子展示了如何使用广义逆运动学来规划机器人的关节空间轨迹。它结合了多种约束条件,生成了一个轨迹,引导夹持器到达放在桌子上的杯子。这些约束保证了夹持器以直线接近杯子,并且夹持器与桌子保持安全距离,而不需要预先确定夹持器的姿态。
建立机器人模型
这个例子使用了KUKA LBR iiwa的一个模型,一个7自由度的机器人机械手。importrobot
生成一个rigidBodyTree
模型来自存储在统一机器人描述格式(URDF)文件中的描述。
lbr = importrobot (“iiwa14.urdf”);% 14公斤有效载荷版本lbr。DataFormat =“行”;爪=“iiwa_link_ee_kuka”;
定义杯子的尺寸。
cupHeight = 0.2;cupRadius = 0.05;杯赛位置=[-0.5,0.5,杯赛高度/2];
在机器人模型中添加一个固定的身体,代表杯子的中心。
身体= rigidBody (“cupFrame”);setFixedTransform(身体。join, trvec2tform(cupPosition)) addBody(lbr, body, lbr. basename);
定义规划问题
本例的目标是生成满足以下条件的机器人配置序列:
从主配置开始
机器人配置无突变
保持夹持器在“工作台”上方至少5厘米(z = 0)
当它接近时,夹持器应该与杯子对齐
完成与夹具5厘米从中心的杯子
这个例子利用约束对象来生成满足这些条件的机器人配置。生成的轨迹由五个构型路径点组成。第一个航点,q0处
,设置为主配置。中预分配其余配置qWaypoints
使用repmat
.
numWaypoints = 5;q0 = homeConfiguration (lbr);qWaypoints = repmat(q0, numWaypoints, 1);
创建一个generalizedInverseKinematics
接受以下约束输入的求解器:
笛卡尔边界-限制夹持器的高度
位置目标-指定杯相对于夹持器的位置。
瞄准约束-使夹持器与杯轴对齐
定位目标-在接近球杯时保持固定的夹持方向
关节位置边界——限制路径点之间关节位置的变化。
gik = generalizedInverseKinematics (“RigidBodyTree”lbr,...“ConstraintInputs”, {笛卡儿的,“位置”,“目标”,“定位”,“联合”})
gik = generizedinversekinematics with properties: NumConstraints: 5 ConstraintInputs: {1x5 cell} RigidBodyTree: [1x1 RigidBodyTree] SolverAlgorithm: 'BFGSGradientProjection' SolverParameters: [1x1 struct]
创建约束对象
创建作为输入传递给求解器的约束对象。这些对象包含每个约束所需的参数。根据需要在调用求解器之间修改这些参数。
创建一个笛卡尔边界约束,要求夹持器至少在桌子上方5厘米(负z方向)。所有其他值都以正
或负
.
heightAboveTable = constraintCartesianBounds(夹);heightAboveTable。界限= [-inf, inf;...负无穷到正无穷;...0.05,正]
heightAboveTable = constraintCartesianBounds with properties: EndEffector: 'iiwa_link_ee_kuka' ReferenceBody: " TargetTransform: [4x4 double] Bounds: [3x2 double] Weights: [1 1 1]
在杯子相对于夹持器的位置上创建一个约束,公差为5毫米。
distanceFromCup = constraintPositionTarget (“cupFrame”);distanceFromCup。ReferenceBody= gripper; distanceFromCup.PositionTolerance = 0.005
distanceFromCup = constraintPositionTarget属性:effeffector: 'cupFrame' ReferenceBody: 'iiwa_link_ee_kuka' TargetPosition: [0 00] PositionTolerance: 0.0050 weight: 1
创建一个瞄准约束,要求z轴的iiwa_link_ee
通过将目标远远地置于机器人上方,使框架近似垂直。的iiwa_link_ee
框架是定向的,这样的约束使夹持器与杯的轴对齐。
alignWithCup = constraintAiming (“iiwa_link_ee”);alignWithCup。TargetPoint = [0,0,100]
alignWithCup = constraintAiming with properties: EndEffector: 'iiwa_link_ee' ReferenceBody: " TargetPoint: [0 0 100] AngularTolerance: 0 Weights: 1 . TargetPoint: [0 0 100
创建一个关节位置边界约束。设置界限
属性,以限制关节位置的变化。
limitJointChange = constraintJointBounds (lbr)
limitJointChange = constraintJointBounds with properties: Bounds: [7x2 double] Weights: [1 1 1 1 1 1 1 1]
为夹持器创建一个公差为一度的方向约束。该约束要求夹持器的方向与属性指定的值匹配TargetOrientation
财产。使用这个约束来固定夹具的方向在最后接近杯子。
fixOrientation = constraintOrientationTarget(夹);fixOrientation。OrientationTolerance =函数(1)
fixOrientation = constraintOrientationTarget with properties: EndEffector: 'iiwa_link_ee_kuka' ReferenceBody: " TargetOrientation: [1 0 0 0] OrientationTolerance: 0.0175 Weights: 1
找到一个指向杯子的配置
这种配置应该将夹持器置于与杯的距离,以便最终接近可以与夹持器正确对齐。
intermediateDistance = 0.3;
约束对象有一个权重
属性,它决定了求解器如何处理冲突的约束。将约束的权重设置为零将禁用该约束。对于这种配置,禁用关节位置边界和方向约束。
limitJointChange。权重= zeros(size(limitJointChange.Weights)); fixOrientation.Weights = 0;
设置目标位置的杯子在夹具框架。杯应在规定的距离上放在夹持器的z轴上。
distanceFromCup。TargetPosition= [0,0,intermediateDistance];
求解满足输入约束的机器人配置gik
解算器。您必须指定所有的输入约束。将该配置设置为第二个路径点。
[qWaypoints(2,:),solutionInfo] = gik(q0, heightAboveTable,...distanceFromCup、alignWithCup fixOrientation,...limitJointChange);
找到的配置,移动夹持器沿一条直线杯
重新启用关节位置约束和方向约束。
limitJointChange。权重= ones(size(limitJointChange.Weights)); fixOrientation.Weights = 1;
禁用align-with-cup约束,因为方向约束使其多余。
alignWithCup。重量= 0;
设置方向约束以保持基于前面配置的方向(: qWaypoints (2)
).得到从夹持器到机器人模型基座的转换。将齐次变换转换为四元数。
fixOrientation。TargetOrientation =...tform2quat (getTransform (lbr qWaypoints(2:),爪));
为每个路径点定义杯和夹持器之间的距离
finalDistanceFromCup = 0.05;distanceFromCupValues = linspace(intermediateDistance, finalDistanceFromCup up, numWaypoints-1);
定义每个路径点之间的关节位置允许的最大变化量。
maxJointChange函数= (10);
为每个剩余的路径点调用求解器。
为k = 3: numWaypoints更新目标位置。distanceFromCup.TargetPosition (3) = distanceFromCupValues (k - 1);限制关节位置,使其接近以前的值。。limitJointChange。界限= [qWaypoints(k-1,:)' - maxJointChange,...: qWaypoints (k - 1) ' + maxJointChange];求解一个配置并将其添加到waypoints数组中。[qWaypoints (k,:), solutionInfo] = gik (qWaypoints (k - 1:)...heightAboveTable,...distanceFromCup alignWithCup,...fixOrientation limitJointChange);结束
可视化生成的轨迹
插值路径点之间产生一个平滑的轨迹。使用pchip
避免过冲,这可能会违反机器人的关节极限。
帧速率= 15;r = rateControl(帧速率);tFinal = 10;tWaypoints = [0, linspace (tFinal / 2、tFinal、大小(qWaypoints, 1) 1)];numFrames = tFinal *帧速率;qInterp = pchip (tWaypoints qWaypoints’,linspace (0 tFinal numFrames))”;
计算每个插值配置的夹持器位置。
gripperPosition = 0 (numFrames, 3);为k = 1:numFrames gripperPosition(k,:) = tform2trvec(getTransform(lbr,qInterp(k,:),...爪));结束
展示机器人的初始配置以及桌子和杯子
图;显示(lbr qWaypoints (1:)“PreservePlot”、假);持有在exampleHelperPlotCupAndTable (cupHeight cupRadius cupPosition);p = plot3(gripperPosition(1,1), gripperPosition(1,2), gripperPosition(1,3));
动画操作臂并绘制夹持器位置。
持有在为k = 1:size(qInterp,1) show(lbr, qInterp(k,:),“PreservePlot”、假);p.XData (k) = gripperPosition (k, 1);p.YData (k) = gripperPosition (k, 2);p.ZData (k) = gripperPosition (k, 3);等待(r);结束持有从
如果需要将生成的配置保存到mat文件中以备以后使用,请执行以下命令:
> > (lbr_trajectory攒钱。席”、“tWaypoints”、“qWaypoints”);
扩展功能
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
版本历史
介绍了R2017aR2019b:constraintPositionTarget
改名为
的constraintPositionTarget
对象已从机器人技术。PositionTarget
.使用constraintPositionTarget
用于所有对象的创建。
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。