1.<link>可以理解为机器人的一个骨骼部分,为实物。

在link中,我们可以定义3个东西:样式,碰撞体,惯性参数

样式<visual>:在仿真/可视化中看到的形状、颜色、位置

碰撞体<collision>:用于物理引擎计算碰撞

惯性参数<inertial>:其中包括物体的质量和描述这个部件旋转时的“惯性”,影响物理仿真的真实感。

  <!-- ===== 红色正方体===== -->
  <link name="cube1">
    <visual>
      <geometry>
        <box size="0.3 0.3 0.3"/>
      </geometry>
      <material name="cube_red"/>
    </visual>
    <collision>
      <geometry>
        <box size="0.3 0.3 0.3"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="0.5"/>
      <inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
    </inertial>
  </link>

2.<joint>:关节

joint 就是连接两个 link 的约束,它定义了父 link 和子 link 之间的相对位置和运动方式。

<joint name="关节名字" type="关节怎么动">

其中name是关键的唯一标识,方便在控制器、话题、调试中引用。

type告诉关键应该怎么动,一般包括以下五类:

类型 含义
fixed 完全固定,不能动
continuous 无限旋转(360°无限制)
revolute 有限旋转(-90° 到 +90°)
prismatic 直线滑动(前后伸缩)
planar 平面运动(x-y 平面)

在<joint>中,以下是定义与作用:

<parent link>:固定的那一端

<child link>:会动的那一端

<origin>:child link 相对于parent link 的位置(xyz)和旋转(rpy

<axis>:对于旋转类关节,指定绕哪个轴旋转

<limit>:运动限制,其中包括lower(最小角度upper(最大角度)effort(最大力度)velocity(最快速度)

 <joint name="cube_joint" type="continuous">
    <parent link="base_link"/>
    <child link="cube"/>
    <origin xyz="0 0 0.25" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <limit effort="10.0" velocity="2.0"/>
  </joint>

以下是完整代码和效果实现:

<?xml version="1.0"?>
<robot name="simple_cube">

  <!-- ===== 1. 定义颜色 ===== -->
  <material name="red">
    <color rgba="1 0 0 1"/>
  </material>
  <material name="gray">
    <color rgba="0.5 0.5 0.5 1"/>
  </material>

  <!-- ===== 2. 世界(根节点) ===== -->
  <link name="world"/>

  <!-- ===== 3. 底座 link ===== -->
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.8 0.8 0.1"/>
      </geometry>
      <material name="gray"/>
    </visual>
    <collision>
      <geometry>
        <box size="0.8 0.8 0.1"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="1.0"/>
      <inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1"/>
    </inertial>
  </link>

  <!-- ===== 4. 底座固定到世界 ===== -->
  <joint name="world_joint" type="fixed">
    <parent link="world"/>
    <child link="base_link"/>
    <origin xyz="0 0 0.05" rpy="0 0 0"/>
  </joint>

  <!-- ===== 5. 红色方块 link ===== -->
  <link name="cube">
    <visual>
      <geometry>
        <box size="0.3 0.3 0.3"/>
      </geometry>
      <material name="red"/>
    </visual>
    <collision>
      <geometry>
        <box size="0.3 0.3 0.3"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="0.5"/>
      <inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
    </inertial>
  </link>

  <!-- ===== 6. 方块连接到底座(绕 Y 轴旋转) ===== -->
  <joint name="cube_joint" type="continuous">
    <parent link="base_link"/>
    <child link="cube"/>
    <origin xyz="0 0 0.25" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <limit effort="10.0" velocity="2.0"/>
  </joint>

</robot>

用的直接可以看的网站Robot Viewer,不需要先放在ros中先编译部署。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