Inovation Lab

🤖 Isaac Sim 로봇 픽앤플레이스 입문 가이드 (ver 5.1.0)

AI를 활용한 지식 정보화 2026. 1. 30. 22:40

이 가이드는 Isaac Sim 환경에서 Franka 로봇이 물체를 인식하고 옮기는 전체 과정을 단계별로 설명합니다.

📂 1. 프로젝트 폴더 구성

가장 먼저 프로젝트 파일을 관리할 폴더를 터미널에서 생성합니다.

# 워크스페이스 폴더 생성
mkdir -p ~/isaac_ws
cd ~/isaac_ws

# 실행 스크립트 파일 생성
touch pick_and_place.py

💻 2. 소스 코드 작성

pick_and_place.py 파일을 열고 아래 코드를 복사하여 붙여넣으세요.

Isaac Sim 5.1.0의 최신 API 규격을 완벽히 반영한 코드입니다.

from isaacsim import SimulationApp

# [STEP 1] 시뮬레이션 앱 초기화 (반드시 모든 임포트보다 위에 위치)
simulation_app = SimulationApp({"headless": False})

from omni.isaac.core import World
from omni.isaac.franka import Franka
from omni.isaac.core.objects import DynamicCuboid, VisualCuboid
from omni.isaac.sensor import Camera
from omni.isaac.franka.controllers import PickPlaceController
import numpy as np
import cv2

def main():
    # [STEP 2] 월드 구성: 물리 엔진과 지면 설정
    world = World(stage_units_in_meters=1.0)
    world.scene.add_default_ground_plane()

    # [STEP 3] 로봇 및 객체 배치
    # Franka 로봇 추가
    franka = world.scene.add(Franka(prim_path="/World/Franka", name="my_franka"))
    
    # 잡을 대상 (빨간 큐브)
    cube = world.scene.add(DynamicCuboid(
        prim_path="/World/Cube", name="target_cube", 
        position=np.array([0.4, 0.4, 0.05]), size=0.05, color=np.array([1, 0, 0])
    ))
    
    # 놓을 목표 지점 (파란색 영역)
    goal_position = np.array([0.4, -0.4, 0.05])
    world.scene.add(VisualCuboid(
        prim_path="/World/Goal", name="goal_zone", 
        position=goal_position, size=0.05, color=np.array([0, 0, 1])
    ))

    # [STEP 4] 카메라 설정 (비전 모니터링)
    camera = Camera(prim_path="/World/MyCamera", 
                    position=np.array([1.2, 0.0, 1.0]), 
                    resolution=(640, 480))
    camera.initialize()
    camera.set_focal_length(1.8)

    # [STEP 5] 픽앤플레이스 컨트롤러 초기화 (5.1.0 버전 API)
    # 로봇 객체(franka)와 그리퍼 객체(franka.gripper)를 직접 전달합니다.
    pp_controller = PickPlaceController(
        name="pick_place_controller",
        robot_articulation=franka,
        gripper=franka.gripper
    )

    world.reset()
    print(">>> 시뮬레이션 준비 완료!")

    # [STEP 6] 메인 루프 실행
    while simulation_app.is_running():
        # 물리 엔진 계산 및 렌더링
        world.step(render=True)
        
        if world.is_playing():
            # (A) 비전 데이터 획득: 카메라 프레임을 OpenCV로 시각화
            images = camera.get_current_frame()
            if "rgba" in images:
                cv_frame = cv2.cvtColor(images["rgba"], cv2.COLOR_RGBA2BGR)
                cv2.imshow("Robot Monitor", cv_frame)
                if cv2.waitKey(1) & 0xFF == ord('q'): break

            # (B) 동작 제어: 물체 위치 파악 및 명령 생성
            cube_pos, _ = cube.get_world_pose()
            actions = pp_controller.forward(
                picking_position=cube_pos,
                placing_position=goal_position,
                current_joint_positions=franka.get_joint_positions()
            )
            
            # (C) 명령 실행
            franka.apply_action(actions)

            # 작업 완료 체크
            if pp_controller.is_done():
                print(">>> 작업을 성공적으로 마쳤습니다!")
                world.pause()

    cv2.destroyAllWindows()
    simulation_app.close()

if __name__ == "__main__":
    main()

🚀 3. 실행 방법

Isaac Sim은 시스템의 기본 파이썬이 아닌, 자체 내장 파이썬 환경(python.sh)에서 실행해야 합니다.

  1. 터미널을 열고 Isaac Sim 설치 폴더로 이동합니다.
    cd ~/isaacsim510     // isaac sim 설치 폴더로 이동
  2. 작성한 스크립트를 실행합니다.
    ./python.sh ~/isaac_ws/pick_and_place.py

💡 4. 초보자를 위한 주요 개념 설명

1) 왜 SimulationApp이 맨 위에 있나요?

Isaac Sim은 GPU 메모리를 미리 선점하고 엔진을 로드해야 합니다.

이 작업이 끝나기 전에 다른 모듈(World, Franka 등)을 불러오면 "Module Not Found" 에러가 발생합니다.

2) PickPlaceController의 역할

이 컨트롤러는 **상태 머신(State Machine)**입니다.

"물체 위로 이동 → 내려가기 → 집기 → 올리기 → 목표지로 이동 → 놓기"의 복잡한 과정을

forward() 함수 하나로 자동 관리해 줍니다.

3) render=True의 의미

일반적인 물리 계산만 할 때는 False로 두면 성능이 빨라지지만, 카메라 영상을 받아오려면

실제로 화면을 그려야(Rendering) 하므로 반드시 True로 설정해야 합니다.


🛠 5. 자주 발생하는 문제 해결 (FAQ)

  • 로봇이 물체를 놓쳐요: 큐브가 너무 작거나 가벼울 수 있습니다. size를 0.05 정도로 설정했는지 확인하세요.
  • OpenCV 창이 안 떠요: cv2.waitKey(1) 코드가 루프 안에 있는지 확인하세요.
  • API 에러가 나요: Isaac Sim은 버전별로 인자 이름이 다릅니다. 이 코드는 5.1.0 버전 전용입니다.

 

'Inovation Lab' 카테고리의 다른 글

로봇 컨트롤러 개발 및 활용을 위한 조사  (0) 2025.09.07