主要内容

rigidBodyTree

创建树形机器人

描述

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

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

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

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

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

创建

描述

例子

机器人= 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对象,并且必须添加到rigidBodyTree使用addBody

创建一个刚体树。

rbtree = rigidBodyTree;

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

body1 = rigidBody(“b1”);

创建一个转动关节。默认情况下,rigidBody物体带有固定的关节。通过赋值new来替换关节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 /2 0.4318 0;0 - /2 0 0;0 0 0 0];

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

robot = 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])轴

{“字符串”:“”,“它”:[],“乳胶”:[]}

参考文献

[1]科克,P. I.和B.阿姆斯特朗-埃洛夫里。“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}
名称:'L4'关节:[1x1 rigidBodyJoint]质量:1 CenterOfMass:[0 0 0]惯性:[1 1 1 0 0 0]父:[1x1 rigidBody]子:{[1x1 rigidBody]}视觉效果:{}碰撞:{}
body3Copy = copy(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.被移除的主体包含在子树中。

subtree = 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]))Joint = joint1;body2。联合=joint2;

为两个物体指定动力学属性。将身体添加到机器人模型中。对于本例,杆的基本值为(界面)与一个附着的球形质量(body2)。

界面。质量=2;界面。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飞机。

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

{

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

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

{

计算给定的机器人构型在外加外力和重力作用下的关节加速度。将扳手施加在特定的物体上,并为整个机器人指定重力。

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

负载exampleRobots.matlbr

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

lbr。DataFormat =“行”

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

lbr。Gravity = [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。Gravity = [0 0 -9.81];

生成的随机配置lbr

q = randomConfiguration(lbr);

计算所需的关节力矩lbr以静态地保持该配置。

tau = inverseDynamics(lbr,q);

使用externalForce函数生成用于刚体树模型的力矩阵。力矩阵是an-by-6矢量,对机器人上的每个关节都有一行,用于应用六元扳手。使用externalForce函数并指定末端执行器,以正确地将扳手分配到矩阵的正确行。你可以把多个力矩阵加在一起,对一个机器人施加多个力。

要计算对抗这些外力的关节力矩,请使用inverseDynamics函数。

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

负载exampleRobots.matlbr

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

lbr。DataFormat =“行”

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

lbr。Gravity = [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.1 0 0],q);

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

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

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

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

以URDF文件的形式导入机器人模型。的.stl文件位置必须在URDF中正确指定。添加其他.stl文件到单个刚体,见addVisual

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

使用相关的可视化模型可视化机器人。单击主体或框架以检查它们。右键单击主体以切换每个可视几何图形的可见性。

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

{

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

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

{

更多关于

全部展开

参考文献

[1]克雷格,约翰J。机器人学导论:力学与控制.马萨诸塞州雷丁:Addison-Wesley, 1989年。

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

扩展功能

版本历史

在R2016b中引入

全部展开