
Ghi lại một tập dữ liệu LeRobot có thể sử dụng được với SO-100: hiệu chuẩn, điều khiển từ xa theo kiểu chủ-tớ, các cờ và giá trị mặc định thực tế của lerobot-record, thiết lập camera, số lượng tập, và các lỗi làm hỏng một lần chạy.
Một SO-100 robot đi theo, một cánh tay dẫn dắt có cùng thiết kế và hai camera USB có thể tinh chỉnh một chính sách (policy) trong một buổi chiều. Cùng một hệ thống đó cũng có thể dễ dàng tạo ra sáu mươi tập (episode) trông có vẻ ổn trong trình duyệt tệp và lãng phí một lần chạy GPU kéo dài sáu giờ. Sự khác biệt hiếm khi nằm ở mô hình; mà là những gì đã xảy ra giữa các động cơ servo và tệp parquet.
Đây là lộ trình thủ công, sau đó là lộ trình ngắn hơn. Mọi lệnh đều từ lerobot 0.6.1, phát hành ngày 3 tháng 8 năm 2026 và hiện có trên PyPI. Nó đã chuyển sang các điểm vào bảng điều khiển, vì vậy các hướng dẫn chạy python lerobot/scripts/control_robot.py mô tả một tệp không còn tồn tại.
Phiên bản ngắn gọn
- •lerobot 0.6.1 ghi lại v3.0; GR00T N1.7 và N1.5 muốn v2.1. Hãy thống nhất định dạng trước khi bạn nhấn ghi.
- •Bốn lệnh: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Sử dụng cùng --robot.id và --teleop.id từ quá trình hiệu chuẩn vào phiên ghi.
- •Các giá trị mặc định thực tế: 30 fps, 60 s mỗi tập, 60 s đặt lại, 50 tập, khoảng 100 phút thời gian thực.
- •Số tập tối thiểu ở đây: 30 cho SmolVLA, 50 cho phần còn lại.
- •Sự đa dạng quan trọng hơn số lượng. Các tập dữ liệu bị lỗi do bốn điều: chỉ mục camera bị hoán đổi, khung hình bị mất hoặc đóng băng, một khớp bị kẹt ở giới hạn của nó, một chuỗi tác vụ không đọc được.
Những gì một phiên ghi lại thu được
Một tập dữ liệu LeRobot không phải là một thư mục chứa video mà là một bảng được lập chỉ mục theo thời gian có đính kèm video: mỗi nhịp vòng điều khiển ghi một hàng chứa hành động được ra lệnh, trạng thái mà bộ phận theo dõi đạt được, một khung hình cho mỗi camera, một dấu thời gian và các chỉ mục. Chính sách chỉ xem các cột đó. Lược đồ của lerobot/svla_so100_pickplace, được đọc từ meta/info.json của nó.
| Tính năng | dtype | Hình dạng | Nó là gì |
|---|---|---|---|
| action | float32 | [6] | các mục tiêu khớp từ cánh tay dẫn đầu |
| observation.state | float32 | [6] | các vị trí khớp mà bộ phận theo dõi đạt được |
| observation.images.top | video | [480, 640, 3] | camera cảnh, MP4 (av1 ở đây) |
| observation.images.wrist | video | [480, 640, 3] | camera cổ tay, cùng tốc độ |
| timestamp | float32 | [1] | số giây kể từ khi bắt đầu tập |
| frame_index, episode_index, index, task_index | int64 | [1] | ghi sổ được tự động điền |
Các khớp là main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll và main_gripper: sáu bậc tự do của SO-100. Hành động và trạng thái có cùng hình dạng vì điều khiển từ xa theo kiểu chủ-tớ ghi lại một mục tiêu và vị trí đạt được một bước sau đó. Khoảng cách đó là thông tin: nơi cánh tay đã chống lại trọng lực hoặc một vật bị kẹt. Các chuỗi đó thuộc về tập dữ liệu đó. Một phiên được ghi lại với 0.6.1 hôm nay ghi shoulder_pan.pos đến gripper.pos, id từ 1 đến 6 trên bus: cùng sáu khớp, các khóa khác nhau, điều này quan trọng khi một cấu hình gọi một tính năng theo tên.
Tập dữ liệu đó chứa 50 tập và 19.631 khung hình ở tốc độ 30 fps: khoảng 393 khung hình, hoặc 13 giây, mỗi tập. Nếu tập dữ liệu của bạn trung bình một phút, bạn đang làm điều gì đó khó hơn hoặc ghi lại thời gian chết ở cả hai đầu.

