mirror of
https://github.com/huggingface/lerobot.git
synced 2026-07-23 17:56:07 +00:00
4f2ef024d8
* move locomotion from examples to robot, move controller to teleoperator class * modify teleoperate to send back actions to robot * whole body controller * add holosoma to locomotros * various updates * update joint zeroing etc * ensure safefail with locomotion * add unitree locomotion * launch camera from g1 server * publish at varying framerates * fix async read in camera * attempting to fix camera lag * test camera speedup * training * inference works * remove logging from pi0 * remove logging * push local changes * testing * final changes * revert control_utils * revert utils * revert * revert g1 * revert again: * revert utils * push recents * remove examples * remove junk * remove mjlog * revergt edit_dataset * Update lerobot_edit_dataset.py Signed-off-by: Martino Russi <77496684+nepyope@users.noreply.github.com> * undo teleop changes * revert logging * remove loggings * remove loogs * revert dataset tools * Update dataset_tools.py Signed-off-by: Martino Russi <77496684+nepyope@users.noreply.github.com> * move gravity to utils * revert changes * remove matplotlib viewer (rerun works fine) * factory revert * send policy action directly * recent changes * implement flexible action space * send empty command if arms are missing * rename locomotion to controller * add init * implement feedback * add feedback for teleoperator * fix ruff * fix ruff * use read_latest * fix zmq camera * revert exo_serial * simplify PR * revert exo_changes * revert camera_zmq * Update camera_zmq.py Signed-off-by: Martino Russi <77496684+nepyope@users.noreply.github.com> * remove frame duplication from zmq server * revert channerfactoryinitialize * keep channelfactoryinitialize * remove zeroing out logic * fix typo * refactor teleop class * simplify teleop further * import armindex at the top * fix visualizer again * revert ik helper * push stuff * simplify image_server * update image_server * asd * add threading logic * simplify ik helper stuff * simplify holosoma * fix names * fix docs * revert leg override * clean connect * fix controller * fix ruff * clean teleoperator * set_from_wireless * avoid double initializations * refactor robot class * fix pre-commit * update docs * update docs format * add teleop instructions * unitree_g1 specific exception in record/teleoperate * add thumbnail to docs * add thumbnail to doc * refactor(unitree): multiple improvements (#3103) * refactor(unitree): multiple improvements * test(unitree): added tests + improved installation instructions * refactor(robots): minor changes unitree robot kinematic * chore(robots): rename g1 kinematics file --------- Signed-off-by: Martino Russi <77496684+nepyope@users.noreply.github.com> Signed-off-by: Steven Palma <imstevenpmwork@ieee.org> Co-authored-by: Steven Palma <imstevenpmwork@ieee.org> Co-authored-by: Steven Palma <steven.palma@huggingface.co>
119 lines
3.3 KiB
Python
119 lines
3.3 KiB
Python
#!/usr/bin/env python
|
|
|
|
# Copyright 2025 The HuggingFace Inc. team. All rights reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import importlib
|
|
from enum import IntEnum
|
|
|
|
import numpy as np
|
|
|
|
# ruff: noqa: N801, N815
|
|
|
|
NUM_MOTORS = 29
|
|
|
|
REMOTE_AXES = ("remote.lx", "remote.ly", "remote.rx", "remote.ry")
|
|
REMOTE_BUTTONS = tuple(f"remote.button.{i}" for i in range(16))
|
|
REMOTE_KEYS = REMOTE_AXES + REMOTE_BUTTONS
|
|
|
|
|
|
def default_remote_input() -> dict[str, float]:
|
|
"""Return a zeroed-out remote input dict (axes + buttons)."""
|
|
return dict.fromkeys(REMOTE_KEYS, 0.0)
|
|
|
|
|
|
def get_gravity_orientation(quaternion: list[float] | np.ndarray) -> np.ndarray:
|
|
"""Get gravity orientation from quaternion [w, x, y, z]."""
|
|
qw, qx, qy, qz = quaternion
|
|
gravity_orientation = np.zeros(3, dtype=np.float32)
|
|
gravity_orientation[0] = 2 * (-qz * qx + qw * qy)
|
|
gravity_orientation[1] = -2 * (qz * qy + qw * qx)
|
|
gravity_orientation[2] = 1 - 2 * (qw * qw + qz * qz)
|
|
return gravity_orientation
|
|
|
|
|
|
class G1_29_JointArmIndex(IntEnum):
|
|
# Left arm
|
|
kLeftShoulderPitch = 15
|
|
kLeftShoulderRoll = 16
|
|
kLeftShoulderYaw = 17
|
|
kLeftElbow = 18
|
|
kLeftWristRoll = 19
|
|
kLeftWristPitch = 20
|
|
kLeftWristYaw = 21
|
|
|
|
# Right arm
|
|
kRightShoulderPitch = 22
|
|
kRightShoulderRoll = 23
|
|
kRightShoulderYaw = 24
|
|
kRightElbow = 25
|
|
kRightWristRoll = 26
|
|
kRightWristPitch = 27
|
|
kRightWristYaw = 28
|
|
|
|
|
|
def make_locomotion_controller(name: str | None):
|
|
"""Instantiate a locomotion controller by class name. Returns None if name is None."""
|
|
if name is None:
|
|
return None
|
|
controllers = {
|
|
"GrootLocomotionController": "lerobot.robots.unitree_g1.gr00t_locomotion",
|
|
"HolosomaLocomotionController": "lerobot.robots.unitree_g1.holosoma_locomotion",
|
|
}
|
|
module_path = controllers.get(name)
|
|
if module_path is None:
|
|
raise ValueError(f"Unknown controller: {name!r}. Available: {list(controllers)}")
|
|
module = importlib.import_module(module_path)
|
|
return getattr(module, name)()
|
|
|
|
|
|
class G1_29_JointIndex(IntEnum):
|
|
# Left leg
|
|
kLeftHipPitch = 0
|
|
kLeftHipRoll = 1
|
|
kLeftHipYaw = 2
|
|
kLeftKnee = 3
|
|
kLeftAnklePitch = 4
|
|
kLeftAnkleRoll = 5
|
|
|
|
# Right leg
|
|
kRightHipPitch = 6
|
|
kRightHipRoll = 7
|
|
kRightHipYaw = 8
|
|
kRightKnee = 9
|
|
kRightAnklePitch = 10
|
|
kRightAnkleRoll = 11
|
|
|
|
kWaistYaw = 12
|
|
kWaistRoll = 13
|
|
kWaistPitch = 14
|
|
|
|
# Left arm
|
|
kLeftShoulderPitch = 15
|
|
kLeftShoulderRoll = 16
|
|
kLeftShoulderYaw = 17
|
|
kLeftElbow = 18
|
|
kLeftWristRoll = 19
|
|
kLeftWristPitch = 20
|
|
kLeftWristYaw = 21
|
|
|
|
# Right arm
|
|
kRightShoulderPitch = 22
|
|
kRightShoulderRoll = 23
|
|
kRightShoulderYaw = 24
|
|
kRightElbow = 25
|
|
kRightWristRoll = 26
|
|
kRightWristPitch = 27
|
|
kRightWristYaw = 28
|