← --library
이과 · 22이과

로봇공학 및 자동제어

Robotics

단계1단계2단계3단계4단계5

3단계: SLAM, 강화학습, 그리고 보행 제어 — "로봇이 세상을 배우는 법"


1부. 이론적 기초 — 불확실성 속에서 판단한다는 것

너는 이미 1단계에서 PID 제어를 배웠다. 오차(Error)를 측정하고, 그걸 줄이는 방향으로 출력을 조정하는 것. 그리고 2단계에서는 **칼만 필터(Kalman Filter)**를 통해, 노이즈 섞인 센서값에서 진짜 상태를 확률적으로 추정하는 법을 배웠다. 지금 3단계에서 배울 것들은 그 위에 올라타는 이야기다. 하지만 규모가 다르다. 1단계와 2단계에서는 "환경이 알려진 상황"에서 로봇을 제어했다면, 3단계는 환경 자체를 모르는 상황에서 어떻게 할 것인가라는 훨씬 근본적인 질문을 다룬다.

먼저 머릿속에 이런 상황을 그려봐라. 너는 눈을 가린 채 낯선 미로에 들어갔다. 손에는 초음파 거리 센서(팔을 뻗어 벽까지 거리를 재는 것과 같은)가 하나 있고, 발걸음 수를 세는 만보계가 있다. 이 두 가지만 갖고 지도를 그리면서, 동시에 "지금 내가 어디 있는지"도 알아야 한다. 이게 바로 **SLAM(Simultaneous Localization and Mapping, 동시 위치 추정 및 지도 작성)**의 핵심 딜레마다. 지도를 만들려면 내 위치를 알아야 하고, 내 위치를 알려면 지도가 있어야 한다. 닭이 먼저냐 달걀이 먼저냐의 문제가 로봇공학의 언어로 번역된 것이다.

이 딜레마를 풀기 위해 필요한 첫 번째 사고방식은 **베이즈 추론(Bayesian Inference)**이다. 칼만 필터를 공부할 때 이미 접했지만, 여기서 좀 더 깊이 이해해야 한다. 베이즈 정리의 핵심은 "내가 지금 어디 있을 것이다"라는 믿음(prior belief)을 새 관측값(observation)으로 업데이트해서 더 정확한 믿음(posterior belief)을 얻는다는 것이다. 수식으로 쓰면 P(state | observations) ∝ P(observations | state) × P(state) 이고, 이 믿음을 확률 분포 전체로 유지한다는 점이 포인트다. 칼만 필터는 이 분포가 가우시안(Gaussian, 종 모양 곡선)이라고 가정해서 계산을 단순하게 만든 것이었다. SLAM은 이걸 훨씬 복잡한 공간 — 로봇의 위치와 수백 개의 랜드마크 위치가 전부 들어있는 거대한 상태 공간 — 에 적용한다.

[노트 기록] 베이즈 정리 핵심 구조: P(x|z) ∝ P(z|x) · P(x) — 여기서 x = 상태(위치+지도), z = 센서 관측값. 칼만 필터는 이 식을 가우시안 가정 하에 닫힌 형태(closed-form)로 계산한 것이었음을 기억하라.

두 번째로 필요한 배경지식은 **마르코프 결정 과정(Markov Decision Process, MDP)**이다. 이것은 강화학습 전체를 수학적으로 기술하는 뼈대다. "마르코프(Markov)" 라는 이름은 러시아 수학자 안드레이 마르코프에서 왔는데, 핵심 성질은 단순하다. 현재 상태만 알면 미래를 예측하는 데 과거 전체 역사가 필요하지 않다. 체스를 생각해봐라. 지금 보드 위 말의 배치 상태만 알면, 이전에 어떤 수를 뒀는지 역사를 몰라도 최선의 다음 수를 찾을 수 있다. 로봇 제어에서도 마찬가지다. 로봇의 현재 관절 각도, 속도, 가속도 — 이 상태 벡터만 있으면 다음 행동을 결정할 수 있다는 것이 마르코프 가정이다. 1단계에서 배운 상태 공간 표현(State Space Representation) x = [θ, θ̇, ...]이 바로 이 아이디어와 직결된다.

