MoveIt2 매니퓰레이터 모션 플래닝 완벽 가이드

로봇 팔(매니퓰레이터)이 물건을 집고, 옮기고, 조립하는 동작은 단순해 보이지만 그 이면에는 충돌 없이 안전한 경로를 찾아내는 정교한 모션 플래닝이 자리 잡고 있어요. MoveIt2는 ROS2(Robot Operating System 2) 생태계에서 사실상 표준으로 자리 잡은 매니퓰레이터 모션 플래닝 프레임워크로, 산업용 로봇 팔부터 휴머노이드 양팔까지 폭넓게 활용되고 있어요. 이 글에서는 MoveIt2가 무엇인지, 어떤 구조로 동작하는지, 실제 프로젝트에서 어떻게 활용하면 좋은지 차근차근 정리해 볼게요.

MoveIt2가 해결하는 문제

로봇 팔을 제어할 때 가장 어려운 부분은 “출발 자세에서 목표 자세까지 어떻게 안전하게 이동시킬 것인가”라는 질문이에요. 관절이 6~7개에 달하는 매니퓰레이터는 동일한 손끝 위치(end-effector pose)를 만들어 내는 자세가 무수히 많고, 그 사이를 이동하는 동안 자기 자신이나 주변 환경과 충돌해서는 안 되거든요. 여기에 속도·가속도 한계, 특이점(singularity) 회피, 시간 최적화까지 동시에 고려해야 하니 직접 알고리즘을 구현하기는 매우 까다로워요.

MoveIt2로 제어 가능한 산업용 매니퓰레이터 로봇 팔
Photo by Akshat Sharma on Unsplash

왜 직접 만들지 않고 MoveIt2를 쓸까요

모션 플래닝의 학술적 토대는 OMPL(Open Motion Planning Library), CHOMP, STOMP, TrajOpt 같은 알고리즘들이에요. 각각 강점과 약점이 다르기 때문에 상황별로 선택해서 쓰는 것이 이상적이지만, 이를 ROS2 인프라(URDF, TF2, 액션 서버)와 연결하는 글루 코드를 직접 작성하면 수개월이 훌쩍 사라져요. MoveIt2는 이러한 알고리즘과 ROS2 미들웨어를 묶어 두고, 사용자에게는 “이 자세로 가 줘”라는 고수준 명령만 노출해 주기 때문에 개발 시간을 비약적으로 줄여 줘요.

ROS2로 넘어오면서 달라진 점

기존 MoveIt(ROS1)이 ROS2로 포팅되면서 DDS 기반 통신, 라이프사이클 노드, 실시간 친화적인 컴포지션 구조가 도입됐어요. 덕분에 단일 PC에서 시뮬레이션만 돌리던 시절을 넘어, 산업용 PLC와 연동되거나 임베디드 보드에서도 결정론적 동작을 보장할 수 있는 토대가 마련됐죠. 또한 MoveIt2는 Servo, Task Constructor, Hybrid Planning 같은 신규 모듈을 적극적으로 도입해 단순 경로 계획을 넘어 복잡한 매니퓰레이션 태스크까지 다루게 됐어요.

MoveIt2 아키텍처 한눈에 보기

MoveIt2의 핵심은 move_group이라는 중앙 노드예요. 이 노드는 로봇의 URDF/SRDF, 관절 상태(joint_states), 환경 정보(Planning Scene)를 입력으로 받아 플래닝 요청에 응답해요. 사용자는 C++의 MoveGroupInterface, Python의 moveit_py, 혹은 RViz의 Motion Planning 플러그인을 통해 명령을 전달하면 돼요.

플래닝 파이프라인의 구성요소

  • Planning Scene Monitor: 충돌 객체, 옥토맵, 부착물(attached object)을 실시간 추적
  • Planning Pipeline: 플래너 호출 전후로 어댑터(adapters)를 거쳐 시작 자세 보정, 시간 매개변수화 등을 수행
  • Planner Plugin: OMPL, Pilz Industrial Motion Planner, STOMP, CHOMP 등 교체 가능한 백엔드
  • Trajectory Execution Manager: FollowJointTrajectory 액션을 통해 컨트롤러로 궤적 전달
  • Sensor Manager: 깊이 카메라·LiDAR로부터 옥토맵 갱신

SRDF가 중요한 이유

