Robotics|Robotics System Toolbox学习笔记(一)(简单建立一个机器人rigidBody、rigidBodyJoint用法)


文章目录

    • 本文软件版本
    • 软件介绍
    • 代码功能介绍
      • rigidBody
        • rigidBody的性质
        • rigidBody的函数
      • rigidBodyJoint
        • rigidBodyJoint的性质
        • rigidBodyJoint的函数
    • 例子
    • 参考

本文软件版本 Matlab:R2019b
Robotics System Toolbox
软件介绍
Robotics System Toolbox提供了用于设计,模拟和测试操纵器,移动机器人和类人机器人的工具和算法。对于机械手和类人机器人,该工具箱包括用于碰撞检查,轨迹生成,正向和反向运动学以及使用刚体树表示的动力学的算法。对于移动机器人,它包括用于映射,本地化,路径规划,路径跟踪和运动控制的算法。该工具箱提供了常见的工业机器人应用程序的参考示例。它还包括可购买的工业机器人模型库,您可以导入,可视化和模拟。
代码功能介绍 rigidBody
ridigBody用来创建一个刚体,以便于将其添加到树(树状的机器人操作臂)上,每一个刚体都有一个关节附带。
body = rigidBody(bodyname)表示创建一个名字为"bodyname"的刚体。
rigidBody的性质
Name 刚体的名称 默认为空
Joint 与刚体相连的关节 这个关节是树关节,不是环形关节,默认为固定关节
Mass 刚体的质量(kg) 默认为1
CenterOfMass 刚体质心(m) 默认为[0 0 0]
Inertia 刚体的转动惯量(kg*m^2) 默认为[1 1 1 0 0 0]
Parent 父刚体 默认为空,当刚体被添加到树上时,该性质自动更新
Children 子刚体 默认值为{ 1 × 0 1\times0 1×0 cell},当刚体被添加到树上时,该性质自动更新,并且树上至少有一个刚体作为其父刚体
Visuals 可视化数据 指定为字符串标量或字符向量的单元格数组。每个字符向量描述视觉几何的类型和来源。例如,如果将网格文件link_0.stl附加到刚体,则可视化数据将是Mesh:link_0.stl。使用addVisual函数将可视化添加到刚体
例如:
body1 = rigidBody('B1'); % 默认情况下刚体附带的关节是固定关节,可将其替换成名为'J1'的旋转关节 body1.Joint = rigidBodyJoint('J1', 'revolute');

rigidBody的函数
  • copy创建刚体对象的深层副本。
NEWBODY = copy(body)表示会创建一个刚体对象的可选择性深层副本。一些内在的性质会被重置为默认,而不是被复制,例如父刚体、子刚体。
% 创建一个名字为B1的刚体 b1 = rigidBody('B1'); % 深层复制 b2 = copy(b1);

  • addVisual将可视化数据添加到刚体上。
addVisual(BODY, 'Mesh', FILENAME)将FILENAME中指定的Mesh附加到刚体BODY上。 假定多边形网格的框架与BODY的框架一致。网格文件必须为STL格式。
addVisual(BODY, 'Mesh', FILENAME, TFORM)中,TFORM为相对于主体坐标系的4*4齐次变换矩阵。
b1 = rigidBody('B1'); % 添加一个可视化数据到刚体B1上 % trvec2tform将位置向量[0.1 0.1 0.2]转变为齐次变换矩阵 % eul2tform(eul,sequence)将欧拉角转换成其次变换矩阵,sequence默认为ZYX,另外还有ZYZ、XYZ % 上述两个相乘得到T姿态 T = trvec2tform([0.1 0.1 0.2]) * eul2tform([0 0 pi], 'ZYX'); addVisual(b1, 'Mesh', 'mesh/B1.stl', T);

  • clearVisual删除刚体上的所有可视化数据
% 从urdf导入机器人模型 lbr = importrobot('iiwa14.urdf'); % 删除iiwa14模型中刚体1上的可视化数据 clearVisual(lbr.Bodies{1});

rigidBodyJoint
创建一个关节。在一个树形机器人结构中,一个关节属于一个特定的刚体,并且每个刚体至少有一个关节。
jointObj = rigidBodyJoint(jname); 创建一个具有特定名称jname的固定关节
jointObj = rigidBodyJoint(jname, jtype); 创建一个名称为jname的指定关节类型jtype的关节。其中jtype为关节类型,默认为fixed,另外还有revolute、prismatic。
rigidBodyJoint的性质
Type 关节类型 只读,默认为fixed固定,另外还有revolute旋转、prismatic移动
Name 关节名称
PositionLimits 关节运动范围 由向量[min max]指定。fixed默认为[NaN NaN]; revolute默认为[-pi pi](弧度); prismatic默认为[-0.5 0.5](米)
HomePosition 关节初始位置 对于三个关节类型,该性质默认为0
JointAxis 关节运动轴 关节的运动轴,指定为三元素单位向量。向量可以在3D空间中以局部坐标表示的任何方向
JointToParentTransform 从关节到父坐标系的固定变换 只读,返回一个4*4齐次变换矩阵,默认值为eye(4)
ChildToJointTransform 从子坐标系到关节的固定变换 只读,返回一个4*4齐次变换矩阵,默认值为eye(4)
rigidBodyJoint的函数
  • copy创建rigidBodyJoint对象的副本
