Skip to content

Wiki

命令转发与控制模式

About 3 min read

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