URDF가 로봇의 “기구학과 외형”을 묘사한다면, SRDF(Semantic Robot Description Format)는 “이 관절들이 한 그룹이고, 이 링크 쌍은 충돌 검사를 생략해도 된다”처럼 의미적 정보를 담아요. MoveIt2 Setup Assistant가 SRDF 초안을 자동 생성해 주지만, 실전에서는 충돌 매트릭스를 한 번 더 점검해 불필요한 충돌 검사를 줄여 주는 것이 플래닝 속도에 직결돼요.

대표적인 플래너 비교

MoveIt2가 강력한 이유 중 하나는 작업 특성에 따라 플래너를 갈아 끼울 수 있다는 점이에요. 어떤 플래너가 어떤 상황에 어울리는지 정리해 볼게요.

플래너 특징 적합한 상황
OMPL (RRTConnect, PRM 등) 샘플링 기반, 고차원 자유도에서 강함 장애물이 많은 자유 공간 이동
Pilz Industrial Motion Planner PTP·LIN·CIRC 결정론적 궤적 산업 자동화, 반복 픽앤플레이스
STOMP 확률적 최적화, 부드러운 궤적 충돌 위험이 높은 좁은 공간
CHOMP 그래디언트 기반 최적화 경로 품질이 중요한 작업
TrajOpt 순차 컨벡스 최적화 제약이 복잡한 매니퓰레이션

샘플링 기반 vs 최적화 기반

RRTConnect 같은 샘플링 기반 플래너는 “일단 충돌 없는 경로를 빠르게 찾는 것”에 강하고, CHOMP·STOMP·TrajOpt 같은 최적화 기반 플래너는 “이미 있는 초기 궤적을 더 부드럽고 짧게 다듬는 것”에 강해요. 그래서 실전에서는 두 가지를 결합해, 우선 RRTConnect로 초기 궤적을 만든 뒤 STOMP로 다듬는 파이프라인을 자주 사용해요.

실시간 제어가 필요할 때, MoveIt Servo

플래닝은 미리 계산된 궤적을 따라가는 방식이라 외란이나 사용자 입력에 즉시 반응하기 어려워요. 이럴 때는 MoveIt Servo를 사용해 카르테시안 속도 명령을 실시간으로 받고 특이점·관절 한계를 회피하면서 손끝을 제어해요. 텔레오퍼레이션, 비주얼 서보잉, 햅틱 제어처럼 사람이 루프 안에 있는 응용에 잘 어울려요.

실전 워크플로: 첫 픽앤플레이스까지

처음 MoveIt2를 도입할 때는 다음과 같은 흐름으로 접근하면 시행착오를 줄일 수 있어요.

1단계: 로봇 모델과 시뮬레이션 준비

제조사가 제공하는 URDF가 있다면 그것을 활용하고, 없다면 CAD에서 변환해야 해요. Gazebo나 Isaac Sim에서 URDF가 제대로 로드되는지, TF 트리가 끊기지 않는지부터 확인해 주세요. 모델이 잘못되면 이후 모든 단계가 무너져요.

2단계: MoveIt Setup Assistant 실행

ros2 launch moveit_setup_assistant setup_assistant.launch.py로 GUI를 띄우고, 플래닝 그룹·엔드 이펙터·자기 충돌 매트릭스·기본 자세(home, ready 등)를 설정해요. 자동 생성되는 패키지 안에는 데모 런치 파일이 포함되어 있어 즉시 RViz에서 인터랙티브 마커로 동작을 확인해 볼 수 있어요.

3단계: 컨트롤러 연결

MoveIt2가 만든 궤적을 실제 로봇이 따라가려면 ros2_control 기반 JointTrajectoryController가 필요해요. 시뮬레이션에서는 gazebo_ros2_control이나 ign_ros2_control을, 실제 로봇에서는 제조사 드라이버(예: Universal Robots ur_robot_driver)를 연결해요. 이 단계에서 컨트롤러 이름과 액션 토픽을 MoveIt 설정의 moveit_controllers.yaml과 정확히 맞춰야 해요.

4단계: 태스크 레벨 코드 작성

간단한 픽앤플레이스라면 MoveGroupInterface로 목표 자세를 설정하고 plan()·execute()만 호출해도 충분해요. 그러나 “잡고 → 들어 올리고 → 옮기고 → 내려놓고 → 후퇴”처럼 단계가 많아지면 MoveIt Task Constructor(MTC)를 권장해요. MTC는 각 스테이지를 트리로 구성하고 백트래킹까지 지원해 복잡한 매니퓰레이션 시퀀스를 깔끔하게 표현할 수 있어요.

현장에서 마주치는 함정과 해결 팁

