跳转至

ros2_control 中的关节运动学(Joint Kinematics for ros2_control)

本文旨在概述 ros2_control 框架中关节运动学(Joint Kinematics)的相关概念,简要介绍该主题并解释当前在 ros2_control 中的实现方式。


术语定义(Nomenclature)

自由度(Degrees of Freedom, DoF)

引自维基百科:
在物理学中,一个机械系统的自由度(DoF)是指定义其构型或状态所需的独立参数数量

关节(Joint)

关节是连接两个连杆(link)的机械结构。在 ROS 生态系统中,常见的关节类型包括:

  • Revolute(旋转关节):带位置限制的铰链关节
  • Continuous(连续旋转关节):无位置限制的旋转关节
  • Prismatic(棱柱关节):沿轴线滑动的平移关节

关节可分为: - 主动关节(Actuated):配备执行器,可主动驱动
- 被动关节(Passive / Non-actuated):无执行器,仅通过外力或其它关节带动运动

被动关节可以具有 1 个自由度(如单摆),也可以作为并联机构的一部分而具有 0 自由度(受约束)。


串联运动学(Serial Kinematics)

指机器人操作臂中关节依次连接的结构,其中: - 每个关节相互独立 - 关节数量 = 运动链自由度数

典型示例:6 自由度工业机械臂(6 个旋转关节),其末端执行器可在工作空间内达到任意位置和姿态。


运动学闭环(Kinematic Loops / Closed-Loop Mechanisms)

指多个关节通过连杆形成闭环结构,关节之间相互耦合,不能独立运动。
- 关节数 > 自由度数 - 常见于并联机构(Parallel Kinematic Mechanisms)

示例:四杆机构(Four-bar linkage)
- 包含 4 个连杆和 4 个关节
- 可配备 1 或 2 个执行器 → 自由度为 1 或 2
- 因此有 1(或 2)个主动关节 + 3(或 2)个被动关节,所有关节必须满足运动学约束


URDF 支持情况

URDF(Unified Robot Description Format)是 ROS 中描述机器人运动学的默认格式,但其原生仅支持串联运动链

Mimic 关节(Mimic Joints)

URDF 通过 <mimic> 标签提供对简单闭环或耦合关节的有限支持。

示例:夹爪的对称运动

<joint name="right_finger_joint" type="prismatic">
  <axis xyz="0 1 0"/>
  <origin xyz="0.0 -0.48 1" rpy="0.0 0.0 0.0"/>
  <parent link="base"/>
  <child link="finger_right"/>
  <limit effort="1000.0" lower="0" upper="0.38" velocity="10"/>
</joint>

<joint name="left_finger_joint" type="prismatic">
  <mimic joint="right_finger_joint" multiplier="1" offset="0"/>
  <axis xyz="0 1 0"/>
  <origin xyz="0.0 0.48 1" rpy="0.0 0.0 3.1415926535"/>
  <parent link="base"/>
  <child link="finger_left"/>
  <limit effort="1000.0" lower="0" upper="0.38" velocity="10"/>
</joint>

Mimic 关节可建模的现实场景:

  • 具有线性位置/速度依赖关系的简单闭环机构
  • 皮带-滑轮系统、伸缩臂等同步传动结构
  • 简化的被动关节模型(如末端单摆始终垂直向下)
  • 多电机同步控制组(多个执行器共享同一设定值)

ros2_control 中的 Mimic 关节处理

  • URDF 中定义的 mimic 关节会被 ResourceManager 解析,并存储在 HardwareInfo 类中,供硬件组件访问。
  • 关键限制
  • Mimic 关节不能声明命令接口command_interface
  • 可以声明状态接口state_interface

示例:<ros2_control> 配置

<ros2_control>
  <joint name="right_finger_joint">
    <command_interface name="effort"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
  <joint name="left_finger_joint">
    <!-- mimic 关节:无 command_interface -->
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

已支持 mimic 的官方包: - mock_components(通用系统) - gz_ros2_control

运动学关系(由 URDF 定义,与硬件接口类型无关):

  • 位置position = multiplier * other_joint_position + offset
  • 速度velocity = multiplier * other_joint_velocity

禁用 Mimic 行为(无需修改 URDF)

<ros2_control> 段中设置 mimic="false" 即可覆盖 URDF 行为:

<joint name="left_finger_joint" mimic="false">
  <state_interface name="position"/>
  <state_interface name="velocity"/>
  <state_interface name="effort"/>
</joint>


传动接口(Transmission Interface)

机械传动装置用于在执行器空间(actuator space)和关节空间(joint space)之间转换功率变量(力/力矩、速度),并保持功率守恒

  • Effort 变量:力(线性)、力矩(旋转)
  • Flow 变量:线速度、角速度

在机器人中,传动通常位于执行器与关节之间transmission_interface 提供了双向映射支持:

映射类型 说明
位置 非功率变量,但可通过速度映射 + 零点偏移积分实现
速度/力矩 直接通过传动比转换

使用方式

  • transmission_interface 提供基类和插件实现
  • 不会自动加载,需由自定义硬件组件显式加载
  • Gazebo 插件不自动集成传动接口

当前可用的传动实现:

  • SimpleTransmission:恒定减速比,无动态特性
  • DifferentialTransmission:双执行器 → 双关节的差速传动
  • FourBarLinkageTransmission:四杆机构传动(双执行器 → 双关节)

📚 更多信息请参考:example_8 示例 或 transmission_interface 官方文档。


闭环运动链的仿真(Simulating Closed-Loop Kinematic Chains)

不同仿真插件对闭环运动链的支持程度不同:

1. gazebo_ros2_control

  • ✅ 支持 mimic 关节
  • ✅ 支持闭环运动学(通过 URDF 中的 <gazebo> 标签实现)

    示例参考:Gazebo 闭环关节配置

2. gz_ros2_control(Ignition Gazebo)


总结

  • ros2_control 原生支持串联运动学
  • 通过 Mimic 关节可模拟简单线性耦合的闭环或被动关节
  • 复杂闭环机构需依赖仿真器(如 Gazebo)或自定义硬件组件 + 传动接口
  • 传动接口为执行器-关节映射提供标准化插件机制,但需手动集成

📌 设计建议:对于高度耦合的并联机构,建议在硬件抽象层或仿真层实现完整的运动学求解器,而非依赖 URDF mimic 机制。