Wiki
命令转发与控制模式
Existing English translations were reused. 17 current source blocks remain in Simplified Chinese, without triggering paid translation.
命令接口定义物理语义,控制器定义目标怎样变成接口值,硬件后端负责实际执行。
1.示例 1:位置命令转发
ros2 topic pub --once /forward_position_controller/commands \
std_msgs/msg/Float64MultiArray "{data: [0.3, -0.2]}"
回调保存消息;update 检查目标数量,再调用借用接口的 set_value。它没有替每个设备自动设计 PID。
2.三种常用命令接口
| 接口 | 旋转关节单位 | 后端通常需要完成什么 |
|---|---|---|
| position | rad | 跟踪位置目标 |
| velocity | rad/s | 跟踪速度目标 |
| effort | N·m | 执行力矩目标 |
直线关节分别为 m、m/s、N。电流不等于力矩,设备协议传电流时需要明确换算。
3.示例 2:为何只改 interface_name 不够
TwoJointSystem 只提供 position 命令。将 YAML 改为 velocity 后,控制器无法取得不存在的资源。要支持速度模式,需要同时改变 URDF、设备实现、反馈处理和控制器配置。
完整速度模式实例见DiffBot与差速底盘控制。那里差速控制器给轮子 velocity 命令,设备再返回位置与速度。
3.1.命令与反馈的闭环在哪里
模拟硬件的响应来自 read 中的教学模型。位置伺服驱动器通常在设备内部闭环;effort 控制则可能要求上层根据反馈计算力矩。明确闭环位置后,才能选择控制器。
4.示例 3:数组顺序与非法输入
Float64MultiArray 的数值顺序对应 YAML 的 joints。两个关节需要两个目标。错误长度可能使控制器报告 ERROR;只能在模拟工程中做这种对照实验,随后检查状态并恢复。
自编控制器还会检查 NaN 和范围,见从零编写控制器。消息类型只约束数据结构,不会自动验证业务范围。
源码:ros2_controllers/forward_command_controller/src/forward_controllers_base.cpp。分别定位 on_configure、接口配置、on_activate 与 update,不把接收消息和下发设备命令混为同一步。
返回 Jazzy 总览 · 上一篇:状态广播与机器人显示 · 下一篇:Joint-Trajectory-Controller