主要内容

rigidBodyTree

创建树形结构的机器人

描述

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

刚体树模型由如下刚体组成rigidBody对象。每个刚体都有一个rigidBodyJoint对象,该对象定义了如何相对于其父主体进行移动。使用setFixedTransform定义一个关节的框架和一个相邻物体的框架之间的固定变换。的方法可以从模型中添加、替换或移除刚体RigidBodyTree类。

机器人动力学计算也是可能的。指定质量CenterOfMass,惯性属性为每个rigidBody在机器人模型中。你可以计算有或没有外力的正动力学和逆动力学,并计算给定机器人关节运动和关节输入的动力学量。要使用与动态相关的函数,请设置DataFormat财产“行”“列”

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

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

创建

描述

例子

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

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

属性

全部展开

此属性是只读的。

机器人模型中的身体数量(不包括基数),返回为整数。

此属性是只读的。

机器人模型中的刚体列表,作为手柄单元数组返回。使用此列表访问特定的RigidBody对象。你也可以拨打getBody通过名字来获取尸体。

此属性是只读的。

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

机器人基的名称,作为字符串标量或字符向量返回。

机器人所经历的重力加速度,指定为[x y z]向量的单位是米每秒的平方。每个元素对应于基本机器人框架在那个方向上的加速度。

运动学和动力学函数的输入/输出数据格式,指定为“结构”“行”,或“列”.要使用动态函数,必须使用其中之一“行”“列”

对象的功能

addBody 给机器人添加身体
addSubtree 给机器人添加子树
centerOfMass 质心位置和雅可比矩阵
checkCollision 检查机器人是否发生碰撞
复制 复制的机器人模型
externalForce 组成相对于基底的外力矩阵
forwardDynamics 给定关节力矩和状态的关节加速度
geometricJacobian 机器人构型的几何雅可比矩阵
gravityTorque 关节力矩用来补偿重力
getBody 通过名字获得机器人的身体手柄
getTransform 在身体框架之间得到变换
homeConfiguration 获得机器人的家庭配置
inverseDynamics 给定运动所需的关节力矩
massMatrix 关节空间质量矩阵
randomConfiguration 生成机器人的随机配置
removeBody 从机扑卸下机体
replaceBody 机扑更换机体
replaceJoint 更换机体关节
显示 展示机器人模型图
showdetails 展示机器人模型的细节
子树 从机器人模型中创建子树
velocityProduct 抵消速度引起的力的关节力矩
writeAsFunction 创建rigidBodyTree代码生成函数

例子

全部折叠

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

创建刚体树。

rbtree = rigidBodyTree;

创建一个具有唯一名称的刚体。

body1 = rigidBody (“b1”);

创建一个转动关节。默认情况下,rigidBody物体有一个固定的关节。通过分配一个新的rigidBodyJoint对象的界面。联合财产。

jnt1 = rigidBodyJoint (“jnt1”“转动”);界面。联合= jnt1;

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

basename = rbtree.BaseName;basename addBody (rbtree界面)

使用showdetails在树上确认刚体和关节的添加是否正确。

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

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

DH参数定义了机器人的几何形状与每个刚体如何连接到它的父体有关。为方便起见,在矩阵中设置Puma560机器人的参数[1].Puma机器人是一种链式机械手。DH参数相对于矩阵中的前一行,对应于前一个关节连接。

