文档

机器人技术。RigidBodyTree class

包:机器人

创建树形机器人

描述

RigidBodyTree表示带有关节的刚体的连通性。利用本课程在MATLAB中构建机器人机械手模型®

刚体树模型由以下刚体组成RigidBody对象。每个刚体都有一个联合对象,该对象定义它如何相对于其父体移动。使用setFixedTransform定义关节的坐标系与相邻物体的坐标系之间的固定变换。方法在模型中添加、替换或删除刚体RigidBodyTree类。

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

您还可以使用该机器人模型来计算所需末端执行器位置的关节角或使用逆运动学的其他机器人约束。使用时指定您的刚体树模型InverseKinematicsGeneralizedInverseKinematics

建设

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

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

属性

全部展开

此属性是只读的。

机器人模型中的主体数(不包括基数),以整数形式返回。

此属性是只读的。

机器人模型中刚体的列表,作为句柄的单元数组返回。使用此列表访问特定的RigidBody对象。你也可以打电话robotics.RigidBodyTree.getBody通过名字找到一具尸体。

此属性是只读的。

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

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

机器人所经历的重力加速度,用an表示[x y z]向量的单位是米每秒的平方。每个元素对应于机器人基础框架在该方向上的加速度。

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

方法

addBody 给机器人添加身体
addSubtree 给机器人添加子树
centerOfMass 重心位置和雅可比矩阵
复制 复制机器人模型
externalForce 构成相对于基底的外力矩阵
forwardDynamics 给定关节力矩和状态的关节加速度
geometricJacobian 机器人构型的几何雅可比矩阵
getBody 按名称获取机器人主体句柄
getTransform 获得体帧之间的变换
gravityTorque 关节力矩补偿重力
homeConfiguration 得到机器人的家庭配置
inverseDynamics 给定运动所需的关节力矩
massMatrix 关节空间质量矩阵
randomConfiguration 生成机器人的随机构型
removeBody 从机器人上拆下机身
replaceBody 更换机器人本体
replaceJoint 更换阀体上的接头
显示 用图形显示机器人的身体框架
showdetails 显示机器人模型的细节
子树 从机器人模型创建子树
velocityProduct 关节力矩抵消了速度引起的力

例子

全部展开

向刚体树中添加刚体和相应的关节。每一个RigidBody对象包含联合对象,并且必须添加到RigidBodyTree使用addBody

创建一个刚体树。

rbtree = robotics.RigidBodyTree;

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

Body1 =机器人。RigidBody (“b1”);

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

Jnt1 =机器人。联合(“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机器人的参数。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 - /2 0 0;0 0 0 0];

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

robot = robotics.RigidBodyTree;

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

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

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

  3. 使用setFixedTransform使用DH参数指定body-to-body转换。

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

Body1 =机器人。RigidBody (“界面”);Jnt1 =机器人。联合(“jnt1”“转动”);setFixedTransform (jnt1 dhparams (1:)“dh”);界面。联合= jnt1; addBody(robot,body1,“基地”

创建并添加其他刚体到机器人。调用时指定前一个主体名称addBody附上它。每个固定变换都相对于前一个关节坐标系。

Body2 =机器人。RigidBody (“body2”);Jnt2 =机器人。联合(“jnt2”“转动”);Body3 =机器人。RigidBody (“body3”);Jnt3 =机器人。联合(“jnt3”“转动”);Body4 =机器人。RigidBody (“body4”);Jnt4 =机器人。联合(“jnt4”“转动”);Body5 =机器人。RigidBody (“body5”);Jnt5 =机器人。联合(“jnt5”“转动”);Body6 =机器人。RigidBody (“body6”);Jnt6 =机器人。联合(“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(机器人)(机器人);轴([-0.5,0.5,-0.5,0.5,-0.5,0.5])轴
-------------------- 机器人:身体(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 ) --------------------

对现有的进行更改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}body3Copy = copy(body3);
childBody = RigidBody与属性:名称:'L4'关节:[1×1机器人。联合] Mass: 1 CenterOfMass: [0 0 0] Inertia: [1 1 1 0 0 0] Parent: [1×1 robotics.RigidBody] Children: {[1×1 robotics.RigidBody]}

更换接头上的L3的身体。您必须创建一个新的联合对象和用途replaceJoint确保下游车身几何形状不受影响。调用setFixedTransform如有必要,定义主体之间的转换,而不是使用默认单位矩阵。

newJoint = robotics。联合(“移动”);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: {1×3 cell} Base: [1×1 robotics. .]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界面.这个变换是x方向。

Joint1 =机器人。联合(“joint1”“转动”);Joint2 =机器人。联合(“joint2”);setFixedTransform(joint2,trvec2tform([1 0 0])) body1。关节= joint1;body2。联合= joint2;

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

界面。质量= 2; body1.CenterOfMass = [0.5 0 0]; body1.Inertia = [0.167 0.001 0.167 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(robot);显示(机器人);持有精神精神情节((1),(2),”或“)视图(2)

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

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

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

加载一个预定义的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];text = externalForce(lbr;“tool0”,扳手,q);

计算由于重力引起的关节加速度,加上施加在末端执行器上的外力“tool0”lbr是它的主构型。假设关节速度和关节力矩为零(输入为空向量)[]).

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

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

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

负载exampleRobots.matlbr

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

lbr。DataFormat =“行”

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

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

生成随机配置lbr

q = randomConfiguration(lbr);

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

tau = inverseDynamics(lbr,q);

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

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

加载一个预定义的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.1 0 0],q);

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

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

参考文献

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

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

扩展功能

在R2016b中引入

这个话题有帮助吗?