Notas de estudo do MATLAB Robotics System Toolbox (1): construir um braço robótico passo a passo

A referência aqui MathWorksem Help Centera Build a Robot Step by Step, e fazer a sua própria compreensão

URL original: https://ww2.mathworks.cn/help/robotics/ug/build-a-robot-step-by-step.html

Este artigo é baseado em Matlab R2020a

Este exemplo completará o processo de construção de um robô passo a passo, mostrando os diferentes componentes do robô e como chamar funções para construí-lo.

  1. Crie um objeto de corpo rígido.

    body1 = rigidBody('body1');
    

    Em seguida, um corpo rígido é criado conforme mostrado abaixo (por exemplo):

    Insira a descrição da imagem aqui

    Resolução do objeto:rigidBody

    O objeto de corpo rígido representa um corpo rígido. O corpo rígido é o bloco de construção de qualquer robô manipulador de estrutura de árvore. Cada corpo rígido possui um objeto de junta de corpo rígido anexado a ele, que define como o corpo rígido se move. Por padrão, o corpo tem uma junta fixa.

    gramática:body = rigidBody(bodyname)

    Parâmetro de entrada: o nome do corpo rígido (escalar da string / vetor de caracteres)

    Atributos:

    Atributo inglês Propriedade chinesa Explicação
    Nome O nome do corpo rígido O padrão é vazio, o nome deve ser exclusivo para o corpo, para que você possa rigidBodyTreeencontrá-lo no objeto. Digite charoustring
    Articulação Juntas conectadas a corpos rígidos Esta junta é uma junta de árvore, não circular. O padrão é uma junta fixa. Tipo éhandle
    Massa A massa do corpo rígido A massa de um corpo rígido, especificada como um escalar numérico, em quilogramas. O padrão é 1
    Centro de massa Centróide de corpo rígido A posição do centro de massa do corpo rígido, especificada como o vetor [xyz]. O vetor descreve a posição do centro de massa em relação ao quadro do objeto, em metros. O padrão é [0 0 0] m.
    Inércia Momento de inércia do corpo rígido (kg ∗ m 2) (kg * m ^ 2)( k gm2 ) A inércia de um corpo rígido, especificada como o vetor [I xx I yy I zz I yz I xz I xy ] em quilogramas metros quadrados. Os primeiros três elementos do vetor são os elementos diagonais do tensor de inércia. Os últimos três elementos são os elementos fora da diagonal do tensor de inércia. O tensor de inércia é uma matriz simétrica semi-definida positiva: [I xx I xy I xz I xy I yy I yz I xz I yz I zz] \ begin {bmatrix} I_ {xx} & I_ {xy} & I_ {xz } \ \ I_ {xy} & I_ {yy} & I_ {yz} \\ I_ {xz} & I_ {yz} & I_ {zz} \ end {bmatrix} \ quadeux xeux yeux zeux yeuy yeuy zeux zeuy zeuz z
    Pai Corpo rígido parental O padrão é vazio.Quando um corpo rígido é adicionado à árvore, esta propriedade atualiza automaticamente a classe pai do corpo rígido e é designada como o manipulador do objeto de corpo rígido. A junta de corpo rígido define como o objeto se move em relação ao objeto pai. Esta propriedade fica vazia, até que o corpo rígido seja adicionado ao rigidBodyTreemodelo do robô.
    Crianças Corpo sub-rígido O valor padrão é {1 × 0 célula} \ {1 × 0 célula \}{ 1×0 c e l l } , subelemento de corpo rígido, especificado como uma matriz de células de alças de objeto de corpo rígido. Esses subobjetos rígidos estão todos ligados a este objeto rígido. Esta propriedade fica vazia, até que o corpo rígido seja adicionado aorigidBodyTreemodelo do robô, e pelo menos um outro corpo rígido seja adicionado à árvore, o corpo rígido como seu pai.
    Visuals Modelo geométrico visual Uma matriz de células especificada como um escalar de string ou vetor de caracteres. Cada vetor de caracteres descreve o tipo e a origem da geometria visual. Por exemplo, se o arquivo de grade fosse link_0.stlanexado ao corpo rígido, os dados visuais seriam Mesh:link_0.stl. Usando a addVisualfunção adicionada à visualização do corpo rígido

    por exemplo:

    body1 = rigidBody('body1');
    body1.Name %输出为body1
    
  2. Crie uma junta e atribua-a ao corpo rígido. home positionPropriedades da junta definidas . Use a conversão homogênea tformé definida para conversão co-pai. Usando a trvec2tformfunção para converter uma transformação homogênea do vetor de tradução. ChildToJointTransformEstá definido para a matriz de identidade.

    jnt1 = rigidBodyJoint('jnt1','revolute');
    jnt1.HomePosition = pi/4;
    tform = trvec2tform([0.25, 0.25, 0]); % User defined
    setFixedTransform(jnt1,tform);
    body1.Joint = jnt1;
    

    Então, conforme mostrado abaixo:

    Insira a descrição da imagem aqui

    Resolução do objeto:rigidBodyJoint

    O objeto de junta de corpo rígido define o movimento do corpo rígido em relação ao ponto de fixação. Em um robô de estrutura de árvore, uma junta sempre pertence a um corpo rígido específico e cada corpo rígido tem uma junta.

    Objetos de articulações de corpo rígido podem descrever vários tipos de articulações. Use a rigidBodyTreeconstrução de uma estrutura de árvore rígida, deve rigidBodyclassificar o objeto para o corpo rígido da junta atribuído.

    Os diferentes tipos de junta suportados são:

    • fixo-fixo, uma junta fixa que impede o movimento relativo entre dois objetos.
    • revolute - uma junta de revolução, uma junta de único grau de liberdade que gira em torno de um determinado eixo, também chamada de pino ou junta de dobradiça.
    • prismática - uma junta de grau único de liberdade que move uma junta e desliza ao longo de um determinado eixo, também chamada de junta deslizante.

    De acordo com a geometria definida, cada tipo de junta possui propriedades e dimensões diferentes.

    gramática:

    jointObj = rigidBodyJoint(jname) %只指定名字
    jointObj = rigidBodyJoint(jname,jtype) %不仅指定名字,还指定了类型
    

    Atributos:

    Atributo inglês Propriedade chinesa Explicação
    Tipo Tipo de junta Por padrão fixed, este atributo é somente leitura. O tipo de conexão é retornado como um escalar de string ou um vetor de caracteres. Ao criar uma conexão, certas propriedades são predefinidas para o tipo de conexão. Se a junta que compreende um modelo de corpo rígido for adicionada ao robô, ela deve ser usada replaceJointsubstituindo o tipo de junta que a articulação é alterada.
    Nome Nome da junta O nome da junta, retornado como um vetor escalar ou de recurso como uma string. O nome da conexão deve ser exclusivo para acessá-la a partir da árvore do corpo rígido. Se um corpo rígido contendo a junta adicionado ao modelo do robô, você deve usar replaceJointsubstituindo a junta para alterar o nome da junta.
    PositionLimits Limites de posição das articulações (amplitude de movimento) Designado como [min max]​vetor de valores. Dependendo do tipo de junta, esses valores têm definições diferentes. (1) fixed- [NaN NaN]​(padrão). Não há limite de junta para juntas fixas. Mantenha-se fixo entre os objetos. (2) revolute- [-pi pi](padrão). O limite define o ângulo de rotação em torno do eixo expresso em radianos. (3) prismatic- [-0.5 0.5](padrão). O limite define o movimento linear ao longo do eixo em metros.
    Posição inicial A posição principal da junta (posição inicial) Especificado como um escalar que depende do tipo de junta. A posição principal deve estar dentro do intervalo definido pelo limite de posição. homeConfigurationUse este atributo para gerar uma configuração principal predefinida para toda a árvore de corpo rígido. (1) fixed- 0(valor padrão). Não há posição inicial associada a uma junta fixa. (2) revolute- 0(valor padrão). O posicionamento da junta de rotação é determinado pelo ângulo de rotação (em radianos) em torno do eixo da junta. (3) prismatic- 0(valor padrão). O posicionamento da junta móvel é determinado pelo movimento linear ao longo do eixo da junta, em metros.
    JointAxis Eixo de articulação 关节的运动轴,指定为三元素单位向量。向量可以在3D空间中以局部坐标表示的任何方向(1)固定关节-固定的关节没有相关的运动轴。(2)转动关节-转动关节在垂直于关节轴的平面上旋转身体。(3)移动关节-移动关节沿关节轴方向做直线运动。
    JointToParentTransform 从关节到父坐标系的固定变换 只读,返回一个4*4齐次变换矩阵,默认值为eye(4)
    ChildToJointTransform 从子坐标系到关节的固定变换 只读,返回一个4*4齐次变换矩阵,默认值为eye(4)

    函数:

    名字 作用
    copy 创建 rigidBodyJoint 对象的副本
    setFixedTransform 设置固定的关节变换特性
  3. 创建一个刚体树。该树初始化时使用一个基础坐标框架来附加主体。

    robot = rigidBodyTree;
    

    Insira a descrição da imagem aqui

    对象解析: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')
    

    Insira a descrição da imagem aqui

  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
    

    Insira a descrição da imagem aqui

  6. Adicione outros corpos. Conecte os corpos 3 e 4 ao corpo 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
    

    Insira a descrição da imagem aqui

  7. Se você tiver o controle de um atuador terminal específico com o qual se preocupa, ele é definido como um corpo rígido com uma junta fixa. Para este robô, adicione um efetor final ao body4 para que você possa transformá-lo.

    bodyEndEffector = rigidBody('endeffector');
    tform5 = trvec2tform([0.5, 0, 0]); % User defined
    setFixedTransform(bodyEndEffector.Joint,tform5);
    addBody(robot,bodyEndEffector,'body4');
    
  8. Agora que o robô foi criado, a configuração do robô pode ser gerada. Para uma determinada configuração, você também pode usar getTransformpara obter a transição entre as duas estruturas do corpo. Transforme de efetor final em base.

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

    Insira a descrição da imagem aqui


  1. Você pode usar a subárvore para criar uma subárvore a partir de um robô existente ou outros modelos de robô. Especifica o nome do principal a ser usado como base da nova subárvore. Você pode modificar esta subárvore adicionando, alterando ou excluindo assuntos.

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

    Insira a descrição da imagem aqui

  2. Você também pode adicionar essas subárvores ao robô. Adicionar uma subárvore é semelhante a adicionar um assunto. O nome do corpo especificado serve como base do anexo e todas as transformações na subárvore são relativas à estrutura do corpo. Antes de adicionar subárvores, você deve garantir que todos os nomes de corpo e juntas sejam exclusivos. Crie uma cópia do corpo e das juntas, renomeie-os e substitua-os na subárvore. Chame addSubtreea subárvore anexada ao assunto especificado.

    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);
    

    Insira a descrição da imagem aqui

  3. Finalmente, você pode showdetailsver um robô que você construiu. Verifique se o tipo de conexão está correto.

    showdetails(robot)
    

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_43229030/article/details/108928529
Recomendado
Clasificación