【ROS2】中级:URDF-添加物理和碰撞属性

URDF物理属性详解

目标:学习如何为连杆(link-被翻译为链接)添加碰撞和惯性属性,以及如何为关节添加关节动力学。

教程级别:中级

 时间:10 分钟

 目录

  •  碰撞

  •  物理性质

    •  惯性

    •  接触系数

    •  关节动力学

  •  其他标签

  •  下一步

在本教程中,我们将学习如何为您的 URDF 模型添加一些基本的物理属性以及如何指定其碰撞属性。

 碰撞

到目前为止,我们只用一个子元素 visual 指定了我们的链接,这个子元素定义了机器人看起来的样子(这并不奇怪)。然而,为了使碰撞检测工作或模拟机器人,我们还需要定义一个 collision 元素。以下是具有碰撞和物理属性的新 urdf。

以下是我们新基础链接的代码。

<link name="base_link">
  <!-- 定义一个名为base_link的链接 -->
  <visual>
    <!-- 定义视觉元素 -->
    <geometry>
      <!-- 定义几何形状 -->
      <cylinder length="0.6" radius="0.2"/>
      <!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
    </geometry>
    <material name="blue">
      <!-- 定义一个名为blue的材质 -->
      <color rgba="0 0 .8 1"/>
      <!-- 定义颜色为蓝色,RGBA值为(0, 0, 0.8, 1) -->
    </material>
  </visual>
  <collision>
    <!-- 定义碰撞元素 -->
    <geometry>
      <!-- 定义几何形状 -->
      <cylinder length="0.6" radius="0.2"/>
      <!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
    </geometry>
  </collision>
</link>
  • 碰撞元素是链接对象的直接子元素,与视觉标签处于同一级别。

  • 碰撞元素通过几何标签以与视觉元素相同的方式定义其形状。几何标签的格式与视觉元素的格式完全相同。

  • 您还可以以与视觉元素相同的方式指定碰撞标签的子元素中的原点。

在许多情况下,您会希望碰撞几何和原点与视觉几何和原点完全相同。然而,有两种主要情况您不会这样做:

  • 更快的处理。对两个网格进行碰撞检测比对两个简单几何体进行碰撞检测要复杂得多。因此,您可能希望在碰撞元素中用更简单的几何体替换网格。

  • 安全区域。您可能希望限制靠近敏感设备的移动。例如,如果我们不希望任何东西碰撞到 R2D2 的头部,我们可以将碰撞几何体定义为包围他头部的圆柱体,以防止任何东西过于靠近他的头部。

 物理性质

为了使您的模型正确模拟,您需要定义机器人的一些物理属性,即物理引擎(如 Gazebo)所需的属性。

 惯性

每个被模拟的链接元素都需要一个惯性标签。这里有一个简单的例子。

<link name="base_link">
  <!-- 定义一个名为base_link的链接 -->
  <visual>
    <!-- 定义视觉元素 -->
    <geometry>
      <!-- 定义几何形状 -->
      <cylinder length="0.6" radius="0.2"/>
      <!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
    </geometry>
    <material name="blue">
      <!-- 定义一个名为blue的材质 -->
      <color rgba="0 0 .8 1"/>
      <!-- 定义颜色为蓝色,RGBA值为(0, 0, 0.8, 1) -->
    </material>
  </visual>
  <collision>
    <!-- 定义碰撞元素 -->
    <geometry>
      <!-- 定义几何形状 -->
      <cylinder length="0.6" radius="0.2"/>
      <!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
    </geometry>
  </collision>
  <inertial>
    <!-- 定义惯性元素 -->
    <mass value="10"/>
    <!-- 定义质量为10 -->
    <inertia ixx="1e-3" ixy="0.0" ixz="0.0" iyy="1e-3" iyz="0.0" izz="1e-3"/>
    <!-- 定义惯性张量,ixx=1e-3, ixy=0.0, ixz=0.0, iyy=1e-3, iyz=0.0, izz=1e-3 -->
  </inertial>