Dhparams = [0 pi/2 0 0;0.4318 00 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. 创建一个rigidBody对象,并给它一个唯一的名称。

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

  3. 使用setFixedTransform使用DH参数指定体对体转换。DH参数的最后一个元素,θ,因为角度取决于关节位置。

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

body1 = rigidBody (“界面”);jnt1 = rigidBodyJoint (“jnt1”“转动”);setFixedTransform (jnt1 dhparams (1:)“dh”);界面。联合= jnt1; addBody(robot,body1,“基地”

创建和添加其他刚体到机器人。在调用时指定前面的主体名称addBody把它。每个固定变换都是相对于之前的关节坐标系的。

body2 = rigidBody (“body2”);jnt2 = rigidBodyJoint (“jnt2”“转动”);body3 = rigidBody (“body3”);jnt3 = rigidBodyJoint (“jnt3”“转动”);body4 = rigidBody (“body4”);jnt4 = rigidBodyJoint (“jnt4”“转动”);body5 = rigidBody (“body5”);jnt5 = rigidBodyJoint (“jnt5”“转动”);body6 = rigidBody (“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。联合= jnt2; body3.Joint = jnt3; body4.Joint = jnt4; body5.Joint = jnt5; body6.Joint = jnt6; addBody(robot,body2,“界面”) addBody (body3的机器人“body2”) addBody (body4的机器人“body3”) addBody (body5的机器人“body4”) addBody (body6的机器人“body5”

通过使用showdetails显示函数。showdetails列出MATLAB®命令窗口中的所有主体。显示用给定的配置显示机器人(默认为home)。调用修改轴限制并隐藏轴标签。

showdetails(机器人)
-------------------- 机器人:(6)尸体Idx身体名称联合名称联合类型父母名字(Idx)孩子的名字(s ) --- --------- ---------- ---------- ---------------- ---------------- 1 body1 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])轴

参考文献

P. I. Corke和B. Armstrong-Helouvry。“PUMA 560机器人模型参数间的一致性搜索”。1994年IEEE国际机器人和自动化会议论文集, IEEE第一版。Soc。出版社,1994,第1608-13页。DOI.org (Crossref), doi: 10.1109 / ROBOT.1994.351360。

对现有的文件进行更改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。孩子{1}
childBody = rigidBody with properties: Name: 'L4' Joint: [1x1 rigidBodyJoint] Mass: 1 CenterOfMass:[0 0 0]惯性:[1 1 1 0 0 0]Parent: [1x1 rigidBody] Children: {[1x1 rigidBody]} visual: {} Collisions: {}
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”
subtree = rigidBodyTree with properties: NumBodies: 3 Bodies: {[1x1 rigidBody] [1x1 rigidBody] [1x1 rigidBody]} Base: [1x1 rigidBody] BodyNames: {'L4' 'L5' 'L6'} BaseName: 'L3' Gravity: [0 0 0] DataFormat: 'struct'

删除修改L3的身体。添加原始副本L3身体的L2正文,然后是返回的子树。机器人模型保持不变。看详细的对比showdetails

removeBody (puma1“L3”);addBody (puma1 body3Copy,“外语”) 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对象和rigidBody

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

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

指定要连接到阀体上的接头。设置的固定变换body2界面.这个变换是1mx方向。

joint1 = rigidBodyJoint (“joint1”“转动”);joint2 = rigidBodyJoint (“joint2”);setFixedTransform(joint2,trvec2tform([1 0 0])) body1。联合= joint1;body2。联合= joint2;

为两个物体指定动力学属性。将身体添加到机器人模型中。对于本例,杆的基本值(界面),带有附着的球形质量(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(机器人);显示(机器人);持有精神精神情节((1),(2),”或“)视图(2)

图中包含一个轴对象。axis对象包含6个类型为patch, line的对象。这些物体代表base, body1, body2。

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

body2。质量= 20; replaceBody(robot,“body2”,body2) comPos2 = centerOfMass(机器人);情节(comPos2 (1) comPos2 (2),“* g”)举行

图中包含一个轴对象。axis对象包含7个类型为patch, line的对象。这些物体代表base, body1, body2。

计算给定机器人配置在外加外力和重力作用下的关节加速度。扳手作用于特定的物体,其重力为整个机器人指定。

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

负载exampleRobots.matlbr

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

lbr。DataFormat =“行”

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

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

的主配置lbr机器人。

q = homeConfiguration (lbr);

指定表示机器人所受外力的扳手向量。使用externalForce函数生成外力矩阵。指定机器人模型、经历扳手的末端执行器、扳手矢量和当前机器人配置。扳手是相对于“tool0”身体框架,这需要你指定机器人的配置,

扳手= [0 0 0.5 0 0 0.3];fext = externalForce (lbr,“tool0”,扳手,q);

计算由于重力和施加在末端执行器上的外力所产生的关节加速度“tool0”lbr是在它的基本配置。关节速度和关节力矩假定为零(输入为空向量)[]).

qddot = forwardDynamics (lbr q [], [], fext);

使用inverseDynamics函数用于计算静态保持特定机器人配置所需的关节力矩。您还可以使用其他语法指定关节速度、关节加速度和外力。

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

负载exampleRobots.matlbr

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

lbr。DataFormat =“行”

设置重力属性来给出一个特定的重力加速度。

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

为生成一个随机配置lbr

q = randomConfiguration (lbr);

计算所需的关节扭矩lbr静态地保持这个配置。

τ= inverseDynamics (lbr q);

使用externalForce函数生成应用于刚体树模型的力矩阵。力矩阵是- x6向量,每一行对应机器人的每个关节,用于使用六元素扳手。使用externalForce函数和指定末端执行器适当地分配扳手到矩阵的正确行。你可以把多个力矩阵加在一起,给一个机器人施加多个力。

要计算抵消这些外力的关节力矩,使用inverseDynamics函数。

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

负载exampleRobots.matlbr

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

lbr。DataFormat =“行”

设置重力属性来给出一个特定的重力加速度。

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

获得的主配置lbr

q = homeConfiguration (lbr);

施加外力link1.输入扳手向量在基架中表示。

fext1 = externalForce (lbr,“link_1”,[0 0 0.0 0.1 0 0]);

在末端执行器上设置外力,tool0.输入的扳手向量表示为tool0框架。

fext2 = externalForce (lbr,“tool0”,[0 0 0 0 0],q);

计算平衡外力所需的关节力矩。要组合这些力,请将力矩阵相加。假设关节速度和加速度为零(输入为[]).

τ= inverseDynamics (lbr q [], [], fext1 + fext2);

你可以导入具有.stl文件与统一机器人描述格式(URDF)文件相关联,用于描述机器人的视觉几何形状。每个刚体都有一个特定的视觉几何。的importrobot函数解析URDF文件以获得机器人模型和可视化几何图形。该函数假定机器人的视觉几何和碰撞几何是相同的,并将视觉几何赋值为相应物体的碰撞几何。

使用显示函数以图形的形式显示机器人模型的视觉和碰撞几何图形。然后,您可以通过单击组件来检查它们,并右键单击以切换可见性来与模型进行交互。

将机器人模型作为URDF文件导入。的.stl文件位置必须在这个URDF中正确指定。添加其他.stl文件到单个刚体,看addVisual

机器人= importrobot (“iiwa14.urdf”);

用相关的视觉模型可视化机器人。点击身体或框架来检查它们。右击物体以切换每个可视几何体的可见性。

表演(机器人,“视觉效果”“上”“碰撞”“关闭”);

图中包含一个轴对象。axis对象包含29个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, 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。

可视化机器人与相关的碰撞几何图形。点击身体或框架来检查它们。右键单击物体以切换每个碰撞几何图形的可见性。

表演(机器人,“视觉效果”“关闭”“碰撞”“上”);

图中包含一个轴对象。axis对象包含29个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, 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, iiwa_link_0_coll_mesh, iiwa_link_5_mesh, iiwa_link_7_mesh, iiwa_link_0_coll_mesh,Iiwa_link_1_coll_mesh, iiwa_link_2_coll_mesh, iiwa_link_3_coll_mesh, iiwa_link_4_coll_mesh, iiwa_link_5_coll_mesh, iiwa_link_6_coll_mesh, iiwa_link_7_coll_mesh。

兼容性的考虑

全部展开

未来版本中的行为改变

参考文献

约翰·J·克雷格机器人学导论:力学与控制.阅读,MA: Addison-Wesley, 1989。

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

扩展功能

介绍了R2016b