mirror of
https://github.com/huggingface/lerobot.git
synced 2026-07-22 09:21:53 +00:00
fix relative imports
This commit is contained in:
@@ -14,20 +14,29 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import onnxruntime as ort
|
|
||||||
from huggingface_hub import hf_hub_download
|
from huggingface_hub import hf_hub_download
|
||||||
|
|
||||||
from lerobot.robots.unitree_g1.g1_utils import (
|
from lerobot.utils.import_utils import _onnxruntime_available, require_package
|
||||||
|
|
||||||
|
from ..g1_utils import (
|
||||||
REMOTE_AXES,
|
REMOTE_AXES,
|
||||||
REMOTE_BUTTONS,
|
REMOTE_BUTTONS,
|
||||||
G1_29_JointIndex,
|
G1_29_JointIndex,
|
||||||
get_gravity_orientation,
|
get_gravity_orientation,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if TYPE_CHECKING or _onnxruntime_available:
|
||||||
|
import onnxruntime as ort
|
||||||
|
else:
|
||||||
|
ort = None
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@@ -83,6 +92,7 @@ class GrootLocomotionController:
|
|||||||
control_dt = CONTROL_DT # Expose for unitree_g1.py
|
control_dt = CONTROL_DT # Expose for unitree_g1.py
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
require_package("onnxruntime", extra="unitree_g1")
|
||||||
# Load policies
|
# Load policies
|
||||||
self.policy_balance, self.policy_walk = load_groot_policies()
|
self.policy_balance, self.policy_walk = load_groot_policies()
|
||||||
|
|
||||||
|
|||||||
@@ -14,21 +14,34 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import onnx
|
|
||||||
import onnxruntime as ort
|
|
||||||
from huggingface_hub import hf_hub_download
|
from huggingface_hub import hf_hub_download
|
||||||
|
|
||||||
from lerobot.robots.unitree_g1.g1_utils import (
|
from lerobot.utils.import_utils import _onnx_available, _onnxruntime_available, require_package
|
||||||
|
|
||||||
|
from ..g1_utils import (
|
||||||
REMOTE_AXES,
|
REMOTE_AXES,
|
||||||
G1_29_JointArmIndex,
|
G1_29_JointArmIndex,
|
||||||
G1_29_JointIndex,
|
G1_29_JointIndex,
|
||||||
get_gravity_orientation,
|
get_gravity_orientation,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if TYPE_CHECKING or _onnxruntime_available:
|
||||||
|
import onnxruntime as ort
|
||||||
|
else:
|
||||||
|
ort = None
|
||||||
|
|
||||||
|
if TYPE_CHECKING or _onnx_available:
|
||||||
|
import onnx
|
||||||
|
else:
|
||||||
|
onnx = None
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
DEFAULT_ANGLES = np.zeros(29, dtype=np.float32)
|
DEFAULT_ANGLES = np.zeros(29, dtype=np.float32)
|
||||||
@@ -101,6 +114,8 @@ class HolosomaLocomotionController:
|
|||||||
control_dt = CONTROL_DT # Expose for unitree_g1.py
|
control_dt = CONTROL_DT # Expose for unitree_g1.py
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
require_package("onnxruntime", extra="unitree_g1")
|
||||||
|
require_package("onnx", extra="unitree_g1")
|
||||||
# Load policy and gains
|
# Load policy and gains
|
||||||
self.policy, self.kp, self.kd = load_policy()
|
self.policy, self.kp, self.kd = load_policy()
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
"""SONIC planner pipeline: ONNX enc/dec/planner, movement state, and input helpers."""
|
"""SONIC planner pipeline: ONNX enc/dec/planner, movement state, and input helpers."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
import math
|
import math
|
||||||
import queue
|
import queue
|
||||||
import select
|
import select
|
||||||
@@ -26,15 +28,22 @@ import time
|
|||||||
import tty
|
import tty
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import onnxruntime as ort
|
|
||||||
|
|
||||||
from lerobot.robots.unitree_g1.g1_utils import (
|
from lerobot.utils.import_utils import _onnxruntime_available
|
||||||
|
|
||||||
|
from ..g1_utils import (
|
||||||
G1_29_JointIndex,
|
G1_29_JointIndex,
|
||||||
get_gravity_orientation,
|
get_gravity_orientation,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if TYPE_CHECKING or _onnxruntime_available:
|
||||||
|
import onnxruntime as ort
|
||||||
|
else:
|
||||||
|
ort = None
|
||||||
|
|
||||||
# ── Constants ────────────────────────────────────────────────────────────────
|
# ── Constants ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
DEFAULT_ANGLES = np.array(
|
DEFAULT_ANGLES = np.array(
|
||||||
@@ -419,7 +428,7 @@ def replan_interval(mode):
|
|||||||
return REPLAN_INTERVAL["default"]
|
return REPLAN_INTERVAL["default"]
|
||||||
|
|
||||||
|
|
||||||
def _ort_providers(force_cpu: bool = False) -> list[str]:
|
def ort_providers(force_cpu: bool = False) -> list[str]:
|
||||||
"""Prefer CUDA for enc/dec/planner (matches deploy when onnxruntime-gpu is installed)."""
|
"""Prefer CUDA for enc/dec/planner (matches deploy when onnxruntime-gpu is installed)."""
|
||||||
avail = ort.get_available_providers()
|
avail = ort.get_available_providers()
|
||||||
if not force_cpu and "CUDAExecutionProvider" in avail:
|
if not force_cpu and "CUDAExecutionProvider" in avail:
|
||||||
@@ -471,7 +480,7 @@ class MovementSnapshot:
|
|||||||
facing: tuple[float, float, float] = (1.0, 0.0, 0.0)
|
facing: tuple[float, float, float] = (1.0, 0.0, 0.0)
|
||||||
|
|
||||||
|
|
||||||
def _snapshot_ms(ms: MovementState) -> MovementSnapshot:
|
def snapshot_ms(ms: MovementState) -> MovementSnapshot:
|
||||||
md, fd = ms.movement_direction, ms.facing_direction
|
md, fd = ms.movement_direction, ms.facing_direction
|
||||||
return MovementSnapshot(ms.mode, ms.speed, ms.height, (md[0], md[1], md[2]), (fd[0], fd[1], fd[2]))
|
return MovementSnapshot(ms.mode, ms.speed, ms.height, (md[0], md[1], md[2]), (fd[0], fd[1], fd[2]))
|
||||||
|
|
||||||
@@ -738,7 +747,7 @@ def _build_planner_inputs(ctx, ms_dict, version, seed):
|
|||||||
def _planner_worker(path, req_q, res_q, stop_evt, version, seed, use_gpu):
|
def _planner_worker(path, req_q, res_q, stop_evt, version, seed, use_gpu):
|
||||||
so = ort.SessionOptions()
|
so = ort.SessionOptions()
|
||||||
so.log_severity_level = 3
|
so.log_severity_level = 3
|
||||||
providers = _ort_providers(force_cpu=not use_gpu)
|
providers = ort_providers(force_cpu=not use_gpu)
|
||||||
sess = ort.InferenceSession(path, sess_options=so, providers=providers)
|
sess = ort.InferenceSession(path, sess_options=so, providers=providers)
|
||||||
while not stop_evt.is_set():
|
while not stop_evt.is_set():
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -16,14 +16,19 @@
|
|||||||
|
|
||||||
"""SONIC full-body controller for Unitree G1."""
|
"""SONIC full-body controller for Unitree G1."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import onnxruntime as ort
|
|
||||||
from huggingface_hub import hf_hub_download
|
from huggingface_hub import hf_hub_download
|
||||||
|
|
||||||
from lerobot.robots.unitree_g1.controllers.sonic_pipeline import (
|
from lerobot.utils.import_utils import _onnxruntime_available, require_package
|
||||||
|
|
||||||
|
from ..g1_utils import lowstate_to_obs
|
||||||
|
from .sonic_pipeline import (
|
||||||
CONTROL_DT,
|
CONTROL_DT,
|
||||||
DEBUG_PRINT_EVERY,
|
DEBUG_PRINT_EVERY,
|
||||||
DEFAULT_ANGLES,
|
DEFAULT_ANGLES,
|
||||||
@@ -33,14 +38,18 @@ from lerobot.robots.unitree_g1.controllers.sonic_pipeline import (
|
|||||||
MovementState,
|
MovementState,
|
||||||
PlannerController,
|
PlannerController,
|
||||||
SonicPlanner,
|
SonicPlanner,
|
||||||
_ort_providers,
|
|
||||||
_snapshot_ms,
|
|
||||||
clamp_mode_params,
|
clamp_mode_params,
|
||||||
compute_kp_kd,
|
compute_kp_kd,
|
||||||
|
ort_providers,
|
||||||
process_joystick,
|
process_joystick,
|
||||||
should_replan_request,
|
should_replan_request,
|
||||||
|
snapshot_ms,
|
||||||
)
|
)
|
||||||
from lerobot.robots.unitree_g1.g1_utils import lowstate_to_obs
|
|
||||||
|
if TYPE_CHECKING or _onnxruntime_available:
|
||||||
|
import onnxruntime as ort
|
||||||
|
else:
|
||||||
|
ort = None
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -89,11 +98,12 @@ class SonicRuntime:
|
|||||||
"""Shared SONIC control loop state (standalone demo + locomotion controller)."""
|
"""Shared SONIC control loop state (standalone demo + locomotion controller)."""
|
||||||
|
|
||||||
def __init__(self, force_cpu: bool = False):
|
def __init__(self, force_cpu: bool = False):
|
||||||
|
require_package("onnxruntime", extra="unitree_g1")
|
||||||
planner_path = hf_hub_download(repo_id="nvidia/GEAR-SONIC", filename="planner_sonic.onnx")
|
planner_path = hf_hub_download(repo_id="nvidia/GEAR-SONIC", filename="planner_sonic.onnx")
|
||||||
encoder_path = hf_hub_download(repo_id="nvidia/GEAR-SONIC", filename="model_encoder.onnx")
|
encoder_path = hf_hub_download(repo_id="nvidia/GEAR-SONIC", filename="model_encoder.onnx")
|
||||||
decoder_path = hf_hub_download(repo_id="nvidia/GEAR-SONIC", filename="model_decoder.onnx")
|
decoder_path = hf_hub_download(repo_id="nvidia/GEAR-SONIC", filename="model_decoder.onnx")
|
||||||
|
|
||||||
providers = _ort_providers(force_cpu=force_cpu)
|
providers = ort_providers(force_cpu=force_cpu)
|
||||||
self.use_gpu = providers[0] == "CUDAExecutionProvider"
|
self.use_gpu = providers[0] == "CUDAExecutionProvider"
|
||||||
so = ort.SessionOptions()
|
so = ort.SessionOptions()
|
||||||
so.log_severity_level = 3
|
so.log_severity_level = 3
|
||||||
@@ -113,7 +123,7 @@ class SonicRuntime:
|
|||||||
|
|
||||||
self.step = 0
|
self.step = 0
|
||||||
self.replan_timer = 0.0
|
self.replan_timer = 0.0
|
||||||
self.last_ms = _snapshot_ms(self.ms)
|
self.last_ms = snapshot_ms(self.ms)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def pipeline(self):
|
def pipeline(self):
|
||||||
@@ -134,7 +144,7 @@ class SonicRuntime:
|
|||||||
self.planner.request_replan(self.controller.ref_cursor, self.ms)
|
self.planner.request_replan(self.controller.ref_cursor, self.ms)
|
||||||
self.replan_timer = 0.0
|
self.replan_timer = 0.0
|
||||||
self.ms.needs_replan = False
|
self.ms.needs_replan = False
|
||||||
self.last_ms = _snapshot_ms(self.ms)
|
self.last_ms = snapshot_ms(self.ms)
|
||||||
|
|
||||||
do_enc = self.step % ENCODER_UPDATE_EVERY == 0
|
do_enc = self.step % ENCODER_UPDATE_EVERY == 0
|
||||||
if debug is None:
|
if debug is None:
|
||||||
@@ -155,7 +165,7 @@ class SonicRuntime:
|
|||||||
self.controller.playing = True
|
self.controller.playing = True
|
||||||
self.step = 0
|
self.step = 0
|
||||||
self.replan_timer = 0.0
|
self.replan_timer = 0.0
|
||||||
self.last_ms = _snapshot_ms(self.ms)
|
self.last_ms = snapshot_ms(self.ms)
|
||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
self.planner.stop_subprocess()
|
self.planner.stop_subprocess()
|
||||||
|
|||||||
@@ -123,6 +123,8 @@ _pyrealsense2_available = is_package_available("pyrealsense2") or is_package_ava
|
|||||||
"pyrealsense2-macosx", import_name="pyrealsense2"
|
"pyrealsense2-macosx", import_name="pyrealsense2"
|
||||||
)
|
)
|
||||||
_zmq_available = is_package_available("pyzmq", import_name="zmq")
|
_zmq_available = is_package_available("pyzmq", import_name="zmq")
|
||||||
|
_onnxruntime_available = is_package_available("onnxruntime")
|
||||||
|
_onnx_available = is_package_available("onnx")
|
||||||
_hebi_available = is_package_available("hebi-py", import_name="hebi")
|
_hebi_available = is_package_available("hebi-py", import_name="hebi")
|
||||||
_teleop_available = is_package_available("teleop")
|
_teleop_available = is_package_available("teleop")
|
||||||
_placo_available = is_package_available("placo")
|
_placo_available = is_package_available("placo")
|
||||||
|
|||||||
Reference in New Issue
Block a user