2025-06-05 17:48:43 +02:00
|
|
|
# Copyright 2024 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.
|
|
|
|
|
|
2025-08-11 11:07:55 +02:00
|
|
|
from enum import Enum
|
|
|
|
|
|
2025-06-05 17:48:43 +02:00
|
|
|
from .config import TeleoperatorConfig
|
|
|
|
|
from .teleoperator import Teleoperator
|
|
|
|
|
|
|
|
|
|
|
2025-08-11 11:07:55 +02:00
|
|
|
class TeleopEvents(Enum):
|
|
|
|
|
"""Shared constants for teleoperator events across teleoperators."""
|
|
|
|
|
|
|
|
|
|
SUCCESS = "success"
|
|
|
|
|
FAILURE = "failure"
|
|
|
|
|
RERECORD_EPISODE = "rerecord_episode"
|
|
|
|
|
IS_INTERVENTION = "is_intervention"
|
|
|
|
|
TERMINATE_EPISODE = "terminate_episode"
|
|
|
|
|
|
|
|
|
|
|
2025-06-05 17:48:43 +02:00
|
|
|
def make_teleoperator_from_config(config: TeleoperatorConfig) -> Teleoperator:
|
|
|
|
|
if config.type == "keyboard":
|
|
|
|
|
from .keyboard import KeyboardTeleop
|
|
|
|
|
|
|
|
|
|
return KeyboardTeleop(config)
|
|
|
|
|
elif config.type == "koch_leader":
|
|
|
|
|
from .koch_leader import KochLeader
|
|
|
|
|
|
|
|
|
|
return KochLeader(config)
|
|
|
|
|
elif config.type == "so100_leader":
|
|
|
|
|
from .so100_leader import SO100Leader
|
|
|
|
|
|
|
|
|
|
return SO100Leader(config)
|
|
|
|
|
elif config.type == "so101_leader":
|
|
|
|
|
from .so101_leader import SO101Leader
|
|
|
|
|
|
|
|
|
|
return SO101Leader(config)
|
|
|
|
|
elif config.type == "stretch3":
|
|
|
|
|
from .stretch3_gamepad import Stretch3GamePad
|
|
|
|
|
|
|
|
|
|
return Stretch3GamePad(config)
|
|
|
|
|
elif config.type == "widowx":
|
|
|
|
|
from .widowx import WidowX
|
|
|
|
|
|
|
|
|
|
return WidowX(config)
|
|
|
|
|
elif config.type == "mock_teleop":
|
|
|
|
|
from tests.mocks.mock_teleop import MockTeleop
|
|
|
|
|
|
|
|
|
|
return MockTeleop(config)
|
2025-06-13 13:15:47 +02:00
|
|
|
elif config.type == "gamepad":
|
|
|
|
|
from .gamepad.teleop_gamepad import GamepadTeleop
|
|
|
|
|
|
|
|
|
|
return GamepadTeleop(config)
|
2025-06-14 09:10:09 +02:00
|
|
|
elif config.type == "keyboard_ee":
|
|
|
|
|
from .keyboard.teleop_keyboard import KeyboardEndEffectorTeleop
|
|
|
|
|
|
|
|
|
|
return KeyboardEndEffectorTeleop(config)
|
Add Hope Jr (#935)
* Fix imports
* Add feetech write tests
* Nit
* Add autoclosing fixture
* Assert ping stub called
* Add CalibrationMode
* Add Motor in dxl robots
* Simplify split_int_bytes
* Rename read/write -> sync_read/write, refactor, add write
* Rename tests
* Refactor dxl tests by functionality
* Add dxl write test
* Refactor _is_comm_success
* Refactor feetech tests by functionality
* Add feetech write test
* Simplify _is_comm_success & _is_error
* Move mock_serial patch to dedicated file
* Remove test skips & fix docstrings
* Nit
* Add dxl operating modes
* Add is_connected in robots and teleops
* Update Koch
* Add feetech operating modes
* Caps dxl OperatingMode
* Update ensure_safe_goal_position
* Update so100
* Privatize methods & renames
* Fix dict
* Add _configure_motors & move ping methods
* Return models (str) with pings
* Implement feetech broadcast ping
* Add raw_values option
* Rename idx -> id_
* Improve errors
* Fix feetech ping tests
* Ensure motors exist at connection time
* Update tests
* Add test_motors_bus
* Move DriveMode & TorqueMode
* Update Koch imports
* Update so100 imports
* Fix visualize_motors_bus
* Fix imports
* Add calibration
* Rename idx -> id_
* Rename idx -> id_
* (WIP) _async_read
* Add new calibration method for robot refactor (#896)
Co-authored-by: Simon Alibert <simon.alibert@huggingface.co>
* Remove deprecated scripts
* Rename CalibrationMode -> MotorNormMode
* Fix calibration functions
* Remove todo
* Add scan_port utility
* Add calibration utilities
* Move encoding functions to encoding_utils
* Add test_encoding_utils
* Rename test
* Add more calibration utilities
* Format baudrate tables
* Implement SO-100 leader calibration
* Implement SO-100 follower calibration
* Implement Koch calibration
* Add test_scan_port (TODO)
* Fix calibration
* Hack feetech firmware bug
* Update tests
* Update Koch & SO-100
* Improve format
* Rename SO-100 classes
* Rename Koch classes
* Add calibration tests
* Remove old calibration tests
* Revert feetech hack and monkeypatch instead
* Simplify motors mocks
* Add is_calibrated test
* Update viperx & widowx
* Rename viperx & widowx
* Remove old calibration
* feat(teleop): thread-safe keyboard teleop implementation (#869)
Co-authored-by: Simon Alibert <75076266+aliberts@users.noreply.github.com>
* Add support for feetech scs series + various fixes
* Update dynamixel with motors bus & tables changes
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* (WIP) Add Hope Jr
* Rename arm -> hand
* (WIP) Add homonculus arm & glove
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Add Feetech protocol version
* Implement read
* Use constants from sdks
* (nit) move write
* Fix broadcast ping type hint
* Add protocol 1 broadcast ping
* Refactor & add _serialize_data
* Add feetech sm8512bl
* Make feetech broadcast ping faster in protocol 1
* Cleanup
* Add support for feetech protocol 1 to _split_into_byte_chunks
* Fix unormalize
* Remove test_motors_bus fixtures
* Add more segmented tests (base motor bus & feetech), add feetech protocol 1 support
* Add more segmented tests (dynamixel)
* Refactor tests
* Add handshake, fix feetech _read_firmware_version
* Fix tests
* Motors config & disconnect fixes
* Add torque_disabled context
* Update branch & fix pre-commit errors
* Fix hand & glove readings
* Update feetech tables
* Move read/write_calibration implementations
* Add setup_motor
* Fix calibration msg display
* Fix setup_motor & add it to robots
* Fix _find_single_motor
* Remove deprecated configure_motor
* Remove deprecated dynamixel_calibration
* Remove names
* Remove deprecated import
* refactor/lekiwi robot (#863)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Simon Alibert <simon.alibert@huggingface.co>
Co-authored-by: Simon Alibert <75076266+aliberts@users.noreply.github.com>
* fix(teleoperators): use property is_connected (#1075)
* Remove deprecated manipulator
* Update robot features & naming
* Update teleop features & naming
* Add make_teleoperator_from_config
* Rename find_port
* Fix config parsing
* Remove app script
* Add setup_motors
* Add teleoperate
* Add record
* Add replay
* Fix test_datasets
* Add mock robot & teleop
* Add new test_control_robot
* Add test_record_and_resume
* Remove deprecated scripts & tests
* Add calibrate
* Add docstrings
* Fix tests (no-extras install)
* Add SO101
* Remove pynput from optional deps
* Rename example 7
* Remove unecessary id
* Add MotorsBus docstrings
* Rename arm -> bus
* Remove Moss arm
* Fix setup_motors & calibrate configs
* Fix test_calibrate
* Add copyrights
* Update hand & arm
* Update homonculus hand & arm
* Fix dxl _find_single_motor
* Update glove
* Add setup_motors for lekiwi
* Fix glove calibration
* Complete docstring
* Add check for same min and max during calibration
* Move MockMotorsBus
* Add so100_follower tests
* (WIP) add calibration gui
* Fix test
* Add setup_motors
* Update calibration gui
* Remove old .cache folder
* Replace deprecated abc.abstractproperty
* Fix feetech protocol 1 configure
* Cleanup gui & add copyrights
* Anatomically precise joint names
* (WIP) Add glove to hand joints translation
* Move make_robot_config
* Add drive_mode & norm_mode in glove calibration
* Fix joints translation
* Fix normalization drive_mode
* nit
* Fix glove to hand conversion
* Adapt feetech calibration
* Remove pygame prompt
* Implement arm calibration (hacks)
* Better MotorsBus error messages
* Update feetech read_calibration
* Fix feetech test_is_calibrated
* Cleanup glove
* (WIP) Update arm
* Add changes from #1117
* refactor(cameras): cameras implementations + tests improvements (#1108)
Co-authored-by: Simon Alibert <simon.alibert@huggingface.co>
Co-authored-by: Simon Alibert <75076266+aliberts@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Fix arm joints order
* Add timeout/event logic
* Fix arm & glove
* Fix predict_action from record
* fix(cameras): update docstring + handle sn when starts with 0 + update timeouts to more reasonable value (#1154)
* fix(scripts): parser instead of draccus in record + add __get_path_fields__() to RecordConfig (#1155)
* Left/Right sides + other fixes
* Arm fixes and add config
* More hacks
* Add control scripts
* Fix merge errors
* push changes to calibration, teleop and docs
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Move readme to docs
* update readme
Signed-off-by: Martino Russi <77496684+nepyope@users.noreply.github.com>
* Add files via upload
Signed-off-by: Martino Russi <77496684+nepyope@users.noreply.github.com>
* Update image sources
* Symlink doc
* Compress image
* Move image
* Update docs link
* fix docs
* simplify teleop scripts
* fix variable names
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Address code review
* add EMA to glove
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* integrate teleoperation for hand
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* update docs
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* import hopejr/homunculus in teleoperate
* update docs for teleoperate, record, replay, train and inference
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* chore(hopejr): address comments
* chore(hopejr): address coments 2
* chore(docs): update teleoperation instructions for the hand/glove
* fix(hopejr): calibration int + update docs
---------
Signed-off-by: Martino Russi <77496684+nepyope@users.noreply.github.com>
Signed-off-by: Simon Alibert <75076266+aliberts@users.noreply.github.com>
Co-authored-by: Pepijn <138571049+pkooij@users.noreply.github.com>
Co-authored-by: Steven Palma <imstevenpmwork@ieee.org>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: nepyope <nopyeps@gmail.com>
Co-authored-by: Martino Russi <77496684+nepyope@users.noreply.github.com>
Co-authored-by: Steven Palma <steven.palma@huggingface.co>
2025-07-08 15:47:11 +02:00
|
|
|
elif config.type == "homunculus_glove":
|
|
|
|
|
from .homunculus import HomunculusGlove
|
|
|
|
|
|
|
|
|
|
return HomunculusGlove(config)
|
|
|
|
|
elif config.type == "homunculus_arm":
|
|
|
|
|
from .homunculus import HomunculusArm
|
|
|
|
|
|
|
|
|
|
return HomunculusArm(config)
|
2025-07-16 17:50:36 +02:00
|
|
|
elif config.type == "bi_so100_leader":
|
|
|
|
|
from .bi_so100_leader import BiSO100Leader
|
|
|
|
|
|
|
|
|
|
return BiSO100Leader(config)
|
2025-06-05 17:48:43 +02:00
|
|
|
else:
|
|
|
|
|
raise ValueError(config.type)
|