7. 系统集成
控制器不是孤立公式。真正做机器人项目时,你需要把控制器接到仿真器、ROS2、运动规划、强化学习策略或 VLA 动作接口上。这一章梳理常见接线方式。
7.1 控制接口
接任何控制器前,先明确:
- 输入是什么?
- 输出是什么?
- 运行频率是多少?
常见输入:
- 目标关节角
- 目标关节速度
- 目标末端位姿
- 目标底盘速度
- 参考轨迹
- 当前关节状态、IMU、力传感器、视觉估计
常见输出:
- 位置命令
- 速度命令
- 力矩命令
- 电流命令
- 底盘线速度 / 角速度
频率不匹配是机器人系统里非常常见的问题。VLA 可能 5Hz 出动作,底层电机控制可能 1kHz 运行。中间必须有动作保持、插值、滤波或轨迹生成。
7.2 ROS2 control
ros2_control 可以理解为 ROS2 里的控制器和硬件接口框架。它把上层控制器和底层硬件解耦:
MoveIt 2 / 控制节点
|
v
controller_manager
|
v
controller
|
v
hardware_interface
|
v
真实电机 / 仿真假硬件
在 MoveIt 2 基础与运动规划 里,机械臂轨迹会交给 ros2_control 里的控制器执行。真实项目里,你需要配置:
- 关节列表
- 控制器类型
- command interface,例如 position / velocity / effort
- state interface,例如 position / velocity
- 控制器启动和激活流程
7.3 MoveIt 2 接口
MoveIt 2 主要负责规划,不负责底层电机闭环。
典型链路:
目标末端位姿
-> MoveIt 2 规划关节轨迹
-> trajectory controller
-> ros2_control hardware interface
-> 仿真或真机
如果你发现 MoveIt 2 里轨迹规划成功,但机器人不动,优先检查:
- 控制器是否启动。
- 控制器名字是否和 MoveIt 配置一致。
- 关节名是否完全匹配。
- command interface 是否匹配。
- 轨迹时间戳是否合理。
- 当前 joint state 是否发布。
规划成功只是上半场,控制器执行成功才是完整闭环。
7.4 仿真接口
仿真器通常提供两类接口:
- 直接写控制输入,例如
data.ctrl[:] = torque_cmd。 - 配置 actuator,让仿真器内部做位置 / 速度 / 力矩控制。
做控制器学习时,推荐先从显式控制开始:
while sim_running:
q = read_joint_position()
dq = read_joint_velocity()
torque = pd_control(q_des, dq_des, q, dq, kp, kd)
data.ctrl[joint_id] = torque
mujoco.mj_step(model, data)
这样你能清楚看到每个控制周期发生了什么。等控制器稳定后,再接更复杂的 actuator、ROS2 bridge 或策略模型。
7.5 RL 策略接口
强化学习策略不一定直接输出底层力矩。常见动作空间包括:
| 策略输出 | 底层控制器 | 常见场景 |
|---|---|---|
| 目标关节角 | PD | 四足 locomotion |
| 目标关节角残差 | PD + residual | 在参考步态上微调 |
| 目标速度 | 速度控制 / MPC | 移动机器人 |
| 末端位姿 | IK + 轨迹控制 | 机械臂操作 |
| 直接力矩 | 力矩控制 | 高动态仿真策略 |
让策略输出目标关节角,再由 PD 执行,是一种很常见的工程折中:策略负责高层协调,PD 负责高频稳定。
7.6 VLA 动作接口
VLA 可能输出:
- 末端位姿增量
- 离散动作 token
- 一段 action chunk
- 夹爪开合命令
- 自然语言子目标
这些动作通常不能直接进入电机。中间需要动作适配层:
VLA 动作
-> 动作反归一化
-> 坐标系转换
-> 限幅和安全检查
-> IK / 轨迹生成
-> 控制器执行
VLA 系统的稳定性,很大一部分取决于这个动作适配层是否清楚。模型输出错一点时,控制器和安全层要能阻止错误被放大成危险动作。
7.7 调试顺序
不要一上来就把所有模块连起来。更稳的顺序是:
- 单独验证传感器读数和单位。
- 单独验证执行器命令方向和限幅。
- 跑单关节 PD。
- 跑多关节定点控制。
- 跑轨迹跟踪。
- 接运动规划器。
- 接 RL / VLA 策略。
- 最后再上真机,并从低速、低增益、安全区域开始。
如果系统不稳定,先把上层策略断开,用固定目标验证底层控制。不要在控制器还没稳定时调模型输出。