LeRobot documentation

요약

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

요약

LeRobot 명령어를 한곳에 모았습니다. 특정 명령어의 사용법을 잊었거나 새로운 명령어를 배우고 싶다면 여기서 확인하세요.

아래에 나열된 모든 명령어에서 포트/이름/ID를 본인의 값으로 변경해야 한다는 점을 기억하세요!

특정 환경에 맞게 모든 명령어를 확인하고 설정하는 또 다른 좋은 방법은 이 Jupyter Notebook을 사용하는 것입니다.

설정 및 설치

설치 방법은 LeRobot Installation을 참고하세요.

유용한 도구

포트 찾기

로봇이 연결된 시리얼 포트를 식별하는 데 이 명령을 사용합니다. 터미널의 지시를 따르세요. USB 케이블을 분리하고 Enter 키를 누르도록 요청됩니다. 그러면 스크립트가 해당 로봇에 대한 올바른 시리얼 포트를 감지하여 출력합니다.

lerobot-find-port
카메라 찾기

카메라 인덱스를 빠르게 찾고 출력을 확인합니다. 이 명령은 카메라 정보를 터미널에 출력하고 각 감지된 카메라의 테스트 프레임을 outputs/captured_images에 저장합니다.

lerobot-find-cameras

교정

대부분의 경우 각 로봇 및 텔레오퍼레이션 장치별로 보정을 한 번만 수행하면 됩니다. 보정을 수행하기 전에 모든 관절이 대략 중간 위치에 있는지 확인하세요.

lerobot-calibrate \
    --robot.type=so101_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_follower_arm

교정 시 사용한 것과 동일한 ID를 나중에 다른 스크립트에서도 사용하도록 하십시오. LeRobot은 이 방식으로 교정 파일을 찾습니다.

원격 조작

두 개의 카메라로 텔레오퍼레이션을 수행하고 Rerun으로 데이터를 표시합니다.

lerobot-teleoperate \
    --robot.type=so101_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_follower_arm \
    --robot.cameras="{ top: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \
    --teleop.type=so101_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_leader_arm \
    --display_data=true

데이터셋 기록