세 번째 배경지식은 **그래프 이론(Graph Theory)**의 기초다. SLAM에서 지도를 표현하고, 경로 계획 알고리즘을 이해하려면 그래프의 언어를 써야 한다. 그래프는 **노드(Node, 정점)**와 **에지(Edge, 간선)**로 이루어진 추상적인 구조물이다. 도시 지도를 생각하면 교차로가 노드이고, 도로가 에지다. SLAM에서는 로봇이 방문한 위치들이 노드가 되고, 연속적인 이동이 에지가 된다. 경로 계획에서는 이 그래프 위에서 최단 경로를 찾는 것이 핵심 문제가 된다. 이 세 가지 — 베이즈 추론, 마르코프 과정, 그래프 이론 — 가 오늘 배울 모든 내용의 뿌리다.


2부. SLAM — 지도를 그리며 길을 찾는다

2-1. 문제의 구조

칼만 필터를 다시 떠올려봐라. 2단계에서 너는 로봇 팔의 위치를 추정할 때, 상태 벡터 x가 "관절 각도와 각속도" 같은 것들로 이루어졌다. SLAM에서 상태 벡터는 어마어마하게 커진다. x_t = [로봇의 x좌표, y좌표, 방향 θ, 랜드마크1의 위치, 랜드마크2의 위치, ..., 랜드마크N의 위치]가 된다. 랜드마크(Landmark)란 환경에서 인식 가능한 고정된 특징점들이다 — LiDAR로 잡히는 벽의 모서리, 카메라로 보이는 특징적인 점들.

이 상태 벡터 전체를 추정하는 문제를 **EKF-SLAM(Extended Kalman Filter SLAM)**이 처음으로 수학적으로 정형화했다. 2단계에서 배운 칼만 필터를 비선형 시스템으로 확장한 **확장 칼만 필터(EKF)**를 기억한다면 — SLAM은 그 EKF를 지도 전체에 적용한다. 문제는 계산 복잡도다. N개의 랜드마크가 있으면 공분산 행렬의 크기가 O(N²)으로 증가한다. 랜드마크가 1000개라면? 행렬이 100만 개의 원소를 가지게 된다. 이게 실시간 SLAM을 어렵게 만드는 핵심 장벽이다.

이 문제를 해결하기 위해 등장한 두 가지 접근이 있다. 하나는 파티클 필터(Particle Filter) 기반 SLAM이다. FastSLAM이라고도 불리는 이 방법은, 하나의 거대한 확률 분포 대신 수백~수천 개의 "가설 입자(particle)"를 유지한다. 각 입자는 "만약 로봇이 이 경로로 이동했다면 지도는 이렇게 생겼을 것이다"라는 하나의 시나리오를 나타낸다. 관측이 들어올 때마다 더 그럴듯한 입자는 살아남고, 그렇지 않은 입자는 사라진다 — 마치 자연 선택처럼. 이 방법은 비가우시안 분포도 다룰 수 있다는 장점이 있지만, 공간이 넓어지면 필요한 입자 수가 폭발적으로 증가한다.

[노트 기록] EKF-SLAM vs Particle Filter SLAM: EKF-SLAM은 가우시안 가정 하에 닫힌 형태로 계산하므로 랜드마크 수 N에 대해 O(N²) 복잡도. Particle Filter SLAM은 비가우시안도 처리하지만 공간 차원 증가에 취약. 둘 다 "믿음(belief)을 유지하고 업데이트한다"는 베이즈 추론의 구현임을 명심.

현대 SLAM의 주류는 **그래프 기반 SLAM(Graph-Based SLAM)**이다. 여기서는 로봇의 자세(pose, 위치+방향)를 노드로, 센서로 측정한 상대적 변환을 에지로 표현한다. 그러면 SLAM 문제가 **비선형 최소 제곱 문제(Nonlinear Least Squares Problem)**로 바뀐다 — 모든 에지 제약 조건을 최대한 만족시키는 노드 위치의 집합을 찾는 것이다. 이를 **포즈 그래프 최적화(Pose Graph Optimization)**라고 하며, g2o, GTSAM 같은 라이브러리가 이를 효율적으로 푼다. 구글의 CartographerORB-SLAM3이 이 방식을 따른다.

2-2. 루프 클로저 — 같은 장소를 다시 알아본다

