rigidBodyTree

创建树状结构的机器人

描述

rigidBodyTree是刚体与关节连接性的一种表示。使用这个类在MATLAB中建立机器人的机械手模型®。如果您有一个使用统一机器人描述格式(URDF)指定的机器人模型,请使用importrobot导入您的机器人模型。

刚体树模型是由刚体为最多RigidBody对象。每个刚体有rigidBodyJoint与之相关联,定义了如何它可以相对于它的父体对象。使用setFixedTransform以限定接头的所述框架和所述相邻的本体中的一个的帧之间的固定变换。您可以从模型中使用的方法添加,替换或删除刚体RigidBodyTree类。

机器人动力学计算也是可能的。指定,CenterOfMass惯性针对每个属性刚体在机器人模型。你可以计算正向和反向带或不带外力并给予机器人关节运动和关节投入计算的动态数量动态。要使用动态相关的功能,设置DataFormat财产“行”要么“柱”

对于给定的刚体树模型,还可以使用机器人逆运动学算法使用机器人模型计算所需末端执行器位置的关节角。使用时指定刚体树模型inverseKinematics要么generalizedInverseKinematics

显示方法支持体网格金宝app的可视化。网格被指定为·STL文件和可添加到个别刚体使用addVisual。此外,默认情况下,importrobot函数加载所有可访问的·STL在URDF机器人模型指定的文件。

创建

描述

例子

机器人= rigidBodyTree创建一个树形结构的机器人对象。添加刚体到它使用addBody

机器人= rigidBodyTree( “MaxNumBodies”,N “DATAFORMAT”,DATAFORMAT)指定的上界生成代码时在机器人允许体的数量。还必须指定DataFormat属性作为名称-值对。

属性

展开全部

此属性是只读的。

在机器人模型(不包括碱)的体的数量,返回一个整数。

此属性是只读的。

在机器人模型刚体,返回句柄的单元阵列的列表。使用此列表来访问特定RigidBody模型中的对象。你也可以打电话getBody通过它的名字得到一个身体。

此属性是只读的。

刚体的名称,作为字符向量的单元数组返回。

robot base的名称,以字符串标量或字符向量的形式返回。

重力加速度通过机器人经验丰富,指定为[x y z]在每米向量平方秒。每个元素对应于在该方向上基机器人帧的加速度。

运动学和动力学函数的输入/输出数据格式,规定为“结构”,“行”,或“柱”。要使用动态功能,您必须使用“行”要么“柱”

对象的功能

addBody 给机器人添加身体
addSubtree 添加子树到机器人
centerOfMass 重心位置和雅可比矩阵
复制 复制机器人模型
外部压力 组成相对于基底的外力矩阵
forwardDynamics 给定关节力矩和状态的关节加速度
geometricJacobian 机器人配置的几何雅可比矩阵
gravityTorque 联合扭矩是重力补偿
getBody 按名称获取机器人本体手柄
getTransform 在身体框架之间进行转换
homeConfiguration 获取机器人的家庭配置
inverseDynamics 给定运动所需的关节力矩
massMatrix 联合空间质量矩阵
randomConfiguration 生成机器人的随机结构
removeBody 从机器人身上取下
replaceBody 在机器人身上装
replaceJoint 更换车身接头
显示 用图形显示机器人模型
showdetails 显示机器人模型的细节
子树 从创建机器人模型树
velocityProduct 抵消速度感应力的关节力矩

例子

全部收缩

在刚体树中加入刚体和相应的关节。每个rigidBody对象包含rigidBodyJoint对象,必须添加到r中igidBodyTree使用addBody

创建一个刚体树。

rbtree = rigidBodyTree;

一个独特的名字创建一个刚体。

body1 = rigidBody (“b1”);

创建一个转动关节。默认是rigidBody对象带有一个固定的接头。通过分配新的取代联合rigidBodyJoint对象的body1.Joint财产。

jnt1 = rigidBodyJoint('jnt1',“回转”);body1.Joint = jnt1;

将刚体添加到树中。指定要将刚体附加到的主体名称。因为这是第一个主体,所以使用树的基名。

基名= rbtree.BaseName;addBody(rbtree,body1,基名)

使用showdetails在采油树上确认刚体和接头的添加是否正确。

showdetails (rbtree)
- - - - - - - - - - - - - - - - - - - - - -机器人:身体(1)Idx身体名称联合名称联合类型父母名字(Idx)孩子的名字(s) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 b1 jnt1转动基地(0)- - - - - - - - - - - - - - - - - - - - -

