planner

플래너 내보내기

완성된 플래너를 체크포인트 + 런타임 코드가 포함된 독립 실행 zip으로 묶어 EasyTrainer 없이 도커 환경에서 실행합니다.

최근 확인 버전: v5.0.0

플래너 내보내기는 완성된 플랜과 그 안에서 쓰는 체크포인트, 보간/실행 런타임 코드, 도커 환경 파일을 한 번에 zip으로 묶어 주는 기능입니다. 받은 zip은 EasyTrainer 백엔드 / 컨테이너 / DB / gRPC 브리지 없이도 호스트의 ROS 2 토픽에 직접 명령을 발행해 플래너를 그대로 재생합니다. 양산 라인, 별도 산업용 PC, 데모용 노트북 등 EasyTrainer 전체 스택을 띄우기 어려운 환경에 배포할 때 사용합니다.

사전 조건

  • 플래너에 그룹과 블록이 모두 추가되어 있고 실행 중이 아니어야 합니다 (실행 중에는 내보내기 버튼이 비활성화됩니다).
  • 사용된 체크포인트 블록들이 모두 export 가능한 형식이어야 합니다.
    • action_key='qaction' 인 정책
    • vision backbone이 resnet18
    • 위 조건을 벗어나는 체크포인트가 하나라도 있으면 백엔드가 시작 단계에서 거부하고 알림으로 원인을 표시합니다.

내보내기 절차

    1. 플래너를 열고 우측 상단의 내보내기 버튼을 누릅니다.

      타임라인 헤더의 전체 실행 옆에 있는 다운로드 아이콘이 달린 버튼입니다. 블록이 하나도 없거나 그룹이 비어 있을 때, 또는 플래너가 실행 중일 때는 비활성화됩니다.

      플래너 헤더 — 내보내기 버튼 위치
    2. 저장 위치 선택 다이얼로그가 뜨면 zip 파일 경로를 지정합니다.

      파일명은 planner_<id>_<safe_name>.zip 형식으로 자동 제안됩니다. 브라우저가 File System Access API를 지원하면(Chrome / Edge 계열) 시스템 저장 다이얼로그가 열리고, 그렇지 않으면 브라우저의 기본 다운로드 폴더로 저장됩니다.

    3. 서버가 zip을 생성하는 동안 로딩 표시가 뜹니다.

      백엔드는 체크포인트 가중치를 export 형식으로 저장하고, IK가 필요한 로봇의 URDF와 메쉬, 런타임 템플릿(run_planner.py, ros_planner_service.py, easytrainer_runtime/), 도커 환경 파일(Dockerfile, docker-compose.yml, requirements.txt), 그리고 플랜 메타데이터(planner_meta.json)를 한 폴더로 묶어 zip으로 만듭니다. 체크포인트 크기에 비례하므로 수십 초까지 걸릴 수 있습니다.

    4. 내보내기에 성공하면 우하단에 저장된 파일명이 알림으로 표시됩니다.

      실패하면 알림에 원인이 함께 표시됩니다. 가장 자주 보이는 원인은 export 불가능한 체크포인트가 섞여 있는 경우입니다.

zip 안에 무엇이 들어 있나요

planner_<id>_<name>/
├── run_planner.py            # 단발 / 반복 실행 진입점
├── ros_planner_service.py    # ROS 서비스 호출로 실행/중지 제어
├── planner_meta.json         # 그룹·블록·체크포인트·로봇 토픽 메타데이터
├── requirements.txt          # Python 의존성
├── Dockerfile                # ROS 2 Humble + 필요한 의존성
├── docker-compose.yml        # GPU + 호스트 네트워크 설정
├── easytrainer_runtime/      # SimpleAgent / SimpleEnv / planner_engine / interpolation_node 등
├── lerobot/                  # 벤더링된 lerobot (별도 pip install 금지)
└── checkpoints/
    └── <체크포인트 ID>/
        ├── config.json, model.safetensors, ...
        └── export_meta.json

플랜이 쓰는 체크포인트 폴더가 모두 포함되어 있고, IK가 활성화된 로봇이 있으면 그 로봇의 URDF와 메쉬도 urdfs/<robot_id>/ 아래에 같이 들어갑니다. 다시 export하면 같은 폴더 위에 풀어쓸 수 있어 한번 빌드한 도커 이미지를 그대로 재사용할 수 있습니다 (requirements.txt가 바뀌지 않는 한).

받은 zip 실행하기

도커로 실행 (권장)

번들된 Dockerfiledocker-compose.yml을 그대로 사용하면 호스트 환경을 오염시키지 않고 깨끗하게 돌아갑니다. 호스트에는 Docker, Docker Compose, (GPU 추론을 위해) nvidia-container-toolkit이 필요합니다.

unzip planner_3_pick_and_place.zip
cd planner_3_pick_and_place