그래프 기반 SLAM에서 가장 극적인 순간은 **루프 클로저(Loop Closure)**다. 로봇이 오랜 탐험 끝에 처음 출발했던 장소로 다시 돌아왔을 때, "아, 여기 전에 왔었던 곳이다"를 인식하는 것이다. 이게 왜 중요하냐면, 로봇이 이동하면서 발생하는 작은 오차들이 오랜 시간 쌓이면 드리프트(drift) — 지도가 점점 어긋나는 현상 — 가 생긴다. 루프 클로저를 감지하면 그 제약 조건을 그래프에 에지로 추가하고, 전체 그래프를 다시 최적화해서 누적 오차를 한 번에 보정할 수 있다. 2단계 칼만 필터에서 "관측 업데이트(measurement update)"가 예측을 보정했던 것처럼, 루프 클로저는 장기적 SLAM의 핵심 보정 메커니즘이다.

루프 클로저를 구현하려면 장소 인식(Place Recognition)이 필요하다. LiDAR 기반 SLAM에서는 점군(point cloud)의 형태를 비교하고, 비전 기반 SLAM에서는 BoW(Bag of Words) 모델이나 딥러닝 기반 디스크립터를 사용한다. 최신 기술로는 DBoW2, NetVLAD 같은 방법이 있다.

2-3. 경로 탐색 — 지도 위에서 최적 경로를 찾는다

SLAM으로 지도를 만들었다면, 이제 그 지도 위에서 목표 지점까지의 경로를 어떻게 찾을 것인가. 여기서 그래프 이론이 본격적으로 등장한다. 가장 먼저 배워야 할 알고리즘은 **다익스트라(Dijkstra)**다. 이것은 시작 노드에서 모든 노드까지의 최단 거리를 구하는 알고리즘으로, 너비 우선 탐색(BFS)에 비용(cost)을 더한 개념이다. 그런데 다익스트라는 비효율적이다 — 목표 지점과 반대 방향에 있는 노드들도 전부 탐색하기 때문이다.

A* 알고리즘은 이 비효율을 **휴리스틱(heuristic) 함수 h(n)*을 도입해서 해결한다. h(n)은 현재 노드 n에서 목표까지의 추정 비용이다. A는 실제 비용 g(n)과 추정 비용 h(n)의 합 f(n) = g(n) + h(n)을 최소화하는 방향으로 탐색한다. 만약 h(n)이 절대 실제 비용을 과대추정하지 않는다면(이를 **허용 가능한 휴리스틱(admissible heuristic)*이라고 한다), A는 항상 최단 경로를 찾는다. 2D 격자 지도에서 유클리드 거리나 맨해튼 거리가 대표적인 허용 가능 휴리스틱이다.

[노트 기록] A* 핵심 공식: f(n) = g(n) + h(n). g(n) = 시작에서 n까지 실제 비용, h(n) = n에서 목표까지 추정 비용(허용 가능해야 함). h(n)=0이면 다익스트라, h(n)이 너무 크면 Greedy Best-First Search와 같아짐.

그런데 A*는 격자(grid) 형태의 지도에서는 잘 동작하지만, **고차원 구성 공간(Configuration Space, C-space)**에서는 다르다. 6축 로봇 팔은 6차원 C-space를 가지고, 사족 보행 로봇은 훨씬 더 높은 차원을 가진다. 이렇게 고차원 공간을 격자로 나누면 메모리가 폭발한다 — 이를 **차원의 저주(Curse of Dimensionality)**라고 한다. 이 문제를 해결하기 위해 **RRT(Rapidly-exploring Random Trees)**가 등장한다. RRT는 공간을 무작위로 샘플링하면서 트리를 확장해 나간다. 이론적 보장은 약하지만, 고차원에서도 실용적으로 동작한다. **RRT***는 RRT에 최적성(optimality)을 보장하는 rewiring 단계를 추가한 것으로, 시간이 무한하면 최적 경로를 찾는다 (점근적 최적성, asymptotic optimality).


3부. 강화학습 기반 제어 — 시행착오로 최적을 배운다

3-1. MDP와 에이전트-환경 인터페이스

이제 질문이 바뀐다. "미리 만든 경로를 따라가는" 것이 아니라, "스스로 최선의 행동 방식을 찾아내는" 것이다. 이것이 **강화학습(Reinforcement Learning, RL)**의 영역이다. 아이가 걷는 법을 배우는 것을 생각해봐라. 아무도 근육을 어떻게 조절해야 한다고 가르쳐주지 않는다. 넘어지면 아프고(벌칙), 한 발 더 내디디면 앞으로 나아가고(보상). 이 시행착오의 반복이 걷기라는 복잡한 스킬로 이어진다.