데이터셋은 repo_id 아래에 Hugging Face Hub로 자동으로 업로드됩니다. CLI를 통해 HF 계정에 로그인되어 있는지 확인하세요(https://huggingface.co/settings/tokens에서 토큰을 발급받을 수 있습니다). 또한 아래 명령에서 사용될 사용자 이름을 HF_USER에 저장하세요:

lerobot-record \
    --robot.type=so101_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_follower_arm \
    --robot.cameras="{ top: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \
    --teleop.type=so101_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_leader_arm \
    --dataset.repo_id=${HF_USER}/so101_dataset_test \
    --dataset.num_episodes=30 \
    --dataset.single_task="put the red brick in a bowl" \
    --dataset.streaming_encoding=true \
    --display_data=true

데이터셋을 수집하는 동안 키보드로 프로세스를 제어할 수 있습니다:

  • 오른쪽 화살표 (→) 또는 n를 누르면 에피소드를 저장하고 다음으로 이동합니다.
  • 왼쪽 화살표 (←) 또는 r를 누르면: 현재 에피소드를 삭제하고 다시 시도합니다.
  • Escape (ESC) 또는 q를 누르면: 중지, 비디오 인코딩, 업로드를 수행합니다.

lerobot-record는 세션의 날짜와 시간을 --dataset.repo_id의 끝에 추가하므로, ${HF_USER}/so101_dataset_test는 ${HF_USER}/so101_dataset_test_YYYYMMDD_HHMMSS로 저장됩니다. 전체 이름은 Hugging Face 프로필에서 또는 ls ~/.cache/huggingface/lerobot/${HF_USER} 명령어로 확인하고, 아래 학습 명령어에 사용하세요. 정확한 이름을 유지하려면 --dataset.no_stamp=true를 추가하세요.

기록 깊이

Intel RealSense 카메라(type: intelrealsense)는 use_depth: true를 설정하면 깊이 스트림을 기록합니다. 깊이는 12비트 코드로 양자화되어 별도의 비디오로 저장됩니다.

lerobot-record \
    ... \
    --robot.cameras="{ head: {type: intelrealsense, serial_number_or_name: \"0123456789\", width: 640, height: 480, fps: 30, use_depth: true} }" \
    --dataset.repo_id=${HF_USER}/so101_depth_test \
    --dataset.single_task="put the red brick in a bowl" \
    --dataset.depth_encoder.depth_min=0.01 \
    --dataset.depth_encoder.depth_max=10.0 \
    --dataset.depth_encoder.shift=0.0 \
    --dataset.depth_encoder.use_log=true

비디오 인코딩 매개변수

RGB 스트림과 depth 스트림은 --dataset.rgb_encoder.* 및 --dataset.depth_encoder.* 키를 통해 독립적으로 인코딩됩니다.

lerobot-record \
    ... \
    --dataset.rgb_encoder.vcodec=h264 \
    --dataset.rgb_encoder.pix_fmt=yuv420p \
    --dataset.rgb_encoder.crf=23 \
    --dataset.depth_encoder.vcodec=hevc \
    --dataset.depth_encoder.extra_options='{"x265-params": "lossless=1"}'

학습

하드웨어에 따라 정책 학습에 몇 시간이 걸릴 수 있습니다. 간단한 ACT 정책을 학습하는 방법은 다음과 같습니다:

lerobot-train \
    --dataset.repo_id=${HF_USER}/so101_dataset_test_YYYYMMDD_HHMMSS \
    --policy.type=act \
    --output_dir=outputs/train/act_so101_test \
    --job_name=act_so101_test \
    --policy.device=cuda \
    --trackio.enable=true \
    --policy.repo_id=${HF_USER}/policy_test \
    --steps=20000
  • 일반적인 정책 유형: act, diffusion, multi_task_dit, smolvla, pi0, pi05, pi0_fast, groot, xvla. 각 정책은 사이드바의 Policies 아래에 전용 페이지를 가지며, Compute & Hardware Guide에서는 어떤 정책이 사용자의 GPU에 적합한지 보여 줍니다.
  • 디바이스: cuda (NVIDIA), mps (Apple Silicon), cpu

--policy.type는 해당 유형의 새 정책을 생성하고 데이터셋에서 처음부터 학습합니다(일부 정책은 설정에 따라 사전 학습된 비전 또는 언어 백본에서 시작합니다). 기존 모델을 미세 조정하려면 로컬 체크포인트나 Hub 저장소 ID를 --policy.path로 전달하세요. 정책 유형과 설정은 해당 경로에서 읽히므로 --policy.type는 필요하지 않습니다.

lerobot-train \
    --dataset.repo_id=${HF_USER}/so101_dataset_test_YYYYMMDD_HHMMSS \
    --policy.path=username/the_policy_to_finetune \
    --policy.device=cuda \
    --policy.repo_id=${HF_USER}/policy_finetuned_test \
    --output_dir=outputs/train/finetuned_so101_test \
    --steps=20000

로컬 GPU가 없나요? --job.target=<flavor>(예: a10g-small)을 두 명령어 중 하나에 추가하면 lerobot-train가 대신 Hugging Face Jobs에서 실행됩니다. 이 경우 로컬 전용 데이터셋을 업로드하고 학습된 모델을 푸시합니다. hf jobs hardware로 flavor 목록을 확인하세요. 작업의 메트릭을 추적하려면 --trackio.enable=true --trackio.space_id=<user>/<space>를 추가하세요. 포드의 로컬 Trackio 데이터베이스는 작업이 종료되면 유지되지 않습니다.

재개를 시작하려면 --config_path를 체크포인트로 지정하고 --resume=true를 추가하세요. 로컬 경로 또는 Hub 저장소 ID(최신 체크포인트가 가져와짐)를 지원하며, --job.target=<flavor>를 추가하여 로컬 또는 잡에서 작동합니다:

lerobot-train --config_path=${HF_USER}/policy_test --resume=true --job.target=a10g-small

추론

Inference는 학습된 policy/model을 로봇에서 실행하는 것을 의미합니다. 이를 위해 lerobot-rollout를 사용합니다. policy의 경로를 제공해야 합니다. 로컬 경로 또는 Hugging Face repo id를 사용할 수 있으며, 예를 들어 위의 학습 명령에서 사용한 ${HF_USER}/policy_test와 같습니다. 데이터셋을 수집할 때와 동일한 포트, --robot.id, 카메라 구성 및 작업 설명을 사용해야 합니다. --duration은 초 단위로 지정되며, 지정하지 않으면 policy가 중지될 때까지 실행됩니다.

v0.5.x 이전 버전에서는 lerobot-rollout이 존재하지 않으므로 대신 lerobot-record를 사용해야 합니다. 자세한 내용은 여기를 참조하세요.

lerobot-rollout \
    --strategy.type=base \
    --policy.path=${HF_USER}/policy_test \
    --robot.type=so101_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_follower_arm \
    --robot.cameras="{ top: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \
    --task="put the red brick in a bowl" \
    --duration=60
Update on GitHub