튜토리얼은 매끄럽지만 실제 프로젝트에서는 자잘한 문제가 끊임없이 등장해요. 자주 나오는 이슈와 대응 방법을 정리해 볼게요.

플래닝 실패가 잦을 때

  • 충돌 매트릭스 점검: 항상 충돌하는 인접 링크가 ‘never collide’로 잘못 설정되면 IK가 모두 실패할 수 있어요
  • 플래닝 시간 증가: planning_time을 5초→10초로 늘리거나 시도 횟수를 키워 보세요
  • 플래너 변경: RRTConnect가 막힐 때 BiTRRT, KPIECE, RRTstar로 바꾸면 풀리는 경우가 많아요
  • 목표 허용 오차 완화: 위치 1mm·자세 0.1° 같은 과도한 정밀도 요구를 작업에 맞게 조정해 주세요

실행 단계에서 떨릴 때

플래닝은 잘 됐는데 실제 로봇이 거칠게 움직이는 경우, 시간 매개변수화(time parameterization) 단계의 속도·가속도 스케일링 인자가 너무 높거나 컨트롤러 PID 게인이 어긋난 경우가 많아요. velocity_scaling_factor·acceleration_scaling_factor를 0.3~0.5로 낮춰 안정적으로 만든 뒤 점진적으로 올리는 방법을 추천해요.

인지(perception) 통합

실제 환경에서는 사람·박스·트레이가 수시로 변하기 때문에 깊이 카메라 데이터를 옥토맵으로 변환해 Planning Scene에 반영해야 해요. occupancy_map_monitor의 시간 지연을 짧게 잡고, 알려진 정적 객체는 CollisionObject로 직접 추가해 노이즈를 줄이는 것이 좋아요.

Physical AI 시대에 MoveIt2의 위치

최근에는 거대 비전·언어·행동(VLA) 모델이 로봇을 직접 제어하는 흐름이 가속되고 있어요. RT-2, OpenVLA, π0 같은 모델은 픽셀과 자연어 명령을 입력받아 곧바로 관절 명령이나 손끝 속도를 출력하는데요. 그렇다고 해서 MoveIt2 같은 전통적 모션 플래너의 가치가 사라진 것은 아니에요. 오히려 학습 모델이 거시적 의사결정(어디를 잡을지, 어떤 순서로 움직일지)을 담당하고, MoveIt2가 충돌 회피와 안전한 궤적 생성을 보장하는 역할 분담형 하이브리드가 표준이 되어 가고 있어요.

학습 정책과의 연동 패턴

현재 산업 현장에서 자주 보이는 패턴은 다음과 같아요. 우선 학습된 정책이 목표 손끝 자세 또는 키프레임을 출력하면, MoveIt2가 그 사이를 충돌 없이 이어 주는 궤적을 생성해요. 또는 정책의 출력 속도를 MoveIt Servo가 받아 안전 한계 안에서 클리핑해서 실행하기도 해요. 이렇게 하면 학습의 일반화 능력과 고전 알고리즘의 안전성을 동시에 누릴 수 있어요.

시뮬레이션과 sim-to-real

대규모 학습 데이터를 모으려면 시뮬레이터가 필수예요. MoveIt2는 Gazebo, Isaac Sim, MuJoCo와 모두 연동 가능하며, 동일한 URDF·SRDF·플래닝 설정을 그대로 실 로봇에 가져갈 수 있다는 점이 큰 장점이에요. 도메인 무작위화로 학습한 정책을 검증할 때도, MoveIt2의 결정론적 플래너를 베이스라인으로 두면 비교가 명확해져요.

마무리: 어떻게 시작하면 좋을까요

MoveIt2는 처음 진입할 때는 부담스럽지만, 한 번 흐름을 익혀 두면 거의 모든 매니퓰레이터 프로젝트에서 재활용할 수 있는 든든한 자산이 돼요. 추천하는 학습 순서는 (1) 공식 튜토리얼의 Panda 예제를 그대로 따라 하기, (2) 보유한 로봇으로 Setup Assistant를 돌려 자체 패키지 만들기, (3) Task Constructor로 픽앤플레이스 시퀀스 구현, (4) MoveIt Servo와 인지 모듈 결합 순이에요. 단계마다 시뮬레이션에서 충분히 검증한 뒤 실 로봇으로 옮기면 사고 없이 안정적인 매니퓰레이션 시스템을 완성할 수 있을 거예요. 보다 깊은 정보는 MoveIt2 공식 문서위키피디아 Motion planning 항목에서 확인하실 수 있어요.