docker compose build                              # 최초 1회만
docker compose run --rm test python3 run_planner.py --dry-run   # 안전 사전 검증
docker compose run --rm test python3 run_planner.py             # 실제 실행

docker-compose.ymlnetwork_mode: host로 설정되어 컨테이너가 호스트와 같은 ROS 2 그래프(ROS_DOMAIN_ID)를 봅니다. 번들 폴더가 /workspace로 마운트되므로, 플래너를 EasyTrainer에서 다시 내보내 같은 폴더에 풀어 두면 다음 docker compose run이 곧바로 새 코드를 잡습니다.

호스트에서 직접 실행

ROS 2 Humble 이상이 설치/소싱되어 있고 pip install -r requirements.txt로 의존성이 들어가 있으면 도커 없이도 됩니다.

# 한 번 실행:
python3 run_planner.py

# 5번 반복:
python3 run_planner.py --repeat 5

# Ctrl-C까지 무한 반복:
python3 run_planner.py --repeat 0

# 로봇으로 명령은 보내지 않고 정책 액션 계산만 하기 (안전 점검):
python3 run_planner.py --dry-run

# CPU 강제 (GPU가 없을 때):
python3 run_planner.py --device cpu

그룹은 병렬 스레드로, 그룹 안의 블록은 순차로 실행됩니다. Ctrl-C를 누르면 안전하게 중지됩니다.

ROS 서비스로 트리거하기

산업용 PLC나 다른 노드에서 실행을 트리거하고 싶으면 ros_planner_service.py를 띄워 두고 표준 ROS 서비스로 시작/중지할 수 있습니다.

# 한 터미널에서 노드 띄우기:
python3 ros_planner_service.py

# 다른 터미널에서 실행 / 중단:
ros2 service call /easytrainer_planner_service/start std_srvs/srv/Trigger
ros2 service call /easytrainer_planner_service/stop  std_srvs/srv/Trigger

노드는 시작할 때 모든 체크포인트를 한 번 메모리에 올려 두므로 start 호출 시 곧바로 실행이 시작됩니다.

사전 조건 (실행 환경)

  • 받은 PC에서 로봇 드라이버와 카메라 드라이버가 미리 떠 있어야 합니다. 플랜은 EasyTrainer에서 만들 때 기록된 토픽 이름(planner_meta.json 안의 workspaces.<id>.assembly.robots / .sensors)을 그대로 사용합니다.
  • 로봇의 write_typetopic이어야 합니다. 서비스/액션 골 기반 로봇은 시작 단계에서 스킵되고 그 로봇이 필요한 블록은 명확한 오류로 실패합니다.
  • 체크포인트 블록은 GPU에서 도는 것을 강력히 권장합니다. --device cpu도 동작하지만 추론이 매우 느려집니다.

보간 노드 (joint command smoothing)

체크포인트 추론은 보통 ~10 Hz, 로봇 드라이버는 200 Hz 정도의 매끄러운 명령 스트림을 받아야 떨림 없이 움직입니다. EasyTrainer에서 interpolation이 켜진 로봇이 플랜에 있으면 export 시 자동으로 기록되고, 실행 시 각 로봇마다 JointInterpolationNode가 함께 떠서 /ec_robot_<id>/ec_joint_cmd를 받아 200 Hz로 보간한 뒤 실제 write_topic으로 발행합니다.

체크포인트 블록 안에서는 예측된 각 액션이 스케줄된 웨이포인트(/ec_robot_<id>/ec_joint_waypoint)로 전달되어 추론 한 스텝이 늦어져도 로봇 속도에 끊김이 생기지 않습니다. 이 경로를 끄고 옛 즉시 명령 방식으로 돌아가려면:

EC_SCHEDULED_WAYPOINTS=0 python3 run_planner.py

블록 지원 범위

블록 종류독립 실행 환경에서 지원 여부
Joint Position지원 — duration 동안 보간 이동
Checkpoint지원 — 폐루프 추론, until_done / move_homepose 모두 반영
Time Sleep지원
Sync지원 — 그룹 간 배리어
Query Pose (관절 모드)지원
Query Pose (엔드 이펙터 모드)지원 — 번들된 Pinocchio + pin-pink IK 사용

EasyTrainer 안에서 실행할 때와의 차이

  • 소켓 진행률 브로드캐스트 / OOD 점수 / Grad-CAM / OTI-RL은 빠집니다. 운영 모니터링 UI가 필요하면 EasyTrainer 안에서 실행하세요.
  • move_homepose는 체크포인트 시작 직전에 한 번만 홈으로 이동합니다 (in-container의 매 에피소드 재홈 루프와는 다릅니다).
  • 엔드 이펙터 모드 Query Pose는 단일 EE 로봇만 지원합니다.

관련 문서