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)¶
- ✅ 支持 mimic 关节
- ❌ 尚未原生支持闭环运动学
- 🔧 可通过自定义插件 +
DetachableJoint实现
总结¶
- ros2_control 原生支持串联运动学
- 通过 Mimic 关节可模拟简单线性耦合的闭环或被动关节
- 复杂闭环机构需依赖仿真器(如 Gazebo)或自定义硬件组件 + 传动接口
- 传动接口为执行器-关节映射提供标准化插件机制,但需手动集成
📌 设计建议:对于高度耦合的并联机构,建议在硬件抽象层或仿真层实现完整的运动学求解器,而非依赖 URDF mimic 机制。