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: Steven Palma <steven.palma@huggingface.co> Co-authored-by: Adil Zouitine <adilzouitinegm@gmail.com> Co-authored-by: Pepijn <pepijn@huggingface.co>
85 lines
2.0 KiB
Python
85 lines
2.0 KiB
Python
# 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.
|
|
|
|
"""
|
|
Helper to set motor ids and baudrate.
|
|
|
|
Example:
|
|
|
|
```shell
|
|
python -m lerobot.setup_motors \
|
|
--teleop.type=so100_leader \
|
|
--teleop.port=/dev/tty.usbmodem575E0031751
|
|
```
|
|
"""
|
|
|
|
from dataclasses import dataclass
|
|
|
|
import draccus
|
|
|
|
from .common.robots import ( # noqa: F401
|
|
RobotConfig,
|
|
koch_follower,
|
|
lekiwi,
|
|
make_robot_from_config,
|
|
so100_follower,
|
|
so101_follower,
|
|
)
|
|
from .common.teleoperators import ( # noqa: F401
|
|
TeleoperatorConfig,
|
|
koch_leader,
|
|
make_teleoperator_from_config,
|
|
so100_leader,
|
|
so101_leader,
|
|
)
|
|
|
|
COMPATIBLE_DEVICES = [
|
|
"koch_follower",
|
|
"koch_leader",
|
|
"so100_follower",
|
|
"so100_leader",
|
|
"so101_follower",
|
|
"so101_leader",
|
|
"lekiwi",
|
|
]
|
|
|
|
|
|
@dataclass
|
|
class SetupConfig:
|
|
teleop: TeleoperatorConfig | None = None
|
|
robot: RobotConfig | None = None
|
|
|
|
def __post_init__(self):
|
|
if bool(self.teleop) == bool(self.robot):
|
|
raise ValueError("Choose either a teleop or a robot.")
|
|
|
|
self.device = self.robot if self.robot else self.teleop
|
|
|
|
|
|
@draccus.wrap()
|
|
def setup_motors(cfg: SetupConfig):
|
|
if cfg.device.type not in COMPATIBLE_DEVICES:
|
|
raise NotImplementedError
|
|
|
|
if isinstance(cfg.device, RobotConfig):
|
|
device = make_robot_from_config(cfg.device)
|
|
else:
|
|
device = make_teleoperator_from_config(cfg.device)
|
|
|
|
device.setup_motors()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
setup_motors()
|