urlab_bridge

用于 虚幻机器人实验室 (Unreal Robotics Lab, ULab) 的 Python 中间件,即通过 ZeroMQ 将神经网络策略连接到 MuJoCo-in-Unreal 仿真。

运行预训练的运动策略、可视化关节状态和摄像头流,或将所有内容桥接到 ROS 2,即所有操作均可通过单个 Python 包完成。

安装

conda activate hutb_3.11
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# 重新打开cmd
# 递归克隆仓库
git clone https://github.com/donghaiwang/URLab_Bridge.git --recursive

# 推荐 uv,安装方法:https://hellowac.github.io/uv-zh-cn/getting-started/installation/#__tabbed_1_2
cd URLab_Bridge
uv sync                          # 核心依赖 (ZMQ, NumPy, OpenCV, DearPyGui)
# pip install requirements.txt
# 运行策略 (可选):
uv sync --extra policy            # + PyTorch, ONNX 等

cd RoboJuDo
pip install -e .
# uv pip install -e ./RoboJuDo     # 策略框架 (内置的子模块):安装模块 robojudo

仪表盘(关节、传感器、摄像头、执行器控制)无需策略扩展即可正常工作。只有当您需要运行神经网络策略时才需要 RoboJuDo。

需要 Python 3.11 或更高版本。

快速开始

# 启动仪表盘 (关节/传感器/相机查看器、执行器控制、可选策略运行器),注意在关卡中必须放置 AMjManager,否则连接不上
python src/run.py --ui

# 以无头模式(不打开图形界面)运行特定策略
# uv run src/run.py --policy unitree_12dof --prefix g1
python src/run.py --policy unitree_12dof --prefix g1
python src/run.py --policy amo --prefix g1 --twist-source zmq

# 测试 ZMQ 连接
python src/run.py --test --prefix g1

无头模式运行日志:

(nn_3.11) D:\hutb\Unreal\CarlaUE4\Plugins\UnrealRoboticsLab\URLab_Bridge>python src/run.py --policy amo --prefix g1
05-18 08:49:31.805 [DEBUG] [robojudo] ========== robojudo-1.5.0 init done ==========

08:49:31 __main__ INFO — Initializing pipeline: amo @ 50Hz → g1 (twist: keyboard)
05-18 08:49:31.836 [INFO] [robojudo.pipeline.base_pipeline] Using device: cpu
[Environment] Dynamic import of environment: UnrealEnv
05-18 08:49:31.837 [INFO] [robojudo.utils.rotation] base set to pos: [0. 0. 0.], quat: [0. 0. 0. 1.]
08:49:32 urlab_policy.unreal_env INFO — ZMQ state: tcp://127.0.0.1:5555  control: tcp://127.0.0.1:5556
08:49:32 urlab_policy.unreal_env INFO — Using specified articulation prefix: 'g1'
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'left_hip_pitch_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'left_hip_roll_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'left_hip_yaw_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'left_knee_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'left_ankle_pitch_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'left_ankle_roll_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'right_hip_pitch_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'right_hip_roll_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'right_hip_yaw_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'right_knee_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'right_ankle_pitch_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env WARNING —   Joint 'right_ankle_roll_joint' not found in ZMQ stream
08:49:37 urlab_policy.unreal_env INFO —   Mapped 0/12 joints
08:49:56 urlab_policy.unreal_env INFO — ZMQ subscription filtered to prefix: 'g1'
08:49:56 urlab_policy.unreal_env INFO — UnrealEnv ready — prefix='g1', 12 DOFs, control_dt=0.0200s (50Hz)
[Registry][robojudo.controller] KeyboardCtrl, total: 1
[Controller] Dynamic import of controller: KeyboardCtrl
[Registry][robojudo.policy] AMOPolicy, total: 1
[Policy] Dynamic import of policy: AMOPolicy
05-18 08:49:56.327 [DEBUG] [robojudo.policy.base_policy] Loading jit from D:/hutb/Unreal/CarlaUE4/Plugins/UnrealRoboticsLab/URLab_Bridge/RoboJuDo/assets/models/g1/amo/amo_jit.pt...
05-18 08:49:56.381 [DEBUG] [robojudo.tools.dof] [DoF] override default_pos with [-0.1, 0.0, 0.0, 0.3, -0.2, 0.0, -0.1, 0.0, 0.0, 0.3, -0.2, 0.0]
05-18 08:49:56.382 [DEBUG] [robojudo.tools.dof] [DoF] override stiffness with [150, 150, 150, 300, 80, 20, 150, 150, 150, 300, 80, 20]
05-18 08:49:56.382 [DEBUG] [robojudo.tools.dof] [DoF] override damping with [2, 2, 2, 4, 2, 1, 2, 2, 2, 4, 2, 1]
05-18 08:49:56.382 [DEBUG] [robojudo.tools.dof] [DoF] override torque_limits with [88, 139, 88, 139, 50, 50, 88, 139, 88, 139, 50, 50]

可用策略

关键字 机器人 自由度(Degrees of Freedom, DOF) 描述 需要永久人形控制(Perpetual Humanoid Control , PHC)
unitree_12dof G1 12 基本行走——WASD 扭转控制
unitree_wo_gait G1 29 无需步态时钟即可进行全身行走
smooth G1 29 更平稳的步行策略
beyondmimic_dance G1 29 动作模仿——舞蹈 Y
h2h G1 21 人体运动重定向 Y
amo G1 29 自适应运动优化 Y
twist_tracker G1 12 带扭动功能的运动追踪器 Y
go2_wtw Go2 12 沿着这些路行走的崎岖地形

标记为 PHC 的策略需要 RoboJuDo 内部安装 PHC 子模块

ZMQ 协议

URLab 通过 ZeroMQ PUB/SUB 套接字发布二进制打包的数据。所有主题都以划分名称为前缀(例如 g1/)。

主题模式 方向 有效载荷格式
{prefix}/joint/{id} Unreal -> Python <Ifff (ID, pos, vel, acc)
{prefix}/sensor/{name} Unreal -> Python <I ID + <I dim + f*N floats
{prefix}/camera/{name} Unreal -> Python Raw BGRA bytes (dedicated socket)
{prefix}/control Python -> Unreal <I count + (<If)*N (ID, value) pairs
  • 状态套接字(默认 tcp://127.0.0.1:5555):关节和传感器数据,最高采样率达 1000 Hz。
  • 控制套接字(默认 tcp://127.0.0.1:5556):策略发送目标位置。
  • 相机套接字(默认 tcp://127.0.0.1:5558):通过单独的套接字传输高带宽图像流。

ROS 2 桥接

ros2_broadcaster.py 将 ZMQ 流重新发布为标准的 ROS 2 主题(JointState、Image、Float64MultiArray)。需要已加载的 ROS 2 工作空间(Humble/Jazzy)。

source /opt/ros/humble/setup.bash
uv run src/ros2_broadcaster.py

许可证

Apache 2.0 -- see LICENSE.

Copyright 2026 Jonathan Embley-Riches.

相关软件包

该软件包是 Unreal Robotics Lab 的 Python 配套软件包,Unreal Robotics Lab 是一个 Unreal Engine 插件,嵌入了 MuJoCo 物理引擎,用于模拟到现实的机器人研究。