This repo contains both Booster K1 paths used by ROSClaw:
- a real-hardware ROS 2 workspace and DDS setup for the physical Booster K1
- an Isaac Sim 5.x/OpenClaw helper runtime for the simulated Booster K1
External code is referenced as git submodules. Local modifications for those
external repos are kept as patch files under patches/ and are applied by the
setup script.
dds-profile.xml: project-root Fast DDS profile aligned with the robot and this hostsetup-dds-env.sh: shell setup that removes Conda from the active environment and exports the Fast DDS profilereal-hardware/: ROS 2 workspace used for the host-side SDK, DDS tests, and relay packagereal-hardware/src/booster_robotics_sdk_ros2: upstream Booster ROS 2 SDK as a git submodulereal-hardware/src/rosclaw-ros2-autonomy: ROSClaw autonomy overlay as a git submodulereal-hardware/src/k1_low_level_relay: robot-local relay package for republishing bare DDS low-level topics as ROS 2 topics under/k1simulators/isaac-sim/: Docker/WebRTC helper scripts for the K1 Isaac Sim runtimeisaac-sim-runtime/: local Isaac Sim 5.x runtime entrypoint used by the simulator helperexternal/: submodules used by the simulator setup scriptpatches/: reproducible local modifications applied to external submodules
Initialize the Booster SDK submodule if needed:
git submodule update --init -- \
real-hardware/src/booster_robotics_sdk_ros2 \
real-hardware/src/rosclaw-ros2-autonomyOr use the helper in real-hardware-only mode:
./scripts/setup_external_environment.sh --real-hardware-onlyThat path initializes only the real-hardware/src/* submodules and leaves the
optional simulator/OpenClaw development submodules untouched.
Source the DDS environment from the repo root:
source ./setup-dds-env.shThat script:
- removes Conda Python paths and environment variables
- sources ROS 2 Humble and the
real-hardwareoverlay if it has been built - selects
rmw_fastrtps_cpp - points Fast DDS at the project-root
dds-profile.xml
Current real-hardware state:
- Host-side discovery works for the main Booster RPC services.
- Safe RPC calls to the robot were verified from the host.
- Bare DDS state topics such as
/low_statedid not deliver reliably to the host directly. - The
k1_low_level_relaypackage worked as a robot-local workaround and republished state topics that the host could read as/k1/low_stateand/k1/joint_states.
The detailed investigation notes and test results are in
real-hardware/DDS_HOST_MATCH_REPORT.md.
Launch the host-side K1 stack with:
./real-hardware/bringup_openclaw_k1.shThat wrapper now defaults to the repo-local K1 ROSClaw config under
real-hardware/src/k1_cmd_vel_bridge/config/k1 instead of relying on a patched
external submodule and, when rosclaw_autonomy is built in the local
real-hardware overlay, starts rosclaw_autonomy a few seconds after
rosclaw_bringup.
When the visionOS backend is enabled, the bringup script now also prints a
small OpenClaw preflight summary so duplicate plugin IDs, an empty
plugins.allow, or an unhealthy gateway are visible before the app starts
timing out.
To probe the backend from the host that is actually serving visionOS requests:
python3 ./real-hardware/probe_visionos_backend.py --base-url http://192.168.2.126:8088That probe now prints a compact state summary as well, including whether the
backend sees a live Nav2 /navigate_to_pose action server.
Useful overrides for that bringup path include:
VISIONOS_OPENCLAW_AGENT_IDVISIONOS_OPENCLAW_SESSION_IDVISIONOS_OPENCLAW_TIMEOUT_SECONDS
For a quick autonomy message sanity check after sourcing the overlay, prefer a
real import over ros2 pkg prefix:
python3 -c "from rosclaw_autonomy_msgs.msg import AutonomyMode, RobotBelief"
ros2 pkg prefix rosclaw_autonomyBuild the local real-hardware overlay with autonomy on top of the existing
rosclaw-ros2 install:
source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash
cd real-hardware
colcon build --packages-select rosclaw_autonomy_msgs rosclaw_autonomyIf /rosclaw/manifest shows the full graph but ros2 topic list only shows a
small subset, the robot is usually fine and the local ROS 2 daemon is stale or
was started from a different DDS environment.
After sourcing ./setup-dds-env.sh, either:
ros2 daemon stop
ros2 topic listor query the graph directly:
ros2 topic list --no-daemon
ros2 service list --no-daemon
ros2 node list --no-daemonAfter cloning, initialize the simulator external repos and apply the local K1 integration patches:
./scripts/setup_external_environment.shIf this checkout already has copied vendor directories from earlier local experiments, replace them with submodule-backed symlinks:
./scripts/setup_external_environment.sh --force-vendor-linksThe setup script does the following:
- initializes the Booster K1 RL/assets, ROSClaw ROS 2, ROSClaw plugin, and Booster ROS 2 SDK submodules
- links
isaac-sim-runtime/vendor/booster_assetsandisaac-sim-runtime/vendor/booster_trainto the Booster K1 RL submodule - applies
patches/booster-k1-rl-runtime-overrides.patchto the Booster K1 RL submodule - applies
patches/rosclaw-ros2-k1-bringup.patchto the ROSClaw ROS 2 submodule - applies
patches/rosclaw-plugin-k1-openclaw.patchto the ROSClaw plugin submodule - syncs the patched ROSClaw plugin into
~/.openclaw/extensions/rosclawwhen that default OpenClaw install exists
Those submodule working-tree modifications are intentionally local setup state.
Do not commit dirty submodule changes; commit changes to the patch files here
instead.
The optional external development submodules are marked with ignore = dirty
so a real-hardware-only workflow does not keep the superproject permanently
dirty.
Use the setup script instead of a blanket recursive submodule update. The
upstream Booster K1 RL repo currently contains a nested booster_assets
submodule URL that points at a local absolute path; this repo tracks
https://github.com/BoosterRobotics/booster_assets as a top-level submodule to
make fresh checkouts portable.
A default OpenClaw install needs the K1 ROSClaw transport profile before it can drive this simulator:
./simulators/isaac-sim/scripts/configure_openclaw_k1.shThat script points the ROSClaw plugin at ws://127.0.0.1:9090, sets the robot
name to Booster K1, sets the namespace to /k1, installs conservative K1
safety limits, and leaves unrelated OpenClaw auth/provider settings alone.
To undo the K1 profile and return OpenClaw to a non-K1 configuration:
./simulators/isaac-sim/scripts/unconfigure_openclaw_k1.shStart the verified WebRTC simulator stack:
./simulators/isaac-sim/scripts/run_k1_isaac_sim.sh --mode webrtcStart with a local Isaac Sim GUI:
xhost +local:root
./simulators/isaac-sim/scripts/run_k1_isaac_sim.sh --mode guiStop containers started by the helper:
./simulators/isaac-sim/scripts/stop_k1_isaac_sim.shThe default simulator mode is K1_CONTROLLER_MODE=kinematic_gait. It keeps the
full-body K1 upright, responds to streamed /k1/cmd_vel, and publishes odom.
Dynamic policy mode remains available for checkpoint diagnostics but is not the
verified default.
The following are local setup/build artifacts and are ignored:
isaac-sim-runtime/vendor/booster_assetsisaac-sim-runtime/vendor/booster_trainisaac-sim-runtime/logsreal-hardware/wsreal-hardware/buildreal-hardware/installreal-hardware/log- generated real-hardware env/XML/log files
- local
.pt,.pth, and.onnxcheckpoint experiments