工业控制器到 ros2_control 的分层映射与流式模式
从传统工业控制器转到 ros2_control,最容易犯两类映射错误:把规划层的输出想成一组角度,把流式接口想成控制器层整体外翻。本文以工业控制器的两条链路(运动程序→运动控制→伺服)为参照系,给出到 ros2_control 的精确分层对应,并讨论流式模式的真实边界与恒力控制的两条实现路线。适合有运动控制背景、正在接入 ros2_control 的读者。ros2_control 的架构与角色划分见本站《ros2_control 控制器架构与 chainable 机制》。
工业链路的两个精化
精化一:规划输出是轨迹流,不是一组角度。 MoveJ/MoveL 进规划/插补层后,输出是「每个插补周期一个关节设定点」的 q(t) 流,带时间戳。两者的区别在插补空间:
- MoveJ:目标点过一次 IK 得到关节目标,中间点在关节空间连线;
- MoveL:直线路径在笛卡尔空间密采样,每个采样点逐次过 IK。
精化二:上行下行分清。 下行给伺服的是设定点(setpoint),EtherCAT CSP 模式下是每总线周期的目标位置计数;编码器值是上行反馈,回到控制器算跟随误差。伺服内环(电流→速度→位置三重嵌套,4–40 kHz)完全在驱动器固件里,控制器只能触达最外一环——工业臂通常只开放位置环。
工业 ↔ ros2_control 分层映射
| 工业控制器 | ros2_control |
|---|---|
| 运动程序(RAPID/KRL,MoveJ/MoveL) | 应用节点(如力控任务的调度节点) |
| 运动控制的规划段 | MoveIt,输出 JointTrajectory(10–100 Hz 密度的 waypoint 序列) |
| 运动控制的插补段 | joint_trajectory_controller(JTC),waypoint 间样条插补,100 Hz–1 kHz,归入控制器层 |
| 伺服分配(EtherCAT CSP) | hardware_interface,command interface 每周期写入 |
| 伺服三环(kHz 级) | 原封不动,仍在驱动器 |
关键差异:工业控制器把规划、插补、伺服分配打在一个盒子里;ros2_control 把规划(MoveIt)与插补(JTC)拆开,且插补明确归入控制器层。JTC 因此能作为 chainable controller 上游:MoveIt 给粗轨迹,JTC 插补成每周期设定点,admittance 在插补之后、进硬件之前插入力修正——力控应用(「走轨迹靠插补、接触力靠导纳」一类)正好架在这条缝上。
流式模式:暴露的是入口,不是整层
自研控制器的流式接口(外部周期性喂设定点/修正量),等价关系是「暴露控制器层的参考输入边界 + 规划上移到应用侧」,两处精确化:
- 对外暴露的只是参考输入边界,硬件侧 command interface 永不外露。控制器层在流式模式下没有消失,而是退化为三件事:细插补(流式点间平滑/lookahead,如 UR
servoJ的 smoothing、RSI 的 correction 插值)、安全限幅(关节限位、速度/加速度、工作空间——外部流不可信,必须复核)、伺服环。 - 「规划上移」的准确说法是「规划上移、插补留守」:路径生成与时间参数化移到应用侧,点间插补和安全检查留在控制器内。
ros2_control 侧的等价物:JTC 订阅 /joint_trajectory 话题就是流式接口,MoveIt 或应用节点是流的生成者;话题数据经 RealtimeBuffer 穿过实时边界进 update();JTC 的 cmd_timeout(从轨迹末点起算、为零则停用)对应工业流式通道的看门狗(RSI 断流即停)。同一条实时边界问题,两套生态各自实现。
恒力控制的实现分叉
同样的力控需求(FT 传感器 + 导纳模型),有两条架构路线:
- 外部流式路线:FT 读取与导纳计算放应用侧节点,以流式修正量喂控制器。工业界 RSI/EGM 做力控的经典姿势,不用改控制器;代价是控制环确定性受流式通道抖动制约,典型周期 4–20 ms。
- 控制器层内置路线:admittance_controller 作为 chainable controller 住在 ros2_control 里,100 Hz 确定性更新,力数据经 RealtimeBuffer 进实时循环。Humble 版控制律没有期望力参数,F_des 注入需要二次开发(完整过程见本站《AdmittanceController 恒力控制二次开发踩坑记》)。
一个工程判断:接触力控制这类需要确定性约束的场景,主路线选控制器层内置;外部流式适合原型验证和快速换算法的阶段。选型时「自带流式接口的控制器 + 外部导纳节点」仍是备选,与内置路线的取舍点在通道抖动指标。
要点
- 规划层的输出永远是带时间戳的轨迹流;MoveJ 关关节空间、MoveL 关笛卡尔空间,区别只在插补空间和 IK 调用次数。
- 下行是设定点、上行是编码器反馈;伺服三环在驱动器里,控制器只碰得到最外环。
- ros2_control 相比工业盒子多拆一层:MoveIt 管规划、JTC 管插补,插补属于控制器层。
- 流式接口 = 控制器层参考输入边界外放,控制器退化为细插补 + 限幅 + 伺服;规划上移、插补留守。
- JTC → admittance 的级联缝(reference interfaces 同周期传递、不经话题)是力控注入点,也是
update()实时契约(无堆分配、无锁、无系统调用)存在的理由。
导纳控制本身的算法定位与 PI 控制的对比见本站《导纳控制与 PI 控制:力控算法的定位与对比》;admittance_controller 源码层的走查见本站《AdmittanceController 源码精读与全流程走查》。