mirror of
https://github.com/huggingface/lerobot.git
synced 2026-05-24 04:59:47 +00:00
Merge branch 'main' into feat/RaC
This commit is contained in:
@@ -165,7 +165,7 @@ huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
|
|||||||
Then store your Hugging Face repository name in a variable:
|
Then store your Hugging Face repository name in a variable:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
HF_USER=$(hf auth whoami | head -n 1)
|
HF_USER=$(hf auth whoami | awk -F': *' 'NR==1 {print $2}')
|
||||||
echo $HF_USER
|
echo $HF_USER
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,13 @@ conda install ffmpeg -c conda-forge
|
|||||||
>
|
>
|
||||||
> - _[On Linux only]_ If you want to bring your own ffmpeg: Install [ffmpeg build dependencies](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#GettheDependencies) and [compile ffmpeg from source with libsvtav1](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#libsvtav1), and make sure you use the corresponding ffmpeg binary to your install with `which ffmpeg`.
|
> - _[On Linux only]_ If you want to bring your own ffmpeg: Install [ffmpeg build dependencies](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#GettheDependencies) and [compile ffmpeg from source with libsvtav1](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#libsvtav1), and make sure you use the corresponding ffmpeg binary to your install with `which ffmpeg`.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> When installing LeRobot inside WSL (Windows Subsystem for Linux), make sure to install `evdev` with the following command:
|
||||||
|
>
|
||||||
|
> ```bash
|
||||||
|
> conda install evdev -c conda-forge
|
||||||
|
> ```
|
||||||
|
|
||||||
## Step 3: Install LeRobot 🤗
|
## Step 3: Install LeRobot 🤗
|
||||||
|
|
||||||
### From Source
|
### From Source
|
||||||
|
|||||||
@@ -66,12 +66,13 @@ Run on of the examples scripts to teleoperate, record a dataset, replay a datase
|
|||||||
|
|
||||||
All scripts assume you configured your robot (e.g., SO-100 follower) and set the correct serial port.
|
All scripts assume you configured your robot (e.g., SO-100 follower) and set the correct serial port.
|
||||||
|
|
||||||
Additionally you need to **copy the urdf of the robot to the examples folder**. For the examples in this tutorial (Using SO100/SO101) it is highly recommended to use the urdf in the [SO-ARM100 repo](https://github.com/TheRobotStudio/SO-ARM100/blob/main/Simulation/SO101/so101_new_calib.urdf)
|
Additionally you need to **copy the URDF of the robot into the examples folder**. For the examples in this tutorial (using SO100/SO101), copy the `SO101` folder from the [SO-ARM100 repo](https://github.com/TheRobotStudio/SO-ARM100/blob/main/Simulation/SO101) into the `examples/phone_to_so100/` directory, so that the URDF file path becomes `examples/phone_to_so100/SO101/so101_new_calib.urdf`.
|
||||||
|
|
||||||
- Run this example to teleoperate:
|
- Run this example to teleoperate:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python examples/phone_to_so100/teleoperate.py
|
cd examples/phone_to_so100
|
||||||
|
python teleoperate.py
|
||||||
```
|
```
|
||||||
|
|
||||||
After running the example:
|
After running the example:
|
||||||
@@ -84,19 +85,22 @@ Additionally you can customize mapping or safety limits by editing the processor
|
|||||||
- Run this example to record a dataset, which saves absolute end effector observations and actions:
|
- Run this example to record a dataset, which saves absolute end effector observations and actions:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python examples/phone_to_so100/record.py
|
cd examples/phone_to_so100
|
||||||
|
python record.py
|
||||||
```
|
```
|
||||||
|
|
||||||
- Run this example to replay recorded episodes:
|
- Run this example to replay recorded episodes:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python examples/phone_to_so100/replay.py
|
cd examples/phone_to_so100
|
||||||
|
python replay.py
|
||||||
```
|
```
|
||||||
|
|
||||||
- Run this example to evaluate a pretrained policy:
|
- Run this example to evaluate a pretrained policy:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python examples/phone_to_so100/evaluate.py
|
cd examples/phone_to_so100
|
||||||
|
python evaluate.py
|
||||||
```
|
```
|
||||||
|
|
||||||
### Important pipeline steps and options
|
### Important pipeline steps and options
|
||||||
|
|||||||
+3
-1
@@ -98,11 +98,13 @@ pygame-dep = ["pygame>=2.5.1,<2.7.0"]
|
|||||||
placo-dep = ["placo>=0.9.6,<0.10.0"]
|
placo-dep = ["placo>=0.9.6,<0.10.0"]
|
||||||
transformers-dep = ["transformers>=4.57.1,<5.0.0"]
|
transformers-dep = ["transformers>=4.57.1,<5.0.0"]
|
||||||
grpcio-dep = ["grpcio==1.73.1", "protobuf>=6.31.1,<6.32.0"]
|
grpcio-dep = ["grpcio==1.73.1", "protobuf>=6.31.1,<6.32.0"]
|
||||||
|
can-dep = ["python-can>=4.2.0,<5.0.0"]
|
||||||
|
|
||||||
# Motors
|
# Motors
|
||||||
feetech = ["feetech-servo-sdk>=1.0.0,<2.0.0"]
|
feetech = ["feetech-servo-sdk>=1.0.0,<2.0.0"]
|
||||||
dynamixel = ["dynamixel-sdk>=3.7.31,<3.9.0"]
|
dynamixel = ["dynamixel-sdk>=3.7.31,<3.9.0"]
|
||||||
damiao = ["python-can>=4.2.0,<5.0.0"]
|
damiao = ["lerobot[can-dep]"]
|
||||||
|
robstride = ["lerobot[can-dep]"]
|
||||||
|
|
||||||
# Robots
|
# Robots
|
||||||
openarms = ["lerobot[damiao]"]
|
openarms = ["lerobot[damiao]"]
|
||||||
|
|||||||
@@ -1653,6 +1653,7 @@ class LeRobotDataset(torch.utils.data.Dataset):
|
|||||||
video_backend: str | None = None,
|
video_backend: str | None = None,
|
||||||
batch_encoding_size: int = 1,
|
batch_encoding_size: int = 1,
|
||||||
vcodec: str = "libsvtav1",
|
vcodec: str = "libsvtav1",
|
||||||
|
metadata_buffer_size: int = 10,
|
||||||
streaming_encoding: bool = False,
|
streaming_encoding: bool = False,
|
||||||
encoder_queue_maxsize: int = 30,
|
encoder_queue_maxsize: int = 30,
|
||||||
encoder_threads: int | None = None,
|
encoder_threads: int | None = None,
|
||||||
@@ -1667,6 +1668,7 @@ class LeRobotDataset(torch.utils.data.Dataset):
|
|||||||
features=features,
|
features=features,
|
||||||
root=root,
|
root=root,
|
||||||
use_videos=use_videos,
|
use_videos=use_videos,
|
||||||
|
metadata_buffer_size=metadata_buffer_size,
|
||||||
)
|
)
|
||||||
obj.repo_id = obj.meta.repo_id
|
obj.repo_id = obj.meta.repo_id
|
||||||
obj.root = obj.meta.root
|
obj.root = obj.meta.root
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#!/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.
|
||||||
|
|
||||||
|
from .robstride import RobstrideMotorsBus
|
||||||
|
from .tables import *
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,120 @@
|
|||||||
|
# Copyright 2025 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.
|
||||||
|
|
||||||
|
"""Configuration tables for Damiao motors."""
|
||||||
|
|
||||||
|
from enum import IntEnum
|
||||||
|
|
||||||
|
|
||||||
|
# Motor type definitions
|
||||||
|
class MotorType(IntEnum):
|
||||||
|
O0 = 0
|
||||||
|
O1 = 1
|
||||||
|
O2 = 2
|
||||||
|
O3 = 3
|
||||||
|
O4 = 4
|
||||||
|
O5 = 5
|
||||||
|
ELO5 = 6
|
||||||
|
O6 = 7
|
||||||
|
|
||||||
|
|
||||||
|
class CommMode(IntEnum):
|
||||||
|
PrivateProtocole = 0
|
||||||
|
CANopen = 1
|
||||||
|
MIT = 2
|
||||||
|
|
||||||
|
|
||||||
|
# Control modes
|
||||||
|
class ControlMode(IntEnum):
|
||||||
|
MIT = 0
|
||||||
|
POS_VEL = 1
|
||||||
|
VEL = 2
|
||||||
|
|
||||||
|
|
||||||
|
# Motor limit parameters [PMAX, VMAX, TMAX]
|
||||||
|
# PMAX: Maximum position (rad)
|
||||||
|
# VMAX: Maximum velocity (rad/s)
|
||||||
|
# TMAX: Maximum torque (N·m)
|
||||||
|
MOTOR_LIMIT_PARAMS: dict[MotorType, tuple[float, float, float]] = {
|
||||||
|
MotorType.O0: (12.57, 33, 14),
|
||||||
|
MotorType.O1: (12.57, 44, 17),
|
||||||
|
MotorType.O2: (12.57, 33, 20),
|
||||||
|
MotorType.O3: (12.57, 33, 60),
|
||||||
|
MotorType.O4: (12.57, 33, 120),
|
||||||
|
MotorType.O5: (12.57, 50, 5.5),
|
||||||
|
MotorType.ELO5: (12.57, 50, 6),
|
||||||
|
MotorType.O6: (112.5, 50, 36),
|
||||||
|
}
|
||||||
|
|
||||||
|
# Motor model names
|
||||||
|
MODEL_NAMES = {
|
||||||
|
MotorType.O0: "O0",
|
||||||
|
MotorType.O1: "O1",
|
||||||
|
MotorType.O2: "O2",
|
||||||
|
MotorType.O3: "O3",
|
||||||
|
MotorType.O4: "O4",
|
||||||
|
MotorType.O5: "O5",
|
||||||
|
MotorType.ELO5: "ELO5",
|
||||||
|
MotorType.O6: "O6",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Motor resolution table (encoder counts per revolution)
|
||||||
|
MODEL_RESOLUTION = {
|
||||||
|
"O0": 65536,
|
||||||
|
"O1": 65536,
|
||||||
|
"O2": 65536,
|
||||||
|
"O3": 65536,
|
||||||
|
"O4": 65536,
|
||||||
|
"O5": 65536,
|
||||||
|
"ELO5": 65536,
|
||||||
|
"O6": 65536,
|
||||||
|
}
|
||||||
|
|
||||||
|
# CAN baudrates supported by Robstride motors
|
||||||
|
AVAILABLE_BAUDRATES = [
|
||||||
|
1000000, # 4: 1 mbps (default)
|
||||||
|
]
|
||||||
|
DEFAULT_BAUDRATE = 1000000
|
||||||
|
|
||||||
|
# Default timeout in milliseconds
|
||||||
|
DEFAULT_TIMEOUT_MS = 0 # disabled by default, otherwise 20000 is 1s
|
||||||
|
|
||||||
|
|
||||||
|
# Data that should be normalized
|
||||||
|
NORMALIZED_DATA = ["Present_Position", "Goal_Position"]
|
||||||
|
|
||||||
|
|
||||||
|
# MIT control parameter ranges
|
||||||
|
MIT_KP_RANGE = (0.0, 500.0)
|
||||||
|
MIT_KD_RANGE = (0.0, 5.0)
|
||||||
|
|
||||||
|
# CAN frame command IDs
|
||||||
|
CAN_CMD_ENABLE = 0xFC
|
||||||
|
CAN_CMD_DISABLE = 0xFD
|
||||||
|
CAN_CMD_SET_ZERO = 0xFE
|
||||||
|
CAN_CMD_CLEAR_FAULT = 0xFB
|
||||||
|
|
||||||
|
|
||||||
|
CAN_CMD_QUERY_PARAM = 0x33
|
||||||
|
CAN_CMD_WRITE_PARAM = 0x55
|
||||||
|
CAN_CMD_SAVE_PARAM = 0xAA
|
||||||
|
|
||||||
|
# CAN ID for parameter operations
|
||||||
|
CAN_PARAM_ID = 0x7FF
|
||||||
|
|
||||||
|
|
||||||
|
RUNNING_TIMEOUT = 0.001
|
||||||
|
PARAM_TIMEOUT = 0.01
|
||||||
|
|
||||||
|
STATE_CACHE_TTL_S = 0.02
|
||||||
@@ -85,7 +85,7 @@ class SmolVLAConfig(PreTrainedConfig):
|
|||||||
scheduler_decay_lr: float = 2.5e-6
|
scheduler_decay_lr: float = 2.5e-6
|
||||||
|
|
||||||
vlm_model_name: str = "HuggingFaceTB/SmolVLM2-500M-Video-Instruct" # Select the VLM backbone.
|
vlm_model_name: str = "HuggingFaceTB/SmolVLM2-500M-Video-Instruct" # Select the VLM backbone.
|
||||||
load_vlm_weights: bool = False # Set to True in case of training the expert from scratch. True when init from pretrained SmolVLA weights
|
load_vlm_weights: bool = False # Set to False in case of training the expert from scratch. True when init from pretrained SmolVLA weights
|
||||||
|
|
||||||
add_image_special_tokens: bool = False # Whether to use special image tokens around image features.
|
add_image_special_tokens: bool = False # Whether to use special image tokens around image features.
|
||||||
|
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ def test_motor(bus, motor_id: int, timeout: float, use_fd: bool):
|
|||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
bus.send(disable_msg)
|
bus.send(disable_msg)
|
||||||
|
bus.recv(timeout=0.1) # Clear any pending responses
|
||||||
except Exception:
|
except Exception:
|
||||||
print(f"Error sending message to motor 0x{motor_id:02X}")
|
print(f"Error sending message to motor 0x{motor_id:02X}")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user