MATLAB Robotics System Toolbox学习笔记(一):一步一步建造一个机械臂

本文参考 MathWorksHelp CenterBuild a Robot Step by Step ,并加以自己的理解

原网址:https://ww2.mathworks.cn/help/robotics/ug/build-a-robot-step-by-step.html

本文基于 Matlab R2020a

本例将一步一步地完成构建机器人的过程,向您展示不同的机器人组件以及如何调用函数来构建它。

  1. 创建一个刚体对象。

    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) (kgm2) 刚体的惯量,指定为[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
    
  2. 创建一个关节并将其分配给刚体。定义关节的 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 设置固定的关节变换特性
  3. 创建一个刚体树。该树初始化时使用一个基础坐标框架来附加主体。

    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
  4. 第一个刚体添加到树中。指定要将其附加到树的 base 上。前面定义的固定转换是从base (parent)到第一个刚体。

    addBody(robot,body1,'base')
    

    在这里插入图片描述

  5. 创造第二个刚体。定义该刚体的属性并将其附加到第一个刚体上。定义相对于前一个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
    

    在这里插入图片描述

  6. 添加其他的身体。将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
    

    在这里插入图片描述

  7. 如果你有一个你关心的特定终端执行器的控制,它定义为一个刚体与一个固定的关节。对于这个机器人,在body4中添加一个末端执行器,这样你就可以对它进行变换。

    bodyEndEffector = rigidBody('endeffector');
    tform5 = trvec2tform([0.5, 0, 0]); % User defined
    setFixedTransform(bodyEndEffector.Joint,tform5);
    addBody(robot,bodyEndEffector,'body4');
    
  8. 现在已经创建了机器人,可以生成机器人配置了。对于给定的配置,您还可以使用 getTransform 来获得两个body框架之间的转换。从末端执行器到基座进行变换。

    config = randomConfiguration(robot)
    tform = getTransform(robot,config,'endeffector','base')
    

    在这里插入图片描述


  1. 您可以使用subtree从现有的机器人或其他机器人模型中创建一个子树。指定要用作新子树基的主体名称。您可以通过添加、更改或删除主体来修改此子树。

    newArm = subtree(robot,'body2'); 
    removeBody(newArm,'body3');
    removeBody(newArm,'endeffector')
    

    在这里插入图片描述

  2. 您还可以向机器人添加这些子树。添加子树类似于添加主体。指定的 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);
    

    在这里插入图片描述

  3. 最后,您可以使用 showdetails 查看您构建的机器人。验证连接类型是否正确。

    showdetails(robot)
    

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43229030/article/details/108928529