使用Puma560®机器人的Denavit-Hartenberg (DH)参数来构建机器人。每个刚体一次添加一个,由关节对象指定子到父的转换。

的DH参数限定与关系所述机器人的各刚性体是如何​​连接到其父的几何形状。为了方便起见,设置在矩阵中的PUMA560机器人的参数。彪马机器人是一个串行链操纵器。的DH参数是相对于在基质中的前一行,对应于前一接头安装。

dhparams = [0 PI / 2 0 0;0.4318 0 0 0 0.0203 -pi / 2 0.15005 0;0 PI / 2 0.4318 0;0 -pi / 2 0 0;0 0 0 0];

创建一个刚体树对象来构建机器人。

机器人= rigidBodyTree;

创建第一个刚体并将其添加到机器人中。加入刚体:

  1. 创建一个刚体对象,并给它一个唯一的名称。

  2. 创建一个rigidBodyJoint对象,并给它一个唯一的名称。

  3. 使用setFixedTransform指定使用DH参数身体到身体改造。卫生署参数的最后一个元素,θ,由于角度与关节位置有关,因此忽略。

  4. 调用addBody将第一个身体关节连接到机器人的基础框架上。

body1 = rigidBody (“界面”);jnt1 = rigidBodyJoint('jnt1',“回转”);setFixedTransform (jnt1 dhparams (1:)“dh”);body1.Joint = jnt1;addBody(机器人,界面,'基础')

创建并添加其他刚体到机器人。在调用时指定先前的主体名称addBody进行安装。每个固定变换是相对于前一关节坐标框架。

body2 = rigidBody (“body2”);jnt2 = rigidBodyJoint(“jnt2”,“回转”);body3 =刚体('body3');jnt3 = rigidBodyJoint (“jnt3”,“回转”);body4 = rigidBody ('BODY4');jnt4 = rigidBodyJoint ('jnt4',“回转”);body5 =刚体(“body5”);jnt5 = rigidBodyJoint('jnt5',“回转”);body6 =刚体(“body6”);jnt6 = rigidBodyJoint (“jnt6”,“回转”);:setFixedTransform (jnt2 dhparams (2),“dh”);:setFixedTransform (jnt3 dhparams (3),“dh”);setFixedTransform(jnt4,dhparams(4,:),“dh”);:setFixedTransform (jnt5 dhparams (5),“dh”);setFixedTransform(jnt6,dhparams(6,:),“dh”);body2.Joint = jnt2;body3.Joint = jnt3;body4.Joint = jnt4;body5.Joint = jnt5;body6.Joint = jnt6;addBody(机器人,body2,“界面”)addBody (body3的机器人“body2”)addBody (body4的机器人'body3')addBody (body5的机器人'BODY4')addBody(机器人,body6,“body5”)

验证您的机器人通过使用适当建showdetails要么显示函数。showdetails列出MATLAB®命令窗口中的所有实体。显示显示与给定的配置(家默认情况下)的机器人。调用修改轴限制并隐藏轴标签。

showdetails(机器人)
- - - - - - - - - - - - - - - - - - - - - -机器人:身体(6)Idx身体名称联合名称联合类型父母名字(Idx)孩子的名字(s) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1界面jnt1转动基地(0)body2 (2) 2 body2 jnt2转动界面(1)body3 (3) 3 body3 jnt3转动body2 (2) body4 (4) 4 body4 jnt4转动body3 (3) body5 (5) 5 body5 jnt5转动body4 (4) body6 (6) 6 body6 jnt6转动body5 (5) - - - - - - - - - - - - - - - - - - - - -
显示(机器人);轴([-0.5,0.5,-0.5,0.5,-0.5,0.5])轴

修改现有的rigidBodyTree对象。你可以在刚体树中替换关节,物体和子树。

例如负载如机器人rigidBodyTree对象。

负载exampleRobots.mat

查看使用的Puma机器人的详细信息showdetails

showdetails (puma1)
- - - - - - - - - - - - - - - - - - - - - -机器人:身体(6)Idx身体名称联合名称联合类型父母名字(Idx)孩子的名字(s) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 L1 jnt1转动基地(0)L2 (2) 2 L2 jnt2转动L1 (1) L3 (3) 3 L3 jnt3转动L2 (2) L4 (4) 4, jnt4转动L3(3)一两百(5)5 L5 jnt5转动L4(4) 16种(6)6 16种jnt6转动L5 (5) - - - - - - - - - - - - - - - - - - - - -