</link>
  • 此元素也是 link 对象的子元素。

  • 质量以千克为单位定义。

  • 3x3 旋转惯性矩阵由惯性元素指定。由于这是对称的,因此它可以仅由 6 个元素表示,如下所示。

50a833be58db2196c2cebdf349bb8450.png

  • 这些信息可以通过诸如 MeshLab 之类的建模程序提供给您。几何图元(圆柱体、盒子、球体)的惯性可以使用维基百科上的惯性张量列表 https://en.wikipedia.org/wiki/List_of_moments_of_inertia#List_of_3D_inertia_tensors 进行计算(并在上述示例中使用)。

  • 惯性张量取决于物体的质量和质量分布。一个好的初步近似是假设物体体积内的质量均匀分布,并根据物体的形状计算惯性张量,如上所述。

  • 如果不确定要放什么,ixx/iyy/izz=1e-3 或更小的矩阵通常是中等大小链接的合理默认值(它对应于边长为 0.1 米、质量为 0.6 千克的盒子)。单位矩阵是一个特别糟糕的选择,因为它通常太高了(它对应于边长为 0.1 米、质量为 600 千克的盒子!)。

  • 您还可以指定一个原点标签,以指定重心和惯性参考系(相对于链接的参考系)。

  • 在使用实时控制器时,惯性元素为零(或几乎为零)可能会导致机器人模型在没有警告的情况下崩溃,并且所有链接的原点将与世界原点重合。

 接触系数

您还可以定义 link 在彼此接触时的行为。这是通过一个名为 contact_coefficients 的碰撞标签子元素完成的。需要指定三个属性:

  • mu - 摩擦系数 https://simple.wikipedia.org/wiki/Coefficient_of_friction

  • kp-刚度系数 https://en.wikipedia.org/wiki/Stiffness

  • kd-阻尼系数 https://en.wikipedia.org/wiki/Damping_ratio#Damping_ratio_definition

 关节动力学

关节的运动方式由关节的动力学标签定义。这里有两个属性:

  • friction - 物理静摩擦力。对于棱柱关节,单位是牛顿。对于旋转关节,单位是牛顿米。

  • damping - 物理阻尼值。对于棱柱关节,单位是牛顿秒每米。对于旋转关节,单位是牛顿米秒每弧度。

如果未指定,这些系数默认为零。

 其他标签

纯 URDF 领域(即不包括 Gazebo 特定标签),还有两个标签可以帮助定义关节:校准和安全控制器 calibration and safety controller.。查看规范 https://wiki.ros.org/urdf/XML/joint ,因为它们不包含在本教程中。

c59707c0f5b4cf6b63fce9fdea5f26fc.png

 1. <Joint> 元素

关节元件描述了关节的运动学和动力学,并指定了关节的安全限制。

以下是一个关节元素的示例:

<joint name="my_joint" type="floating">
  <!-- 定义一个名为my_joint的关节,类型为浮动 -->
  <origin xyz="0 0 1" rpy="0 0 3.1416"/>
  <!-- 定义关节的原点,位置为(0, 0, 1),绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转3.1416弧度 -->
  <parent link="link1"/>
  <!-- 定义父链接为link1 -->
  <child link="link2"/>
  <!-- 定义子链接为link2 -->


  <calibration rising="0.0"/>
  <!-- 定义校准参数,rising值为0.0 -->
  <dynamics damping="0.0" friction="0.0"/>
  <!-- 定义动力学参数,阻尼值为0.0,摩擦值为0.0 -->
  <limit effort="30" velocity="1.0" lower="-2.2" upper="0.7"/>
  <!-- 定义限制参数,最大作用力为30,最大速度为1.0,下限为-2.2,上限为0.7 -->
  <safety_controller k_velocity="10" k_position="15" soft_lower_limit="-2.0" soft_upper_limit="0.5"/>
  <!-- 定义安全控制器参数,速度系数为10,位置系数为15,软下限为-2.0,软上限为0.5 -->
</joint>

 2. 属性

关节元素有两个属性:

name(必需)

  • 指定关节的唯一名称。