NEWJNT = COPY(JNT)表示会返回一个与关节JNT性质一样的新关节NEWJWT。
% 创建一个旋转关节joint_1 jnt1 = rigidBodyJoint('joint_1', 'revolute'); % 创建一个关节对象的副本 jnt1cp = copy(jnt1); % 删除原关节对象 delete(jnt1);

  • setFixedTransform创建关节的固定变换属性
setFixedTransform(jointObj,tform)直接使用提供的tform齐次变换矩阵设置rigidBodyJoint对象jointObjJointToParentTransform属性。
setFixedTransform(jointObj,dhparams,"dh")使用标准DH参数设置ChildToJointTransform属性。 JointToParentTransform属性设置为一个单位矩阵。 DH参数以 [ a α d θ ] [a \quad\alpha \quad d \quad \theta] [aαdθ]顺序给出。因为角度取决于关节的位置,因此 θ \theta θ参数被忽略。
【Robotics|Robotics System Toolbox学习笔记(一)(简单建立一个机器人rigidBody、rigidBodyJoint用法)】setFixedTransform(jointObj,mdhparams,'mdh')具体操作与上一个函数相同,不同点在于该函数使用改进DH参数设置。
例子
clear %aalphadtheta dhparams = [0pi/2 00; 0.4318 000 0.0203 -pi/2 0.15005 0; 0pi/2 0.4318 0; 0-pi/2 00; 0000]; robot = rigidBodyTree; % 创建一个rigidBody对象并给它一个唯一的名称。 body1 = rigidBody('body1'); %第一个刚体 jnt1 = rigidBodyJoint('jnt1','revolute'); %刚体上面的关节是转动关节 名字叫jnt1setFixedTransform(jnt1,dhparams(1,:),'dh'); %设置DH变换 body1.Joint = jnt1; % 调用addBody将第一个身体关节连接到机器人树形结构上。 addBody(robot,body1,'base') % 创建并添加其他刚体到机器人。在调用addBody来附加它时,指定以前的主体名称。每个固定变换相对于前一个关节坐标系。 body2 = rigidBody('body2'); jnt2 = rigidBodyJoint('jnt2','revolute'); body3 = rigidBody('body3'); jnt3 = rigidBodyJoint('jnt3','revolute'); body4 = rigidBody('body4'); jnt4 = rigidBodyJoint('jnt4','revolute'); body5 = rigidBody('body5'); jnt5 = rigidBodyJoint('jnt5','revolute'); body6 = rigidBody('body6'); jnt6 = rigidBodyJoint('jnt6','revolute'); 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.Joint = jnt2; body3.Joint = jnt3; body4.Joint = jnt4; body5.Joint = jnt5; body6.Joint = jnt6; addBody(robot,body2,'body1') addBody(robot,body3,'body2') addBody(robot,body4,'body3') addBody(robot,body5,'body4') addBody(robot,body6,'body5')% 查看细节 部件名,关节名 .索引序号 showdetails(robot)% 获取机器人的home构型 % 修改配置并将第二个关节位置设置为pi / 2。在机械手配置中显示结果更改。 conf= homeConfiguration(robot); conf(2).JointPosition=pi/2; % show可视化结果在figure中显示,此结果是默认配置的机器人状态 show(robot,conf); axis([-0.5,0.5,-0.5,0.5,-0.5,0.5])

输出:
-------------------- Robot: (6 bodies) IdxBody NameJoint NameJoint TypeParent Name(Idx)Children Name(s) ---------------------------------------------------------------- 1body1jnt1revolutebase(0)body2(2) 2body2jnt2revolutebody1(1)body3(3) 3body3jnt3revolutebody2(2)body4(4) 4body4jnt4revolutebody3(3)body5(5) 5body5jnt5revolutebody4(4)body6(6) 6body6jnt6revolutebody5(5) --------------------

Robotics|Robotics System Toolbox学习笔记(一)(简单建立一个机器人rigidBody、rigidBodyJoint用法)
文章图片

参考 Robot Models — Functions

    推荐阅读