RMCS 的 RL 部署包。控制进程通过组件接口组装观测,独立策略进程执行 ONNX 推理; 车辆侧消费器负责动作语义、模式切换、限位和电机控制。
| 层 | 文件 | 职责 |
|---|---|---|
| 控制桥 | src/rl_bridge.cpp |
组件接口、观测发布、动作时效与契约门控 |
| 桥配置 | src/rl_bridge/config.cpp |
参数、维数、词条布局的启动检查 |
| 观测与历史 | src/rl_bridge/observation.cpp、observation_history.cpp、observation_timeline.hpp |
单帧观测、历史堆叠、序号时效与复位 |
| 动作通道 | src/rl_bridge/action_channel.cpp |
ROS 回调与控制循环之间传递完整快照,控制循环不等待锁 |
| ROS 策略服务 | src/policy_server.cpp |
订阅观测、发布动作和可选状态 |
| 策略模型 | src/policy/policy_model.cpp |
元数据、模型 ID、归一化、裁剪、有限值检查 |
| 推理后端 | src/policy/onnx_runtime.cpp |
ONNX Runtime 会话、张量形状及执行 |
| 子进程管理 | src/policy_server_launcher.cpp |
启停、退出回收、延时重启 |
| 参数解析 | src/parameters.cpp |
上述组件共用的类型及数值检查 |
组件保持 RMCS 的 .cpp 类布局,构造函数直接注册输出。观测输入类型依赖其他组件的
输出表,在 before_pairing() 中解析。非模板模型实现位于 .cpp,私有头文件放在
src/policy/;控制桥不链接 ONNX Runtime。
| 车辆 | 配置(位于 rmcs_bringup/config) | 消费及控制 |
|---|---|---|
| wheel-leg | wheel-leg-infantry-rl.yaml |
WheelLegRlImu → 桥 → WheelLegRlConsumer → 配对角度环 → 速度 PID → DM MIT 力矩 |
| deformable | deformable-infantry-omni-rl.yaml |
桥 → DeformableRlSuspension → DeformableSuspensionArbiter → 关节控制器 |
wheel-leg 的 IMU 观测使用 Body xyz;关节 offset、配对选弧和机械限位由硬件及车辆控制层管理。 deformable 使用 RF、LF、LB、RB 的策略动作顺序,消费器根据标定把 RL 坐标转换为物理角; RL 未就绪时仲裁器使用传统姿态目标。双下复位经组件接口清除历史、动作及控制状态。
在 ROS 工作区内:
colcon build --merge-install --symlink-install --packages-select rmcs_rl rmcs_core rmcs_bringup
source install/setup.bash使用对应车辆的 bringup 配置启动 RMCS;配置中的 PolicyServerLauncher 自动启动策略进程。
需要独立调试策略进程时,将 launcher 的 autostart 设为 false,再运行:
ros2 run rmcs_rl policy_server --ros-args --params-file <车辆配置.yaml>车辆配置统一放在 rmcs_bringup/config/;旧的、不含完整消费链的 config/executor.yaml 已移除。
模型输入为 float32 obs[batch,N],输出为 float32 actions[batch,M],batch 为 1 或动态。
部署模型须含 rmcs_obs_layout、rmcs_actions_layout;建议带 policy_layout_hash 和版本。
history_length × 单帧维数 = rl_obs_size。归一化均值和标准差必须成对提供,标准差为正数。
新模型先核对训练的观测顺序、坐标、基准角、缩放和频率,再盖章:
bash src/rmcs_rl/tool/stamp_model.sh <模型.onnx> --config <车辆配置.yaml> --version <版本>按工具输出同步 policy_server.rl_model_path、rl_bridge.expected_model_id,然后验证:
python3 src/rmcs_rl/tool/check_policy_contract.py <模型.onnx> --config <车辆配置.yaml> --node rl_bridge --expect-model-id <ID>盖章只写元数据;布局匹配不能证明训练侧的坐标或动作含义正确。 更新模型或配置后重启 RMCS。模型或布局不匹配会锁存拒绝动作,需要重启恢复。
当前 models/deformable_sps_V2.onnx 缺少 rmcs_obs_layout 和 rmcs_actions_layout,
完整契约检查与策略服务会拒绝它。这是已有模型的部署缺口,需核对训练契约后补元数据;
不能只按张量维数推断其含义。
<rl_base>/obs、<rl_base>/action:两个进程间的 ROS 消息。<rl_base>/policy_status:可选模型身份和推理耗时信息。- 控制进程内部使用组件接口
<rl_base>/valid、healthy、action_age和配置的动作输出。 - 动作必须对应最近两次有效观测之一且未超时;复位前的动作不能重新获得控制权。
invalid_value可选nan、zero、hold;实际车辆使用"nan"让消费器处理失效。
tool/ 仅保留模型校验、盖章和依赖安装工具。离线模型生成及回归放在 test/,
不安装到部署目录;合成模型不用于实车启动。历史临时脚本与生成报告可从 Git 历史获取。
colcon build --merge-install --symlink-install --packages-select rmcs_rl rmcs_core --cmake-args -DBUILD_TESTING=ON
colcon test --merge-install --packages-select rmcs_rl rmcs_core
PYTHON=<带 onnx、onnxruntime、PyYAML 的 Python> bash src/rmcs_rl/test/test_layout_contract.shC++ 回归覆盖推理归一化、历史帧与跨线程动作快照;Python 回归覆盖布局解析、盖章及错误契约拒绝。 车辆包保留 DM 使能、帧解码、闭链几何、Body IMU 以及 MuJoCo 查看器回归。