이 가이드는 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)에서 실행해야 합니다.
- 터미널을 열고 Isaac Sim 설치 폴더로 이동합니다.
cd ~/isaacsim510 // isaac sim 설치 폴더로 이동 - 작성한 스크립트를 실행합니다.
./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 |
|---|