type(必需)

  • 指定关节的类型,类型可以是以下之一:

    • revolute - 一个围绕轴旋转并且有上下限制的铰链关节。

    • continuous - 一个围绕轴无限旋转的连续铰链关节,没有上下限制。

    • prismatic - 一个沿轴滑动并且有上下限制的滑动关节。

    • fixed - 这实际上不是一个关节,因为它不能移动。所有自由度都被锁定。这种类型的关节不需要<axis>、<calibration>、<dynamics>、<limits>或<safety_controller>。

    • floating - 这种关节允许所有六个自由度的运动。

    • planar - 这种关节允许在垂直于轴的平面内运动。

The joint element has two attributes:

  • name (required)

    type (required)

    • revolute — a hinge joint that rotates along the axis and has a limited range specified by the upper and lower limits.

    • continuous — a continuous hinge joint that rotates around the axis and has no upper and lower limits.

    • prismatic — a sliding joint that slides along the axis, and has a limited range specified by the upper and lower limits.

    • fixed — this is not really a joint because it cannot move. All degrees of freedom are locked. This type of joint does not require the <axis><calibration><dynamics><limits> or <safety_controller>.

    • floating — this joint allows motion for all 6 degrees of freedom.

    • planar — this joint allows motion in a plane perpendicular to the axis.

    • Specifies the type of joint, where type can be one of the following:

    • Specifies a unique name of the joint

 3.元素

关节元素具有以下元素:

<origin>(可选:如果未指定,则默认为身份矩阵)

这是从父链接到子链接的变换。关节位于子链接的原点,如上图所示。

  • xyz(可选:默认为零向量)

    • 表示x、y、z偏移。所有位置都以米为单位指定。

  • rpy(可选:默认为零向量)

    • 表示围绕固定轴的旋转:首先围绕x轴滚动,然后围绕y轴俯仰,最后围绕z轴偏航。所有角度都以弧度为单位指定。

<parent>(必需)

父链接名称,具有强制属性:

  • link

    • 在机器人树结构中作为此链接父链接的链接名称。

<child>(必需)

子链接名称,具有强制属性:

  • link

    • 子链接的名称。

<axis>(可选:默认为(1,0,0))

在关节框架中指定的关节轴。这是旋转关节的旋转轴,棱柱关节的平移轴,以及平面关节的表面法线。轴在关节参考框架中指定。固定和浮动关节不使用轴字段。

  • xyz(必需)

    • 表示向量的(x, y, z)分量。向量应归一化。

<calibration>(可选)

关节的参考位置,用于校准关节的绝对位置。

  • rising(可选)

    • 当关节向正方向移动时,此参考位置将触发上升沿。

  • falling(可选)

    • 当关节向正方向移动时,此参考位置将触发下降沿。

<dynamics>(可选)

指定关节物理特性的元素。这些值用于指定关节的建模特性,特别适用于仿真。

  • damping(可选,默认为0)

    • 关节的物理阻尼值(对于棱柱关节,以牛顿秒每米[N∙s/m]为单位,对于旋转关节,以牛顿米秒每弧度[N∙m∙s/rad]为单位)。

  • friction(可选,默认为0)

    • 关节的物理静摩擦值(对于棱柱关节,以牛顿[N]为单位,对于旋转关节,以牛顿米[N∙m]为单位)。

<limit>(仅对旋转和棱柱关节必需)

元素可以包含以下属性:

  • lower(可选,默认为0)

    • 指定关节下限的属性(对于旋转关节,以弧度为单位,对于棱柱关节,以米为单位)。如果关节是连续的,则省略。

  • upper(可选,默认为0)

    • 指定关节上限的属性(对于旋转关节,以弧度为单位,对于棱柱关节,以米为单位)。如果关节是连续的,则省略。

  • effort(必需)

    • 用于强制执行最大关节作用力的属性(|applied effort| < |effort|)。参见安全限制。

  • velocity(必需)

    • 用于强制执行最大关节速度的属性(对于旋转关节,以每秒弧度[rad/s]为单位,对于棱柱关节,以每秒米[m/s]为单位)。参见安全限制。

