Skip to content

Add G1 Wuji teleop example#699

Open
supinelay wants to merge 1 commit into
NVIDIA:mainfrom
LightwheelAI:lightwheel/wuji_teleop
Open

Add G1 Wuji teleop example#699
supinelay wants to merge 1 commit into
NVIDIA:mainfrom
LightwheelAI:lightwheel/wuji_teleop

Conversation

@supinelay

@supinelay supinelay commented Jun 24, 2026

Copy link
Copy Markdown

Description

Add a self-contained G1-Wuji teleoperation example under examples/g1_wuji_teleop.

The example wires AVP + MANUS and VR/PICO + MANUS input into the G1-Wuji robot and Wuji hand
retargeting workflow without modifying the underlying CloudXR, WebXR, MANUS plugin, or Televiz
runtime code.

Changes include:

  • Add examples/g1_wuji_teleop example package and CMake entry.
  • Add AVP + MANUS and VR/PICO + MANUS example configurations.
  • Add the Python example runtime for input streaming, transforms, retargeting, robot control,
    and scene setup.
  • Add G1-Wuji USD asset, Wuji hand URDFs, meshes, and retargeting configs.
  • Add setup and run documentation under examples/g1_wuji_teleop/docs/setup.md.

Fixes: N/A

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Testing

Tested locally on Linux.

Commands run:

PYTHONPATH=examples/g1_wuji_teleop/python \
  python -m compileall -q examples/g1_wuji_teleop/python

git diff --check nvidia/main..HEAD

SKIP=check-copyright-year pre-commit run --all-files

Result: passed.

Notes:

- No C++ files are touched in the current PR version, so clang-format was not applicable.
- This branch does not include examples/g1_wuji_teleop/python_tests, so pytest was not run.
- Runtime hardware validation with AVP/PICO, MANUS, and G1-Wuji hardware will be performed
  separately.

## Checklist

- [x] I have read and understood the CONTRIBUTING.md
- [x] I have run the linter and formatter with SKIP=check-copyright-year pre-commit run --all-
  files

- [x] I have made corresponding changes to the documentation
- [ ] I have added tests that prove my fix/feature works, or explained why not
- [x] I have signed off all my commits (git commit -s) per CONTRIBUTING.md#signing-your-work

@github-actions

Copy link
Copy Markdown
Contributor

📝 Docs preview is not auto-deployed for fork PRs.

A maintainer with write access to NVIDIA/IsaacTeleop can deploy a preview by
commenting /preview-docs on this PR. Once deployed, the preview
will live at:

