MATLAB Robotics System Toolbox学习笔记(一):一步一步建造一个机械臂
本文参考 MathWorks
中 Help Center
的 Build a Robot Step by Step
,并加以自己的理解
原网址:https://ww2.mathworks.cn/help/robotics/ug/build-a-robot-step-by-step.html
本文基于 Matlab R2020a
本例将一步一步地完成构建机器人的过程,向您展示不同的机器人组件以及如何调用函数来构建它。
-
创建一个刚体对象。
body1 = rigidBody('body1');
则如下图创建了一个刚体(举例):
对象解析:
rigidBody
刚体对象表示刚体。刚体是任何树形结构机器人机械手的构造块。每个刚体都有一个附着在其上的刚体关节对象,它定义了刚体如何移动。默认情况下,身体有一个固定的关节。
语法:
body = rigidBody(bodyname)
输入参数:刚体的名字(字符串标量/字符向量)
属性:
属性英语 属性中文 解释 Name 刚体的名称 默认为空,此名称对于主体必须是唯一的,以便可以在 rigidBodyTree
对象中找到它。类型为char
或者string
Joint 与刚体相连的关节 这个关节是树关节,不是环形关节,默认为固定关节。类型为 handle
Mass 刚体的质量 刚体的质量,指定为数值标量,单位为千克。默认为1 CenterOfMass 刚体质心 刚体质心位置,指定为 [x y z] 矢量。矢量描述了质心相对于物体框架的位置,单位为米。默认为 [0 0 0]m。 Inertia 刚体的转动惯量 ( k g ∗ m 2 ) (kg*m^2) (kg∗m2) 刚体的惯量,指定为[Ixx Iyy Izz Iyz Ixz Ixy] 向量,单位为千克平方米。向量的前三个元素是惯性张量的对角元素。最后三个元素是惯性张量的非对角元素。惯性张量为正半定对称矩阵: [ I x x I x y I x z I x y I y y I y z I x z I y z I z z ] \begin{bmatrix} I_{xx} & I_{xy} & I_{xz} \\ I_{xy} & I_{yy} & I_{yz} \\ I_{xz} & I_{yz} & I_{zz}\end {bmatrix} \quad ⎣⎡IxxIxyIxzIxyIyyIyzIxzIyzIzz⎦⎤ Parent 父刚体 默认为空,当刚体被添加到树上时,该性质自动更新刚体父类,指定为刚体对象句柄。刚体关节定义了这个物体如何相对于父物体移动。此属性为空,直到刚体被添加到 rigidBodyTree
机器人模型。Children 子刚体 默认值为 { 1 × 0 c e l l } \{1 × 0 cell\} {1×0cell} ,刚体子元素,指定为刚体对象句柄的单元格数组。这些刚体子物体都附着在这个刚体物体上。这个属性是空的,直到刚体被添加到 rigidBodyTree
机器人模型中,并且至少有一个其他的刚体被添加到树中,这个刚体作为它的父体。Visuals 可视几何模型 指定为字符串标量或字符向量的单元格数组。每个字符向量描述视觉几何的类型和来源。例如,如果将网格文件 link_0.stl
附加到刚体,则可视化数据将是Mesh:link_0.stl
。使用addVisual
函数将可视化添加到刚体举个例子:
body1 = rigidBody('body1'); body1.Name %输出为body1
-
创建一个关节并将其分配给刚体。定义关节的
home position
属性。使用齐次转换tform
设置联合到父转换。使用trvec2tform
函数将一个平移向量转换为齐次变换。ChildToJointTransform
被设为单位矩阵。jnt1 = rigidBodyJoint('jnt1','revolute'); jnt1.HomePosition = pi/4; tform = trvec2tform([0.25, 0.25, 0]); % User defined setFixedTransform(jnt1,tform); body1.Joint = jnt1;
则如下图:
对象解析:
rigidBodyJoint
刚体关节对象定义了刚体相对于附着点的运动方式。在树结构机器人中,一个关节总是属于一个特定的刚体,每个刚体都有一个关节。
刚体关节对象可以描述各种类型的关节。使用
rigidBodyTree
构建刚体树结构时,必须使用rigidBody
类将关节对象分配给刚体。支持的不同关节类型有:
- fixed——固定,阻止两个物体之间相对运动的固定关节。
- revolute——转动关节,绕给定轴旋转的单*度关节,也称为销或铰链接合。
- prismatic——移动关节,沿给定轴滑动的单*度关节,也称为滑动关节。
根据定义的几何形状,每种关节类型都有不同的属性和不同的维度。
语法:
jointObj = rigidBodyJoint(jname) %只指定名字 jointObj = rigidBodyJoint(jname,jtype) %不仅指定名字,还指定了类型
属性:
属性英语 属性中文 解释 Type 关节类型 默认为 fixed
,此属性为只读属性。连接类型以字符串标量或字符向量的形式返回。在创建连接时,连接类型预定义了某些属性。如果将包含该关节的刚体添加到机器人模型中,则必须通过使用replaceJoint
替换该关节来改变关节类型。Name 关节名称 关节的名字,作为字符串返回标量或特征向量。连接名称必须是唯一的,才能从刚体树中访问它。如果将包含该关节的刚体添加到机器人模型中,则必须通过使用 replaceJoint
替换该关节来更改关节名称。PositionLimits 关节的位置限制(运动范围) 指定为 [min max]
值的向量。根据关节的类型,这些值有不同的定义。(1)fixed
—[NaN NaN]
(默认) 。固定关节没有关节极限。物体之间保持固定。(2)revolute
—[-pi pi]
(默认)。极限定义了以弧度表示的绕轴旋转的角度。(3)prismatic
—[-0.5 0.5]
(默认)。极限定义了沿轴的直线运动,单位是米。HomePosition 关节的主位置(初始位置) 指定为依赖于关节类型的标量。主位置必须在位置限制设置的范围内。 homeConfiguration
使用此属性为整个刚体树生成预定义的主配置。(1)fixed
-0
(默认值)。固定关节没有相关的home位置。(2)revolute
-0
(默认值)。转动关节的定位是由绕关节轴的旋转角度(以弧度表示)确定的。(3)prismatic
-0
(默认值)。移动关节的定位是由沿关节轴的直线运动确定的,单位为米。JointAxis 关节运动轴 关节的运动轴,指定为三元素单位向量。向量可以在3D空间中以局部坐标表示的任何方向(1)固定关节-固定的关节没有相关的运动轴。(2)转动关节-转动关节在垂直于关节轴的平面上旋转身体。(3)移动关节-移动关节沿关节轴方向做直线运动。 JointToParentTransform 从关节到父坐标系的固定变换 只读,返回一个4*4齐次变换矩阵,默认值为 eye(4)
ChildToJointTransform 从子坐标系到关节的固定变换 只读,返回一个4*4齐次变换矩阵,默认值为 eye(4)
函数:
名字 作用 copy
创建 rigidBodyJoint
对象的副本setFixedTransform
设置固定的关节变换特性 -
创建一个刚体树。该树初始化时使用一个基础坐标框架来附加主体。
robot = rigidBodyTree;
对象解析:
rigidBodyTree
刚体树是刚体带关节的连通性的表示。使用这个类在MATLAB中构建机器人机械手模型。如果您有一个使用统一机器人描述格式(URDF)指定的机器人模型,那么使用
importrobot
来导入机器人模型。刚体树模型由刚体作为刚体对象组成。每个刚体都有一个与之相关联的
rigidBodyJoint
对象,该对象定义了它如何相对于它的父体移动。使用setFixedTransform
来定义关节的框架和相邻物体的框架之间的固定转换。您可以使用RigidBodyTree
类的方法从模型中添加、替换或删除刚体。机器人动力学计算也是可能的。指定机器人模型中每个刚体的质量、质心和惯性特性。你可以计算和逆动力学有或没有外部力量和数量计算动力学机器人关节运动和关节的输入。若要使用与动态相关的函数,请将
DataFormat
属性设置为“row”
或“column”
。对于给定的刚体树模型,您还可以使用机器人模型使用机器人逆运动学算法计算所需末端执行器位置的关节角。当使用逆运动学或广义逆运动学时,指定刚体树模型。
显示方法支持体网格的可视化。网格被指定为。
stl
文件,可以使用addVisual
添加到单个刚体中。另外,在默认情况下,importrobot
函数加载在URDF机器人模型中指定的所有可访问的.stl
文件。语法:
robot = rigidBodyTree %创建一个树形结构的机器人对象。使用addBody向它添加刚体。 robot = rigidBodyTree("MaxNumBodies",N,"DataFormat",dataFormat) % 指定在生成代码时机器人中允许的主体数量的上限。还必须将DataFormat属性指定为 名称/值 。
属性:
属性英语 属性中文 解释 NumBodies 刚体数量 此属性为只读属性。机器人模型中的主体数(不包括基值),返回值为整数。 Bodies 刚体的列表 只读属性。机器人模型中刚体的列表,返回为 cell array of handles
。使用此列表来访问模型中的特定RigidBody
对象。您还可以调用getBody
来通过名称获取body。BodyNames 刚体名字的列表 此属性是只读的。刚体的名称作为字符向量的单元格数组返回。 BaseName 关节的主位置(初始位置) 指定为依赖于关节类型的标量。主位置必须在位置限制设置的范围内。 homeConfiguration
使用此属性为整个刚体树生成预定义的主配置。(1)fixed
-0
(默认值)。固定关节没有相关的home位置。(2)revolute
-0
(默认值)。转动关节的定位是由绕关节轴的旋转角度(以弧度表示)确定的。(3)prismatic
-0
(默认值)。移动关节的定位是由沿关节轴的直线运动确定的,单位为米。Gravity 重力 机器人所经历的重力加速度,指定为 [x y z]
矢量,单位为米每秒的平方。每个单元对应于机器人基架在那个方向上的加速度。[0 0 0]
m/s2 (默认值)DataFormat 运动学和动力学函数的输入/输出数据格式 运动学和动力学函数的输入/输出数据格式,指定为“结构”、“行”或“列”。要使用动力学函数,必须使用“行”或“列”。 "struct"
(默认)相关函数: 具体内容解释直接点击名称即可
函数名称 函数作用 addBody
Add body to robot addSubtree
Add subtree to robot centerOfMass
Center of mass position and Jacobian copy
Copy robot model externalForce
Compose external force matrix relative to base forwardDynamics
Joint accelerations given joint torques and states geometricJacobian
Geometric Jacobian for robot configuration gravityTorque
Joint torques that compensate gravity getBody
Get robot body handle by name getTransform
Get transform between body frames homeConfiguration
Get home configuration of robot inverseDynamics
Required joint torques for given motion massMatrix
Joint-space mass matrix randomConfiguration
Generate random configuration of robot removeBody
Remove body from robot replaceBody
Replace body on robot replaceJoint
Replace joint on body show
Show robot model in a figure showdetails
Show details of robot model subtree
Create subtree from robot model velocityProduct
Joint torques that cancel velocity-induced forces -
第一个刚体添加到树中。指定要将其附加到树的
base
上。前面定义的固定转换是从base
(parent
)到第一个刚体。addBody(robot,body1,'base')
-
创造第二个刚体。定义该刚体的属性并将其附加到第一个刚体上。定义相对于前一个body框架的转换。
body2 = rigidBody('body2'); jnt2 = rigidBodyJoint('jnt2','revolute'); jnt2.HomePosition = pi/6; % User defined tform2 = trvec2tform([1, 0, 0]); % User defined setFixedTransform(jnt2,tform2); body2.Joint = jnt2; addBody(robot,body2,'body1'); % Add body2 to body1
-
添加其他的身体。将body 3和4连接到body 2上。
body3 = rigidBody('body3'); body4 = rigidBody('body4'); jnt3 = rigidBodyJoint('jnt3','revolute'); jnt4 = rigidBodyJoint('jnt4','revolute'); tform3 = trvec2tform([0.6, -0.1, 0])*eul2tform([-pi/2, 0, 0]); % User defined tform4 = trvec2tform([1, 0, 0]); % User defined setFixedTransform(jnt3,tform3); setFixedTransform(jnt4,tform4); jnt3.HomePosition = pi/4; % User defined body3.Joint = jnt3 body4.Joint = jnt4 addBody(robot,body3,'body2'); % Add body3 to body2 addBody(robot,body4,'body2'); % Add body4 to body2
-
如果你有一个你关心的特定终端执行器的控制,它定义为一个刚体与一个固定的关节。对于这个机器人,在body4中添加一个末端执行器,这样你就可以对它进行变换。
bodyEndEffector = rigidBody('endeffector'); tform5 = trvec2tform([0.5, 0, 0]); % User defined setFixedTransform(bodyEndEffector.Joint,tform5); addBody(robot,bodyEndEffector,'body4');
-
现在已经创建了机器人,可以生成机器人配置了。对于给定的配置,您还可以使用
getTransform
来获得两个body框架之间的转换。从末端执行器到基座进行变换。config = randomConfiguration(robot) tform = getTransform(robot,config,'endeffector','base')
-
您可以使用subtree从现有的机器人或其他机器人模型中创建一个子树。指定要用作新子树基的主体名称。您可以通过添加、更改或删除主体来修改此子树。
newArm = subtree(robot,'body2'); removeBody(newArm,'body3'); removeBody(newArm,'endeffector')
-
您还可以向机器人添加这些子树。添加子树类似于添加主体。指定的 body 名称充当附件的 base,子树上的所有转换都相对于该 body 框架。在添加子树之前,必须确保 body 和关节的所有名称都是唯一的。创建 body 和关节的副本,重命名它们,并在子树中替换它们。调用
addSubtree
将子树附加到指定的主体。newBody1 = copy(getBody(newArm,'body2')); newBody2 = copy(getBody(newArm,'body4')); newBody1.Name = 'newBody1'; newBody2.Name = 'newBody2'; newBody1.Joint = rigidBodyJoint('newJnt1','revolute'); newBody2.Joint = rigidBodyJoint('newJnt2','revolute'); tformTree = trvec2tform([0.2, 0, 0]); % User defined setFixedTransform(newBody1.Joint,tformTree); replaceBody(newArm,'body2',newBody1); replaceBody(newArm,'body4',newBody2); addSubtree(robot,'body1',newArm);
-
最后,您可以使用
showdetails
查看您构建的机器人。验证连接类型是否正确。showdetails(robot)