<mimic>(可选)(ROS Groovy新增功能。参见问题)

此标签用于指定定义的关节模仿另一个现有关节。此关节的值可以计算为value = multiplier * other_joint_value + offset。

预期和可选属性:

  • joint(必需)

    • 指定要模仿的关节的名称。

  • multiplier(可选)

    • 指定上述公式中的乘数因子。

  • offset(可选)

    • 指定上述公式中的偏移量。默认为0(对于旋转关节,以弧度为单位,对于棱柱关节,以米为单位)。

<safety_controller>(可选)

元素可以包含以下属性:

  • soft_lower_limit(可选,默认为0)

    • 指定安全控制器开始限制关节位置的下关节边界的属性。此限制需要大于关节下限(见上文)。有关更多详细信息,请参见安全限制。

  • soft_upper_limit(可选,默认为0)

    • 指定安全控制器开始限制关节位置的上关节边界的属性。此限制需要小于关节上限(见上文)。有关更多详细信息,请参见安全限制。

  • k_position(可选,默认为0)

    • 指定位置和速度限制之间关系的属性。有关更多详细信息,请参见安全限制。

  • k_velocity(必需)

    • 指定作用力和速度限制之间关系的属性。有关更多详细信息,请参见安全限制。

 下一步

通过使用 xacro 减少你需要编写的代码量和烦人的数学计算。

ROS Noetic环境下,遇到 `ros-noetic-urdf-sim-tutorial` 依赖无法安装的问题时,通常是由于系统中某些软件包版本冲突或未正确配置导致的。以下是一些可行的解决方法: 1. **更新系统并修复依赖关系** 首先确保系统软件源是最新的,并尝试修复损坏的依赖关系: ```bash sudo apt update && sudo apt upgrade sudo apt install -f ``` 这将尝试自动修复依赖问题并安装缺失的组件。 2. **手动安装依赖包** 如果 `ros-noetic-urdf-sim-tutorial` 的依赖项(如 `ros-noetic-desktop`, `ros-noetic-perception`, `ros-noetic-simulators`)未被安装,可以尝试分别手动安装这些包: ```bash sudo apt install ros-noetic-desktop sudo apt install ros-noetic-perception sudo apt install ros-noetic-simulators ``` 安装完成后再次尝试安装 `ros-noetic-urdf-sim-tutorial`: ```bash sudo apt install ros-noetic-urdf-sim-tutorial ``` 3. **检查 libcups 相关版本冲突** 如果出现类似 `libcupsimage2` `libcups2` 版本不匹配的问题,可以通过指定版本号来安装兼容版本: ```bash sudo apt install libcups2=2.2.10-6+deb10u1 sudo apt install libcups2-dev ``` 此操作可确保系统使用与 ROS Noetic 兼容的库版本[^2]。 4. **修改软件源配置** 确保系统使用的软件源支持 ROS Noetic 所需的依赖包。对于基于 Debian 的系统,可以在 `/etc/apt/sources.list.d/ros-latest.list` 中确认是否包含正确的 ROS 源。此外,考虑切换到更稳定的镜像源(例如官方源或国内镜像源),以避免因网络问题导致的依赖缺失。 5. **使用 aptitude 解决复杂依赖冲突** 在某些情况下,`apt` 可能无法自动解决复杂的依赖冲突。此时可以尝试使用 `aptitude` 工具进行更智能的依赖解析: ```bash sudo apt install aptitude sudo aptitude install ros-noetic-urdf-sim-tutorial ``` `aptitude` 会在安装过程中提供多个解决方案供选择,有助于找到合适的依赖组合。 6. **清理并重新初始化 ROS 环境** 若上述方法均无效,可以尝试清理当前的 ROS 安装并重新初始化: ```bash sudo apt purge ros-noetic-* sudo apt autoremove sudo apt install ros-noetic-desktop-full ``` 此操作会移除所有现有的 ROS Noetic 包并重新安装完整桌面环境,通常可以修复深层次的依赖问题[^3]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值