主要内容

约束动脉边界

创建约束以保持笛卡尔界内的身体

描述

约束动脉边界对象描述了一个物体(末端执行器)相对于固定在另一个物体(参考物体)上的目标帧的位置约束。如果末端执行器原点相对于目标坐标系的位置保持在界限指定。的靶向转移属性是将目标帧中的点转换为目标帧中的点的齐次变换ReferenceBody框架。

中的约束对象广义微分方程对象来指定机器人的多个运动学约束。

有关使用多个约束对象的示例,请参见多运动约束下的到达轨迹规划

创建

描述

例子

卡通= ConstrameCarteSiansss(Endeffector.返回一个笛卡尔边界对象,该对象表示指定的机器人模型的身体上的约束Endeffector.

卡通= ConstrameCarteSiansss(Endeffector.名称,价值返回笛卡尔边界对象,其中每个指定的属性名称由一个或多个属性设置为指定值名称,价值配对参数。

输入参数

展开全部

末端执行器名称,指定为字符串标量或字符向量。当使用这个约束时广义微分方程,名称必须与机器人模型中指定的主体相匹配(刚体树)。

例子:“left_palm”

数据类型:烧焦|细绳

特性

展开全部

末端效应器的名称,指定为字符串标量或字符向量。将此约束用于广义微分方程,名称必须与机器人模型中指定的主体相匹配(刚体树)。

例子:“left_palm”

数据类型:烧焦|细绳

参考主体帧的名称,指定为字符串标量或字符向量。默认值''指示约束相对于机器人模型的基础。将此约束用于广义微分方程,名称必须与机器人模型中指定的主体相匹配(刚体树)。

目标帧相对于参考体的姿势,指定为矩阵。矩阵是一个均匀的变换,指定相对变换,以将目标帧中的点转换为参考体帧。

例子:[1 0 0 1; 0 1 0 1; 0 0 1 1; 0 0 0 1]

相对于目标帧的末端效应位置界限,指定为3×2向量,[xmin xmax;ymin ymax;zmin zmax]。每行定义了xyz- 分别为基因。

约束的权重,指定为[x y z]向量。载体的每个元素对应于重量xyz- 分别为......这些重量用于权重指定的所有约束的属性广义微分方程适当地平衡每个限制。

例子

全部崩溃

这个例子说明了如何利用广义逆运动学来规划机器人的关节空间轨迹。它结合多种约束条件,生成一个轨迹,引导夹具到放在桌子上的杯子。这些约束条件确保夹钳以直线接近杯子,并且保持与桌子的安全距离,而不需要事先确定夹钳的姿势。

建立机器人模型

本例使用KUKA LBR iiwa模型,一个7自由度机器人操纵器。进口机器人生成一个刚体树模型来自存储在统一机器人描述格式(URDF)文件中的描述。

lbr=导入机器人(“iiwa14.urdf”);%14千克有效载荷版本lbr。DataFormat =“行”抓手=“iiwa_link_ee_kuka”

定义杯子的尺寸。

杯高=0.2;铜半径=0.05;杯位=[-0.5,0.5,杯高/2];

将固定实体添加到表示杯子中心的机器人模型中。

身体=刚体(“杯架”); setFixedTransform(body.Joint,trvec2tform(cupPosition))addBody(lbr,body,lbr.BaseName);

定义规划问题

本例的目标是生成满足以下条件的机器人配置序列:

  • 在主配置中启动

  • 机器人配置没有突然变化

  • 将夹具保持在“工作台”上方至少5cm处(z=0)

  • 夹具应在接近时与杯子对齐

  • 用离杯中心5厘米的夹具完成

此示例利用约束对象来生成满足这些标准的机器人配置。生成的轨迹由五个配置航路点组成。第一个航点,q0,被设置为家庭配置。预先分配其余配置Qwaypopitts.使用repmat

numWaypoints=5;q0=homeConfiguration(lbr);qWaypoints=repmat(q0,numWaypoints,1);

创建一个广义微分方程接受以下约束输入的求解器:

  • 笛卡尔边界-限制夹持器的高度

  • 位置目标-指定纸杯相对于夹持器的位置。

  • 瞄准约束-将夹具与杯轴对齐

  • 定位目标-在接近杯子时保持钳口的固定方向

  • 联合位置界限 - 限制航点之间联合职位的变化。

gik = generalizedInverseKinematics (“RigidBodyTree”lbr,...'constraintinpuls', {笛卡儿的'位置''瞄准'“方向”“关节”})
GIK = GeneralizedInverseWkematics具有属性:NumConstraints:5约束inputs:{1x5 Cell}刚性小组编号:[1x1刚性小组特勒]溶剂竞争算法:'BfgsgradientProimple'ocverParameters:[1x1 struct]

创建约束对象

创建传递作为求解器的输入的约束对象。这些对象包含每个约束所需的参数。必要时将这些参数修改到求解器之间。

创建一个笛卡尔界约束,该约束要求夹具至少5厘米在表格(负Z方向上)上。所有其他值都是如此inf

高度可爱的= ConstrameCarteSianBounds(夹具);高度可爱.Bounds = [-inf,INF;...-inf,inf;...0.05,INF]
HeightUpperTable=constraintCartesianBounds with properties:EndEffector:'iiiwa_link_ee_kuka'ReferenceBody:'TargetTransform:[4x4 double]界限:[3x2 double]权重:[1]

在杯子相对于夹具的位置上产生限制,具有5mm的公差。

distanceFromCup=约束位置目标(“杯架”);distanceFromCup。ReferenceBody= gripper; distanceFromCup.PositionTolerance = 0.005
distanceFromCup=constraintPositionTarget with properties:EndEffector:“cupFrame”ReferenceBody:“iiiwa_link_ee_kuka”TargetPosition:[0]位置公差:0.0050权重:1

创建一个瞄准约束,要求z轴iiwa_link_ee通过将目标放置在机器人上方,框架近似垂直。的iiwa_link_ee框架的方向应确保该约束将夹具与杯轴对齐。

对准杯子=泰明('iiwa_link_ee'); alignWithCup.TargetPoint=[0,0,100]
alignWithCup=ConstraintaMing与属性:EndEffector:“iiwa\u link\u ee”引用主体:“”目标点:[0 100]角度公差:0权重:1

创建关节位置边界约束。设置界限基于先前配置的该约束的属性,以限制联合位置的变化。

limitJointChange=constraintJointBounds(lbr)
limitJointChange = constraintJointBounds with properties: Bounds: [7x2 double]

为具有一个度的容差的夹具创造一个定向约束。该约束需要夹具的方向以匹配由此指定的值靶向所有物使用此约束可在最终接近杯的过程中固定夹持器的方向。

sixorientation = constrameorientationtarget(夹具);sixorientation.orientationTolerance = DEG2RAD(1)
fixOrientation=ConstraintionTarget,属性为:EndEffector:“iiwa\u link\u ee\u kuka”引用正文:“”TargetOrientation:[1 0 0]方向公差:0.0175权重:1

找到一个指向杯子的结构

这种配置应该将夹持器放置在离杯一定距离的地方,这样就可以使夹持器正确对齐。

intermediateDistance = 0.3;

约束对象有一个权重属性,该属性确定解算器如何处理冲突约束。将约束的权重设置为零将禁用该约束。对于此配置,禁用关节位置边界和方向约束。

limitJointChange.Weights=零(大小(limitJointChange.Weights));固定方向。权重=0;

在夹具框架中设置杯子的目标位置。杯子应位于指定距离处夹具的z轴上。

textingfromcup.targetPosition = [0,0,中介仪];

使用吉克解算器。必须指定所有输入约束。将该配置设置为第二个航路点。

[qWaypoints(2,:),solutionInfo]=gik(q0,上表高度,...距离杯,与杯对齐,固定方向,...limitjointchange);

找出将夹持器沿直线移动到杯子的结构

重新启用关节位置绑定和方向约束。

limitJointChange。权重= ones(size(limitJointChange.Weights)); fixOrientation.Weights = 1;

禁用与杯对齐约束,因为方向约束使其冗余。

与杯子对齐。重量=0;

根据前面的配置设置方向约束以保持方向(QwayPoints(2,:)).获取从夹具到机器人模型基础的变换。将齐次变换转换为四元数。

定向=...tform2quat(getTransform(lbr,qwaypoints(2,:),夹具));

为每个路径点定义杯和夹持器之间的距离

finalDistanceFromCup = 0.05;distanceFromCupValues = linspace(intermediateDistance, finaldistancefrommcup, numWaypoints-1);

定义每个路点之间最大允许的关节位置变化。

maxJointChange=deg2rad(10);

调用每个剩余路径点的求解器。

为了k = 3:numwaypoints%更新目标位置。distanceFromCup.TargetPosition (3) = distanceFromCupValues (k - 1);%限制关节位置,使其接近于以前的值。limitJointChange。界限= [qWaypoints(k-1,:)' - maxJointChange,...: qWaypoints (k - 1) ' + maxJointChange];%求解配置并将其添加到航点数组中。[qWaypoints (k,:), solutionInfo] = gik (qWaypoints (k - 1:)...高高在上,,...距离杯,与杯对齐,...固定方向、限制连接变化);结尾

可视化生成的轨迹

在航点之间插入以产生平滑的轨迹。用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,盆地);p = plot3(格拉皮特(1,1),gripperposition(1,2),gripperposition(1,3));

图中包含一个轴对象。axis对象包含34个类型为patch, line的对象。这些对象代表world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, cupFrame, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh。

为机械手设置动画并绘制夹持器位置。

持有在…上为了k = 1:大小(qtinterp,1)显示(lbr,qinterp(k,:),“PreservePlot”, 错误的);p.xdata(k)= gripperposition(k,1);p.ydata(k)= gripperposition(k,2);p.zdata(k)=格拉伯置(k,3);等待(r);结尾持有

图中包含一个轴对象。axis对象包含34个类型为patch, line的对象。这些对象代表world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, cupFrame, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh。

如果要将生成的配置保存到MAT文件以供以后使用,请执行以下操作:

> > (lbr_trajectory攒钱。席”、“tWaypoints”、“qWaypoints”);

兼容性考虑

展开全部

未来版本中的行为更改

扩展能力

C/C++代码生成
使用Matlab®编码器生成C和C++代码™.

介绍了R2017a