https://nvidia.github.io/IsaacTeleop/preview/pr-699/

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 2ddbcb61-48d1-4762-b836-69a1b459be5b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR introduces a complete G1-Wuji AVP+MANUS teleoperation example for Isaac Teleop. It adds a new examples/g1_wuji_teleop directory containing: left/right Wuji hand URDF models (5-finger kinematic chains), Git LFS pointers for all STL meshes and USD robot assets, YAML retargeting configs (local DexPilot and official MANUS Wuji), and a Python package implementing TeleopMain (AVP+MANUS session stream), WujiOfficialManusHandRetargeter (upstream wuji-retargeting wrapper), AvpRobotFrameBinding (calibration state machine), G1WujiSceneConfig (Isaac Lab scene), and a standalone 3D visualizer. Supporting changes include an avp_manus.sh runbook, a WebXR AVP controller shim in CloudXRComponent.tsx with debug overlay in App.tsx/CloudXRUI.tsx, a --disable-optical-wrist flag for the MANUS C++ plugin, a QuadLayer Python binding fix using lambdas, and repo config updates (gitattributes, gitignore, gitmodules, REUSE.toml, submodule pin).

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.07% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding a new G1 Wuji teleoperation example.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@avp_manus.sh`:
- Around line 170-172: The final demo launch command uses an invalid config path
that will not resolve from a normal repo checkout. Update the config argument in
the main teleop command in avp_man.sh to use a repo-relative path or the correct
full IsaacTeleop path, and make sure the g1_wuji_teleop_main.py invocation still
points to the avp_manus.yml config correctly.

In `@examples/g1_wuji_teleop/python/g1_wuji_teleop/devices/avp_manus_stream.py`:
- Around line 53-58: The retargeter state path in
FIXED_G1_WUJI_RETARGET_DEFAULTS is hardcoded to a shared /tmp filename, which
can collide across runs and be abused via pre-created symlinks. Update the
left/right parameter_config_path entries in avp_manus_stream.py to generate a
unique file per process in a private runtime directory instead of using fixed
/tmp/...json names, and route the code that consumes these defaults to use the
generated path via the existing default config structure.

In `@examples/g1_wuji_teleop/python/g1_wuji_teleop/paths.py`:
- Around line 32-37: resolve_repo_relative_path currently checks app_root() but
never actually falls back to repo_root(), so repo-relative paths are resolved
from the wrong base. Update this function to first try the app_root()-based path
and, if it does not exist, resolve the same relative_path against repo_root()
instead; keep the behavior centered on resolve_repo_relative_path, app_root(),
and repo_root() so the fallback is clear and correct.

In `@examples/g1_wuji_teleop/python/g1_wuji_teleop/robots/g1_wuji/debug_viz.py`:
- Around line 350-378: The frame marker updater only handles "left" and "right",
so head markers are skipped and never refreshed. Update
update_frame_axis_markers() to also process the "head" key (or otherwise make
the side iteration configurable) so update_head_marker() can pass {"head":
head_pose} and still drive frame_markers.visualize for handles.head_link_frame.

In `@examples/g1_wuji_teleop/python/g1_wuji_teleop/robots/g1_wuji/runtime.py`:
- Around line 1002-1017: The early return in runtime.py’s hand retargeting path
is too strict: the current left_input/right_input check in the logic around
_last_left_skeleton, _last_right_skeleton, and _waiting_announced blocks updates
for one side when only the other side is missing. Change the fallback flow so
each hand is processed independently using its own skeleton or last-known value,
and only skip the side that truly has no usable input instead of returning both
_last_left_targets and _last_right_targets together. Keep the waiting message in
the same retargeting helper, but gate it on both sides being unavailable rather
than one side missing.

In `@examples/g1_wuji_teleop/python/g1_wuji_teleop/viz/teleop_visualizer.py`:
- Line 24: The teleop visualizer is hardcoding a shared MPLCONFIGDIR under /tmp,
which should be replaced with a uniquely created per-user/per-process cache
directory. Update teleop_visualizer.py where
os.environ.setdefault("MPLCONFIGDIR", ...) is set so it points to a freshly
created private temp directory for each run, using a location derived from the
current process/user rather than a fixed /tmp/matplotlib path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: a2eb2022-8fea-477e-9c9e-c6423d590ccb

📥 Commits

Reviewing files that changed from the base of the PR and between 7002ed6 and 25c9ff6.

📒 Files selected for processing (147)
  • .gitattributes
  • .gitignore
  • .gitmodules
  • AGENTS.md
  • REUSE.toml
  • avp_manus.sh
  • deps/cloudxr/webxr_client/helpers/react/CloudXRComponent.tsx
  • deps/cloudxr/webxr_client/src/App.tsx
  • deps/cloudxr/webxr_client/src/CloudXRUI.tsx
  • examples/g1_wuji_teleop/README.md
  • examples/g1_wuji_teleop/assets/g1_wuji/g1_three_fingers.usd
  • examples/g1_wuji_teleop/assets/g1_wuji/g1_wuji.usd
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger1_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger2_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger3_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger4_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/finger5_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/palm_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/left/palm_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger1_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger2_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger3_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger4_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_link1.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_link1_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_link2.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_link2_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_link3.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_link3_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_link4.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_link4_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_tip_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/finger5_tip_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/palm_link.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/meshes/right/palm_link_collision.STL
  • examples/g1_wuji_teleop/assets/wuji_hand/urdf/left.urdf
  • examples/g1_wuji_teleop/assets/wuji_hand/urdf/right.urdf
  • examples/g1_wuji_teleop/config/avp_manus.yml
  • examples/g1_wuji_teleop/config/local/g1_wuji/hand_left_config.yml
  • examples/g1_wuji_teleop/config/local/g1_wuji/hand_right_config.yml
  • examples/g1_wuji_teleop/config/official/g1_wuji/manus_wuji_left.yaml
  • examples/g1_wuji_teleop/config/official/g1_wuji/manus_wuji_right.yaml
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/__init__.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/cli.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/devices/avp_manus_stream.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/hand_retargeting/__init__.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/hand_retargeting/base.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/hand_retargeting/wuji_official_adapter.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/paths.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/robots/g1_wuji/__init__.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/robots/g1_wuji/debug_viz.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/robots/g1_wuji/runtime.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/robots/g1_wuji/scene.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/session.py
  • examples/g1_wuji_teleop/python/g1_wuji_teleop/viz/teleop_visualizer.py
  • examples/g1_wuji_teleop/scripts/g1_wuji_teleop_main.py
  • examples/g1_wuji_teleop/scripts/g1_wuji_teleop_visualizer.py
  • examples/teleop/CMakeLists.txt
  • examples/teleop/python/pyproject.toml
  • scripts/setup_v2d_src.sh
  • src/plugins/manus/app/main.cpp
  • src/plugins/manus/core/inc/manus/manus_hand_tracking_plugin.hpp
  • src/plugins/manus/core/manus_hand_tracking_plugin.cpp
  • src/viz/python/layers_bindings.cpp
  • src/viz/python_tests/test_offscreen_session.py
  • third_party/wuji-retargeting

Comment thread avp_manus.sh Outdated
Comment thread examples/g1_wuji_teleop/python/g1_wuji_teleop/devices/avp_manus_stream.py Outdated
Comment thread examples/g1_wuji_teleop/python/g1_wuji_teleop/paths.py Outdated
Comment thread examples/g1_wuji_teleop/python/g1_wuji_teleop/robots/g1_wuji/debug_viz.py Outdated
Comment thread examples/g1_wuji_teleop/python/g1_wuji_teleop/robots/g1_wuji/runtime.py Outdated
Comment thread examples/g1_wuji_teleop/python/g1_wuji_teleop/viz/teleop_visualizer.py Outdated
@supinelay supinelay force-pushed the lightwheel/wuji_teleop branch 2 times, most recently from 6047d99 to 99c3146 Compare June 30, 2026 11:42
@supinelay

Copy link
Copy Markdown
Author

Updated the PR to a single example-only commit.

The current diff is limited to CMakeLists.txt and examples/g1_wuji_teleop/**. The previous lower-layer changes to
CloudXR/WebXR, MANUS plugin bindings, Televiz bindings, debug visualizer code, run scripts, and the third_party/wuji- retargeting submodule were removed.

Most CodeRabbit inline comments now refer to files that no longer exist in the current PR version:

  • avp_manus.sh
  • devices/avp_manus_stream.py
  • paths.py
  • robots/g1_wuji/debug_viz.py
  • viz/teleop_visualizer.py

Signed-off-by: lei.hu <lei.hu@git.lightwheel.ai>
@supinelay supinelay force-pushed the lightwheel/wuji_teleop branch from 99c3146 to 8816f3f Compare July 2, 2026 07:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant