🧪 새 튜토리얼이 계속 업데이트 중 — 로봇 팔부터 센서까지
본문으로 건너뛰기

문제 해결 및 빠른 참조 ​

소속: troubleshooting/관련: deployment/ · xlerobot/ · lerobot/


자주 발생하는 문제 ​

컨테이너에서 로봇의 시리얼 포트가 보이지 않음 ​

bash
# 호스트에서 디바이스 존재 확인
ls /dev/ttyACM*
# 사용자가 dialout 그룹에 있는지 확인
groups | grep dialout

그룹에 없다면 sudo usermod -aG dialout $USER를 실행한 뒤 다시 로그인하세요.

이미지 다운로드가 멈춤 / 타임아웃 ​

미러 가속기를 설정하지 않은 경우입니다. deployment/02-Environment-Setup 2절을 참고하세요.

모델 다운로드 실패 / huggingface에 연결할 수 없음 ​

-e HF_ENDPOINT=https://hf-mirror.com을 설정하세요. deployment/02-Environment-Setup 4절을 참고하세요.

rerun 시각화 창이 크래시함 ​

thread 'main' panicked at 'Library libxkbcommon-x11.so could not be loaded.'

X11 라이브러리가 없기 때문입니다. 로봇 자체에는 영향이 없고, 창이 보이지 않을 뿐입니다. 라이브러리 설치 명령과 주의 사항은 xlerobot/ 1절을 참고하세요 — 핵심은 docker exec에 반드시 -u root를 붙여야 한다는 것입니다.

컨테이너에서 torch.cuda.is_available()이 False임 ​

  • cpu / cpu-slim 이미지를 사용 중 → 정상입니다, 이 버전들은 애초에 GPU가 없습니다
  • jetson 이미지를 사용 중 → --runtime nvidia를 사용했는지 확인하세요 (반드시 --device nvidia.com/gpu=all을 사용해야 합니다), 그리고 CDI 스펙이 생성되었는지도 확인하세요

컨테이너가 시작되지 않고 CDI 오류가 발생함 ​

CDI device injection failed: failed to stat CDI host device "/dev/dri/card0"

호스트의 자동 새로 고침 서비스가 존재하지 않는 card0을 참조하는 스펙을 생성했습니다. 해결 방법:

bash
sudo systemctl disable --now nvidia-cdi-refresh.path nvidia-cdi-refresh.service
sudo rm -f /var/run/cdi/nvidia.yaml
sudo systemctl restart docker

(이 문제는 자체 보드에서 재부팅할 때마다 재현됩니다. 자세한 내용은 developer/03-Board-Remote-Testing.md를 참고하세요.)

캘리브레이션을 매번 다시 해야 함 ​

캘리브레이션 파일이 컨테이너 안에 저장되어, 컨테이너를 삭제하면 사라집니다. 시작할 때 캐시 디렉터리를 마운트하세요:

bash
-v ~/.cache/huggingface:/home/jetson/.cache/huggingface

scripts/run.sh가 이미 이 작업을 수행합니다.

캘리브레이션 명령에서 invalid choice: 'xlerobot' 오류 발생 ​

고장이 아니라 원래 그렇게 설계된 것입니다. lerobot-calibrate 명령줄 도구는 XLeRobot을 지원하지 않으며, 캘리브레이션은 예제 스크립트에서 자동으로 시작됩니다. xlerobot/ 0절과 3절을 참고하세요.

데이터셋 작업 시 torchcodec 오류가 잔뜩 출력됨 ​

이미지가 아니라 직접 설치한 환경을 사용하는 경우, libnvrtc.so.13: cannot open shared object file이 나타날 수 있습니다. 이는 torchcodec이 순수 CPU 환경에서 로드되지 못하는 것인데, lerobot이 자동으로 pyav로 폴백하므로 기능에는 영향이 없습니다. 이미지에서는 이미 제거되어 있어 이 오류가 나타나지 않습니다.

컨테이너에서 로봇 변형 두 개를 import하면 오류 발생 ​

Cannot register ... as xlerobot because ... is already registered

xlerobot과 xlerobot_mecanum, 이 한 쌍에서만 발생합니다 — 둘 다 소스 코드에서 "xlerobot"으로 등록되기 때문입니다(mecanum 쪽 config는 복사해 온 것이라 등록 이름을 바꾸지 않았습니다). XLeRobot 업스트림의 버그입니다.

다른 조합은 충돌하지 않습니다: 원본 LeRobot의 모든 로봇 + XLeRobot이 같은 프로세스에서 공존할 수 있습니다 (실측에서 8개 유형이 동시에 등록 성공). xlerobot_2wheels도 충돌하지 않습니다.

로봇 한 대에는 변형 하나만 사용하므로 실제 사용에는 영향이 없습니다. 정말로 동시에 써야 한다면(예: 비교 스크립트 작성) 프로세스를 분리해 실행하세요.


원본 lerobot-* 명령을 쓸 때의 문제 ​

lerobot-record에서 카메라 관련 오류가 발생 / 녹화된 데이터에 이미지가 없음 ​

카메라는 --robot.cameras 중첩 딕셔너리로 전달해야 하며, 별도의 최상위 파라미터가 아닙니다:

bash
--robot.cameras="{ front: {type: opencv, index_or_path: /dev/video0, width: 640, height: 480, fps: 30} }"

index가 아니라 index_or_path라는 점에 주의하세요. front는 카메라 이름이며 여러 개를 지정할 수 있습니다. 전체 예제는 lerobot/ 6절을 참고하세요.

lerobot-eval이 실제 로봇에서 작동하지 않음 ​

lerobot-eval은 시뮬레이션 benchmark용입니다(--env.type=aloha/pusht/libero/metaworld...). 실제 로봇 배포 도구가 아닙니다.

실제 로봇에서 학습된 정책을 실행하려면 **lerobot-rollout**을 사용하세요:

bash
lerobot-rollout \
  --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=my_follower \
  --policy.path=<사용자이름>/<모델이름> --strategy.type=base

examples/를 쓸지 lerobot-*를 쓸지 구분이 안 될 때 ​

하드웨어사용할 것
XLeRobot 일체형(양팔 + 베이스)examples/ 스크립트 → xlerobot/
단일 SO-101 / SO-100 암, LeKiwilerobot-* 명령줄 → lerobot/

판별 기준은 간단합니다: lerobot-*의 로봇 화이트리스트에 xlerobot이 없습니다(전체 목록은 lerobot/ 11절 참고).

--robot.type을 지정했는데 invalid choice 오류 발생 ​

lerobot/ 11절의 전체 목록과 대조해 보세요 — 그 14종의 원본 유형만 사용할 수 있습니다. xlerobot은 목록에 없으므로 examples/ 스크립트를 사용해야 합니다.


치트시트 ​

공통 (두 경로 모두) ​

bash
# 이미지 받기
docker pull chenyang310/xlerobot:cpu-slim

# 시작(범용)
bash scripts/run.sh cpu

# 시작(Jetson, GPU 포함)
bash scripts/run.sh jetson

# 컨테이너 진입 후 — 최초 설정
lerobot-find-port                     # 시리얼 포트 찾기(대화형, 안내에 따라 서보 케이블 뽑았다 꽂기)

# rerun에 필요한 X11 라이브러리 두 개 설치(터미널을 따로 열고, -u root는 생략 불가)
docker exec -u root -it xlerobot bash -c "apt-get update && apt-get install -y libxkbcommon-x11-0 libxinerama1"

# 학습(두 경로 공용: robot.type 불필요)
lerobot-train --policy.type=act --dataset.repo_id=<사용자이름>/<데이터셋이름>

# 자체 점검
python -c "import torch, lerobot; print(torch.__version__, lerobot.__version__)"
python -c "import torch; print('GPU:', torch.cuda.is_available())"

A · XLeRobot 일체형 (양팔 + 베이스) ​

bash
# 원격 조작: 터미널 하나면 충분, 처음 실행 시 자동으로 캘리브레이션 안내 시작
python examples/4_xlerobot_teleop_keyboard.py

# 2륜 베이스 버전
python examples/4_xlerobot_2wheels_teleop_keyboard.py

# ⚠️ lerobot-calibrate / lerobot-record / lerobot-teleoperate에 xlerobot을 전달하지 마세요.
#    화이트리스트에 없어서 invalid choice만 출력합니다. XLeRobot은 examples/ 스크립트를 사용합니다.

자세한 내용은 xlerobot/을 참고하세요.

B · 단일 SO-101 / LeKiwi (lerobot-* CLI) ​

bash
# 디바이스 찾기
lerobot-find-port
lerobot-find-cameras opencv

# 새 서보에 ID 쓰기(새로 조립한 암에만 필요)
lerobot-setup-motors --robot.type=so101_follower --robot.port=/dev/ttyACM0

# 캘리브레이션
lerobot-calibrate --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=my_follower

# 원격 조작(키보드, 리더 암 불필요)
lerobot-teleoperate \
  --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=my_follower \
  --teleop.type=keyboard

# 데이터셋 녹화
lerobot-record \
  --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=my_follower \
  --robot.cameras="{ front: {type: opencv, index_or_path: /dev/video0, width: 640, height: 480, fps: 30} }" \
  --teleop.type=keyboard \
  --dataset.repo_id=<사용자이름>/<데이터셋이름> --dataset.num_episodes=10 \
  --dataset.single_task="pick up the cube"

# 재생 확인
lerobot-replay --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=my_follower \
  --dataset.repo_id=<사용자이름>/<데이터셋이름> --dataset.episode=0

# 학습된 정책을 실제 로봇에 배포(⚠️ lerobot-eval이 아닙니다, 그것은 시뮬레이션용)
lerobot-rollout \
  --robot.type=so101_follower --robot.port=/dev/ttyACM0 --robot.id=my_follower \
  --policy.path=<사용자이름>/<모델이름> --strategy.type=base

자세한 내용은 lerobot/을 참고하세요.

키 빠른 참조 ​

부위키동작
베이스i k j l전 / 후 / 좌 / 우
베이스u o n m좌회전 / 우회전 / 가속 / 감속
베이스b종료
왼팔q/e w/s a/d z/xpan / x / y / pitch
왼팔r/f t/g c ywrist / 그리퍼 / 원점 복귀 / 사각형 궤적
왼팔< > , .헤드 서보 1 / 2
오른팔7/9 8/2 4/6 1/3pan / x / y / pitch
오른팔/ * + - 0wrist / 그리퍼 / 원점 복귀
오른팔Y(대문자)사각형 궤적
기타?헤드 원점 복귀

전체 설명은 xlerobot/ 4절을 참고하세요.


부록: 이 튜토리얼에서 언급한 것들이 왜 이렇게 되어 있는가 ​

결정이유
Python 3.12가 필수lerobot 0.6.2가 PEP 695 문법(type X = ..., class Foo[T]:)을 사용해서 3.10/3.11에서는 컴파일조차 되지 않습니다
중국 본토에서는 미러 가속기 필수Docker Hub 직접 연결이 타임아웃되며, 실측에서 context deadline exceeded가 발생합니다
HF_ENDPOINT 필수중국 본토에서는 huggingface.co에 전혀 접속할 수 없고, hf-mirror.com은 접속 가능합니다
Jetson은 --runtime nvidia 대신 CDI 사용JetPack 6/7의 cgroup v2 환경에서는 --runtime nvidia가 디바이스 노드를 주입하지 않습니다
placo 운동학 라이브러리를 설치하지 않음cp312/aarch64용 휠이 없습니다. XLeRobot은 자체 내장 해석적 IK를 사용하며 이 라이브러리에 의존하지 않습니다

더 자세한 기술 내용은 developer/01-Jetson-Environment.md를 참고하세요.


관련 링크 ​


처음으로: deployment/01-Overview다른 경로: xlerobot/ · lerobot/