From 5650787ac0c234a08fb6ced5ed2f098ac8bd3fa7 Mon Sep 17 00:00:00 2001 From: "-T.K.-" Date: Tue, 29 Sep 2026 16:20:24 -0700 Subject: [PATCH] Ship the assets in the lite_description package, so a consumer installs them A consumer reached the assets through robot_assets.load(), which downloaded the default branch of this repository into a data/ directory relative to the working directory and never refreshed it. The uv.lock of the consumer pinned only the loader code, so two machines on the same commit could train on different robot models. The lite_biped feet are one example: they went from two box soles to eleven contact spheres, and a machine with an older cache kept the boxes. The assets now sit inside the Python package, at lite_description/robots/, so the wheel carries them and the lock of the consumer pins them. This is the layout of mjlab and specialist_description. The package returns paths rather than loaded models: from lite_description import get_mjcf_path, get_urdf_path mujoco.MjModel.from_xml_path(str(get_mjcf_path("lite_biped"))) The functions carry a get_ prefix, because mjcf_path and urdf_path are the names that callers, and this repository, give to the paths they return. ROBOTS_DIR names that robots/ directory, and VARIANTS comes from it, so no second list can drift. The wheel leaves cad/ out, and the ament install leaves it out as before. The generator stays in the package as lite_description.workflow, because this repository owns the conversion logic. The CAD toolchain stays behind the cad extra, so the base install has no dependencies. The commands are renamed to lite-description-*, and the generator now resolves a variant through the package. An installed package carries no cad/, so the generator stops with an error there instead of writing into site-packages. lite_description.actuators.func becomes lite_description.actuators.modeling. Its functions take the armature and the effort limit as floats instead of a whole spec table, so each signature names what the function reads. The results do not change for any table in the package. The distribution is renamed from robot-assets to lite-description, to match the import name and the ament package. The version goes to 0.5.0, because load() is removed and the actuators API changes. The ament install destination does not change, so $(find lite_description) and package://lite_description/robots/... resolve as before. Only the banner line of each generated file changed, to name the new command. A regeneration of all six variants with --only urdf,mjcf,xacro changes no other line. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_016v8yyJmNp67C8M5rMxHnKF --- .github/workflows/test.yml | 2 +- .gitignore | 7 +- CMakeLists.txt | 18 +- README.md | 83 +++++---- lite_description/__init__.py | 28 +++ .../actuators/__init__.py | 0 .../actuators/damiao.py | 0 .../actuators/ideal.py | 0 .../actuators/modeling.py | 28 +-- .../actuators/robstride.py | 0 .../actuators/sito.py | 0 .../robots}/lite/cad/config.json | 0 .../robots}/lite/cad/joint_properties.json | 0 .../robots}/lite/cad/scad/chest.scad | 0 .../robots}/lite/cad/scad/head.scad | 0 .../robots}/lite/cad/scad/left_fingertip.scad | 0 .../robots}/lite/cad/scad/left_foot.scad | 0 .../robots}/lite/cad/scad/left_hand.scad | 0 .../robots}/lite/cad/scad/left_hip_roll.scad | 0 .../lite/cad/scad/left_knee_pitch.scad | 0 .../lite/cad/scad/left_shoulder_yaw.scad | 0 .../robots}/lite/cad/scad/left_wrist_yaw.scad | 0 .../lite/cad/scad/right_fingertip.scad | 0 .../robots}/lite/cad/scad/right_foot.scad | 0 .../robots}/lite/cad/scad/right_hand.scad | 0 .../robots}/lite/cad/scad/right_hip_roll.scad | 0 .../lite/cad/scad/right_knee_pitch.scad | 0 .../lite/cad/scad/right_shoulder_yaw.scad | 0 .../lite/cad/scad/right_wrist_yaw.scad | 0 .../robots}/lite/cad/scad/torso.scad | 0 .../robots}/lite/cad/scad/waist.scad | 0 .../lite/meshes/visual/chest_visual.stl | Bin .../lite/meshes/visual/head_visual.stl | Bin .../meshes/visual/left_ankle_pitch_visual.stl | Bin .../meshes/visual/left_ankle_yaw_visual.stl | Bin .../meshes/visual/left_elbow_pitch_visual.stl | Bin .../meshes/visual/left_finger1_j1_visual.stl | Bin .../meshes/visual/left_finger1_j2_visual.stl | Bin .../meshes/visual/left_finger1_j3_visual.stl | Bin .../meshes/visual/left_finger1_j4_visual.stl | Bin .../meshes/visual/left_finger2_j1_visual.stl | Bin .../meshes/visual/left_finger2_j2_visual.stl | Bin .../meshes/visual/left_finger2_j3_visual.stl | Bin .../meshes/visual/left_finger2_j4_visual.stl | Bin .../meshes/visual/left_finger3_j1_visual.stl | Bin .../meshes/visual/left_finger3_j2_visual.stl | Bin .../meshes/visual/left_finger3_j3_visual.stl | Bin .../meshes/visual/left_finger3_j4_visual.stl | Bin .../meshes/visual/left_finger4_j1_visual.stl | Bin .../meshes/visual/left_finger4_j2_visual.stl | Bin .../meshes/visual/left_finger4_j3_visual.stl | Bin .../meshes/visual/left_finger4_j4_visual.stl | Bin .../meshes/visual/left_finger5_j1_visual.stl | Bin .../meshes/visual/left_finger5_j2_visual.stl | Bin .../meshes/visual/left_finger5_j3_visual.stl | Bin .../meshes/visual/left_finger5_j4_visual.stl | Bin .../lite/meshes/visual/left_foot_visual.stl | Bin .../lite/meshes/visual/left_hand_visual.stl | Bin .../meshes/visual/left_hip_pitch_visual.stl | Bin .../meshes/visual/left_hip_roll_visual.stl | Bin .../meshes/visual/left_hip_yaw_visual.stl | Bin .../meshes/visual/left_knee_pitch_visual.stl | Bin .../visual/left_shoulder_pitch_visual.stl | Bin .../visual/left_shoulder_roll_visual.stl | Bin .../visual/left_shoulder_yaw_visual.stl | Bin .../meshes/visual/left_wrist_roll_visual.stl | Bin .../meshes/visual/left_wrist_yaw_visual.stl | Bin .../lite/meshes/visual/neck_roll_visual.stl | Bin .../lite/meshes/visual/neck_yaw_visual.stl | Bin .../lite/meshes/visual/pelvis_visual.stl | Bin .../visual/right_ankle_pitch_visual.stl | Bin .../meshes/visual/right_ankle_yaw_visual.stl | Bin .../visual/right_elbow_pitch_visual.stl | Bin .../meshes/visual/right_finger1_j1_visual.stl | Bin .../meshes/visual/right_finger1_j2_visual.stl | Bin .../meshes/visual/right_finger1_j3_visual.stl | Bin .../meshes/visual/right_finger1_j4_visual.stl | Bin .../meshes/visual/right_finger2_j1_visual.stl | Bin .../meshes/visual/right_finger2_j2_visual.stl | Bin .../meshes/visual/right_finger2_j3_visual.stl | Bin .../meshes/visual/right_finger2_j4_visual.stl | Bin .../meshes/visual/right_finger3_j1_visual.stl | Bin .../meshes/visual/right_finger3_j2_visual.stl | Bin .../meshes/visual/right_finger3_j3_visual.stl | Bin .../meshes/visual/right_finger3_j4_visual.stl | Bin .../meshes/visual/right_finger4_j1_visual.stl | Bin .../meshes/visual/right_finger4_j2_visual.stl | Bin .../meshes/visual/right_finger4_j3_visual.stl | Bin .../meshes/visual/right_finger4_j4_visual.stl | Bin .../meshes/visual/right_finger5_j1_visual.stl | Bin .../meshes/visual/right_finger5_j2_visual.stl | Bin .../meshes/visual/right_finger5_j3_visual.stl | Bin .../meshes/visual/right_finger5_j4_visual.stl | Bin .../lite/meshes/visual/right_foot_visual.stl | Bin .../lite/meshes/visual/right_hand_visual.stl | Bin .../meshes/visual/right_hip_pitch_visual.stl | Bin .../meshes/visual/right_hip_roll_visual.stl | Bin .../meshes/visual/right_hip_yaw_visual.stl | Bin .../meshes/visual/right_knee_pitch_visual.stl | Bin .../visual/right_shoulder_pitch_visual.stl | Bin .../visual/right_shoulder_roll_visual.stl | Bin .../visual/right_shoulder_yaw_visual.stl | Bin .../meshes/visual/right_wrist_roll_visual.stl | Bin .../meshes/visual/right_wrist_yaw_visual.stl | Bin .../lite/meshes/visual/waist_pitch_visual.stl | Bin .../lite/meshes/visual/waist_yaw_visual.stl | Bin .../robots}/lite/mjcf/lite.xml | 2 +- .../robots}/lite/urdf/lite.urdf | 2 +- .../robots}/lite/xacro/lite.description.xacro | 4 +- .../robots}/lite/xacro/lite.urdf.xacro | 2 +- .../robots}/lite_bimanual/cad/config.json | 0 .../lite_bimanual/cad/joint_properties.json | 0 .../robots}/lite_bimanual/cad/physics.json | 0 .../lite_bimanual/cad/ros2_control.json | 0 .../robots}/lite_bimanual/cad/scad/chest.scad | 0 .../cad/scad/left_fingertip.scad | 0 .../lite_bimanual/cad/scad/left_hand.scad | 0 .../cad/scad/left_shoulder_yaw.scad | 0 .../cad/scad/left_wrist_yaw.scad | 0 .../cad/scad/right_fingertip.scad | 0 .../lite_bimanual/cad/scad/right_hand.scad | 0 .../cad/scad/right_shoulder_yaw.scad | 0 .../cad/scad/right_wrist_yaw.scad | 0 .../meshes/visual/chest_visual.stl | Bin .../meshes/visual/left_elbow_pitch_visual.stl | Bin .../meshes/visual/left_hand_visual.stl | Bin .../visual/left_shoulder_pitch_visual.stl | Bin .../visual/left_shoulder_roll_visual.stl | Bin .../visual/left_shoulder_yaw_visual.stl | Bin .../meshes/visual/left_wrist_roll_visual.stl | Bin .../meshes/visual/left_wrist_yaw_visual.stl | Bin .../visual/right_elbow_pitch_visual.stl | Bin .../meshes/visual/right_hand_visual.stl | Bin .../visual/right_shoulder_pitch_visual.stl | Bin .../visual/right_shoulder_roll_visual.stl | Bin .../visual/right_shoulder_yaw_visual.stl | Bin .../meshes/visual/right_wrist_roll_visual.stl | Bin .../meshes/visual/right_wrist_yaw_visual.stl | Bin .../lite_bimanual/mjcf/lite_bimanual.xml | 2 +- .../lite_bimanual/urdf/lite_bimanual.urdf | 2 +- .../xacro/lite_bimanual.description.xacro | 4 +- .../xacro/lite_bimanual.ros2_control.xacro | 2 +- .../xacro/lite_bimanual.urdf.xacro | 2 +- .../robots}/lite_biped/cad/config.json | 0 .../lite_biped/cad/joint_properties.json | 0 .../robots}/lite_biped/cad/physics.json | 0 .../robots}/lite_biped/cad/ros2_control.json | 0 .../lite_biped/cad/scad/left_foot.scad | 0 .../lite_biped/cad/scad/left_hip_roll.scad | 0 .../lite_biped/cad/scad/left_knee_pitch.scad | 0 .../lite_biped/cad/scad/right_foot.scad | 0 .../lite_biped/cad/scad/right_hip_roll.scad | 0 .../lite_biped/cad/scad/right_knee_pitch.scad | 0 .../meshes/visual/left_ankle_pitch_visual.stl | Bin .../meshes/visual/left_ankle_yaw_visual.stl | Bin .../meshes/visual/left_foot_visual.stl | Bin .../meshes/visual/left_hip_pitch_visual.stl | Bin .../meshes/visual/left_hip_roll_visual.stl | Bin .../meshes/visual/left_hip_yaw_visual.stl | Bin .../meshes/visual/left_knee_pitch_visual.stl | Bin .../meshes/visual/pelvis_visual.stl | Bin .../visual/right_ankle_pitch_visual.stl | Bin .../meshes/visual/right_ankle_yaw_visual.stl | Bin .../meshes/visual/right_foot_visual.stl | Bin .../meshes/visual/right_hip_pitch_visual.stl | Bin .../meshes/visual/right_hip_roll_visual.stl | Bin .../meshes/visual/right_hip_yaw_visual.stl | Bin .../meshes/visual/right_knee_pitch_visual.stl | Bin .../robots}/lite_biped/mjcf/lite_biped.xml | 2 +- .../lite_biped/mjcf/lite_biped_scene.xml | 0 .../robots}/lite_biped/urdf/lite_biped.urdf | 2 +- .../xacro/lite_biped.description.xacro | 4 +- .../xacro/lite_biped.ros2_control.xacro | 2 +- .../lite_biped/xacro/lite_biped.urdf.xacro | 2 +- .../robots}/lite_biped_debug/cad/config.json | 0 .../cad/joint_properties.json | 0 .../robots}/lite_biped_debug/cad/physics.json | 0 .../lite_biped_debug/cad/ros2_control.json | 0 .../cad/scad/left_foot_palm_debug.scad | 0 .../cad/scad/left_hip_roll.scad | 0 .../cad/scad/left_knee_pitch.scad | 0 .../cad/scad/right_foot_palm_debug.scad | 0 .../cad/scad/right_hip_roll.scad | 0 .../cad/scad/right_knee_pitch.scad | 0 .../meshes/visual/left_ankle_pitch_visual.stl | Bin .../meshes/visual/left_ankle_yaw_visual.stl | Bin .../meshes/visual/left_foot_visual.stl | Bin .../meshes/visual/left_hip_pitch_visual.stl | Bin .../meshes/visual/left_hip_roll_visual.stl | Bin .../meshes/visual/left_hip_yaw_visual.stl | Bin .../meshes/visual/left_knee_pitch_visual.stl | Bin .../meshes/visual/pelvis_visual.stl | Bin .../visual/right_ankle_pitch_visual.stl | Bin .../meshes/visual/right_ankle_yaw_visual.stl | Bin .../meshes/visual/right_foot_visual.stl | Bin .../meshes/visual/right_hip_pitch_visual.stl | Bin .../meshes/visual/right_hip_roll_visual.stl | Bin .../meshes/visual/right_hip_yaw_visual.stl | Bin .../meshes/visual/right_knee_pitch_visual.stl | Bin .../mjcf/lite_biped_debug.xml | 2 +- .../mjcf/lite_biped_debug_scene.xml | 0 .../urdf/lite_biped_debug.urdf | 2 +- .../xacro/lite_biped_debug.description.xacro | 4 +- .../xacro/lite_biped_debug.ros2_control.xacro | 2 +- .../xacro/lite_biped_debug.urdf.xacro | 2 +- .../robots}/lite_dummy/cad/config.json | 0 .../lite_dummy/cad/joint_properties.json | 0 .../robots}/lite_dummy/cad/physics.json | 0 .../robots}/lite_dummy/cad/ros2_control.json | 0 .../robots}/lite_dummy/cad/scad/chest.scad | 0 .../robots}/lite_dummy/cad/scad/head.scad | 0 .../lite_dummy/cad/scad/left_fingertip.scad | 0 .../lite_dummy/cad/scad/left_foot.scad | 0 .../lite_dummy/cad/scad/left_hand.scad | 0 .../lite_dummy/cad/scad/left_hip_roll.scad | 0 .../lite_dummy/cad/scad/left_knee_pitch.scad | 0 .../cad/scad/left_shoulder_yaw.scad | 0 .../lite_dummy/cad/scad/left_wrist_yaw.scad | 0 .../robots}/lite_dummy/cad/scad/pelvis.scad | 0 .../lite_dummy/cad/scad/right_fingertip.scad | 0 .../lite_dummy/cad/scad/right_foot.scad | 0 .../lite_dummy/cad/scad/right_hand.scad | 0 .../lite_dummy/cad/scad/right_hip_roll.scad | 0 .../lite_dummy/cad/scad/right_knee_pitch.scad | 0 .../cad/scad/right_shoulder_yaw.scad | 0 .../lite_dummy/cad/scad/right_wrist_yaw.scad | 0 .../robots}/lite_dummy/cad/scad/torso.scad | 0 .../lite_dummy/meshes/visual/chest_visual.stl | Bin .../lite_dummy/meshes/visual/head_visual.stl | Bin .../meshes/visual/left_elbow_pitch_visual.stl | Bin .../meshes/visual/left_hand_visual.stl | Bin .../visual/left_shoulder_pitch_visual.stl | Bin .../visual/left_shoulder_roll_visual.stl | Bin .../visual/left_shoulder_yaw_visual.stl | Bin .../meshes/visual/left_wrist_roll_visual.stl | Bin .../meshes/visual/left_wrist_yaw_visual.stl | Bin .../meshes/visual/neck_roll_visual.stl | Bin .../meshes/visual/neck_yaw_visual.stl | Bin .../visual/right_elbow_pitch_visual.stl | Bin .../meshes/visual/right_hand_visual.stl | Bin .../visual/right_shoulder_pitch_visual.stl | Bin .../visual/right_shoulder_roll_visual.stl | Bin .../visual/right_shoulder_yaw_visual.stl | Bin .../meshes/visual/right_wrist_roll_visual.stl | Bin .../meshes/visual/right_wrist_yaw_visual.stl | Bin .../robots}/lite_dummy/mjcf/lite_dummy.xml | 2 +- .../robots}/lite_dummy/urdf/lite_dummy.urdf | 2 +- .../xacro/lite_dummy.description.xacro | 4 +- .../xacro/lite_dummy.ros2_control.xacro | 2 +- .../lite_dummy/xacro/lite_dummy.urdf.xacro | 2 +- .../robots}/lite_pro/cad/config.json | 0 .../lite_pro/cad/joint_properties.json | 0 .../robots}/lite_pro/cad/scad/chest.scad | 0 .../robots}/lite_pro/cad/scad/head.scad | 0 .../lite_pro/cad/scad/left_fingertip.scad | 0 .../robots}/lite_pro/cad/scad/left_foot.scad | 0 .../robots}/lite_pro/cad/scad/left_hand.scad | 0 .../lite_pro/cad/scad/left_hip_roll.scad | 0 .../lite_pro/cad/scad/left_knee_pitch.scad | 0 .../lite_pro/cad/scad/left_shoulder_yaw.scad | 0 .../lite_pro/cad/scad/left_wrist_yaw.scad | 0 .../lite_pro/cad/scad/right_fingertip.scad | 0 .../robots}/lite_pro/cad/scad/right_foot.scad | 0 .../robots}/lite_pro/cad/scad/right_hand.scad | 0 .../lite_pro/cad/scad/right_hip_roll.scad | 0 .../lite_pro/cad/scad/right_knee_pitch.scad | 0 .../lite_pro/cad/scad/right_shoulder_yaw.scad | 0 .../lite_pro/cad/scad/right_wrist_yaw.scad | 0 .../robots}/lite_pro/cad/scad/torso.scad | 0 .../robots}/lite_pro/cad/scad/waist.scad | 0 .../lite_pro/meshes/visual/chest_visual.stl | Bin .../lite_pro/meshes/visual/head_visual.stl | Bin .../meshes/visual/left_ankle_pitch_visual.stl | Bin .../meshes/visual/left_ankle_yaw_visual.stl | Bin .../meshes/visual/left_elbow_pitch_visual.stl | Bin .../meshes/visual/left_finger1_j1_visual.stl | Bin .../meshes/visual/left_finger1_j2_visual.stl | Bin .../meshes/visual/left_finger1_j3_visual.stl | Bin .../meshes/visual/left_finger1_j4_visual.stl | Bin .../meshes/visual/left_finger2_j1_visual.stl | Bin .../meshes/visual/left_finger2_j2_visual.stl | Bin .../meshes/visual/left_finger2_j3_visual.stl | Bin .../meshes/visual/left_finger2_j4_visual.stl | Bin .../meshes/visual/left_finger3_j1_visual.stl | Bin .../meshes/visual/left_finger3_j2_visual.stl | Bin .../meshes/visual/left_finger3_j3_visual.stl | Bin .../meshes/visual/left_finger3_j4_visual.stl | Bin .../meshes/visual/left_finger4_j1_visual.stl | Bin .../meshes/visual/left_finger4_j2_visual.stl | Bin .../meshes/visual/left_finger4_j3_visual.stl | Bin .../meshes/visual/left_finger4_j4_visual.stl | Bin .../meshes/visual/left_finger5_j1_visual.stl | Bin .../meshes/visual/left_finger5_j2_visual.stl | Bin .../meshes/visual/left_finger5_j3_visual.stl | Bin .../meshes/visual/left_finger5_j4_visual.stl | Bin .../meshes/visual/left_foot_visual.stl | Bin .../meshes/visual/left_hand_visual.stl | Bin .../meshes/visual/left_hip_pitch_visual.stl | Bin .../meshes/visual/left_hip_roll_visual.stl | Bin .../meshes/visual/left_hip_yaw_visual.stl | Bin .../meshes/visual/left_knee_pitch_visual.stl | Bin .../visual/left_shoulder_pitch_visual.stl | Bin .../visual/left_shoulder_roll_visual.stl | Bin .../visual/left_shoulder_yaw_visual.stl | Bin .../meshes/visual/left_wrist_roll_visual.stl | Bin .../meshes/visual/left_wrist_yaw_visual.stl | Bin .../meshes/visual/neck_roll_visual.stl | Bin .../meshes/visual/neck_yaw_visual.stl | Bin .../lite_pro/meshes/visual/pelvis_visual.stl | Bin .../visual/right_ankle_pitch_visual.stl | Bin .../meshes/visual/right_ankle_yaw_visual.stl | Bin .../visual/right_elbow_pitch_visual.stl | Bin .../meshes/visual/right_finger1_j1_visual.stl | Bin .../meshes/visual/right_finger1_j2_visual.stl | Bin .../meshes/visual/right_finger1_j3_visual.stl | Bin .../meshes/visual/right_finger1_j4_visual.stl | Bin .../meshes/visual/right_finger2_j1_visual.stl | Bin .../meshes/visual/right_finger2_j2_visual.stl | Bin .../meshes/visual/right_finger2_j3_visual.stl | Bin .../meshes/visual/right_finger2_j4_visual.stl | Bin .../meshes/visual/right_finger3_j1_visual.stl | Bin .../meshes/visual/right_finger3_j2_visual.stl | Bin .../meshes/visual/right_finger3_j3_visual.stl | Bin .../meshes/visual/right_finger3_j4_visual.stl | Bin .../meshes/visual/right_finger4_j1_visual.stl | Bin .../meshes/visual/right_finger4_j2_visual.stl | Bin .../meshes/visual/right_finger4_j3_visual.stl | Bin .../meshes/visual/right_finger4_j4_visual.stl | Bin .../meshes/visual/right_finger5_j1_visual.stl | Bin .../meshes/visual/right_finger5_j2_visual.stl | Bin .../meshes/visual/right_finger5_j3_visual.stl | Bin .../meshes/visual/right_finger5_j4_visual.stl | Bin .../meshes/visual/right_foot_visual.stl | Bin .../meshes/visual/right_hand_visual.stl | Bin .../meshes/visual/right_hip_pitch_visual.stl | Bin .../meshes/visual/right_hip_roll_visual.stl | Bin .../meshes/visual/right_hip_yaw_visual.stl | Bin .../meshes/visual/right_knee_pitch_visual.stl | Bin .../visual/right_shoulder_pitch_visual.stl | Bin .../visual/right_shoulder_roll_visual.stl | Bin .../visual/right_shoulder_yaw_visual.stl | Bin .../meshes/visual/right_wrist_roll_visual.stl | Bin .../meshes/visual/right_wrist_yaw_visual.stl | Bin .../meshes/visual/waist_roll_visual.stl | Bin .../meshes/visual/waist_yaw_visual.stl | Bin .../robots}/lite_pro/mjcf/lite_pro.xml | 2 +- .../robots}/lite_pro/urdf/lite_pro.urdf | 2 +- .../lite_pro/xacro/lite_pro.description.xacro | 4 +- .../lite_pro/xacro/lite_pro.urdf.xacro | 2 +- .../workflow/__init__.py | 0 .../workflow/finalize_urdf.py | 2 +- .../workflow/generate.py | 10 +- .../workflow/onshape_to_urdf.py | 4 +- .../workflow/robot_model.py | 27 +-- .../workflow/urdf_to_mjcf.py | 6 +- .../workflow/urdf_to_xacro.py | 2 +- package.xml | 11 +- pyproject.toml | 24 +-- robot_assets/__init__.py | 3 - robot_assets/loader.py | 163 ------------------ tests/conftest.py | 6 +- tests/test_package.py | 27 +++ tests/test_ros2_artifacts.py | 24 ++- tests/test_urdf_to_mjcf.py | 7 +- uv.lock | 80 ++++----- 365 files changed, 266 insertions(+), 364 deletions(-) create mode 100644 lite_description/__init__.py rename {robot_assets => lite_description}/actuators/__init__.py (100%) rename {robot_assets => lite_description}/actuators/damiao.py (100%) rename {robot_assets => lite_description}/actuators/ideal.py (100%) rename robot_assets/actuators/func.py => lite_description/actuators/modeling.py (58%) rename {robot_assets => lite_description}/actuators/robstride.py (100%) rename {robot_assets => lite_description}/actuators/sito.py (100%) rename {robots => lite_description/robots}/lite/cad/config.json (100%) rename {robots => lite_description/robots}/lite/cad/joint_properties.json (100%) rename {robots => lite_description/robots}/lite/cad/scad/chest.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/head.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/left_fingertip.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/left_foot.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/left_hand.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/left_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/left_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/left_shoulder_yaw.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/left_wrist_yaw.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/right_fingertip.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/right_foot.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/right_hand.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/right_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/right_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/right_shoulder_yaw.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/right_wrist_yaw.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/torso.scad (100%) rename {robots => lite_description/robots}/lite/cad/scad/waist.scad (100%) rename {robots => lite_description/robots}/lite/meshes/visual/chest_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/head_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_ankle_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_ankle_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_elbow_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger1_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger1_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger1_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger1_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger2_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger2_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger2_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger2_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger3_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger3_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger3_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger3_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger4_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger4_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger4_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger4_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger5_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger5_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger5_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_finger5_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_foot_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_hand_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_hip_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_hip_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_hip_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_knee_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_shoulder_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_shoulder_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_shoulder_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_wrist_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/left_wrist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/neck_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/neck_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/pelvis_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_ankle_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_ankle_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_elbow_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger1_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger1_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger1_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger1_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger2_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger2_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger2_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger2_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger3_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger3_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger3_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger3_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger4_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger4_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger4_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger4_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger5_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger5_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger5_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_finger5_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_foot_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_hand_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_hip_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_hip_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_hip_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_knee_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_shoulder_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_shoulder_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_shoulder_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_wrist_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/right_wrist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/waist_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite/meshes/visual/waist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite/mjcf/lite.xml (99%) rename {robots => lite_description/robots}/lite/urdf/lite.urdf (99%) rename {robots => lite_description/robots}/lite/xacro/lite.description.xacro (99%) rename {robots => lite_description/robots}/lite/xacro/lite.urdf.xacro (62%) rename {robots => lite_description/robots}/lite_bimanual/cad/config.json (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/joint_properties.json (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/physics.json (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/ros2_control.json (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/scad/chest.scad (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/scad/left_fingertip.scad (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/scad/left_hand.scad (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/scad/left_shoulder_yaw.scad (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/scad/left_wrist_yaw.scad (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/scad/right_fingertip.scad (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/scad/right_hand.scad (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/scad/right_shoulder_yaw.scad (100%) rename {robots => lite_description/robots}/lite_bimanual/cad/scad/right_wrist_yaw.scad (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/chest_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/left_elbow_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/left_hand_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/left_shoulder_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/left_shoulder_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/left_shoulder_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/left_wrist_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/left_wrist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/right_elbow_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/right_hand_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/right_shoulder_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/right_shoulder_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/right_shoulder_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/right_wrist_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/meshes/visual/right_wrist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_bimanual/mjcf/lite_bimanual.xml (99%) rename {robots => lite_description/robots}/lite_bimanual/urdf/lite_bimanual.urdf (99%) rename {robots => lite_description/robots}/lite_bimanual/xacro/lite_bimanual.description.xacro (98%) rename {robots => lite_description/robots}/lite_bimanual/xacro/lite_bimanual.ros2_control.xacro (98%) rename {robots => lite_description/robots}/lite_bimanual/xacro/lite_bimanual.urdf.xacro (86%) rename {robots => lite_description/robots}/lite_biped/cad/config.json (100%) rename {robots => lite_description/robots}/lite_biped/cad/joint_properties.json (100%) rename {robots => lite_description/robots}/lite_biped/cad/physics.json (100%) rename {robots => lite_description/robots}/lite_biped/cad/ros2_control.json (100%) rename {robots => lite_description/robots}/lite_biped/cad/scad/left_foot.scad (100%) rename {robots => lite_description/robots}/lite_biped/cad/scad/left_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite_biped/cad/scad/left_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite_biped/cad/scad/right_foot.scad (100%) rename {robots => lite_description/robots}/lite_biped/cad/scad/right_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite_biped/cad/scad/right_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/left_ankle_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/left_ankle_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/left_foot_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/left_hip_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/left_hip_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/left_hip_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/left_knee_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/pelvis_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/right_ankle_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/right_ankle_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/right_foot_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/right_hip_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/right_hip_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/right_hip_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/meshes/visual/right_knee_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped/mjcf/lite_biped.xml (99%) rename {robots => lite_description/robots}/lite_biped/mjcf/lite_biped_scene.xml (100%) rename {robots => lite_description/robots}/lite_biped/urdf/lite_biped.urdf (99%) rename {robots => lite_description/robots}/lite_biped/xacro/lite_biped.description.xacro (98%) rename {robots => lite_description/robots}/lite_biped/xacro/lite_biped.ros2_control.xacro (98%) rename {robots => lite_description/robots}/lite_biped/xacro/lite_biped.urdf.xacro (88%) rename {robots => lite_description/robots}/lite_biped_debug/cad/config.json (100%) rename {robots => lite_description/robots}/lite_biped_debug/cad/joint_properties.json (100%) rename {robots => lite_description/robots}/lite_biped_debug/cad/physics.json (100%) rename {robots => lite_description/robots}/lite_biped_debug/cad/ros2_control.json (100%) rename {robots => lite_description/robots}/lite_biped_debug/cad/scad/left_foot_palm_debug.scad (100%) rename {robots => lite_description/robots}/lite_biped_debug/cad/scad/left_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite_biped_debug/cad/scad/left_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite_biped_debug/cad/scad/right_foot_palm_debug.scad (100%) rename {robots => lite_description/robots}/lite_biped_debug/cad/scad/right_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite_biped_debug/cad/scad/right_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/left_ankle_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/left_ankle_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/left_foot_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/left_hip_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/left_hip_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/left_hip_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/left_knee_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/pelvis_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/right_ankle_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/right_ankle_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/right_foot_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/right_hip_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/right_hip_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/right_hip_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/meshes/visual/right_knee_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_biped_debug/mjcf/lite_biped_debug.xml (98%) rename {robots => lite_description/robots}/lite_biped_debug/mjcf/lite_biped_debug_scene.xml (100%) rename {robots => lite_description/robots}/lite_biped_debug/urdf/lite_biped_debug.urdf (99%) rename {robots => lite_description/robots}/lite_biped_debug/xacro/lite_biped_debug.description.xacro (98%) rename {robots => lite_description/robots}/lite_biped_debug/xacro/lite_biped_debug.ros2_control.xacro (98%) rename {robots => lite_description/robots}/lite_biped_debug/xacro/lite_biped_debug.urdf.xacro (88%) rename {robots => lite_description/robots}/lite_dummy/cad/config.json (100%) rename {robots => lite_description/robots}/lite_dummy/cad/joint_properties.json (100%) rename {robots => lite_description/robots}/lite_dummy/cad/physics.json (100%) rename {robots => lite_description/robots}/lite_dummy/cad/ros2_control.json (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/chest.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/head.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/left_fingertip.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/left_foot.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/left_hand.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/left_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/left_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/left_shoulder_yaw.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/left_wrist_yaw.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/pelvis.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/right_fingertip.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/right_foot.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/right_hand.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/right_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/right_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/right_shoulder_yaw.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/right_wrist_yaw.scad (100%) rename {robots => lite_description/robots}/lite_dummy/cad/scad/torso.scad (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/chest_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/head_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/left_elbow_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/left_hand_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/left_shoulder_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/left_shoulder_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/left_shoulder_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/left_wrist_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/left_wrist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/neck_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/neck_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/right_elbow_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/right_hand_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/right_shoulder_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/right_shoulder_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/right_shoulder_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/right_wrist_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/meshes/visual/right_wrist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_dummy/mjcf/lite_dummy.xml (99%) rename {robots => lite_description/robots}/lite_dummy/urdf/lite_dummy.urdf (99%) rename {robots => lite_description/robots}/lite_dummy/xacro/lite_dummy.description.xacro (98%) rename {robots => lite_description/robots}/lite_dummy/xacro/lite_dummy.ros2_control.xacro (98%) rename {robots => lite_description/robots}/lite_dummy/xacro/lite_dummy.urdf.xacro (86%) rename {robots => lite_description/robots}/lite_pro/cad/config.json (100%) rename {robots => lite_description/robots}/lite_pro/cad/joint_properties.json (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/chest.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/head.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/left_fingertip.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/left_foot.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/left_hand.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/left_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/left_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/left_shoulder_yaw.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/left_wrist_yaw.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/right_fingertip.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/right_foot.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/right_hand.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/right_hip_roll.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/right_knee_pitch.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/right_shoulder_yaw.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/right_wrist_yaw.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/torso.scad (100%) rename {robots => lite_description/robots}/lite_pro/cad/scad/waist.scad (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/chest_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/head_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_ankle_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_ankle_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_elbow_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger1_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger1_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger1_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger1_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger2_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger2_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger2_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger2_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger3_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger3_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger3_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger3_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger4_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger4_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger4_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger4_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger5_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger5_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger5_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_finger5_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_foot_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_hand_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_hip_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_hip_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_hip_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_knee_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_shoulder_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_shoulder_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_shoulder_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_wrist_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/left_wrist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/neck_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/neck_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/pelvis_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_ankle_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_ankle_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_elbow_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger1_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger1_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger1_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger1_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger2_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger2_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger2_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger2_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger3_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger3_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger3_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger3_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger4_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger4_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger4_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger4_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger5_j1_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger5_j2_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger5_j3_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_finger5_j4_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_foot_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_hand_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_hip_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_hip_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_hip_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_knee_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_shoulder_pitch_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_shoulder_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_shoulder_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_wrist_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/right_wrist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/waist_roll_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/meshes/visual/waist_yaw_visual.stl (100%) rename {robots => lite_description/robots}/lite_pro/mjcf/lite_pro.xml (99%) rename {robots => lite_description/robots}/lite_pro/urdf/lite_pro.urdf (99%) rename {robots => lite_description/robots}/lite_pro/xacro/lite_pro.description.xacro (99%) rename {robots => lite_description/robots}/lite_pro/xacro/lite_pro.urdf.xacro (63%) rename {robot_assets => lite_description}/workflow/__init__.py (100%) rename {robot_assets => lite_description}/workflow/finalize_urdf.py (95%) rename {robot_assets => lite_description}/workflow/generate.py (91%) rename {robot_assets => lite_description}/workflow/onshape_to_urdf.py (96%) rename {robot_assets => lite_description}/workflow/robot_model.py (89%) rename {robot_assets => lite_description}/workflow/urdf_to_mjcf.py (98%) rename {robot_assets => lite_description}/workflow/urdf_to_xacro.py (99%) delete mode 100644 robot_assets/__init__.py delete mode 100644 robot_assets/loader.py create mode 100644 tests/test_package.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 25120a2..1275608 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -65,7 +65,7 @@ jobs: # Each assembly must expand on every backend it supports, not just the # default. Only the real backend emits the per-bus # blocks that the hardware bring-ups depend on. - for assembly in robots/*/xacro/*.urdf.xacro; do + for assembly in lite_description/robots/*/xacro/*.urdf.xacro; do for backend in \ "" \ "use_mock_hardware:=false" \ diff --git a/.gitignore b/.gitignore index 751c5e6..e45adf3 100644 --- a/.gitignore +++ b/.gitignore @@ -15,11 +15,8 @@ wheels/ # Onshape export intermediates (transient; the committed urdf/.urdf hub # is what the generator reuses instead of re-exporting). -robots/*/cad/assets/ -robots/*/cad/robot.pkl - -# load_asset() download cache -data/ +lite_description/robots/*/cad/assets/ +lite_description/robots/*/cad/robot.pkl # colcon build artifacts (when robot_descriptions is built in a ROS workspace) /install/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e941cc..5c3beb2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,12 +3,14 @@ project(lite_description) find_package(ament_cmake REQUIRED) -# Lite variants live under robots// (franka_description layout: package at -# the repo root, per-robot assets in a robots/ subdir). Each ships generated, -# installable artifacts (xacro / urdf / mjcf / meshes). The cad/ subdir holds -# generation INPUTS (Onshape config, joint_properties.json, physics.json, -# ros2_control.json, scad) and is intentionally NOT installed. -# Keep this list in sync with the converter's robot list. +# Lite variants live under lite_description/robots//, inside the Python +# package that ships them in a wheel. They install to +# share/lite_description/robots//, so package:// URLs and $(find ...) do +# not depend on the source layout. Each ships generated, installable artifacts +# (xacro / urdf / mjcf / meshes). The cad/ subdir holds generation INPUTS +# (Onshape config, joint_properties.json, physics.json, ros2_control.json, scad) +# and is intentionally NOT installed. +# The generator's package stage adds each new robot to this list. set(ROBOTS lite lite_bimanual @@ -22,9 +24,9 @@ set(ROBOTS # a model-only robot may have no ros2_control xacro, etc.). foreach(robot ${ROBOTS}) foreach(sub xacro urdf mjcf meshes) - if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/robots/${robot}/${sub}) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/lite_description/robots/${robot}/${sub}) install( - DIRECTORY robots/${robot}/${sub} + DIRECTORY lite_description/robots/${robot}/${sub} DESTINATION share/${PROJECT_NAME}/robots/${robot} ) endif() diff --git a/README.md b/README.md index bd3b4eb..f7de91a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ meshes, all generated from the Onshape CAD. The same source serves both worlds: -- Simulation and RL, through the `robot_assets` Python loader, for Mujoco Lab and Isaac Lab. +- Simulation and RL, through the `lite_description` Python package, for Mujoco Lab and Isaac Lab. - ROS 2, through `ros2_control` and `robot_state_publisher`, as the `lite_description` ament package. @@ -53,27 +53,36 @@ path emits several blocks while the mock and MuJoCo paths share one combined blo ## CAD source Every description is generated from an Onshape assembly (document -`e9ee61a2e2678af2088d9f31`) by the `robot_assets` tool. See -[Re-generating from CAD](#re-generating-from-cad). The files under `robots//` are -build artifacts. Do not hand-edit them. Change the `cad/` inputs and regenerate. +`e9ee61a2e2678af2088d9f31`) by the generator in `lite_description.workflow`. See +[Re-generating from CAD](#re-generating-from-cad). The files under +`lite_description/robots//` are build artifacts. Do not hand-edit them. Change the +`cad/` inputs and regenerate. ## Usage ### Simulation and RL (Python, no ROS toolchain) +The `lite_description` Python package carries every variant, so a simulator or a training +run reaches the assets without a checkout. The package has no dependencies of its own. + ```bash uv add git+https://github.com/Berkeley-Humanoids/Lite-Description.git ``` ```python -from robot_assets import load +import mujoco +from lite_description import VARIANTS, get_mjcf_path, get_urdf_path -urdf_path = load("robots/lite/urdf/lite.urdf") # Isaac Lab -mjcf_path = load("robots/lite_dummy/mjcf/lite_dummy.xml") # MuJoCo +model = mujoco.MjModel.from_xml_path(str(get_mjcf_path("lite_biped"))) # MuJoCo +urdf_path = get_urdf_path("lite") # Isaac Lab ``` -`load()` fetches the requested variant's subtree from this GitHub repo and caches it. No -ROS install is required. +Each function returns a path inside the installed package. A name that is not in +`VARIANTS` raises `ValueError`. A URDF or MJCF reaches its meshes by a path relative to its +own directory, so load the file where it lies instead of copying it out alone. + +The `uv.lock` of the consuming project records the commit of this repository. The assets +thus change only when that project upgrades `lite-description`. No ROS install is required. ### ROS 2 @@ -81,33 +90,36 @@ ROS install is required. repo root. Build it in a ROS 2 workspace, or pull it with `vcs` or `humanoid_control.repos` from `Humanoid Control`, then run `colcon build`. Downstream, `robot_state_publisher` runs xacro on -`robots//xacro/.urdf.xacro`, and +`$(find lite_description)/robots//xacro/.urdf.xacro`, and `package://lite_description/robots//meshes/visual/...` resolves after install. +colcon installs `lite_description/robots//` to +`share/lite_description/robots//` and leaves out `cad/`. ## Repository layout ``` Lite-Description/ # repo root == ament package "lite_description" - package.xml CMakeLists.txt # ament (colcon); installs robots//... - pyproject.toml # pip/uv: builds the robot_assets Python module - robot_assets/ # Python module: load() and the CAD->assets generator + package.xml CMakeLists.txt # ament (colcon); installs lite_description/robots//... + pyproject.toml # pip/uv: builds the lite-description wheel + lite_description/ # Python package + __init__.py # ROBOTS_DIR, VARIANTS, get_urdf_path(), get_mjcf_path() actuators/ # actuator spec tables (velocity/effort/armature) - workflow/ # the generator stages - robots/ # per-variant assets (franka_description-style subdir) - / - xacro/ # ROS entry (GENERATED) - .urdf.xacro # assembly: args, includes, instantiation - .description.xacro # model macro: kinematics, ${mesh_root}, base_link - .ros2_control.xacro # hardware macros: joints, groups, backends - urdf/.urdf # flat URDF (GENERATED; the kinematic HUB) - mjcf/.xml # MJCF (GENERATED; MuJoCo training + deployment sim) - meshes/visual/*.stl # one shared mesh copy - cad/ # generation INPUTS (not installed): - config.json # Onshape document + export options - joint_properties.json # sim tuning: armature / friction / effort_limit - physics.json # MJCF