获取一个特定的主体来检查属性。唯一的孩子L3身体是L4身体。您可以在特定的身体复制为好。

body3 = getBody (puma1,“L3”);childBody = body3.Children {1}
属性:Name: 'L4' Joint: [1x1 rigidBody] Mass: 1 CenterOfMass:[0 0 0]惯性:[1 1 1 1 0 0 0]Parent: [1x1 rigidBody] Children: {[1x1 rigidBody]}视觉效果:{}
body3Copy =拷贝(body3);

重新装上接头L3身体。您必须创建一个新的联合对象和使用replaceJoint以确保下游体几何形状不受影响。调用setFixedTransform如果必要的话,以限定机构与默认身份矩阵之间,而不是一个变换。

newJoint = rigidBodyJoint (“棱镜”);replaceJoint(puma1,“L3”,newJoint);showdetails (puma1)
- - - - - - - - - - - - - - - - - - - - - -机器人:身体(6)Idx身体名称联合名称联合类型父母名字(Idx)孩子的名字(s) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 L1 jnt1转动基地(0)L2 (2) 2 L2 jnt2转动L1 (1) L3 3 L3棱镜(3)固定L2 (2) L4 (4) 4, jnt4转动L3(3)一两百(5)5 L5 jnt5转动L4(4) 16种(6)6 16种jnt6转动L5 (5) - - - - - - - - - - - - - - - - - - - - -

使用以下命令删除整个主体并获得结果子树removeBody。删除的主体包含在子树中。

子树= removeBody (puma1,“L4”)
子树= rigidBodyTree与属性:NumBodies:3分体:{[1x1的刚体] [1x1的刚体] [1x1的刚体]}基数:[1x1的刚体] BodyNames:{ 'L4' 'L5' 'L6'}基本名称: 'L3' 重力:[0 0 0] DATAFORMAT: '结构'

删除修改L3身体。添加复制的原L3身体向L2身体,随后返回子树。机器人模型保持不变。请参阅通过详细的对比showdetails

removeBody (puma1“L3”);addBody(puma1,body3Copy,'L2')addSubtree(puma1,“L3”,子树)showdetails(puma1)
- - - - - - - - - - - - - - - - - - - - - -机器人:身体(6)Idx身体名称联合名称联合类型父母名字(Idx)孩子的名字(s) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 L1 jnt1转动基地(0)L2 (2) 2 L2 jnt2转动L1 (1) L3 (3) 3 L3 jnt3转动L2 (2) L4 (4) 4, jnt4转动L3(3)一两百(5)5 L5 jnt5转动L4(4) 16种(6)6 16种jnt6转动L5 (5) - - - - - - - - - - - - - - - - - - - - -

若要使用动力学函数来计算关节扭矩和加速度,请指定关节的动力学特性rigidBodyTree对象和刚体

创建一个刚体树模型。创造两个刚体附着在它上面。

机器人= rigidBodyTree('DATAFORMAT',“行”);body1 = rigidBody (“界面”);body2 = rigidBody (“body2”);

指定连接到主体上的关节。的固定变换body2body1。这种变换是在第1Mx-方向。

joint1 = rigidBodyJoint (“joint1”,“回转”);接头2 = rigidBodyJoint(“joint2”);setFixedTransform(接头2,trvec2tform([1 0 0]))body1.Joint = joint1;body2.Joint =接头2;

指定两个物体的动力学属性。将身体添加到机器人模型中。在本例中,杆的基本值(body1)与附加的球形质量(body2) 给出。

界面。块= 2; body1.CenterOfMass = [0.5 0 0]; body1.Inertia = [0.001 0.67 0.67 0 0 0]; body2.Mass = 1; body2.CenterOfMass = [0 0 0]; body2.Inertia = 0.0001*[4 4 4 0 0 0]; addBody(robot,body1,'基础');addBody(机器人,body2,“界面”);

计算整个机器人的质量位置的中心。绘制机器人上的位置。移动视图到XY飞机。

心神= centerOfMass(机器人);显示(机器人);持有情节(comPos(1),comPos(2),”或“)视图(2)

改变第二个物体的质量。注意质量中心的变化。

body2。块= 20; replaceBody(robot,“body2”,body2)comPos2 = centerOfMass(机器人);情节(comPos2(1),comPos2(2),“* g”)保持

计算给定机器人配置在外加外力和重力作用下的关节加速度。一个扳手被应用到一个特定的身体,重力是为整个机器人指定的。

