Trang hướng dẫn của AY-Robots để ghi lại tập dữ liệu LeRobot đầu tiên của bạn với cánh tay SO-100
LeRobotSO-100Ghi dữ liệuĐiều khiển từ xaHọc bắt chước

Ghi lại tập dữ liệu LeRobot đầu tiên của bạn với SO-100

AY-Robots ResearchAugust 23, 202616 phút đọc

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ăngdtypeHình dạngNó là gì
actionfloat32[6]các mục tiêu khớp từ cánh tay dẫn đầu
observation.statefloat32[6]các vị trí khớp mà bộ phận theo dõi đạt được
observation.images.topvideo[480, 640, 3]camera cảnh, MP4 (av1 ở đây)
observation.images.wristvideo[480, 640, 3]camera cổ tay, cùng tốc độ
timestampfloat32[1]số giây kể từ khi bắt đầu tập
frame_index, episode_index, index, task_indexint64[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.

Một thước đo từ một tập dữ liệu thực

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.

Mục từ điển AY-Robots cho định dạng tập dữ liệu LeRobot, hiển thị bố cục thư mục và các tệp siêu dữ liệu
Những gì nằm trong data/, videos/ và meta/, và chính sách nào đọc phiên bản nào.

Những gì bạn cần trên bàn làm việc

MụcChi tiếtLưu ý
Cánh tay theo dõiSO-100, sáu servo Feetech STS3215khoảng 110 đến 150 EUR cho các bộ phận
Cánh tay dẫn đầumột SO-100 thứ hai, đã tháo bánh răngbá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ệnphù 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
Camerahai camera USB, 640x480 ở 30 khung hình/giâymộ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, ffmpegrequires-python >= 3.12
Tài khoản HubHugging Face write tokenoptional with --dataset.push_to_hub=false
7.4 V, không phải 12 V

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-100hướ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

bash
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-info
lerobot-info in ra bản tóm tắt hệ thống, bao gồm phiên bản ffmpeg mà nó có thể tìm thấy trên PATH.

Cá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.

  1. 1
    Tì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.

    bash
    lerobot-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.
  2. 2
    Ghi 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.

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  3. 3
    Hiệ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ó. id sẽ trở thành tên tệp hồ sơ.

    bash
    lerobot-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. 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.

    bash
    lerobot-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
Nơi lưu trữ hiệu chuẩn và lý do ID quan trọng

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

bash
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.0
Chạy lệnh này mỗi phiên: tài liệu cảnh báo rằng các định danh này có thể thay đổi sau khi khởi động lại hoặc cắm lại, tùy thuộc vào hệ điều hành.

Hai 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.

Chỉ mục camera không phải là một định danh ổn định

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ờ

bash
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=2
Từ điển camera là một chuỗi được trích dẫn trong shell; các dấu ngoặc nhọn lồng nhau không phải là cú pháp shell.

Cá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 địnhChức năng
--dataset.repo_idemptytên; dấu thời gian được thêm vào theo mặc định
--dataset.single_taskemptychuỗ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.fps30tố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_s60số giây trước khi một tập tự động chuyển tiếp
--dataset.reset_time_s60đặt lại cảnh; cánh tay robot di chuyển, không có gì được lưu trữ
--dataset.num_episodes50số tập được ghi trong phiên này
--dataset.push_to_hubtruetải lên khi kết thúc phiên; false giữ cục bộ
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablemã hóa trong quá trình thu thập; đặt rõ ràng
--dataset.encoder_queue_maxsize30khung hình được đệm cho mỗi camera, ~1 giây ở 30 khung hình/giây
--dataset.encoder_threadsnull (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_stampfalsegiữ repo_id chính xác như đã nhập
--resumefalsethêm vào một tập dữ liệu hiện có; cần --dataset.root
Hai cờ lệnh gây mất một giờ bất ngờ

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--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áchSố tập tối thiểuĐịnh dạng tập dữ liệuHạng GPUChi phí mỗi lần chạy
SmolVLA30LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
ACT50LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
Pi0.550LeRobot v3.0A100 80 GB or H100 80 GBabout 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.

Điều khiển từ xa theo kiểu chủ-tớ làm nguồn dữ liệu
Ưu điểm
  • 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
Đánh đổi
  • 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ỗiDấu hiệu nhận biếtNguyên nhânCách phát hiện
Chế độ xem camera bị hoán đổihình ảnh cổ tay dưới khóa trên cùnggán lại chỉ mục sau khi cắm lạilerobot-find-cameras mỗi phiên; đường dẫn theo ID
Khung hình bị đóng băngcùng một hình ảnh trong hàng chục hàngcamera ngừng cung cấp; vòng lặp lặp lại khung hình cuối cùngkiểm tra nó trong lerobot-dataset-viz
Khung hình bị bỏ quasố hàng thấp hơn fps nhân với giâyhà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 đaphạm vi của khớp dẫn vượt quá khớp theo sau, hoặc tư thế giữa không tốtmin/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ặpgiữ mọi camera ở --dataset.fps
Thời gian chếtcác chuỗi dài các hàng hành động giống hệt nhaungười vận hành tạm dừng khi máy ghi đang chạytỷ 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 đượctask1, demo2, testgõ nhanhmeta/tasks.parquet trong v3.0 (nó là meta/tasks.jsonl trong v2.1); sửa bằng lerobot-edit-dataset modify_tasks
Các khung hình bị bỏ qua tự ẩn mình

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.

python
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"])
Một tập có tốc độ khung hình (fps) nhân với thời lượng quá khác biệt là ứng cử viên để xóa, không phải để huấn luyện.

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.

bash
# 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]"
lerobot-edit-dataset cũng thực hiện chia tách, hợp nhất, xóa tính năng, sửa đổi tác vụ và tính toán lại số liệu thống kê. Hãy xóa một cách hào phóng: một tập tệ chỉ tốn một tập; giữ nó sẽ tốn kém cho mọi lần chạy được huấn luyện trên đó.
Thư mục tập dữ liệu AY-Robots liệt kê các tập dữ liệu LeRobot công khai với số lượng tập và định dạng.
Cách các tập dữ liệu có thể so sánh được định cỡ và chú thích.

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.1LeRobot v3.0
Bố cụcmột tệp parquet và một tệp MP4 cho mỗi tậpnhiều tập cho mỗi phân đoạn
Siêu dữ liệu tậpTệp JSONLparquet được phân đoạn dưới meta/episodes/, thông qua ngăn xếp datasets
Truyền phát từ Hubkhôngcó, thông qua StreamingLeRobotDataset
Được ghi bởi lerobot 0.6.1khôngcó, những gì bạn nhận được hôm nay
Được đọc bởi GR00T N1.7 và N1.5không, phải được chuyển đổi xuống
Ghi hôm nay, huấn luyện GR00T ngày mai

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.

bash
# 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=false
Nhanh chóng cho 50 tập. Mở rộng quy mô là một công việc khác: hướng dẫn chuyển đổi của lerobot, dành cho DROID thô sang v3.0, dự trù hơn 7 ngày xử lý cục bộ và khoảng 400 GB.

Hai 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ộ.

Chi phí của cách này

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í.

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àn

Từ 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ậpthu 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.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started