강화학습의 수학적 뼈대는 앞서 배경지식에서 설명한 **마르코프 결정 과정(MDP)**이다. MDP는 다섯 가지 요소로 구성된다. S(상태 공간, State Space): 환경이 가질 수 있는 모든 상태의 집합. A(행동 공간, Action Space): 에이전트가 취할 수 있는 모든 행동의 집합. R(보상 함수, Reward Function): 상태 s에서 행동 a를 했을 때 받는 즉각적인 보상 r. P(전이 확률, Transition Probability): 상태 s에서 행동 a를 했을 때 다음 상태 s'가 될 확률. γ(할인 인수, Discount Factor): 미래 보상을 현재 가치로 환산하는 비율(0~1).

강화학습에서 에이전트의 목표는 **누적 할인 보상(Cumulative Discounted Reward)**을 최대화하는 정책(Policy) π를 찾는 것이다. 정책 π(s)는 "상태 s에서 어떤 행동을 취할 것인가"를 정의하는 함수다. 수식으로 쓰면 에이전트는 G_t = R_{t+1} + γR_{t+2} + γ²R_{t+3} + ...를 최대화하고 싶은 것이다. 할인 인수 γ가 0에 가까울수록 근시안적(현재 보상만 중시), 1에 가까울수록 장기적 관점을 취한다.

