제9부 로보틱스
9.10 Isaac 매니퓰레이션 — cuMotion
9.10.1 이 장에서 배우는 것 / 선수 지식
9.9에서 로봇이 자기 위치를 추정(cuVSLAM) 하고 3D 지도를 재구성(nvblox) 하는 인지를 봤다. 인지의 끝은 곧 행동의 시작이다 — 로봇 팔(매니퓰레이터)이 "어디·무엇"을 알았으니 이제 "어떻게 움직일까" 를 풀어야 한다. 이 장은 NVIDIA의 GPU 가속 모션 플래너 cuMotion(오픈소스 cuRobo 라이브러리 기반)을 판다 — 로봇 팔이 장애물을 피하고 관절 한계를 지키며 매끄럽고 빠르게 목표 자세로 가는 궤적을, 수백 개의 후보 궤적을 GPU로 병렬 최적화해 수십 밀리초에 찾는 법이다. 그리고 그 충돌 세계가 nvblox의 ESDF(9.9)와 공유된다 — 인지와 행동이 한 거리장으로 이어진다.
핵심 통찰: 모션 플래닝의 두 적은 "국소 최소"와 "속도"다. 로봇 팔의 가능한 자세는 관절 수(예: 6~7) 차원의 구성 공간(C-space) 의 한 점이고, 플래닝은 그 고차원 공간에서 충돌 없는 경로를 찾는 일이다. 고전 최적화 플래너(CHOMP·TrajOpt)는 하나의 초기 궤적에서 시작해 국소 최소에 빠지고, 고전 샘플링 플래너(RRT)는 느리고 불규칙하다. cuMotion의 답은 병렬성 — 수백 개의 서로 다른 초기 궤적(seed)을 GPU에서 동시에 최적화해, 국소 최소를 여러 출발점으로 탈출하고, 충돌 검사·순기구학을 대량 병렬로 실행해 실시간에 가깝게 푼다. 이것이 GPU가 모션 플래닝에 가져온 변화다.
배우는 것:
- 모션 플래닝 문제 — C-space, 충돌(환경·자기·관절 한계), 왜 직선 보간이 안 되나.
- 고전 플래너의 한계 — 샘플링(RRT/PRM) vs 최적화(CHOMP/TrajOpt/STOMP), 국소 최소·직렬·느림.
- cuMotion I — GPU 병렬 모션 생성: FK·IK·충돌 검사·궤적 최적화를 대량 병렬, 다중 seed로 국소 최소 탈출.
- cuMotion II — 충돌 세계: 로봇을 구(sphere)로 근사, nvblox ESDF(9.9)와 공유하는 거리장 충돌 질의.
- 인지→행동 연동 — MoveIt 2 플러그인, pick&place, 반응형 재계획(동적 장애물).
선수 지식: 9.9(nvblox ESDF 충돌 세계·cuVSLAM 자세)·9.7·9.8(Isaac ROS NITROS 그래프)·9.4(Jetson)·1.10(루프라인·병렬성 사고). 로봇 운동학(FK/IK)·MoveIt 2·URDF 기초는 가정(BK-02). 시뮬레이션에서 매니퓰레이션 학습·검증은 9.12·9.14, 합성 데이터는 10.5.
정직: 모션 플래닝은 로보틱스의 깊은 알고리즘 분야이고, cuMotion/cuRobo의 내부(최적화기·seed 수·충돌 표현)·API·MoveIt 통합·지원 로봇은 릴리스 의존이다. 이 장은 "왜 GPU 병렬이 모션 플래닝을 바꾸는가, 충돌 세계가 인지와 어떻게 이어지는가"의 원리와 운영 지식을 가르치고, 구체 API·파라미터·로봇 설정은 "그 릴리스 문서로 확인". 지연(ms)·seed 수는 환경·로봇·장면 의존 개략값이다. 충돌 회피는 안전 직결이므로 실로봇 적용 전 검증·여유(margin) 가 필수임을 정직하게 다룬다.
9.10.2 모션 플래닝 문제 — C-space·충돌·제약
로봇 팔을 A 자세에서 B 자세로 옮기는 것은 보기보다 어렵다. "끝점(end-effector)을 직선으로"가 왜 안 되는지부터.
구성 공간(Configuration space, C-space): 관절 N개 로봇의 한 자세 = N개 관절각 = N차원 공간의 한 점 q=(θ1,…,θN). 6~7 DOF 팔이면 C-space는 6~7차원이고, 플래닝은 C-space에서 시작점 q_start → 목표 q_goal의 '충돌 없는 경로'를 찾는 일이다.
동시에 만족해야 할 제약:
| 제약 | 내용 |
|---|---|
| ① 환경 충돌 회피 | 팔이 책상·물체·벽에 안 부딪힘(nvblox 지도 9.9) |
| ② 자기 충돌 회피 | 팔이 자기 몸통·다른 링크에 안 부딪힘 |
| ③ 관절 한계 | 위치·속도·가속도·저크(jerk) 한계 안에서 |
| ④ 매끄러움·시간 | 부드럽고(저크 제한) 빠르게 |
| ⑤ (목표) 끝점이 원하는 자세(pose) | IK로 q_goal 찾기 |
- 왜 직선 보간이 안 되나: 끝점을 직선으로 움직여도 팔의 중간 링크(팔꿈치 등)가 장애물에 부딪힐 수 있다. 또 C-space에서 직선(관절각 선형 보간)은 작업 공간(실제 3D)에서 곡선이라 충돌·한계 위반이 흔하다. 충돌은 고차원 C-space의 복잡한 금지 영역(C-obstacle)이라, 단순 보간으론 못 피한다.
- IK의 역할: 목표는 보통 "끝점을 이 위치·방향에"(작업 공간)로 주어진다. 이를 관절각 목표 q_goal(C-space)로 바꾸는 것이 역기구학(IK) 이다. 7-DOF 같은 여유 자유도(redundant) 로봇은 같은 끝점 자세에 무한히 많은 q_goal이 있어, 어느 해가 충돌 없고 좋은지 골라야 한다.
- 순기구학(FK): 반대로 관절각 q → 각 링크·끝점의 3D 자세. 충돌 검사·비용 평가의 기초 — "이 q에서 팔이 어디 있나"를 알아야 충돌을 본다.
- 궤적 vs 경로: 경로(path)는 공간상 점들의 연속, 궤적(trajectory)은 시간까지 매개변수화(언제 어느 속도로)된 것. 실로봇은 궤적이 필요 — 속도·가속도·저크 한계를 지키는 시간 매개변수화가 포함.
핵심: 모션 플래닝은 고차원 C-space에서 환경·자기 충돌·관절 한계·매끄러움을 모두 지키는 충돌 없는 궤적을 찾는 문제다. 끝점 직선 보간으론 안 된다 — 중간 링크 충돌·C-space의 복잡한 금지 영역 때문. IK로 목표 q를, FK로 충돌을, 시간 매개변수화로 실행 가능한 궤적을 만든다.
9.10.3 왜 어려운가 — 고전 플래너의 한계
고전 모션 플래너는 크게 두 갈래이고, 각각 약점이 있다.
| 갈래 | 방법 | 장점(+) | 단점(−) |
|---|---|---|---|
| ① 샘플링 기반(RRT·RRT*·PRM, OMPL) | C-space를 무작위 샘플 → 충돌 없는 점들로 트리/그래프 → 경로 탐색 | 고차원·복잡한 공간 잘 다룸, 확률적 완전성 | 경로가 불규칙(후처리 smoothing 필요), 시간 불규칙(언제 끝날지), 최적성 약함(RRT), 단일 쿼리 직렬 |
| ② 최적화 기반(CHOMP·TrajOpt·STOMP) | 초기 궤적 하나 → 비용(충돌+매끄러움) 경사하강으로 최적화 | 매끄러운 궤적, 비용으로 품질 제어 | 국소 최소에 빠짐(초기 궤적 의존), 초기화가 나쁘면 실패, 충돌 검사·경사 계산이 비쌈, 단일 seed 직렬 |
- 국소 최소 문제(최적화 플래너): 하나의 초기 궤적에서 경사하강하면, 장애물 배치에 따라 불량한 국소 최소(예: 장애물의 잘못된 쪽으로 돌아가는 궤적)에 갇힌다. 초기화를 바꾸면 다른 결과 — 운에 의존. 단일 seed로는 이를 못 벗어난다.
- 속도 문제: 두 갈래 모두 충돌 검사가 병목이다 — 궤적의 많은 점 × 로봇 링크 × 장애물의 충돌 쌍을 계산해야 한다. CPU에서 직렬로 하면 수백 ms~초가 걸려, 반응형(움직이는 장애물에 즉시 재계획)이 어렵다.
- 불규칙(샘플링): RRT는 무작위라 매번 다른 경로·다른 시간, 결과가 거칠어 smoothing 후처리 필요 — 산업·반복 작업엔 예측성이 아쉽다.
- 결론: 고전 플래너는 단일 궤적을 직렬로 다룬다. 국소 최소(최적화)나 무작위성·후처리(샘플링), 그리고 충돌 검사 병목으로 느리고 불확실하다. 여기에 GPU 병렬이 들어갈 자리가 있다.
견해: 모션 플래닝의 본질적 난점은 고차원 C-space의 충돌 검사 비용 + 최적화의 국소 최소다. 고전 플래너는 단일 궤적을 직렬 처리해 국소 최소(최적화) 또는 무작위·느림(샘플링) 중 하나를 택한다. cuMotion의 통찰은 "그럼 많은 궤적을 동시에 시도하면? 충돌 검사를 대량 병렬로 하면?" — 즉 GPU 병렬로 두 약점을 동시에 친다.
9.10.4 cuMotion I — GPU 병렬 모션 생성
cuMotion(cuRobo 기반)의 핵심은 모션 플래닝의 모든 고부하 연산을 GPU 대량 병렬로 실행하는 것이다.
cuMotion 모션 생성 파이프라인(개념 — 내부·단계는 릴리스 의존):
- 다중 seed로 국소 최소 탈출: 단일 seed 최적화(CHOMP)가 빠지는 국소 최소를, cuMotion은 수백 개의 서로 다른 초기 궤적을 병렬 최적화해 여러 출발점으로 친다 — 어떤 seed는 장애물 왼쪽, 어떤 seed는 오른쪽으로 수렴하고, 그중 충돌 없는 최저 비용을 고른다. GPU라 수백 seed가 거의 단일 seed 비용에 끝난다(병렬성의 핵심, 1.10 정신).
- FK·충돌·비용의 대량 병렬: 모든 seed × 궤적의 모든 시점에서 FK(링크 자세)·충돌(ESDF 질의)·비용을 동시에 계산. CPU 직렬의 병목이 GPU에선 병렬 처리량으로 사라진다.
- 병렬 IK: 여유 자유도 로봇의 IK는 해가 많다 — cuMotion은 여러 IK 해를 병렬로 구해 충돌·도달성 좋은 q_goal을 고른다(IK도 GPU 가속).
- 출력 품질: 시간 매개변수화로 저크 제한·속도/가속 한계를 지키는 매끄러운 궤적. 산업 로봇이 바로 실행 가능.
- 지연: 고전 CPU 플래너의 수백 ms~초 대비 수십 ms급(환경·로봇·장면 의존, 개략) → 반응형 재계획(움직이는 장애물·바뀐 장면에 빠르게 다시) 가능.
핵심: cuMotion은 IK·FK·충돌 검사·궤적 최적화를 GPU 대량 병렬로 실행해, 수백 개 seed를 동시에 최적화해 국소 최소를 탈출하고(고전 최적화의 약점), 충돌 검사 병목을 병렬 처리량으로 없앤다(고전 직렬의 약점). 결과는 수십 ms급 매끄럽고 충돌 없는 궤적 — 반응형 매니퓰레이션의 토대. "많이·동시에"가 GPU가 모션 플래닝에 준 답.
9.10.5 cuMotion II — 충돌 세계(nvblox ESDF 공유)
모션 플래닝의 핵심은 충돌 검사다 — "이 자세에서 팔이 무언가에 부딪히나?"를 빠르게·매끄럽게 답해야 한다. cuMotion의 두 축은 로봇의 구(sphere) 근사와 거리장(ESDF) 충돌 세계다.
cuMotion 충돌 검사의 두 축과, 인지(nvblox)→행동을 잇는 거리장 흐름:
- 왜 구 근사인가: 정밀 메시 대 메시 충돌은 비용이 크다. 로봇을 구 집합으로 덮으면, 각 구의 충돌은 "중심에서 장애물까지 거리 ≥ 반지름?"이라는 거리장 질의 한 번(O(1))으로 끝난다. 수천 개 구를 GPU 병렬로 → 충돌 검사가 매우 빠르다. 구 근사는 약간 보수적(실제보다 크게 잡음)이라 안전 여유도 된다.
- nvblox ESDF 공유(9.9): cuMotion의 충돌 세계는 nvblox가 만든 ESDF(장애물 거리장) 를 그대로 쓸 수 있다 — 인지(nvblox)와 행동(cuMotion)이 같은 거리장을 공유한다. 9.9에서 "ESDF를 cuMotion과 공유"라 한 것이 여기. 카메라로 본 장애물(nvblox)이 곧 팔이 피할 장애물(cuMotion)이 된다.
- gradient의 가치: ESDF는 거리뿐 아니라 gradient(장애물에서 멀어지는 방향) 를 준다 — 최적화가 충돌 궤적을 장애물 밖으로 밀어내는 방향을 알아 빠르게 수렴(9.9.6).
- 자기 충돌: 로봇 자신의 구들 사이 충돌도 검사(어떤 링크 쌍은 항상 가까우니 무시 목록). 환경 충돌과 함께 GPU 병렬.
- 충돌 세계의 품질 = 안전: "쓰레기 지도→쓰레기 계획"이 여기서도 성립 — nvblox 지도가 부정확하면(자세 드리프트 9.9, 노이즈, 동적 장애물 누락) cuMotion이 있는 장애물을 못 보거나 없는 장애물을 피해 위험·실패. 충돌 여유(margin)·센서 검증이 안전의 핵심.
견해: cuMotion 충돌 검사의 두 트릭은 로봇의 구 근사(메시 대신 거리장 질의 O(1))와 거리장 충돌 세계(특히 nvblox ESDF 공유, 9.9)다. 인지가 만든 3D 거리장이 그대로 플래닝의 장애물·gradient가 되어 인지→행동이 한 거리장으로 이어진다. 단, 충돌 세계의 정확성이 안전을 정한다 — 지도가 틀리면 계획도 위험하니, 여유(margin)·센서 검증이 필수.
9.10.6 워크스루 — 인지→플래닝 pick&place
cuMotion을 MoveIt 2 플래너 플러그인으로 쓰거나 cuRobo Python으로 직접 호출한다. 인지(9.9)→충돌 세계→플래닝→실행의 전형 흐름.
pick & place 파이프라인(개념):
# cuRobo로 모션 생성(개념 골격 — API·설정은 릴리스 의존, 반드시 확인)
# (또는 isaac_ros_cumotion + MoveIt 2 플러그인으로 ROS 2 그래프에 통합)
from curobo.wrap.reacher.motion_gen import MotionGen, MotionGenConfig, MotionGenPlanConfig
from curobo.types.math import Pose
from curobo.types.state import JointState
# 1) 로봇·세계 설정(URDF·구 근사·충돌 세계: ESDF/프리미티브)
cfg = MotionGenConfig.load_from_robot_config(
"my_robot.yml", # 로봇 운동학·구 근사·관절 한계
"collision_world.yml") # 충돌 세계(프리미티브) — 또는 nvblox ESDF 연결(9.9)
motion_gen = MotionGen(cfg)
motion_gen.warmup() # 커널·메모리 예열(첫 호출 지연 제거)
# 2) 현재 관절 상태 + 목표 끝점 자세
start = JointState.from_position(current_joint_positions) # 현재 q
goal_pose = Pose.from_list([x, y, z, qw, qx, qy, qz]) # 잡을 자세(작업공간)
# 3) 플래닝 — 내부에서 병렬 IK + 다중 seed 병렬 최적화 + 시간 매개변수화
result = motion_gen.plan_single(start, goal_pose,
MotionGenPlanConfig(max_attempts=N))
if result.success.item():
traj = result.get_interpolated_plan() # 매끄럽고 충돌 없는 궤적(시간 매개변수화)
# → ros2_control/MoveIt로 실행
else:
pass # 실패: 도달 불가·충돌·IK 없음 → 진단(9.10.9)
# ROS 2 통합(isaac_ros_cumotion + MoveIt 2, 개념):
ros2 launch isaac_ros_cumotion ... # cuMotion 플래너 노드(MoveIt 플러그인)
# · nvblox ESDF(9.9)를 충돌 세계로 구독
# · MoveIt의 plan 요청을 cuMotion이 GPU로 처리 → 궤적 반환
# · NITROS(9.7)로 깊이·ESDF zero-copy, 한 컨테이너(9.8)
ros2 component list ; jtop # zero-copy·GPU 점유 검증(9.8.6·9.4)
- warmup의 중요성: 첫
plan호출은 커널 컴파일·메모리 할당으로 느리다(수백 ms~).warmup()으로 미리 데워 실제 호출은 수십 ms — 반응형엔 필수. - MoveIt 2 통합: cuMotion이 MoveIt의 플래닝 파이프라인 플러그인으로 들어가면, 기존 MoveIt 워크플로우(장면·그리퍼·실행)에서 플래너만 GPU cuMotion으로 교체 — 점진 도입(9.7 정신).
- 반응형 재계획: nvblox(9.9)가 장면을 실시간 갱신하고 cuMotion이 수십 ms에 재계획하니, 움직이는 장애물·바뀐 장면에 팔이 즉시 대응 — 고전 플래너로는 어려운 동적 매니퓰레이션.
- 검증(9.8): nvblox·cuMotion을 NITROS 그래프로 이으면 한 컨테이너·zero-copy 확인, jtop으로 GPU 점유.
견해: cuMotion 실습의 핵심은 ① 충돌 세계를 nvblox ESDF(9.9)와 연결해 인지→행동을 잇고 ② warmup으로 첫 호출 지연 제거 ③ MoveIt 2 플러그인으로 점진 도입(플래너만 GPU 교체)이다. nvblox 실시간 갱신 + cuMotion 수십 ms 재계획이 반응형 동적 매니퓰레이션을 연다 — 인지(9.9)가 행동으로 닫히는 지점.
9.10.7 중간 점검 (체크포인트)
- [ ] 모션 플래닝을 C-space에서 충돌·관절 한계·매끄러움을 지키는 충돌 없는 궤적 문제로 정의하고, 직선 보간이 왜 안 되는지 안다.
- [ ] 고전 플래너의 갈래(샘플링 RRT vs 최적화 CHOMP)와 약점(국소 최소·직렬·느림·불규칙)을 안다.
- [ ] cuMotion이 IK·FK·충돌·궤적 최적화를 GPU 병렬로, 다중 seed로 국소 최소 탈출, 수십 ms급임을 안다.
- [ ] 충돌 검사의 구 근사(O(1) 거리 질의)와 거리장 충돌 세계(nvblox ESDF 공유, 9.9) 를 안다.
- [ ] 인지(nvblox)→충돌 세계→cuMotion→실행 흐름과 반응형 재계획, MoveIt 2 통합·warmup을 안다.
- [ ] 충돌 세계 정확성이 안전임("쓰레기 지도→쓰레기 계획")과 여유(margin)·검증의 필요를 안다.
증상→의심: 경로를 못 찾음(실패) → 목표 도달 불가(작업 공간 밖)·IK 해 없음·충돌로 막힘·seed/시도 부족 → 도달성·충돌 세계·max_attempts 점검. 위험한/비정상적인 경로 → 충돌 세계 부정확(nvblox 자세 드리프트 9.9·동적 장애물 누락)·여유 부족·자기충돌 무시 목록 오류 → 지도·margin·구 근사 확인. 첫 호출만 느림 → warmup 안 함 → warmup(). 반응이 느림 → GPU 미사용·zero-copy 폴백·재계획 주기 → component list·Nsight(9.8.6). 궤적이 거칠/한계 위반 → 시간 매개변수화·저크/속도 한계 설정. GPU는 유휴인데 CPU만 → CPU 폴백 플래너 사용 중 → cuMotion 활성·GPU 확인.
9.10.8 트레이드오프·대안
| 결정 | 트레이드오프 |
|---|---|
| cuMotion(GPU 병렬 최적화) vs RRT(샘플링) | 빠름·매끄러움·반응형 vs 고차원·복잡 공간 탐색·확률적 완전성 |
| 최적화 기반 vs 샘플링 기반 | 매끄러움·국소최소(다중 seed로 완화) vs 완전성·불규칙 |
| 구 근사 충돌 vs 정밀 메시 | 빠름(O(1) 거리)·보수적 여유 vs 정확·비쌈 |
| nvblox ESDF vs 프리미티브 충돌 세계 | 실측 동적 장면 vs 알려진 정적 장면·정확 |
| 작은 margin vs 큰 margin | 좁은 틈 통과·민첩 vs 안전·실패 적음 |
| 반응형 재계획 vs 미리 계획 | 동적 장애물 대응 vs 예측성·검증 용이(산업 반복) |
견해: 반응형·동적·여유 자유도 매니퓰레이션엔 cuMotion(GPU 병렬 최적화)이 강하다 — 수십 ms 재계획으로 움직이는 장애물·바뀐 장면에 대응하고, 다중 seed로 국소 최소를 친다. 단 충돌 세계의 정확성이 안전을 정하므로(nvblox 품질·여유), 안전 critical·정밀 작업엔 충분한 margin·검증·필요시 보수적 정적 충돌 세계가 낫다. 매우 복잡한 좁은 공간 탐색(미로형)은 샘플링(RRT)이 강할 수 있어, cuMotion(빠름·매끄러움) + 샘플링(어려운 탐색) 을 조합하기도. 산업 반복 작업은 미리 계획·검증된 궤적이 예측성에서 유리.
비엔비디아 정직: 모션 플래닝은 풍부한 오픈소스가 있다 — 샘플링(OMPL: RRT·RRT*·PRM, MoveIt 기본), 최적화(CHOMP·STOMP·TrajOpt), 반응형(MPC·잠재장). cuMotion/cuRobo의 강점은 GPU 대량 병렬(다중 seed·병렬 충돌/FK/IK)로 인한 속도·반응성, nvblox와 충돌 세계 공유, MoveIt 2 통합이다. 알고리즘 아이디어(궤적 최적화·구 근사·거리장)는 학계 공통 — NVIDIA가 더하는 것은 GPU 병렬 구현과 인지 스택 통합. 정확도·성공률·속도는 로봇·장면·튜닝 의존이라 자기 환경에서 검증해야 하고, 충돌 회피는 안전 직결이므로 실로봇 적용 전 충분한 시험(9.12 시뮬·실로봇)이 필수.
9.10.9 흔한 함정
- 충돌 세계를 못 믿고 계획. nvblox 지도가 부정확(자세 드리프트 9.9·동적 장애물 누락·노이즈)하면 있는 장애물을 못 보거나 위험한 궤적 → 지도·자세·시간 동기 검증, 충분한 margin.
- warmup 생략. 첫
plan이 커널 컴파일로 느림 →warmup()으로 예열, 반응형엔 필수. - 여유(margin) 0. 구 근사·센서 노이즈·제어 오차를 무시하면 실제로 부딪힘 → 보수적 margin(안전).
- 자기 충돌 무시 목록 오류. 항상 가까운 링크 쌍을 무시 목록에서 빼먹으면 "항상 충돌"로 실패, 반대로 너무 많이 무시하면 실제 자기충돌 놓침 → 무시 목록 정확히.
- 목표가 도달 불가/특이점. 작업 공간 밖·IK 해 없음·특이점(singularity)이면 실패 → 도달성·IK·목표 자세 점검.
- 시간 매개변수화 누락·한계 오설정. 속도/가속/저크 한계가 틀리면 거친·실행 불가 궤적 → 로봇 사양에 맞춤.
- CPU 폴백을 GPU로 오해. MoveIt이 cuMotion 대신 기본 플래너로 떨어졌는데 모름 → 플래너 설정·GPU 점유(jtop) 확인.
- seed/시도 너무 적음. 어려운 장면서 실패율↑ →
max_attempts·seed 수 조정(속도↔성공률). - 두 GEM 따로 프로세스. nvblox↔cuMotion zero-copy 폴백 → 한 컨테이너(9.7·9.8).
- 시뮬 성공률을 실로봇으로 단정. Sim2Real 갭(10.7)·실센서/제어 오차 → 실로봇 검증·여유.
9.10.10 연습문제
연습 1 (문제 정의). 모션 플래닝을 C-space·충돌·제약으로 정의하고, "끝점을 직선으로 보간"이 왜 안전·실행 가능한 궤적이 아닌지, IK·FK가 각각 어디에 쓰이는지 설명하라.
정답
정의: N-DOF 로봇의 한 자세는 N개 관절각 q=(θ1..θN), 즉 N차원 C-space의 한 점. 모션 플래닝은 q_start→q_goal의 충돌 없는 궤적(시간 매개변수화 경로)을 찾되 ① 환경 충돌 회피(nvblox 지도 9.9) ② 자기 충돌 회피 ③ 관절 위치/속도/가속/저크 한계 ④ 매끄러움 ⑤ 끝점이 목표 자세를 동시에 만족. 직선 보간이 안 되는 이유: ⓐ 끝점을 작업 공간에서 직선으로 움직여도 중간 링크(팔꿈치 등)가 장애물에 부딪힐 수 있다(끝점만 본 것이 아니다). ⓑ C-space에서 관절각을 선형 보간하면 작업 공간에선 곡선이고 충돌·한계 위반 흔함. ⓒ 충돌은 C-space의 복잡한 금지 영역(C-obstacle) 이라 단순 보간으로 못 피함. ⓓ 속도/가속/저크 한계를 무시하면 실행 불가·거친 궤적. IK: 목표는 보통 "끝점을 이 위치·방향에"(작업 공간)로 주어지니, 이를 관절각 목표 q_goal(C-space)로 변환(역기구학). 여유 자유도(7-DOF)는 해가 무한 → 충돌 없고 좋은 해 선택. FK: 관절각 q → 각 링크·끝점의 3D 자세(순기구학). 충돌 검사·비용 평가의 기초 — "이 q에서 팔이 어디 있나"를 알아야 충돌·여유를 본다. 플래닝은 IK(목표 q)·FK(충돌)·시간 매개변수화(실행 가능 궤적)를 모두 엮는다.
연습 2 (고전 한계와 GPU 병렬). 샘플링(RRT)과 최적화(CHOMP) 플래너의 트레이드오프를 비교하고, cuMotion의 GPU 병렬·다중 seed가 "국소 최소"와 "속도" 두 문제를 어떻게 동시에 푸는지 설명하라.
정답
*샘플링(RRT/RRT/PRM, OMPL): C-space를 무작위 샘플해 충돌 없는 점들로 트리/그래프를 만들고 경로 탐색. +고차원·복잡 공간 잘 다룸, 확률적 완전성(해가 있으면 언젠가 찾음). −경로가 불규칙(smoothing 후처리 필요), 시간 불규칙(언제 끝날지), 최적성 약함(RRT), 단일 쿼리 직렬. 최적화(CHOMP/TrajOpt/STOMP): 초기 궤적 하나를 비용(충돌+매끄러움) 경사하강으로 다듬음. +매끄러움, 비용으로 품질 제어. −국소 최소(초기 궤적 의존, 장애물 잘못된 쪽으로 갇힘), 초기화 나쁘면 실패, 단일 seed 직렬. 공통 병목: 충돌 검사(궤적 점×링크×장애물)가 비용이 커 CPU 직렬이면 수백 ms~초 → 반응형 어려움. cuMotion의 GPU 병렬·다중 seed: ① 국소 최소 → 단일 seed가 아니라 수십~수백 개의 서로 다른 초기 궤적(seed)을 GPU에서 동시에 최적화. 각 seed가 다른 국소 최소(장애물 왼쪽/오른쪽 등)로 수렴하고, 그중 충돌 없는 최저 비용을 선택 → 여러 출발점으로 국소 최소를 탈출. ② 속도 → FK·충돌(ESDF 질의)·비용을 모든 seed × 모든 시점에서 대량 병렬로 계산. CPU 직렬 병목이 GPU 처리량으로 사라져 수십 ms급. 핵심: GPU라 수백 seed가 거의 단일 seed 비용에 끝나(병렬성, 1.10), "많은 궤적을 동시에 + 충돌을 대량 병렬로"가 국소 최소(최적화 약점)와 속도(직렬 약점)를 한 번에** 친다. 결과는 매끄럽고(시간 매개변수화) 충돌 없는 궤적을 빠르게 → 반응형 재계획 가능.
연습 3 (충돌 세계와 인지 공유). cuMotion이 로봇을 구로 근사하고 ESDF로 충돌을 검사하는 이유·방법을 설명하고, nvblox(9.9) ESDF를 공유한다는 것의 의미와 그 정확성이 왜 안전 직결인지 답하라.
정답
구 근사: 각 링크를 여러 개의 구(중심+반지름)로 덮는다. 충돌 검사 = 각 구 중심에서 "가장 가까운 장애물까지 거리"가 반지름보다 큰가? 왜: 정밀 메시 대 메시 충돌은 비용이 크지만, 구는 "중심에서 장애물 거리 ≥ 반지름?"이라는 거리장 질의 한 번(O(1)) 으로 끝나고 수천 구를 GPU 병렬로 → 충돌 검사 초고속. 구 근사는 약간 보수적(실제보다 크게)이라 안전 여유도 된다. ESDF 충돌 세계: ESDF(Euclidean Signed Distance Function, 9.9)는 각 복셀에 가장 가까운 장애물까지 유클리드 거리(+gradient)를 저장 → 구 중심 위치로 거리·gradient를 O(1) 질의, 충돌·여유 판정과 장애물 밖으로 미는 방향을 얻어 최적화가 빠르게 수렴. nvblox ESDF 공유의 의미: cuMotion의 충돌 세계로 nvblox가 만든 ESDF를 그대로 쓴다 — 인지(nvblox)와 행동(cuMotion)이 같은 거리장을 공유. 카메라로 본 장애물(nvblox)이 곧 팔이 피할 장애물(cuMotion)이 되어, 9.9에서 본 "인지의 끝이 행동의 시작"이 한 거리장으로 닫힌다. 별도 충돌 모델을 수작업으로 만들 필요 없이 실측 3D 장면이 플래닝 장애물. 정확성=안전: "쓰레기 지도→쓰레기 계획" — nvblox 자세가 드리프트(9.9)하거나 노이즈·동적 장애물 누락이면 cuMotion이 있는 장애물을 못 보고(충돌 위험) 또는 없는 장애물을 피해(실패/비효율). 충돌 회피는 안전 직결이라, 충분한 margin(구 근사·센서 노이즈·제어 오차 흡수)·센서/지도 검증·실로봇 시험(9.12)이 필수. 인지 품질이 그대로 행동 안전으로 전파된다.
연습 4 (진단). "cuMotion이 자꾸 플래닝에 실패하거나, 성공해도 위험해 보이는 궤적을 낸다." 실패와 위험 각각의 원인 후보를 나누어 우선순위로 제시하고 진단·해결을 답하라.
정답
A. 실패(경로 못 찾음): ① 목표 도달 불가 — grasp 자세가 작업 공간 밖·특이점·IK 해 없음. 진단: IK 단독 호출·도달성 확인. 해결: 목표 자세 조정·로봇 배치·여유 자유도 활용. ② 충돌로 막힘 — 충돌 세계가 목표 주변을 막거나(잘못된 장애물) 시작/목표가 이미 충돌. 진단: 시작·목표 q의 충돌 검사·ESDF 시각화. 해결: 지도 정확성(9.9)·margin·장애물 제거. ③ seed/시도 부족 — 어려운 장면서 다중 seed가 충돌 없는 해를 못 찾음. 진단: 성공률 vs max_attempts. 해결: seed 수·시도↑(속도↔성공률). ④ 자기충돌 무시 목록 오류 — 항상 가까운 링크 쌍을 안 무시해 "항상 자기충돌". 해결: 무시 목록 교정. B. 위험한 궤적: ① 충돌 세계 부정확(최우선) — nvblox 자세 드리프트(9.9)·동적 장애물 누락·노이즈·시간 동기로 실제 장애물을 못 봄. 진단: 지도·TF·동기 검증(9.9.7). 해결: 자세·지도 품질·갱신율. ② margin 0/부족 — 구 근사·센서·제어 오차를 안 흡수해 여유가 거의 없음. 해결: 보수적 margin. ③ 자기충돌 과다 무시 — 실제 자기충돌 놓침. 해결: 무시 목록 정밀화. ④ 시간/한계 오설정 — 속도/가속/저크 한계 틀려 거친·과격 궤적. 해결: 로봇 사양 정합. 공통: 충돌 회피는 안전 직결이라 실로봇 전 시뮬(9.12)·여유·검증. GPU 미사용(CPU 폴백)으로 느리면 플래너 설정·jtop(9.4)로 GPU 점유 확인. 우선순위: 충돌 세계(지도) 정확성 → margin → 도달성/IK → seed/시도. "위험"은 거의 항상 지도·margin 문제.
연습 5 (pick&place·반응형). MoveIt 2 + cuMotion으로 인지(9.9)→pick&place 파이프라인을 설계하고, 움직이는 장애물에 대응하는 반응형 재계획을 어떻게 구성하는지, warmup과 zero-copy 검증을 어디에 넣는지 답하라.
정답
"물체 자세 추정"은 9.9과 다른 인지 태스크다: 9.9의 cuVSLAM·nvblox는 로봇(카메라) 자신이 어디 있나(자기 위치추정)와 환경의 조밀 지도를 만든다 — 여기서 필요한 것은 집을 대상 물체가 장면의 어디에·어느 방향으로 놓였나(6-DOF object pose)로, 별개의 인지 문제다. Isaac ROS는 이를 위한 전용 물체 자세 추정 GEM을 별도로 제공한다(예: RGB-D 기반 6-DOF 자세 추정 네트워크 — 정확한 패키지·모델명은 릴리스 의존, 9.7.5의 GEM 카탈로그·그 시점 문서로 확인). nvblox의 ESDF(충돌 회피용 조밀 지도)와 이 물체 자세(파지 대상)는 서로 다른 두 인지 출력이 함께 cuMotion에 입력된다.
파이프라인: ① 인지 — nvblox(9.9)로 ESDF 충돌 세계, 별도 GEM으로 대상 물체 자세(pose) 추정(위 설명). ② grasp 결정 — 물체 자세에서 집을 끝점 자세(grasp pose)·접근(pre-grasp) 자세 산출 → cuMotion 병렬 IK로 q_goal 후보. ③ 플래닝(cuMotion) — 현재 q → pre-grasp 충돌 없는 궤적(다중 seed 병렬, 수십 ms) → 접근 → grasp. ④ 실행 — 궤적을 ros2_control/MoveIt로, 그리퍼 닫기. ⑤ place — place 자세로 다시 플래닝·실행. MoveIt 2 통합: cuMotion을 MoveIt 플래너 플러그인으로 등록 → 기존 MoveIt 장면·그리퍼·실행은 그대로, 플래너만 GPU cuMotion으로 교체(점진 도입, 9.7 정신). cuMotion 노드는 nvblox ESDF를 충돌 세계로 구독. 반응형 재계획: nvblox(9.9)가 장면을 실시간 갱신(사람·물체 이동) → 매 주기 또는 충돌 임박 시 cuMotion이 갱신된 충돌 세계로 수십 ms에 재계획 → 팔이 움직이는 장애물을 피해 궤적 수정. 고전 CPU 플래너(수백 ms~초)로는 어려운 동적 매니퓰레이션 — GPU 속도가 반응성을 연다. warmup: 시스템 시작 시 motion_gen.warmup()으로 커널·메모리 예열 → 첫 plan의 수백 ms 지연 제거, 실제 호출 수십 ms(반응형 필수). zero-copy 검증(9.8): nvblox·cuMotion을 한 component container(9.7)에 두고 ros2 component list로 한 컨테이너 확인, Nsight(내부 memcpy 부재)·jtop(GPU 점유·CPU 한가, 9.4) 로 ESDF·깊이가 zero-copy로 흐르는지 검증 — 폴백이면 복사로 느려져 반응성 저하. 안전: 충분한 margin·실로봇 전 시뮬(9.12)·동적 장애물 누락 대비(센서 사각·지연). 인지(9.9)가 행동(cuMotion)으로 닫히는 완결 루프.
9.10.11 요약 · 다음 장
- 모션 플래닝 = C-space 충돌 없는 궤적. 환경·자기 충돌·관절 한계·매끄러움을 동시에. 끝점 직선 보간 불가(중간 링크 충돌·C-obstacle). IK(목표 q)·FK(충돌)·시간 매개변수화로.
- 고전 플래너의 약점. 샘플링(RRT, 불규칙·느림) vs 최적화(CHOMP, 국소 최소). 충돌 검사 병목으로 단일 궤적 직렬, 수백 ms~초.
- cuMotion = GPU 병렬 모션 생성. IK·FK·충돌·궤적 최적화를 대량 병렬, 수백 seed 동시 최적화로 국소 최소 탈출, 충돌 병목을 병렬 처리량으로 → 수십 ms급 반응형.
- 충돌 세계. 로봇을 구로 근사(O(1) 거리 질의), nvblox ESDF(9.9)와 공유 — 인지가 만든 3D 거리장이 그대로 플래닝 장애물·gradient. 인지→행동이 한 거리장으로.
- 연동·안전. MoveIt 2 플러그인(플래너만 GPU 교체)·warmup(첫 호출 지연 제거)·반응형 재계획(nvblox 갱신+수십 ms). 충돌 세계 정확성이 안전("쓰레기 지도→쓰레기 계획") → margin·검증·실로봇 시험 필수. 정직: 알고리즘은 학계 공통(OMPL·CHOMP·cuRobo 오픈소스) + NVIDIA의 GPU 병렬·인지 통합, 수치 개략.
다음 장: 9.11 Isaac Sim I — PhysX·씬·RTX 센서. 지금까지 실로봇 인지·행동(Isaac ROS)을 봤다. 그런데 충돌 회피·매니퓰레이션을 실로봇에서 바로 시험하면 위험·비용이 크다 — 그래서 시뮬레이션으로 간다. Omniverse 기반 Isaac Sim의 물리 엔진(PhysX)·씬 구성·RTX 센서 시뮬레이션을 보고, 그 위에서 로봇을 안전하게 개발·학습(9.13·9.14)·검증(9.12)하는 토대를 닦는다. 실세계에서 시뮬레이션으로.