系列文章目录
文章目录
- 系列文章目录
- 前言
- [一、UR5 URDF 代码](#一、UR5 URDF 代码)
- 二、base_link
- 三、shoulder_pan_joint
- 四、shoulder_pan_trans
- [五、ROS base_link 坐标系到 UR 机器人 'Base' 坐标系的转换](#五、ROS base_link 坐标系到 UR 机器人 'Base' 坐标系的转换)
- 六、与全零TCP(工具坐标系)重合的工具链接
前言
一、UR5 URDF 代码
xml
<?xml version="1.0" encoding="utf-8"?>
<!-- =================================================================================== -->
<!-- | This document was autogenerated by xacro from ur5_robot.urdf.xacro | -->
<!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | -->
<!-- =================================================================================== -->
<robot name="ur5" xmlns:xacro="http://wiki.ros.org/xacro">
<gazebo>
<plugin filename="libgazebo_ros_control.so" name="ros_control">
<!--robotNamespace>/</robotNamespace-->
<!--robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType-->
</plugin>
<!--
<plugin name="gazebo_ros_power_monitor_controller" filename="libgazebo_ros_power_monitor.so">
<alwaysOn>true</alwaysOn>
<updateRate>1.0</updateRate>
<timeout>5</timeout>
<powerStateTopic>power_state</powerStateTopic>
<powerStateRate>10.0</powerStateRate>
<fullChargeCapacity>87.78</fullChargeCapacity>
<dischargeRate>-474</dischargeRate>
<chargeRate>525</chargeRate>
<dischargeVoltage>15.52</dischargeVoltage>
<chargeVoltage>16.41</chargeVoltage>
</plugin>
-->
</gazebo>
<!-- measured from model -->
<!--property name="shoulder_height" value="0.089159" /-->
<!--property name="shoulder_offset" value="0.13585" /-->
<!-- shoulder_offset - elbow_offset + wrist_1_length = 0.10915 -->
<!--property name="upper_arm_length" value="0.42500" /-->
<!--property name="elbow_offset" value="0.1197" /-->
<!-- CAD measured -->
<!--property name="forearm_length" value="0.39225" /-->
<!--property name="wrist_1_length" value="0.093" /-->
<!-- CAD measured -->
<!--property name="wrist_2_length" value="0.09465" /-->
<!-- In CAD this distance is 0.930, but in the spec it is 0.09465 -->
<!--property name="wrist_3_length" value="0.0823" /-->
<!-- manually measured -->
<link name="base_link">
<visual>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/visual/base.dae"/>
</geometry>
<material name="LightGrey">
<color rgba="0.7 0.7 0.7 1.0"/>
</material>
</visual>
<collision>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/collision/base.stl"/>
</geometry>
</collision>
<inertial>
<mass value="4.0"/>
<origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
<inertia ixx="0.00443333156" ixy="0.0" ixz="0.0" iyy="0.00443333156" iyz="0.0" izz="0.0072"/>
</inertial>
</link>
<joint name="shoulder_pan_joint" type="revolute">
<parent link="base_link"/>
<child link="shoulder_link"/>
<origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.089159"/>
<axis xyz="0 0 1"/>
<limit effort="150.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.15"/>
<dynamics damping="0.0" friction="0.0"/>
</joint>
<link name="shoulder_link">
<visual>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/visual/shoulder.dae"/>
</geometry>
<material name="LightGrey">
<color rgba="0.7 0.7 0.7 1.0"/>
</material>
</visual>
<collision>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/collision/shoulder.stl"/>
</geometry>
</collision>
<inertial>
<mass value="3.7"/>
<origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
<inertia ixx="0.010267495893" ixy="0.0" ixz="0.0" iyy="0.010267495893" iyz="0.0" izz="0.00666"/>
</inertial>
</link>
<joint name="shoulder_lift_joint" type="revolute">
<parent link="shoulder_link"/>
<child link="upper_arm_link"/>
<origin rpy="0.0 1.57079632679 0.0" xyz="0.0 0.13585 0.0"/>
<axis xyz="0 1 0"/>
<limit effort="150.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.15"/>
<dynamics damping="0.0" friction="0.0"/>
</joint>
<link name="upper_arm_link">
<visual>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/visual/upperarm.dae"/>
</geometry>
<material name="LightGrey">
<color rgba="0.7 0.7 0.7 1.0"/>
</material>
</visual>
<collision>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/collision/upperarm.stl"/>
</geometry>
</collision>
<inertial>
<mass value="8.393"/>
<origin rpy="0 0 0" xyz="0.0 0.0 0.28"/>
<inertia ixx="0.22689067591" ixy="0.0" ixz="0.0" iyy="0.22689067591" iyz="0.0" izz="0.0151074"/>
</inertial>
</link>
<joint name="elbow_joint" type="revolute">
<parent link="upper_arm_link"/>
<child link="forearm_link"/>
<origin rpy="0.0 0.0 0.0" xyz="0.0 -0.1197 0.425"/>
<axis xyz="0 1 0"/>
<limit effort="150.0" lower="-3.14159265359" upper="3.14159265359" velocity="3.15"/>
<dynamics damping="0.0" friction="0.0"/>
</joint>
<link name="forearm_link">
<visual>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/visual/forearm.dae"/>
</geometry>
<material name="LightGrey">
<color rgba="0.7 0.7 0.7 1.0"/>
</material>
</visual>
<collision>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/collision/forearm.stl"/>
</geometry>
</collision>
<inertial>
<mass value="2.275"/>
<origin rpy="0 0 0" xyz="0.0 0.0 0.25"/>
<inertia ixx="0.049443313556" ixy="0.0" ixz="0.0" iyy="0.049443313556" iyz="0.0" izz="0.004095"/>
</inertial>
</link>
<joint name="wrist_1_joint" type="revolute">
<parent link="forearm_link"/>
<child link="wrist_1_link"/>
<origin rpy="0.0 1.57079632679 0.0" xyz="0.0 0.0 0.39225"/>
<axis xyz="0 1 0"/>
<limit effort="28.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.2"/>
<dynamics damping="0.0" friction="0.0"/>
</joint>
<link name="wrist_1_link">
<visual>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/visual/wrist1.dae"/>
</geometry>
<material name="LightGrey">
<color rgba="0.7 0.7 0.7 1.0"/>
</material>
</visual>
<collision>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/collision/wrist1.stl"/>
</geometry>
</collision>
<inertial>
<mass value="1.219"/>
<origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
<inertia ixx="0.111172755531" ixy="0.0" ixz="0.0" iyy="0.111172755531" iyz="0.0" izz="0.21942"/>
</inertial>
</link>
<joint name="wrist_2_joint" type="revolute">
<parent link="wrist_1_link"/>
<child link="wrist_2_link"/>
<origin rpy="0.0 0.0 0.0" xyz="0.0 0.093 0.0"/>
<axis xyz="0 0 1"/>
<limit effort="28.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.2"/>
<dynamics damping="0.0" friction="0.0"/>
</joint>
<link name="wrist_2_link">
<visual>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/visual/wrist2.dae"/>
</geometry>
<material name="LightGrey">
<color rgba="0.7 0.7 0.7 1.0"/>
</material>
</visual>
<collision>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/collision/wrist2.stl"/>
</geometry>
</collision>
<inertial>
<mass value="1.219"/>
<origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
<inertia ixx="0.111172755531" ixy="0.0" ixz="0.0" iyy="0.111172755531" iyz="0.0" izz="0.21942"/>
</inertial>
</link>
<joint name="wrist_3_joint" type="revolute">
<parent link="wrist_2_link"/>
<child link="wrist_3_link"/>
<origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.09465"/>
<axis xyz="0 1 0"/>
<limit effort="28.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.2"/>
<dynamics damping="0.0" friction="0.0"/>
</joint>
<link name="wrist_3_link">
<visual>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/visual/wrist3.dae"/>
</geometry>
<material name="LightGrey">
<color rgba="0.7 0.7 0.7 1.0"/>
</material>
</visual>
<collision>
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/collision/wrist3.stl"/>
</geometry>
</collision>
<inertial>
<mass value="0.1879"/>
<origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
<inertia ixx="0.0171364731454" ixy="0.0" ixz="0.0" iyy="0.0171364731454" iyz="0.0" izz="0.033822"/>
</inertial>
</link>
<joint name="ee_fixed_joint" type="fixed">
<parent link="wrist_3_link"/>
<child link="ee_link"/>
<origin rpy="0.0 0.0 1.57079632679" xyz="0.0 0.0823 0.0"/>
</joint>
<link name="ee_link">
<inertial>
<mass value="0"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
</inertial>
<collision>
<geometry>
<box size="0.01 0.01 0.01"/>
</geometry>
<origin rpy="0 0 0" xyz="-0.01 0 0"/>
</collision>
</link>
<transmission name="shoulder_pan_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="shoulder_pan_joint">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
<actuator name="shoulder_pan_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="shoulder_lift_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="shoulder_lift_joint">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
<actuator name="shoulder_lift_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="elbow_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="elbow_joint">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
<actuator name="elbow_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="wrist_1_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="wrist_1_joint">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
<actuator name="wrist_1_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="wrist_2_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="wrist_2_joint">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
<actuator name="wrist_2_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="wrist_3_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="wrist_3_joint">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
<actuator name="wrist_3_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<gazebo reference="shoulder_link">
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="upper_arm_link">
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="forearm_link">
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="wrist_1_link">
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="wrist_3_link">
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="wrist_2_link">
<selfCollide>true</selfCollide>
</gazebo>
<gazebo reference="ee_link">
<selfCollide>true</selfCollide>
</gazebo>
<!-- ROS base_link to UR 'Base' Coordinates transform -->
<link name="base">
<inertial>
<mass value="0"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
</inertial>
</link>
<joint name="base_link-base_fixed_joint" type="fixed">
<!-- NOTE: this rotation is only needed as long as base_link itself is
not corrected wrt the real robot (ie: rotated over 180
degrees)
-->
<origin rpy="0 0 -3.14159265359" xyz="0 0 0"/>
<parent link="base_link"/>
<child link="base"/>
</joint>
<!-- Frame coincident with all-zeros TCP on UR controller -->
<link name="tool0">
<inertial>
<mass value="0"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
</inertial>
</link>
<joint name="wrist_3_link-tool0_fixed_joint" type="fixed">
<origin rpy="-1.57079632679 0 0" xyz="0 0.0823 0"/>
<parent link="wrist_3_link"/>
<child link="tool0"/>
</joint>
<link name="world"/>
<joint name="world_joint" type="fixed">
<parent link="world"/>
<child link="base_link"/>
<origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.0"/>
</joint>
</robot>
二、base_link
xml
<link name="base_link">
<!-- 定义链接的可视化特性 -->
<visual>
<!-- 定义几何形状,使用dae文件作为可视化模型 -->
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/visual/base.dae"/>
</geometry>
<!-- 定义材质及颜色 -->
<material name="LightGrey">
<color rgba="0.7 0.7 0.7 1.0"/>
</material>
</visual>
<!-- 定义链接的碰撞特性 -->
<collision>
<!-- 定义几何形状,使用stl文件作为碰撞模型 -->
<geometry>
<mesh filename="package://example-robot-data/robots/ur_description/meshes/ur5/collision/base.stl"/>
</geometry>
</collision>
<!-- 定义链接的惯性特性 -->
<inertial>
<!-- 定义链接的质量 -->
<mass value="4.0"/>
<!-- 定义质心的位置和方向 -->
<origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
<!-- 定义链接的转动惯量 -->
<inertia ixx="0.00443333156" ixy="0.0" ixz="0.0" iyy="0.00443333156" iyz="0.0" izz="0.0072"/>
</inertial>
</link>
该段XML代码在机器人建模中定义了一个名为"base_link"的链接单元,这个链接具备视觉、碰撞和惯性属性,适用于UR5机器人模型或类似应用场景。以下是各个部分的具体说明:
- visual 标签:
- 定义了链接的可视化表示,即渲染时显示的形状与外观。
<geometry>
标签内嵌套的<mesh>
元素指定了一个三维模型文件,文件路径为"package://example-robot-data/robots/ur_description/meshes/ur5/visual/base.dae",这是一个Collada (.dae)格式的文件,包含了链接的三维几何形状数据。<material>
标签定义了模型表面的材质信息,这里创建了一个名为"LightGrey"的材质,其颜色属性rgba值为(0.7, 0.7, 0.7, 1.0),表示一种浅灰色且完全不透明的颜色。
- collision 标签:
- 定义了此链接在进行物理模拟或碰撞检测时所使用的几何形状。
- 同样在
<geometry>
标签内嵌套的<mesh>
元素指定了一个碰撞模型文件,文件路径为 "package://example-robot-data/robots/ur_description/meshes/ur5/collision/base.stl",这是一个 STereoLithography (.stl) 格式的文件,常用于精确的碰撞检测计算。
- inertial 标签:
- 描述了链接的惯性属性,这对于动态仿真非常重要,涉及到质量和转动惯量等物理参数。
<mass>
标签定义了链接的质量,其值为4.0千克。<origin>
标签定义了链接质心的位置和方向,这里的 rpy 属性代表绕三个坐标轴的旋转角度(此处均为0),xyz 属性则是质心相对于父坐标系的偏移量(此处也是 0,意味着质心位于原点)。<inertia>
标签提供了链接的惯性张量,包含六个分量(ixx, ixy, ixz, iyy, iyz, izz),这些值反映了链接在不同方向上的转动惯量特性,对于准确模拟物体运动状态至关重要。
总之,这段XML代码在机器人模拟软件中为"base_link"链接创建了完整的视觉表现、碰撞检测模型以及必要的物理属性,使得软件能够真实地模拟该链接在各种场景下的行为和反应。
这段XML代码定义了一个名为"shoulder_pan_joint"的关节,类型为"revolute",表示旋转关节。它指定了关节的父链接和子链接,以及关节的原点位置和旋转轴向。同时,还设置了关节的运动范围、最大力矩、最大速度和动力学参数(阻尼和摩擦力)。
-
定义了一个名为"shoulder_pan_joint"的关节,类型为"revolute",这是一种绕固定轴旋转的关节。
-
指定该关节的父级链接是"base_link",即该关节从"base_link"链接处开始。
-
指定该关节的子级链接是"shoulder_link",即关节连接到"shoulder_link"这一部分,关节运动将影响到这个链接。
-
描述了关节在父链接坐标系下的原点位置,其中rpy表示绕xyz轴的旋转角度(此处均为0,表示不旋转),xyz表示沿xyz轴的平移距离(此处z轴方向上有0.089159米的距离)。
-
定义了关节的旋转轴,xyz值为(0, 0, 1),表示关节绕z轴正方向进行旋转。
-
限制关节的运动范围和性能:
effort
:指定关节的最大输出力矩,这里是150.0单位。lower
和upper
:分别设定了关节允许的最小和最大旋转角度,这里都设置为-π到π弧度,意味着关节可以360度全范围旋转。velocity
:指定了关节的最大速度,这里为3.15弧度每秒。
-
描述关节的动力学特性:
damping
:表示关节阻尼系数,这里是0.0,意味着没有额外的阻尼效应。friction
:表示关节摩擦力,这里的值也为0.0,意味着没有考虑摩擦力的影响。
三、shoulder_pan_joint
xml
<!-- 定义名为 "shoulder_pan_joint" 的关节 -->
<joint name="shoulder_pan_joint" type="revolute">
<!-- 指定该关节连接于父级链接,此处为 "base_link" -->
<parent link="base_link"/>
<!-- 指定该关节连接于子级链接,此处为 "shoulder_link" -->
<child link="shoulder_link"/>
<!-- 定义关节相对于父级链接的原点坐标,以RPY(Roll-Pitch-Yaw)顺序指定旋转角度,xyz表示直角坐标偏移 -->
<origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.089159"/>
<!-- 定义关节轴的方向,xyz三元组表示关节旋转轴的方向向量 -->
<axis xyz="0 0 1"/>
<!-- 定义关节的运动限制参数 -->
<limit>
<!-- 最大允许力矩(effort limit) -->
<effort>150.0</effort>
<!-- 关节可旋转的最小和最大角度范围 -->
<lower>-6.28318530718</lower>
<upper>6.28318530718</upper>
<!-- 关节的最大允许速度(velocity limit) -->
<velocity>3.15</velocity>
</limit>
<!-- 定义关节动力学特性 -->
<dynamics>
<!-- 关节阻尼系数(damping coefficient) -->
<damping>0.0</damping>
<!-- 关节摩擦系数(friction coefficient) -->
<friction>0.0</friction>
</dynamics>
</joint>
这段XML代码定义了一个名为"shoulder_pan_trans"的传输装置(transmission),它使用了"transmission_interface/SimpleTransmission"类型。该传输装置连接了一个名为"shoulder_pan_joint"的关节,该关节使用了"hardware_interface/PositionJointInterface"硬件接口。此外,该传输装置还有一个名为"shoulder_pan_motor"的执行器,它具有一个机械传动比为1的设置。
<transmission name="shoulder_pan_trans">
:此元素定义了一个名为"shoulder_pan_trans"的传输组件,它是机器人系统中关节和执行器之间的桥梁,用于实现力矩、速度或位置等物理量的转换。<type>transmission_interface/SimpleTransmission</type>
:这个属性指定了所使用的传输类型为"SimpleTransmission",这是ROS控制框架中的一个标准传输类,它提供了一种简单的线性映射机制,即将执行器(如电机)的输出直接映射到关节的角度或转速。<joint name="shoulder_pan_joint">
:这一部分定义了与该传输关联的关节,名称为"shoulder_pan_joint"。这意味着该传输配置将影响该特定关节的行为。<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
:这里指定了关节使用的硬件接口类型为"hardware_interface/PositionJointInterface"。这意味着该关节在硬件层面上支持位置控制,即可以通过发送目标位置值来控制其运动。<actuator name="shoulder_pan_motor">
:这部分定义了驱动关节运动的实际执行器设备,名称为"shoulder_pan_motor"。<mechanicalReduction>1</mechanicalReduction>
:这一属性表示执行器(电机)与关节之间的机械传动比为1,也就是说执行器的每单位输出直接对应关节的单位运动,没有额外的齿轮或其他机械结构导致的扭矩放大或缩小。在实际应用中,如果存在齿轮箱等传动装置,这个值通常会大于1,表示扭矩放大;若小于1,则表示扭矩减小或速度增大。
四、shoulder_pan_trans
xml
<!-- 定义名为 "shoulder_pan_trans" 的传动装置 -->
<transmission name="shoulder_pan_trans">
<!-- 指定传动装置的类型,这里是基于 "transmission_interface" 包中的 "SimpleTransmission" 类型 -->
<type>transmission_interface/SimpleTransmission</type>
<!-- 定义与传动装置关联的关节信息 -->
<joint name="shoulder_pan_joint">
<!-- 指定关节使用的硬件接口,这里是 "hardware_interface" 包中的 "PositionJointInterface" -->
<!-- 这意味着该关节支持位置控制,即可以接收并执行位置指令 -->
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
<!-- 定义传动装置对应的执行器(例如电机) -->
<actuator name="shoulder_pan_motor">
<!-- 指定执行器到关节之间的机械传动比 -->
<!-- 值为1表示执行器的输出直接对应关节的运动,没有额外的减速或增速 -->
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
这段XML代码来自机器人建模领域,主要用来描述机器人模型中的一个链接(Link)及其与另一个链接之间的固定关节(Joint)。这里是在UR机器人系统中定义从ROS(Robot Operating System)框架下的"base_link"坐标系到实际UR机器人基座坐标系的转换关系。
-
<link name="base">
-
这个标签定义了一个名为"base"的链接,它代表了UR机器人系统的基座部分,在机器人模型中,每个链接通常包含形状、质量、惯性等物理特性。
<inertial>
标签定义了该链接的惯性属性:
<mass value="0"/>
:设置链接的质量为0,这可能是因为此处简化处理,不考虑基座的质量属性。<origin rpy="0 0 0" xyz="0 0 0"/>
:设置惯性参考坐标系(原点)的位置和方向,这里的rpy参数分别代表绕x、y、z轴的旋转角度,xyz参数则是原点在父坐标系下的位置坐标,这里都设为0,意味着惯性参考坐标系与父坐标系对齐且位于原点。<inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
:定义了链接的惯性张量,其中各个参数代表不同维度的转动惯量,这里所有值均为0,同样可能是因为简化处理或默认假设基座的转动惯量在此场景下可以忽略。
-
-
<joint name="base_link-base_fixed_joint" type="fixed">
- 定义了一个名为"base_link-base_fixed_joint"的关节,其类型为"fixed",这意味着这个关节连接的两个链接之间没有相对运动,即"base_link"和"base"是固定在一起的。
<origin rpy="0 0 -3.14159265359" xyz="0 0 0"/>
:设置关节相对于父链接(这里是"base_link")的位置和姿态,rpy参数表明需要进行一个沿z轴的180度旋转,可能是为了调整坐标系的方向以匹配真实机器人的方向。<parent link="base_link"/>
:声明此关节的父链接是"base_link",也就是ROS框架下的基础坐标系。<child link="base"/>
:声明此关节的子链接是"base",即UR机器人的基座坐标系。
通过这种方式,这段XML代码建立了ROS框架下的"base_link"与UR机器人实际基座坐标系之间的关联,并通过固定关节保证了两者间不存在相对运动。
五、ROS base_link 坐标系到 UR 机器人 'Base' 坐标系的转换
xml
<!--
ROS base_link 坐标系到 UR 机器人 'Base' 坐标系的转换
-->
<!-- 首先定义一个名为 "base" 的 Link,表示 UR 机器人的基座 -->
<link name="base">
<!-- 定义 Link 的惯性属性 -->
<inertial>
<!-- 设置 Link 的质量为 0,此处可能是出于简化考虑或者基座质量较小可忽略 -->
<mass value="0"/>
<!-- 设置 Link 惯性参考坐标系的原点,rpy 表示绕 x、y、z 轴的旋转角度,xyz 表示在父坐标系下的位置坐标,这里都为 0,意味着惯性参考坐标系与父坐标系重合且位于原点 -->
<origin rpy="0 0 0" xyz="0 0 0"/>
<!-- 定义 Link 的惯性张量,ixx, ixy, ixz, iyy, iyz, izz 分别代表绕对应轴的转动惯量分量,
此处所有值均为 0,同样可能是因为简化处理,认为基座的转动惯量在此场景下可以忽略 -->
<inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
</inertial>
</link>
<!-- 定义一个名为 "base_link-base_fixed_joint" 的 Joint,类型为 "fixed",表示这是一个固定关节 -->
<joint name="base_link-base_fixed_joint" type="fixed">
<!--
注意:这里的旋转参数 rpy="0 0 -3.14159265359" 是因为 base_link 相对于真实机器人本身的方向需要校正,
即 base_link 相对于机器人基座需要旋转 180 度,仅当 base_link 未按照真实机器人实际方向修正时才需要此旋转
-->
<origin rpy="0 0 -3.14159265359" xyz="0 0 0"/>
<!-- 定义 Joint 的父级 Link,此处为 ROS 中的 base_link 坐标系 -->
<parent link="base_link"/>
<!-- 定义 Joint 的子级 Link,此处为 UR 机器人的基座坐标系 -->
<child link="base"/>
</joint>
当然,以下是对该段XML代码中各部分的详细解释:
-
<link name="tool0">
:这部分定义了一个新的链接(link)元素,名称为 "tool0",在机器人模型中通常表示机器人的末端执行器或工具。<inertial>
:这个标签定义了链接的惯性属性,包括质量、转动惯量以及质心的位置。
<mass value="0"/>
:声明该链接的质量为0,意味着"tool0"是一个虚拟的、无质量的链接。<origin rpy="0 0 0" xyz="0 0 0"/>
:定义了链接质心的初始方向(roll-pitch-yaw角)和三维坐标,此处均为原点(0, 0, 0)。<inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
:定义了链接的六维转动惯量矩阵,所有元素均为0,进一步表明此链接没有惯性效应。
-
<joint name="wrist_3_link-tool0_fixed_joint" type="fixed">
:定义了一个名为 "wrist_3_link-tool0_fixed_joint" 的关节,类型为 "fixed",即固定关节,这意味着工具0和上一级链接(这里是"wrist_3_link")之间不存在相对运动。<origin rpy="-1.57079632679 0 0" xyz="0 0.0823 0"/>
:定义了该固定关节相对于父级链接(wrist_3_link)的位置,使用 roll-pitch-yaw 角度(rpy)和xyz坐标表示,这里表示工具相对于手腕有一个负的π/2(-90度)的绕Z轴旋转,并且沿Y轴有0.0823米的偏移。<parent link="wrist_3_link"/>
:声明此关节的父级链接为 "wrist_3_link"。<child link="tool0"/>
:声明此关节的子级链接为前面定义的 "tool0"。
-
<link name="world"/>
:定义了一个名为 "world" 的链接,通常表示机器人所在的全局参考系或环境。 -
<joint name="world_joint" type="fixed">
:定义了一个名为 "world_joint" 的固定关节,用于将 "world" 链接与 "base_link" 链接相连。<parent link="world"/>
:声明此关节的父级链接为 "world"。<child link="base_link"/>
:声明此关节的子级链接为 "base_link",通常表示机器人的基座。<origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.0"/>
:固定关节相对于父级链接(world)的原点位置,这里的值表示基座链接位于世界坐标系的原点,且方向与世界坐标系一致。
总结来说,这段XML代码定义了一个零质量的工具链接tool0,它通过一个固定关节与机器人手腕链接相接,并且整个机器人模型通过另一个固定关节与世界的坐标系关联起来。
六、与全零TCP(工具坐标系)重合的工具链接
xml
<!-- 定义一个与全零TCP(工具坐标系)重合的工具链接 -->
<link name="tool0">
<!-- 描述工具链接的惯性特性 -->
<inertial>
<!-- 设定工具的质量为0 -->
<mass value="0"/>
<!-- 设置工具质心的原始方向(欧拉角)和三维坐标,此处均为原点 -->
<origin rpy="0 0 0" xyz="0 0 0"/>
<!-- 设定工具的六自由度转动惯量矩阵,所有元素均为0,表示无惯性效应 -->
<inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
</inertial>
</link>
<!-- 定义一个名为"wrist_3_link-tool0_fixed_joint"的固定关节 -->
<joint name="wrist_3_link-tool0_fixed_joint" type="fixed">
<!-- 设置该固定关节相对于其父级链接(wrist_3_link)的位置姿态 -->
<!-- 这里表示工具绕Z轴逆时针旋转90度(-π/2),并沿Y轴向上偏移0.0823米 -->
<origin rpy="-1.57079632679 0 0" xyz="0 0.0823 0"/>
<!-- 定义该关节的父级链接 -->
<parent link="wrist_3_link"/>
<!-- 定义该关节的子级链接 -->
<child link="tool0"/>
</joint>
<!-- 定义一个代表全局参考系或环境的链接,名为"world" -->
<link name="world"/>
<!-- 定义一个名为"world_joint"的固定关节 -->
<joint name="world_joint" type="fixed">
<!-- 定义该关节的父级链接为"world" -->
<parent link="world"/>
<!-- 定义该关节的子级链接为"base_link",通常代表机器人的基座 -->
<child link="base_link"/>
<!-- 设置该固定关节的原点位置,此处表示基座链接与世界坐标系的原点重合 -->
<!-- 并且基座链接的方向与世界坐标系保持一致 -->
<origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.0"/>
</joint>