Những gì bạn cần trên bàn làm việc
| Mục | Chi tiết | Lưu ý |
|---|---|---|
| Cánh tay theo dõi | SO-100, sáu servo Feetech STS3215 | khoảng 110 đến 150 EUR cho các bộ phận |
| Cánh tay dẫn đầu | một SO-100 thứ hai, đã tháo bánh răng | bánh răng đã được tháo khỏi tất cả sáu động cơ dẫn đầu: chỉ còn bộ mã hóa, ít ma sát hơn |
| Nguồn điện | phù hợp với biến thể STS3215 7.4 V trong danh sách vật tư | xem cảnh báo bên dưới |
| Camera | hai camera USB, 640x480 ở 30 khung hình/giây | một góc nhìn cảnh, một trên cổ tay |
| Máy chủ | Python 3.12 hoặc mới hơn, ffmpeg | requires-python >= 3.12 |
| Tài khoản Hub | Hugging Face write token | optional with --dataset.push_to_hub=false |
STS3215 có hai phiên bản: SO-ARM100 README đánh giá phiên bản 7.4 V có mô-men xoắn dừng 16.5 kg.cm đo ở 6 V và phiên bản 12 V có 30 kg.cm, đồng thời lưu ý rằng việc sử dụng động cơ 12 V cũng có nghĩa là phải mua nguồn điện 12 V 5 A+ thay vì nguồn 5 V. Danh sách vật tư liệt kê các servo 7.4 V. Cấp 12 V cho các servo định mức 7.4 V sẽ làm hỏng chúng, vì vậy hãy đọc nhãn động cơ trước khi bạn đấu dây bất cứ thứ gì. Servo không phản hồi.
Nếu cánh tay robot chưa được lắp ráp, đó sẽ là một buổi tối riêng biệt: hãy bắt đầu tại bắt đầu với SO-100 và hướng dẫn thiết lập SO-100 đầy đủ. Nếu bạn chưa mua bất cứ thứ gì, hãy đọc so sánh SO-100 với SO-101 trước: SO-101 là phiên bản mới hơn với hệ thống dây điện được cải thiện và không cần bước tháo bánh răng, quy trình ghi hình cũng giống hệt nhau.
Cài đặt lerobot 0.6.1
conda create -y -n lerobot python=3.12
conda activate lerobot
# TorchCodec is the default video decoder and needs ffmpeg
conda install ffmpeg -c conda-forge
# core_scripts = dataset + hardware + viz extras (record, replay, calibrate)
# feetech = SDK for the STS3215 bus servos in the SO-100
pip install 'lerobot[core_scripts,feetech]'
lerobot-infoCác phần bổ trợ thường gây khó khăn nhất cho mọi người. pip install lerobot chỉ cài đặt các phụ thuộc ML cốt lõi, không có gì để giao tiếp với robot. Các cánh tay Koch cần dynamixel thay vì feetech. Nếu shell của bạn chưa từng nghe nói về lerobot-record, đây là lý do.
Cổng, ID động cơ và hiệu chuẩn
Ba bước thực hiện một lần là cần thiết để chuyển từ các bộ phận riêng lẻ sang một vòng lặp điều khiển từ xa hoạt động. giúp một chính sách được huấn luyện trên cánh tay của bạn có thể chạy trên cánh tay của người khác, ánh xạ các giá trị bộ mã hóa thô sang một quy ước khớp chung.
- 1Tìm cổng USB của từng cánh tay
Chạy lệnh này khi cả hai cánh tay đều được cắm vào, rút phích cắm của cánh tay bạn đang xác định khi được nhắc, và ghi lại cổng nào biến mất. Trên Linux, bạn có thể cần
sudo chmod 666 /dev/ttyACM0.bashlerobot-find-port # Finding all available ports for the MotorsBus. # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1'] # Remove the USB cable from your MotorsBus and press Enter when done. # The port of this MotorsBus is '/dev/ttyACM1' # Reconnect the USB cable. - 2Ghi ID động cơ và tốc độ baud
ID được ghi cho từng động cơ một, và tài liệu hướng dẫn rất nghiêm ngặt về cách thực hiện: chỉ kết nối chính xác một động cơ với bảng điều khiển, chưa nối chuỗi với bất kỳ động cơ nào khác. Script sẽ đi ngược chuỗi, nhắc nhậpm cho bộ kẹp trước và gán ID 6, sau đó là khớp cổ tay (wrist_roll) là 5, xuống đến khớp vai (shoulder_pan) là 1. Hãy thực hiện trước khi lắp ráp.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Hiệu chuẩn cả hai cánh tay
Di chuyển từng khớp đến giữa phạm vi của nó, nhấn Enter, sau đó quét từng khớp qua toàn bộ phạm vi của nó.
idsẽ trở thành tên tệp hồ sơ.bashlerobot-calibrate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower lerobot-calibrate \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader - 4Điều khiển từ xa trước khi ghi bất cứ điều gì
Bài kiểm tra chấp nhận cho tất cả các bước trên. Nếu điều khiển từ xa bị giật, bị phản chiếu, hoặc một khớp không tuân theo, việc ghi lại sẽ lưu giữ điều đó trong 50 tập.
bashlerobot-teleoperate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader \ --display_data=true
Các hồ sơ được lưu tại $HF_LEROBOT_CALIBRATION, mặc định là ~/.cache/huggingface/lerobot/calibration, và ID là khóa tra cứu. Cung cấp cho lerobot-record một ID đã hiệu chuẩn và nó sẽ đề xuất nhấn Enter để sử dụng lại hồ sơ hoặc c để làm lại. Nếu cung cấp một ID không xác định, sẽ không có tệp nào, vì vậy nó sẽ chuyển sang chế độ hiệu chuẩn giữa phiên.
Máy ảnh quyết định những gì chính sách nhìn thấy
lerobot-find-cameras opencv # or: lerobot-find-cameras realsense
# --- Detected Cameras ---
# Camera #0:
# Name: OpenCV Camera @ 0
# Type: OpenCV
# Id: 0
# Backend api: AVFOUNDATION
# Default stream profile:
# Format: 16.0
# Width: 1920
# Height: 1080
# Fps: 15.0Hai góc nhìn, và vị trí của chúng rất quan trọng: một camera cảnh cố định bao phủ không gian làm việc, và một camera cổ tay gần bộ phận chấp hành cuối hiển thị những gì bộ kẹp sắp chạm vào. Danh sách kiểm tra bộ dữ liệu cộng đồng LeRobot yêu cầu ưu tiên hai góc nhìn ở độ phân giải 480x640 / 720p trở lên, nền tĩnh, ánh sáng ổn định trung tính, và cánh tay dẫn hướng cùng các chi của con người nằm ngoài khung hình. Hướng dẫn ghi hình bổ sung quy tắc chung: bạn phải có khả năng tự thực hiện nhiệm vụ chỉ bằng cách nhìn vào hình ảnh từ camera.
Các chỉ mục OpenCV đến từ thứ tự liệt kê, vì vậy việc khởi động lại hoặc cắm lại có thể khiến chỉ mục 0 và 2 đổi chỗ và đặt góc nhìn cổ tay vào vị trí hàng đầu trong suốt một phiên. lerobot tự nói rằng: lớp camera của nó chấp nhận đường dẫn thiết bị cũng như một số nguyên, và cảnh báo rằng các chỉ mục không ổn định khi khởi động lại hoặc thay đổi cổng, đặc biệt trên Linux. Trỏ index_or_path vào symlink udev dưới /dev/v4l/by-id/, cái mà theo thiết bị chứ không phải thứ tự liệt kê. Đây là cách phổ biến nhất khiến một bộ dữ liệu trở nên không nhất quán nội bộ, và quá trình huấn luyện không thể sửa chữa nó. Không phát hiện camera.
Lệnh record và mọi cờ
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')
lerobot-record \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_so100_follower \
--robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--teleop.type=so100_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_so100_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/so100_pick_cube \
--dataset.single_task="Pick the red cube and drop it in the box" \
--dataset.num_episodes=50 \
--dataset.fps=30 \
--dataset.episode_time_s=25 \
--dataset.reset_time_s=10 \
--dataset.streaming_encoding=true \
--dataset.encoder_threads=2Các giá trị mặc định dưới đây đến từ src/lerobot/configs/dataset.py, trên nhánh chính, không phải từ hướng dẫn. Một số không như mọi người vẫn nghĩ.
| Cờ | Mặc định | Chức năng |
|---|---|---|
| --dataset.repo_id | empty | tên; dấu thời gian được thêm vào theo mặc định |
| --dataset.single_task | empty | chuỗi tác vụ được lưu trữ với mỗi tập |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | đường dẫn ghi, mặc định ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | tốc độ vòng lặp điều khiển và tốc độ khung hình của tập dữ liệu |
| --dataset.episode_time_s | 60 | số giây trước khi một tập tự động chuyển tiếp |
| --dataset.reset_time_s | 60 | đặt lại cảnh; cánh tay robot di chuyển, không có gì được lưu trữ |
| --dataset.num_episodes | 50 | số tập được ghi trong phiên này |
| --dataset.push_to_hub | true | tải lên khi kết thúc phiên; false giữ cục bộ |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | mã hóa trong quá trình thu thập; đặt rõ ràng |
| --dataset.encoder_queue_maxsize | 30 | khung hình được đệm cho mỗi camera, ~1 giây ở 30 khung hình/giây |
| --dataset.encoder_threads | null (codec decides) | số luồng cho mỗi bộ mã hóa; giảm nếu quá trình thu thập bị giật |
| --dataset.no_stamp | false | giữ repo_id chính xác như đã nhập |
| --resume | false | thêm vào một tập dữ liệu hiện có; cần --dataset.root |
Tập dữ liệu của bạn không được đặt tên như bạn đã nhập. lerobot thêm một thẻ ngày-giờ, vì vậy so100_pick_cube trở thành so100_pick_cube_20260823_141530. Sử dụng --dataset.no_stamp=true để có tên ổn định. Tiếp tục (Resume) tính số lượng bổ sung, không phải tổng số. Với --resume=true, --dataset.num_episodes đếm các tập bổ sung và --dataset.root trở thành bắt buộc. Yêu cầu 50 tập trên một tập dữ liệu 30 tập và bạn sẽ nhận được 80.
Điều khiển bàn phím trong một phiên
- Mũi tên phải hoặc
n: kết thúc tập hoặc đặt lại giai đoạn sớm. Đây là phím bạn sử dụng nhiều nhất, vì một lần nắm sạch hiếm khi cần 25 giây. - Mũi tên trái hoặc
r: loại bỏ tập và làm lại. Một lần thực hiện không tốt không tốn gì bây giờ nhưng sẽ tốn rất nhiều sau này. - Escape hoặc
q: dừng phiên, hoàn tất mã hóa, tải lên. - Những phím này hoạt động trên X11, Wayland và SSH không đầu (headless): không có backend phím toàn cục, lerobot-record đọc các phím tương tự từ terminal điều khiển. Các chữ cái vẫn hoạt động trên các liên kết SSH bị lag, nơi các chuỗi mũi tên bị tách.
- Điều khiển từ xa bằng bàn phím thì khác và cần một backend toàn cục: X11, Windows hoặc macOS với Trợ năng (Accessibility).
Bao nhiêu tập, và một tập tốt trông như thế nào
Hướng dẫn ghi hình đề xuất ít nhất 50 tập cho nhiệm vụ đầu tiên, khoảng 10 tập cho mỗi vị trí đối tượng. Các trang chính sách liệt kê mức tối thiểu cho mỗi mô hình, dưới mức đó một lần chạy không đáng thời gian GPU.
| Chính sách | Số tập tối thiểu | Định dạng tập dữ liệu | Hạng GPU | Chi phí mỗi lần chạy |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
Câu hỏi hay hơn là bao nhiêu của cái gì. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) đã thu thập hơn 40.000 bản trình diễn và thực hiện hơn 15.000 lần triển khai trong thế giới thực. Khả năng tổng quát hóa tuân theo mối quan hệ luật lũy thừa xấp xỉ với số lượng môi trường và đối tượng, và vượt quá ngưỡng cho mỗi môi trường hoặc đối tượng, các bản trình diễn bổ sung có tác dụng tối thiểu. Trên một băng ghế thử nghiệm: di chuyển đối tượng, thay đổi ánh sáng, hoán đổi khối lập phương, thay vì lặp lại một lần quay.
- Quỹ đạo khớp liên tục mà servo có thể tái tạo, không giống như bàn phím hoặc tay cầm chơi game
- Hành động và trạng thái chia sẻ một quy ước tọa độ, vì vậy chính sách học được một mục tiêu mà nó có thể điều khiển trực tiếp
- Một tập 25 giây cộng với 10 giây đặt lại là khoảng 100 tập mỗi giờ
- Người vận hành cảm nhận được thiết bị tớ bị kẹt hoặc bó, vì vậy lỗi sẽ xuất hiện trước khi dữ liệu được cam kết
- Một cánh tay thứ hai làm tăng gấp đôi chi phí linh kiện
- Các bản trình diễn kế thừa thói quen của người vận hành; Mandlekar et al. nhận thấy chất lượng chính sách phụ thuộc nhiều vào chất lượng bản trình diễn
- Thiết bị chủ được lấy mẫu theo tốc độ vòng lặp, vì vậy các khoảng dừng trở thành các hàng gần như giống hệt nhau, dạy chính sách chờ đợi
- Không có gì đảm bảo tính nhất quán giữa các phiên: một camera bị xê dịch 5 cm là một sự thay đổi phân phối ẩn
Một tập tốt là một tập nhàm chán: tư thế ban đầu có thể lặp lại, một việc được hoàn thành, kết thúc khi vật thể đã vào thùng, chuỗi tác vụ trong khoảng 25 đến 50 ký tự mà danh sách kiểm tra khuyến nghị. Nhặt khối lập phương màu đỏ và thả vào hộp là một chuỗi tác vụ; task1 là một phản mẫu mà danh sách kiểm tra nêu rõ. Các chú thích mơ hồ đứng đầu danh sách các vấn đề của nó, và chúng quan trọng nhất đối với , nơi chuỗi là đầu vào của mô hình, không phải tên tệp.
Các lỗi âm thầm phá hỏng một tập dữ liệu
Không có lỗi nào gây ra ngoại lệ. Tất cả đều tồn tại trong quá trình huấn luyện, xuất hiện dưới dạng đường cong mất mát trông ổn và một robot không làm gì cả. Kiểm tra khi cảnh đang được thiết lập.
| Lỗi | Dấu hiệu nhận biết | Nguyên nhân | Cách phát hiện |
|---|---|---|---|
| Chế độ xem camera bị hoán đổi | hình ảnh cổ tay dưới khóa trên cùng | gán lại chỉ mục sau khi cắm lại | lerobot-find-cameras mỗi phiên; đường dẫn theo ID |
| Khung hình bị đóng băng | cùng một hình ảnh trong hàng chục hàng | camera ngừng cung cấp; vòng lặp lặp lại khung hình cuối cùng | kiểm tra nó trong lerobot-dataset-viz |
| Khung hình bị bỏ qua | số hàng thấp hơn fps nhân với giây | hàng đợi tràn, bỏ qua thay vì chặn | 'Encoder queue full' trong nhật ký; số hàng so với fps nhân với thời lượng |
| Khớp ở giới hạn của nó | một khớp phẳng ở mức tối thiểu hoặc tối đa | phạm vi của khớp dẫn vượt quá khớp theo sau, hoặc tư thế giữa không tốt | min/max của từng khớp trong ds.meta.stats; lerobot-find-joint-limits trước đó |
| Hình ảnh và hành động không đồng bộ | chính sách dự đoán hoặc bị trễ | camera có fps khác với vòng lặp | giữ mọi camera ở --dataset.fps |
| Thời gian chết | các chuỗi dài các hàng hành động giống hệt nhau | người vận hành tạm dừng khi máy ghi đang chạy | tỷ lệ các hàng hành động giống hệt nhau liên tiếp |
| Chuỗi tác vụ không sử dụng được | task1, demo2, test | gõ nhanh | meta/tasks.parquet trong v3.0 (nó là meta/tasks.jsonl trong v2.1); sửa bằng lerobot-edit-dataset modify_tasks |
Bộ mã hóa giữ một hàng đợi giới hạn cho mỗi camera, mặc định là 30 khung hình. Khi không thể theo kịp, các khung hình sẽ bị bỏ qua thay vì bị chặn: quá trình quay tiếp tục và không có gì bị treo. Bạn sẽ nhận được thông báo Encoder queue full for {camera}, dropped N frame(s) và tổng số khung hình bị bỏ qua cho mỗi camera vào cuối tập. Ngưỡng của lerobot: khoảng 5 phần trăm thiếu nghĩa là hệ thống bị quá tải, 2 phần trăm là tải khởi động dự kiến. Các cách khắc phục theo thứ tự: --display_data=false, giảm --dataset.encoder_threads, vcodec=h264, tắt streaming.
Một lưu ý: bảng hướng dẫn mã hóa-truyền phát liệt kê giá trị mặc định là True, trong khi dataclass trên main đọc là streaming_encoding: bool = False. Tài liệu và mã không khớp, vì vậy hãy đặt nó một cách rõ ràng; lerobot sẽ ghi lại một gợi ý khuyến nghị điều này bất cứ khi nào nó khởi động mà không bật cờ.
Kiểm tra tập dữ liệu trước khi thuê GPU
Kiểm tra chấp nhận từ tài liệu: so sánh thời lượng video với thời lượng tập mà CLI đã báo cáo, và xác nhận số hàng bằng fps nhân với thời lượng. Theo từng tập, không phải tổng cộng.
from lerobot.datasets import LeRobotDataset
ds = LeRobotDataset("your-user/so100_pick_cube_20260823_141530")
print("fps:", ds.fps, "frames:", ds.num_frames)
# In v3.0 the per-episode records live in meta/episodes/ as chunked parquet:
# lengths, tasks and offsets into the shared parquet and mp4 shards.
# They load through the datasets stack, so this is a datasets.Dataset --
# use .column_names and integer indexing, not pandas .columns / .head().
eps = ds.meta.episodes
print(eps.column_names)
print(eps[0])
# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])Sau đó hãy xem xét nó. lerobot-dataset-viz phát lại một tập từng khung hình với các dấu vết khớp bên cạnh chế độ xem camera, trong Rerun hoặc Foxglove. Các camera bị hoán đổi và khung hình bị đóng băng sẽ hiển thị trong mười giây. Mọi người thường bỏ qua bước này.
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0
# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0 \
--display-mode foxglove
# Drop the episodes that did not survive review
lerobot-edit-dataset \
--repo_id your-user/so100_pick_cube_20260823_141530 \
--new_repo_id your-user/so100_pick_cube_clean \
--operation.type delete_episodes \
--operation.episode_indices "[3, 17, 41]"
v2.1 hoặc v3.0: quyết định trước khi bạn ghi lại
v2.1 ghi một tệp parquet và một tệp MP4 cho mỗi tập. v3.0 nối nhiều tập thành các phân đoạn dùng chung và xây dựng lại ranh giới từ siêu dữ liệu, do đó info.json mang các mẫu đường dẫn như data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet thay vì số tập. Lý do từ phía nhà phát triển là ít tệp hơn, kích thước lớn hơn: khởi tạo nhanh hơn và giảm áp lực lên hệ thống tệp ở quy mô lớn.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| Bố cục | một tệp parquet và một tệp MP4 cho mỗi tập | nhiều tập cho mỗi phân đoạn |
| Siêu dữ liệu tập | Tệp JSONL | parquet được phân đoạn dưới meta/episodes/, thông qua ngăn xếp datasets |
| Truyền phát từ Hub | không | có, thông qua StreamingLeRobotDataset |
| Được ghi bởi lerobot 0.6.1 | không | có, những gì bạn nhận được hôm nay |
| Được đọc bởi GR00T N1.7 và N1.5 | có | không, phải được chuyển đổi xuống |
lerobot 0.6.1 ghi v3.0, nhưng GR00T N1.7 và N1.5 đọc v2.0 hoặc v2.1 và gặp lỗi. Lưu ý hướng phát triển: src/lerobot/scripts/ chứa convert_dataset_v21_to_v30.py và không có gì theo hướng ngược lại. Giải quyết vấn đề này trước buổi làm việc. Khắc phục: tập dữ liệu bị từ chối dưới dạng v3.
# Upgrade an older v2.1 dataset to v3.0
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube
# By default it pushes the converted dataset back to the hub and tags it v3.0.
# To convert a local copy and keep it off the hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube \
--root=/path/to/dataset/directory \
--push-to-hub=falseHai cách để có cùng bộ dữ liệu
Mọi thứ ở trên, trên máy của riêng bạn: bạn sở hữu việc liệt kê USB, bản dựng ffmpeg, điều chỉnh bộ mã hóa và các tệp hiệu chuẩn. Đây là cách phù hợp để hiểu quy trình, chạy một thiết lập camera khác thường hoặc giữ dữ liệu cục bộ.
Thời gian: một buổi tối cho mỗi cánh tay để lắp ráp, một lần hiệu chuẩn đầu tiên phức tạp và một phiên đầu tiên bạn phải bỏ đi vì camera bị đặt sai vị trí.
Ứng dụng máy tính để bàn ghi lại các bộ dữ liệu, tập, luồng camera và trạng thái khớp theo định dạng LeRobot, trực tiếp từ một phiên điều khiển từ xa . Bộ dữ liệu đó cung cấp cho biểu mẫu huấn luyện: chọn mô hình, bộ dữ liệu và siêu tham số, và phần phụ trợ thuê một GPU có kích thước phù hợp với VRAM của mô hình, chạy trình huấn luyện và ghi điểm kiểm tra vào bộ lưu trữ đối tượng.
- 1Cài đặt ứng dụng khách
Trên trang tải xuống; thiết lập trong tài liệu ứng dụng khách.
- 2Ghi lại từ một phiên điều khiển từ xa
Điều khiển cánh tay; ứng dụng khách ghi các tập theo định dạng LeRobot. Hướng dẫn chi tiết: ghi lại bộ dữ liệu đầu tiên của bạn.
- 3Hoặc mang dữ liệu của riêng bạn
Một bộ dữ liệu cũng có thể đến từ ID kho lưu trữ Hugging Face hoặc máy của riêng bạn: tài liệu bộ dữ liệu, thư mục công khai.
- 4Huấn luyện và chạy lại
Chọn sự kết hợp trên ma trận huấn luyện, sau đó chạy lại chính sách trên cánh tay. Khoảng 1 đến 3 USD trên tầng 24 GB, 4 đến 12 trên tầng A100 hoặc H100.
Nó không lắp ráp hoặc hiệu chỉnh cánh tay của bạn, và nó không sửa chữa một tập bị lỗi, vì vậy bước kiểm tra vẫn được áp dụng. Ngoài ra còn có một giới hạn cứng ở đầu kia: đối với các tác vụ nhanh, suy luận phải nằm cạnh các servo. Vòng điều khiển chạy từ 20 đến 485 ms cho mỗi bước hành động, và các chuyến đi khứ hồi qua internet công cộng sẽ biến một chính sách hoạt động thành một chính sách do dự.
Ghi lại bộ dữ liệu LeRobot mà không cần tự mình kết nối đường ống
Ứng dụng máy tính để bàn AY-Robots ghi lại các tập, luồng camera và trạng thái khớp theo định dạng LeRobot từ một phiên điều khiển từ xa, sau đó chuyển bộ dữ liệu cho trình huấn luyện.
Tải ứng dụng máy tính để bànTừ tập dữ liệu đến chính sách
Năm mươi tập sạch cung cấp cho mọi học bắt chước chạy ở đây. ACT huấn luyện từ đầu chỉ trên tác vụ của bạn, khoảng 80 triệu tham số với khoảng 20 ms mỗi bước hành động, là một trong năm mô hình duy nhất thoải mái với chuyển động nhanh. SmolVLA có khoảng 450 triệu tham số trên một card 24 GB. GR00T N1.7 là một mô hình nền tảng khoảng 3 tỷ tham số, nơi tinh chỉnh chạm khoảng 40 triệu tham số, cần một A100 hoặc H100, và yêu cầu tập dữ liệu v2.1 đó.
Tiếp theo, hướng dẫn cho sự kết hợp của bạn: ACT trên SO-100, SmolVLA trên SO-100 hoặc GR00T N1.7 trên SO-100; đối với lần chạy đầu tiên, huấn luyện chính sách đầu tiên của bạn ngắn hơn. Khi chính sách hoạt động trên bàn thử nghiệm nhưng sụp đổ ngay khi bạn di chuyển bàn, đó là một vấn đề về dữ liệu: chính sách chỉ hoạt động trong một thiết lập và thu thập dữ liệu huấn luyện VLA chất lượng cao đi sâu hơn về sự đa dạng.
Tôi thực sự cần bao nhiêu tập để có một chính sách hoạt động đầu tiên?▾
Ba mươi cho SmolVLA, năm mươi cho ACT, Pi0.5, GR00T N1.5 và N1.7, là số lượng tối thiểu mà các huấn luyện viên AY-Robots yêu cầu. Hướng dẫn của LeRobot độc lập khuyến nghị ít nhất 50 cho một tác vụ đầu tiên, khoảng 10 cho mỗi vị trí đối tượng. Nghiên cứu về mở rộng dữ liệu cho thấy khả năng tổng quát hóa tỷ lệ thuận với môi trường và đối tượng hơn là số lượng minh họa, vì vậy một trăm lần thực hiện của một cảnh tệ hơn năm mươi lần trên năm vị trí khác nhau.
Tôi có cần một cánh tay dẫn hướng không, hay tôi có thể điều khiển từ xa bằng bàn phím?▾
lerobot cung cấp các bộ điều khiển từ xa bằng bàn phím và gamepad, vì vậy một cánh tay dẫn hướng không thực sự bắt buộc, nhưng rất được khuyến khích: leader-follower cung cấp các quỹ đạo khớp liên tục theo quy ước tọa độ của hành động được ghi lại, trong khi đầu vào bàn phím tạo ra chuyển động từng bước mà một chính sách học được như giật. Điều khiển từ xa bằng bàn phím cũng cần một backend khóa toàn cầu, vì vậy nó không hoạt động trên Wayland và headless.
Tôi có thể ghi hình trên Raspberry Pi hoặc một máy tính mini nhỏ không?▾
Có, với việc tinh chỉnh. Hướng dẫn mã hóa luồng có một phân khúc tài nguyên thấp bao gồm các máy 4 lõi hiện đại và Raspberry Pi 5, và đặt hai camera ở độ phân giải 640x480 và 30 fps trong cột yêu cầu một số tinh chỉnh của nó. Lời khuyên của nó: ngăn bộ mã hóa cạnh tranh với vòng lặp chụp, thông qua --dataset.rgb_encoder.vcodec=h264 và --dataset.streaming_encoding=false. Nó đánh giá hai camera ở 640x480 là khoảng 55 triệu pixel mỗi giây và hai camera ở 1920x1080 là khoảng 373 triệu.
Làm thế nào để tôi biết tập dữ liệu tôi vừa ghi lại thực sự khỏe mạnh?▾
Ba kiểm tra đơn giản. So sánh thời lượng video của mỗi tập với thời lượng mà CLI báo cáo và xác nhận số hàng bằng fps nhân với thời lượng đó, theo từng tập chứ không phải tổng cộng; đó là bài kiểm tra chấp nhận mà hướng dẫn mã hóa của lerobot đưa ra. Đọc ds.meta.stats, nơi một khớp có giá trị min bằng max thì không bao giờ di chuyển. Sau đó phát lại hai hoặc ba tập trong lerobot-dataset-viz, đó là cách duy nhất để các khung hình bị hoán đổi và đóng băng xuất hiện. Về các khung hình bị mất, hướng dẫn đặt ra giới hạn khoảng 5 phần trăm bị thiếu; khoảng 2 phần trăm là tải tạm thời bình thường, thường chỉ là lúc khởi động.
Công việc huấn luyện của tôi đã từ chối tập dữ liệu là v3.0. Bây giờ phải làm gì?▾
GR00T N1.7 và N1.5 đọc LeRobot v2.0 hoặc v2.1 và gặp lỗi trên v3.0, đây là định dạng mà lerobot 0.6.1 ghi lại. Hoặc là thống nhất định dạng trước khi huấn luyện, hoặc sử dụng một chính sách đọc v3.0 nguyên bản: Pi0.5, SmolVLA hoặc ACT. lerobot cung cấp một bộ chuyển đổi từ v2.1 sang v3.0 và không có gì ngược lại.
Sources
- LeRobot: Học bắt chước trên robot thực tế
- LeRobot: Lắp ráp SO-100, cài đặt động cơ và hiệu chuẩn
- LeRobot: Camera và lerobot-find-cameras
- LeRobot: Cài đặt và ma trận tiện ích bổ sung
- LeRobotDataset v3.0: bố cục và di chuyển từ v2.1
- LeRobot: Mã hóa video trực tuyến và các khung hình bị bỏ qua
- LeRobot: Chuyển đổi các tập dữ liệu lớn sang v3.0 (DROID)
- lerobot v0.6.1 phát hành, 3 tháng 8 năm 2026
- DatasetRecordConfig: các cài đặt ghi mặc định thực tế
- lerobot_record.py: vòng lặp ghi và xử lý tiếp tục
- TheRobotStudio/SO-ARM100: kho lưu trữ bản dựng và danh mục vật liệu
- Hugging Face: Danh sách kiểm tra tập dữ liệu cộng đồng LeRobot
- lerobot/svla_so100_pickplace: 50 tập, 19.631 khung hình
- Lin et al. (2024), Các quy luật mở rộng dữ liệu trong học bắt chước
- Mandlekar et al. (2021), Điều gì quan trọng khi học từ các bản trình diễn ngoại tuyến của con người
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started