加载一个预定义的库卡LBR机器人模型,它被指定为一个RigidBodyTree对象。

负载exampleRobots.matLBR

将数据格式设置为“行”。对于所有动力学计算,数据格式必须是“行”要么“列”

lbr。DataFormat =“行”;

设置重力。默认情况下,重力为零。

lbr。重力= [0 0 -9.81];

获取。的主配置LBR机器人。

Q = homeConfiguration(LBR);

指定表示机器人所经历的外力的扳手向量。使用外部压力函数来生成外力矩阵。指定机器人模型、体验扳手的末端执行器、扳手矢量和当前机器人配置。扳手是相对于给定'TOOL0'身体框架,它要求你指定机器人的配置,

扳手= [0 0 0.5 0 0 0.3];fext = externalForce (lbr,'TOOL0'扳手,Q);

计算由于重力所产生的关节加速度,随着外力施加到所述端部执行器'TOOL0'什么时候LBR在它的首页设定。关节速度和关节力矩被认为是零(输入作为空载体[])。

qddot = forwardDynamics(LBR,Q,[],[],FEXT);

使用inverseDynamics函数来计算所需的关节力矩静态保持特定机器人配置。您也可以指定关节速度,加速度联合,以及外部势力利用其他语法。

加载一个预定义的库卡LBR机器人模型,它被指定为一个RigidBodyTree对象。

负载exampleRobots.matLBR

将数据格式设置为“行”。对于所有动力学计算,数据格式必须是“行”要么“列”

lbr。DataFormat =“行”;

设置重力属性给出具体的重力加速度。

lbr。重力= [0 0 -9.81];

生成一个随机配置LBR

Q = randomConfiguration(LBR);

计算所需的关节扭矩LBR静态认为配置。

tau蛋白= inverseDynamics(LBR,Q);

使用外部压力函数生成力矩阵,应用于刚体树模型。力矩阵是-by-6载体,其具有用于在机器人的每个关节以施加六元件扳手的行。使用外部压力功能,并指定末端执行器扳手正确地分配到矩阵的正确的行。您可以添加多个力矩阵一起多方力量应用到一个机器人。

为了计算出抵消这些外部力量的联合扭矩,使用inverseDynamics函数。

加载一个预定义的库卡LBR机器人模型,它被指定为一个RigidBodyTree对象。

负载exampleRobots.matLBR

将数据格式设置为“行”。对于所有动力学计算,数据格式必须是“行”要么“列”

lbr。DataFormat =“行”;

设置重力属性给出具体的重力加速度。

lbr。重力= [0 0 -9.81];

获取主配置LBR

Q = homeConfiguration(LBR);

施加外力链接1。输入扳手载体在基架中表达。

fext1 = externalForce(LBR,请将 'Link_1',[0 0 0.0 0.1 0 0]);

在末端执行器上设置外力,TOOL0。输入扳手载体在表达TOOL0框架。

fext2 = externalForce (lbr,'TOOL0',[0 0 0.0 0.1 0 0],Q);

计算平衡外力所需的关节力矩。要结合部队,加上力的矩阵合在一起。关节的速度和加速度被假定为零(输入作为[])。

tau蛋白= inverseDynamics(LBR,Q,[],[],fext1 + fext2);

你可以导入机器人·STL与统一机器人描述格式(URDF)文件相关联的文件来描述机器人的视觉几何形状。每个刚性体具有指定单独的视觉几何形状。的importrobot函数解析URDF文件以获得机器人模型和可视几何图形。使用显示功能,以可视化的机器人模型在一个数字。然后,您可以通过单击组件来检查它们,并通过右键单击来切换可见性,从而与模型进行交互。

导入机器人模型作为URDF文件。的·STL文件位置必须在这个URDF中正确指定。添加其他·STL文件个别刚体,请参阅addVisual

机器人= importrobot ('iiwa14.urdf');

可视化与相关联的视觉模型的机器人。点击机构或帧来检查它们。右键单击机构拨动知名度每个视觉几何。

显示(机器人);

兼容性注意事项

展开全部

在未来的版本中行为改变

参考

[1]克雷格,约翰J.介绍机器人:力学与控制。阅读,MA:Addison-Wesley出版社,1989年。

[2]西西里亚诺、布鲁诺、洛伦佐·斯亚维科、路易吉·维拉尼和朱塞佩·奥里奥罗。机器人技术:建模、规划和控制。伦敦:施普林格,2009年。

扩展功能

介绍了R2016b