mirror of
https://github.com/huggingface/lerobot.git
synced 2026-07-09 11:01:53 +00:00
add pico teleoperator, add sonic VR support
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Copyright 2026 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.
|
||||
|
||||
"""CLI/self-test shim for the live ``rt/smpl`` SONIC reference stream.
|
||||
|
||||
The implementation now lives in the installed package so it can be shared with the
|
||||
``pico_headset`` teleoperator:
|
||||
``lerobot.robots.unitree_g1.smpl_stream``. This example re-exports it (so
|
||||
``from smpl_stream import SmplStream`` keeps working next to ``sonic.py``) and adds a
|
||||
standalone smoke-test entrypoint.
|
||||
|
||||
Example:
|
||||
python examples/unitree_g1/smpl_stream.py --smpl-host 127.0.0.1 --smpl-port 5560
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import time
|
||||
|
||||
import numpy as np
|
||||
|
||||
from lerobot.robots.unitree_g1.smpl_stream import (
|
||||
DEFAULT_SMPL_HOST,
|
||||
DEFAULT_SMPL_PORT,
|
||||
SMPL_OBS_DIM,
|
||||
SMPL_TOPIC,
|
||||
SmplStream,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
"DEFAULT_SMPL_HOST",
|
||||
"DEFAULT_SMPL_PORT",
|
||||
"SMPL_OBS_DIM",
|
||||
"SMPL_TOPIC",
|
||||
"SmplStream",
|
||||
]
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--smpl-host", default=DEFAULT_SMPL_HOST)
|
||||
parser.add_argument("--smpl-port", type=int, default=DEFAULT_SMPL_PORT)
|
||||
parser.add_argument("--ticks", type=int, default=250, help="control ticks to sample")
|
||||
args = parser.parse_args()
|
||||
|
||||
stream = SmplStream(host=args.smpl_host, port=args.smpl_port)
|
||||
print(f"Subscribed to {SMPL_TOPIC} @ tcp://{args.smpl_host}:{args.smpl_port}")
|
||||
print("Start pico_manager_thread_server.py --manager on the publisher host.")
|
||||
try:
|
||||
for t in range(args.ticks):
|
||||
w = stream.step()
|
||||
assert w.shape == (SMPL_OBS_DIM,), w.shape
|
||||
if t % 25 == 0:
|
||||
print(
|
||||
f" t={t} idx={stream._last_index} window_norm={np.linalg.norm(w):.3f} "
|
||||
f"first={stream.has_data}"
|
||||
)
|
||||
time.sleep(1.0 / 50.0)
|
||||
finally:
|
||||
stream.close()
|
||||
print("OK: rt/smpl stream yields SONIC-format 720-vec windows.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user