[노트 기록] MDP 5-tuple: (S, A, R, P, γ). 에이전트의 목표: 정책 π를 찾아 E[Σ γ^t R_{t+1}]을 최대화. 벨만 방정식(Bellman Equation): V^π(s) = Σ_a π(a|s) [R(s,a) + γ Σ_{s'} P(s'|s,a) V^π(s')] — 현재 상태의 가치는 즉각 보상과 미래 상태 가치의 가중 평균.

3-2. Q-러닝에서 DQN까지

**Q-함수(Q-Function) Q(s,a)**는 "상태 s에서 행동 a를 취하고 이후 최적 정책을 따를 때 기대되는 누적 보상"이다. 이게 왜 유용하냐면, Q-함수만 알면 정책을 바로 유도할 수 있다 — 상태 s에서 Q(s,a)를 최대화하는 a를 선택하면 된다. **Q-러닝(Q-Learning)**은 이 Q-함수를 경험으로부터 반복적으로 업데이트하는 알고리즘이다. 업데이트 규칙은 Q(s,a) ← Q(s,a) + α[r + γ max_{a'} Q(s',a') - Q(s,a)]인데, 여기서 α는 학습률(learning rate), [r + γ max Q(s',a') - Q(s,a)]는 TD 오차(Temporal Difference Error)라고 불린다. 1단계 PID 제어의 오차를 줄이는 것과 구조적으로 유사하다 — 현재 추정치와 더 나은 추정치의 차이를 줄이는 방향으로 업데이트한다.

문제는 상태 공간이 거대해지면 Q-테이블을 메모리에 저장하는 것 자체가 불가능하다는 것이다. 연속적인 관절 각도 공간이나 카메라 이미지를 상태로 쓰는 경우를 생각해봐라. DeepMind가 2015년 Nature에 발표한 DQN(Deep Q-Network) (Mnih et al., 2015)은 이 문제를 딥러닝으로 해결했다. Q-테이블 대신 **신경망(Neural Network)**으로 Q-함수를 근사한다 — Q(s,a) ≈ Q(s,a; θ). DQN은 두 가지 핵심 트릭을 사용한다. 하나는 경험 재생(Experience Replay): 과거 경험을 버퍼에 저장하고 무작위로 샘플링해서 학습하는 것 (데이터 효율성 + 학습 안정성). 다른 하나는 타깃 네트워크(Target Network): 업데이트 목표값을 계산할 때 주 네트워크가 아닌 천천히 업데이트되는 별도 네트워크를 사용해서 학습을 안정화하는 것이다.

3-3. 정책 경사와 PPO

Q-러닝 계열은 이산(discrete) 행동 공간에 강하다. 그런데 로봇 관절 토크는 연속적(continuous)이다. "토크를 1.73 Nm 가한다" — 이런 연속값을 다루기 위해 정책 경사(Policy Gradient) 방법이 등장한다. 정책 π(a|s;θ)를 직접 신경망으로 표현하고, 누적 보상을 정책 파라미터 θ에 대해 미분해서 경사 상승(gradient ascent)한다. 기초적인 REINFORCE 알고리즘부터 시작해서, 분산을 줄이기 위한 베이스라인(baseline) 도입, Actor-Critic 구조(가치 함수가 베이스라인 역할을 하는) 등으로 발전한다.

현대 로봇공학에서 가장 많이 쓰이는 알고리즘은 PPO(Proximal Policy Optimization) (Schulman et al., 2017)다. PPO의 핵심 아이디어는 정책을 한 번에 너무 크게 바꾸지 말라는 것이다. 정책이 급격히 변하면 학습이 불안정해진다. PPO는 새 정책과 이전 정책의 비율 r_t(θ) = π_θ(a|s)/π_{θ_old}(a|s)가 [1-ε, 1+ε] 범위를 벗어나지 못하도록 클리핑(clipping)해서 안정성을 확보한다. ETH Zurich의 ANYmal 로봇 보행, OpenAI의 다양한 로봇 과제들이 모두 PPO를 기반으로 한다.

3-4. 보상 설계와 시뮬레이션-실제 이전

강화학습에서 로봇공학자들이 가장 고심하는 부분은 보상 함수(Reward Function) 설계다. "잘 걷기"를 어떻게 숫자로 표현할 것인가? 너무 단순한 보상(예: 앞으로 이동한 거리)은 예상치 못한 방식으로 최적화된다 — 로봇이 앞구르기를 하거나 쓰러져 굴러가는 행동을 학습하기도 한다. 이것을 **보상 해킹(Reward Hacking)**이라고 한다. 그래서 실제 구현에서는 여러 보상 항목을 조합한다: 전진 속도, 에너지 소비, 관절 각도 한계, 몸통 높이 유지, 지면 접촉 패턴 등.

또 다른 실용적 문제는 현실 세계에서 직접 RL을 훈련하기 어렵다는 것이다. RL은 수백만 번의 시행착오가 필요한데, 실제 로봇에 수백만 번의 낙상을 시키면 하드웨어가 망가진다. 해결책은 **시뮬레이션(Simulation)**에서 학습한 뒤 실제 로봇에 이전하는 Sim-to-Real Transfer다. 그런데 시뮬레이션과 현실 사이에는 언제나 차이가 있다 — 이를 Reality Gap이라고 한다. 이를 극복하기 위해 Domain Randomization(시뮬레이션에서 물리 파라미터를 무작위로 변화시켜 다양한 환경에 강인한 정책을 학습)과 Domain Adaptation(현실 데이터로 시뮬레이션 정책을 미세조정)이 사용된다.


4부. 보행 제어 — 동적 균형의 물리학

4-1. 정적 보행 vs 동적 보행

초등학생이 처음 자전거를 배울 때를 생각해봐라. 처음에는 발을 땅에 딛거나 속도가 너무 느리면 쓰러진다. 자전거는 본질적으로 **동적으로 안정(dynamically stable)**한 시스템이지 정적으로 안정한 시스템이 아니다. 보행 로봇도 마찬가지다. **정적 안정(Static Stability)**이란 어떤 순간에 로봇을 그대로 멈춰도 쓰러지지 않는 상태를 말한다 — 발이 네 개인 거북이처럼 느리게 움직이는 경우. **동적 안정(Dynamic Stability)**이란 순간순간은 불안정해도 운동을 유지하면서 전체적으로 안정한 상태 — 사람이 빠르게 걷거나 뛰는 것이 이에 해당한다.

ZMP(Zero Moment Point) 이론은 이족 보행 로봇 제어의 고전적 기반이다. Vukobratovic et al. (1972)이 제안한 이 개념은 다음과 같다. 로봇이 지면과 접촉하는 발바닥 영역에서, 지면이 로봇에 가하는 모든 반력의 합이 중점을 이루는 지점이 ZMP다. ZMP가 발바닥 지지 다각형(support polygon) 내부에 있으면 동적으로 안정하다. 이 조건을 만족하도록 궤적을 계획하는 것이 전통적 이족 보행 제어 방식이었고, 혼다의 ASIMO가 대표적 사례다. 그러나 ZMP 기반 제어는 발바닥이 항상 지면에 평평하게 닿아야 하는 제약이 있어 동작이 경직되고, 에너지 효율이 낮다.

[노트 기록] ZMP 조건: ZMP가 지지 다각형(support polygon) 내에 있을 것. ZMP가 경계를 넘으면 로봇이 회전(넘어짐). 이 조건이 ASIMO의 "느린" 보행 원인이었음. 에너지 효율을 위해 현대 제어는 ZMP 대신 MPC+RL로 이동 중.

4-2. CPG와 전신 제어

생물학적 보행을 연구하면, 척수 수준의 신경 회로가 기본적인 보행 리듬을 생성한다는 것을 알 수 있다. 뇌가 하나하나 명령을 내리지 않아도 된다. 이것을 **중추 패턴 생성기(Central Pattern Generator, CPG)**라고 한다. 로봇공학에서는 이를 모방하여, 연결된 비선형 진동자들의 네트워크로 보행 리듬을 생성하는 방법을 사용한다. CPG의 장점은 환경 교란에 대해 자연스럽게 적응하며, 고수준 명령(속도 변경, 방향 전환)을 저수준 제어에 자연스럽게 통합할 수 있다는 것이다.

현대 보행 제어의 정점은 **전신 제어(Whole-Body Control, WBC)**다. 2단계에서 배운 역기구학을 기억해봐라 — 끝점 위치가 주어지면 관절 각도를 구하는 것. WBC는 이것을 전신으로 확장한다. 여러 과제(task) — 몸통 자세 유지, 발 위치 제어, 균형 유지 — 를 우선순위를 두고 동시에 처리하는 최적화 문제를 풀어낸다. 수학적으로는 **2차 프로그래밍(Quadratic Programming, QP)**을 실시간으로 푸는 것이다. ETH Zurich의 ANYmal, MIT의 Cheetah 로봇이 이 방식으로 놀라운 보행 성능을 보여준다.

4-3. 심층 강화학습 기반 보행

앞서 배운 PPO가 보행 제어에 어떻게 적용되는지 이제 볼 차례다. ETH Zurich의 Learning to Walk in Minutes (Rudin et al., 2022, RSS) 논문은 병렬 시뮬레이션으로 수천 개의 로봇 인스턴스를 동시에 학습시켜 수분 내에 강인한 보행 정책을 얻는 방법을 보여줬다. 보상 함수는 전진 속도, 에너지 효율, 관절 한계, 몸통 높이 등 여러 항목의 가중합이고, Domain Randomization으로 다양한 지형과 물리 파라미터에 노출시켰다. 학습된 정책은 시뮬레이션에서 실제 하드웨어로 바로 이전(zero-shot transfer)되어 계단 오르기, 자갈밭 보행까지 성공했다.

DeepMind의 Emergence of Locomotion Behaviours in Rich Environments (Heess et al., 2017) 연구는 환경 자체를 다양하고 풍부하게 설계하면 명시적으로 특정 보행 패턴을 지정하지 않아도 걷기, 뛰기, 점프하기 같은 행동이 자연스럽게 출현(emergent)한다는 것을 보여줬다. **모델 예측 제어(Model Predictive Control, MPC)**를 RL과 결합하는 접근도 활발한데, MPC가 단기 예측과 물리적 제약을 처리하고 RL이 장기 전략을 학습하는 방식으로 상호 보완한다.


5부. 기술적 구현 요점 — 시뮬레이터와 도구들

이론을 실제로 구현하려면 도구를 알아야 한다. Isaac Gym (NVIDIA, GPU 병렬 시뮬레이션), MuJoCo (Todorov et al., 2012, 로봇공학 표준 물리 시뮬레이터), PyBullet, Gazebo가 대표적이다. SLAM 구현에는 **ROS(Robot Operating System)**와 함께 Cartographer(그래프 기반 2D/3D SLAM), ORB-SLAM3(비전+IMU 퓨전 SLAM), LOAM(LiDAR Odometry and Mapping)이 널리 쓰인다. 강화학습 프레임워크는 Stable-Baselines3, RLlib, TorchRL이 있으며, 모두 PPO를 포함한 주요 알고리즘을 제공한다.

LiDAR 기반 SLAM에서 핵심 전처리 단계는 **ICP(Iterative Closest Point)**다. 연속된 두 LiDAR 스캔을 정렬해서 로봇이 얼마나 이동했는지(odometry)를 추정한다. 두 점군 사이의 대응점을 반복적으로 찾고 변환 행렬(회전+평행이동)을 최소 제곱으로 구하는 방식으로 작동한다. 2단계에서 배운 선형 대수와 최소 제곱법이 여기에 직접 적용된다.


6부. 프로젝트 — 직접 생각하고 풀어봐라

아래는 예제 중심 프로젝트다. 코드를 떠먹여주지 않는다. 이론을 응용해서 직접 설계하고, 막히면 위에서 배운 개념들을 다시 뒤적여 봐. 정답은 없다 — 얼마나 논리적으로 설계하고 그 설계를 얼마나 명확하게 설명할 수 있는지가 핵심이다.


프로젝트 A. 격자 세계에서 A* 구현 및 분석

너는 20×20 격자 지도를 갖고 있다. 각 셀은 이동 가능(cost=1), 장애물(통과 불가), 또는 진흙(cost=5) 중 하나다. 시작점은 (0,0), 목표점은 (19,19)다.

(문제 1) 다익스트라 알고리즘을 의사 코드(pseudocode) 또는 흐름도로 설계하라. 우선순위 큐(priority queue)를 어떻게 활용할지 명시하고, 각 노드에 저장해야 하는 정보가 무엇인지 설명하라.

(문제 2) A* 알고리즘으로 개선하라. 네 가지 이동만 허용할 때(상하좌우)와 여덟 방향(대각선 포함) 이동을 허용할 때 각각 적합한 휴리스틱 함수가 무엇인지 추론하고, 왜 그것이 "허용 가능(admissible)"한지 논리적으로 설명하라.

(문제 3) 다음 시나리오를 분석하라: h(n)을 의도적으로 실제 비용보다 2배 크게 설정하면(즉, 허용 불가능한 휴리스틱) 어떤 일이 벌어지는가? 탐색 속도와 경로 최적성 사이의 트레이드오프를 논하라. 이것이 실제 자율주행에서 왜 유용할 수 있는가?

(문제 4) 지도가 실시간으로 바뀐다고 가정하라(장애물이 이동). 정적 A*의 한계는 무엇이고, 이를 극복하기 위한 알고리즘의 이름을 조사하고 핵심 아이디어를 한 단락으로 서술하라.


프로젝트 B. 1차원 강화학습 환경 설계

마찰 없는 수평 레일 위에 질량 m=1 kg의 카트가 있다. 카트의 상태는 위치 x와 속도 v로 구성된다: s = (x, v). 에이전트는 매 스텝마다 힘 F ∈ {−10N, 0N, +10N} 중 하나를 선택할 수 있다. 목표는 x=10m 위치에 가능한 한 빠르게, 최소한의 에너지로 도달하는 것이다.

(문제 1) 이 환경의 **MDP 5-tuple (S, A, R, P, γ)**을 명시적으로 정의하라. 보상 함수 R(s, a, s')를 두 가지 이상의 항목을 포함하도록 설계하고, 각 항목의 역할과 가중치 선택 이유를 설명하라. (예: 목표 도달 보상, 에너지 패널티 등)

(문제 2) γ = 0.9로 설정했을 때, 목표 도달 시 받는 보상 +100이 10스텝 이전 상태의 Q-값에 얼마나 반영되는가? 계산 과정을 보여라. γ를 0.5로 낮추면 에이전트의 행동이 어떻게 달라질 것으로 예상하는가?

(문제 3) Q-테이블 기반 Q-러닝을 구현하려 한다. 연속적인 상태 (x, v)를 이산화(discretization)해야 한다. x를 012m 범위에서 24개 구간, v를 -55m/s 범위에서 20개 구간으로 나눈다면 Q-테이블의 총 크기(행×열)는 얼마인가? 만약 상태 차원이 10개로 늘어나면 이 크기는 어떻게 증가하는가? 이것이 왜 DQN이 필요한 이유인지 설명하라.

(문제 4) 보상 해킹(reward hacking)의 위험성을 이 환경에서 구체적으로 예시를 들어 설명하라. 설계한 보상 함수가 의도치 않게 어떤 최적화를 유발할 수 있는가? 그리고 이를 방지하기 위해 보상 함수를 어떻게 수정할 것인가?


프로젝트 C. SLAM 포즈 그래프 설계

로봇이 정사각형 경로를 따라 이동한 후 출발점으로 돌아오는 시나리오를 생각하라. 총 4개의 포즈 노드가 있다: p0=(0,0,0°), p1=(5,0,0°), p2=(5,5,90°), p3=(0,5,180°)이고, 마지막으로 p0으로 복귀한다.

각 이동 단계에서 측정된 상대 변환(에지)은 다음과 같다: z01=(5.1m, 0°), z12=(5.0m, 88°), z23=(5.2m, 91°), z30=(4.9m, 90°). 또한 루프 클로저 관측으로 z04=(0.3m, 2°)가 측정되었다 (이상적으로는 (0,0,0°)이어야 함).

(문제 1) 이 포즈 그래프를 그림으로 그려라(노드를 원으로, 에지를 화살표로). 측정 오차가 없다면 루프 클로저 에지의 값은 얼마여야 하는가? 측정된 값과의 차이(잔차, residual)는 얼마인가?

(문제 2) 그래프 기반 SLAM의 최적화 목표를 "모든 에지 잔차의 제곱합을 최소화"로 기술할 수 있다. 이것이 2단계에서 배운 최소 제곱법(Least Squares)과 어떻게 연결되는지 설명하라. 가우스-뉴턴(Gauss-Newton) 방법의 핵심 아이디어를 한 단락으로 서술하라.

(문제 3) 루프 클로저가 없을 때와 있을 때, 포즈 p3의 추정 위치 오차가 어떻게 다를 것인지 정성적으로 설명하라. 왜 루프 클로저가 장기 SLAM에서 결정적으로 중요한가?

(문제 4) 실제 LiDAR SLAM에서 잘못된 루프 클로저(False Loop Closure) — 다른 장소를 같은 장소로 잘못 인식하는 것 — 가 발생하면 어떤 결과가 생기는가? 이를 방지하기 위한 전략을 두 가지 이상 제안하고 논거를 제시하라.


프로젝트 D. 보행 제어 시나리오 분석

간단한 이족 보행 로봇이 평지에서 걷고 있다. 로봇의 몸무게는 50kg, 발바닥 크기는 20cm×10cm, 한 발씩 들어 올리며 걷는다.

(문제 1) 한 발이 지면에서 떨어져 있는 단지지(single support) 단계에서 ZMP가 어디에 위치해야 동적 안정을 유지할 수 있는가? 지지 발바닥의 형태를 그리고, ZMP의 허용 범위를 표시하라. ZMP가 발뒤꿈치 가장자리를 넘어가면 어떤 일이 벌어지는가?

(문제 2) Domain Randomization을 사용해 이 로봇의 보행 정책을 학습시키려 한다. 어떤 물리 파라미터들을 무작위화해야 하는지 최소 5가지를 나열하고, 각각을 무작위화하는 것이 왜 Sim-to-Real 이전에 도움이 되는지 설명하라.

(문제 3) 로봇이 5cm 높이의 예상치 못한 턱(step)에 발을 딛는 상황을 가정하라. PPO로 학습한 정책이 이 상황에 적응하려면 보상 함수 설계에서 어떤 항목이 중요한가? 단순히 "전진 거리"만을 보상으로 쓰면 어떤 문제가 생기는가?

(문제 4) **사족 보행 로봇(Quadruped)**과 이족 보행 로봇(Biped)을 비교하라. 사족 보행 로봇의 ZMP 조건이 왜 더 완화되는가? 그럼에도 사족 보행 로봇이 동적 트롯(trot) 보행 — 대각선 발을 동시에 드는 — 을 할 때 어떤 안정성 문제가 발생하는가?


이 네 가지 프로젝트를 다 풀고 나서, 각 문제에서 네가 내린 설계 결정에 논리적 근거를 붙일 수 있는지 스스로 검증해봐라. "왜 그렇게 했는가"에 대한 답이 명확하다면, 3단계 학습목표 — 지도를 그리며 길 찾기, 시행착오 학습, 동적 균형 유지 — 를 충분히 이해한 것이다.

← 단계 2단계 4