# 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. from dataclasses import dataclass, field from lerobot.common.cameras.configs import CameraConfig from lerobot.common.cameras.opencv.configuration_opencv import OpenCVCameraConfig from ..config import RobotConfig @RobotConfig.register_subclass("lekiwi") @dataclass class LeKiwiConfig(RobotConfig): port = "/dev/ttyACM0" # port to connect to the bus disable_torque_on_disconnect: bool = True # `max_relative_target` limits the magnitude of the relative positional target vector for safety purposes. # Set this to a positive scalar to have the same value for all motors, or a list that is the same length as # the number of motors in your follower arms. max_relative_target: int | None = None cameras: dict[str, CameraConfig] = field( default_factory=lambda: { "front": OpenCVCameraConfig( camera_index="/dev/video1", fps=30, width=640, height=480, rotation=90 ), "wrist": OpenCVCameraConfig( camera_index="/dev/video4", fps=30, width=640, height=480, rotation=180 ), } ) @RobotConfig.register_subclass("lekiwi_client") @dataclass class LeKiwiClientConfig(RobotConfig): # Network Configuration remote_ip: str = "172.18.129.208" port_zmq_cmd: int = 5555 port_zmq_observations: int = 5556 teleop_keys: dict[str, str] = field( default_factory=lambda: { # Movement "forward": "w", "backward": "s", "left": "a", "right": "d", "rotate_left": "z", "rotate_right": "x", # Speed control "speed_up": "r", "speed_down": "f", # quit teleop "quit": "q", } )