Robotics Workbench
Tool 09 · Descriptor-driven ros2_control

Go2 ros2_control
验证台

这里运行的不再是孤立的关节发布器:go2_mock.yaml 描述机器人、硬件插件、控制器和 Lifecycle supervisor,再由同一个 Launch 图拉起 controller_manager、Robot State Publisher 与 RViz2。

scenarioGO2_MOCK
ROSHUMBLE
manager/go2/controller_manager
lifecycleUNKNOWN
PRIMARY VIEW · LOCAL :6080

受 ros2_control 驱动的 Go2 · 真实 RViz2

正在确认本地预览环境,准备加载 noVNC 桌面。

CHECKING 在新窗口打开 RViz
RVIZ2 / NOVNC 等待本机 :6080 先运行 ./bin/site.sh ros2-serve 4000
RViz2 从 /go2/robot_description、/go2/joint_state_broadcaster/joint_states 和 /go2/tf 观察同一套受管 ROS 图。 :6080 RViz · :7681 shell
Managed launch graph

一个场景描述文件,拉起完整控制图

场景 ID 决定 xacro、控制器参数、硬件插件、命名空间与可视化配置;严格校验通过后才生成 Launch actions。

01 · DESCRIPTORgo2_mock.yamlrobot · limits · controllers · lifecycle
02 · DESCRIPTIONxacro → robot_description官方 Go2 URDF + ros2_control tag
03 · RESOURCE OWNER/go2/controller_manager加载硬件、申领接口、切换控制器
HARDWARE SYSTEMGo2MockSystemmock_components/GenericSystem当前是理想回显硬件,不代表动力学或实体 Go2
STATE CONTROLLERjoint_state_broadcaster/go2/joint_state_broadcaster/joint_states读取 12 个 position / velocity 状态接口
COMMAND CONTROLLERgo2_position_controller/go2/control/position_command → supervisor/go2/go2_position_controller/commands按关节名校验并排序,再申领 12 个 position command interfaces
joint_state_broadcasterrobot_state_publisher/go2/tfRViz2 / Web
LIFECYCLE SUPERVISOR/go2/control_supervisor

负责控制器激活 / 停用、命令 watchdog 与故障锁存;不会绕过 Controller Manager 直接伪造 JointState。

MODE
WAITING
HARDWARE
Go2MockSystem
JOINT STATE
UNKNOWN
POSITION
UNKNOWN
BOOTunconfigured参数已声明,尚未接管控制器
STANDBYinactive状态广播 active,命令接口已释放
RUNNINGactive两控制器 active,才允许发布命令
FAULTlatched overlay停止发布并尝试停用;确认恢复后才可 reset
ros2_control 在线诊断只有 Lifecycle active、无 fault、control_ready 且两个控制器 active 时才显示 LIVE OFFLINE
还没有收到受管控制图的遥测;这里会严格校验 :9090 的只读 v2 契约。
MANAGED JOINT TELEMETRY

Unitree Go2 · 12 关节受管状态

AWAITING CONTROL

数值来自 joint_state_broadcaster,而不是独立的网页动画或直接 JointState publisher;运动画面以上方 RViz2 为准。

LEGHIPTHIGHCALF
FLfront left+0.000 rad+0.000 rad+0.000 rad
FRfront right+0.000 rad+0.000 rad+0.000 rad
RLrear left+0.000 rad+0.000 rad+0.000 rad
RRrear right+0.000 rad+0.000 rad+0.000 rad
WS://127.0.0.1:9090等待 controller_manager启动后无需刷新页面
RATE
— Hz
AGE
— ms
Descriptor-selected launch

选择场景并启动完整控制图

入口会按场景描述加载 Go2 xacro、ros2_control hardware、两个控制器、Lifecycle supervisor、RViz2、noVNC 与只读诊断服务。

ROS2_CONTROL_SCENARIO=go2_mock ./bin/site.sh ros2-serve 4000

集成方式:新增机器人时提供一份受校验的 scenario YAML、对应 xacro / URDF 和控制器参数;接真实硬件或仿真时,把 mock_components/GenericSystem 替换为实现 ros2_control 接口的 hardware plugin。上层 Controller Manager、Lifecycle 状态约束与观察链路可以继续复用。

Integration slots

每一层都有明确的替换边界

SCENARIO

描述文件选择

go2_mock.yaml 固定模型、关节顺序、限制、控制器与命名空间,避免散落在启动脚本中。

HARDWARE

SystemInterface 插件

当前 GenericSystem 只做理想状态回显;后续可接 Gazebo、MuJoCo adapter 或实体硬件实现。

CONTROL

Controller Manager

控制器通过标准接口申领硬件资源;Lifecycle supervisor 只通过管理服务切换其状态。

OBSERVABILITY

RSP / TF / RViz2

Robot State Publisher 消费 broadcaster 输出并生成 TF;可选 RViz2 + noVNC、SSH -Y / XQuartz、Foxglove bridge 或 rosbag / URDF 静态播放作为观察端。

RECOVERY

STANDBY / FAULT

停用时释放命令接口;watchdog 触发故障锁存,reset 后仍需显式 activate 才恢复。

Runtime boundary

能证明什么,以及不能证明什么

本地已观察

标准 Controller Manager 管理 12 个 position command interfaces,两个控制器状态、Lifecycle 状态与 Go2 RViz2 画面来自同一容器内 ROS 图。

仍不在结论内

GenericSystem 不是接触动力学或真实执行器;GPU 加速、真实相机、串口 / USB、实体 Go2 DDS、跨机器及公网访问也未由本页验证。

终端写入边界

/workspace 是宿主仓库的读写 bind mount,文件修改会持久化;容器根文件系统只读,且没有 Docker socket。

网络边界

:6080、:7681、:9090 只绑定回环地址,不应反向代理到局域网或公网。