VSLAM이 주는 것
- 로봇의 현재 자세를 추정한다.
- 관측한 특징점으로 지도를 만든다.
- 같은 장소를 다시 인식해 누적 오차를 줄인다.
LECTURE 03
미지 환경에서의 위치 추정과 경로 계획

QUESTION
CONCEPT
SLAM은 위치 추정과 지도 생성을, Navigation은 경로 계획과 제어기 실행을 맡는다.
COMPARE
QUESTION
CONCEPT
BUILD
작은 오차도 적분 과정에서 누적된다.
BUILD
QUESTION
CONCEPT
단안 Vision-only SLAM은 절대 스케일을 관측할 수 없다.
CONCEPT
CONCEPT
유리·반사체·검은 물체에서는 뎁스 값이 누락될 수 있다.
CONCEPT
CALIBRATION

정확한 외부 파라미터와 시간 동기화가 위치 추정의 기준을 맞춘다.
QUESTION
PIPELINE
픽셀 기반 방식은 특징점 대신 선택한 픽셀의 밝기 오차를 사용한다.
CONCEPT
CONCEPT
여러 프레임에서 같은 키포인트를 추적해 카메라 이동을 계산한다.
COMPARE
CONCEPT
CONCEPT
시선 교차각이 충분해야 3차원 점의 뎁스를 안정적으로 추정할 수 있다.
CONCEPT
CONCEPT
같은 장소를 다시 인식하면 Pose Graph나 전역 BA로 누적 오차를 지도 전체에 보정한다.
CONCEPT
비슷한 장면은 기하학적 검증을 통과해야 같은 장소로 인정한다.
COMPARE
CONCEPT
COMPARE
QUESTION
CONCEPT
특징점 지도는 위치 추정용이며, 장애물 지도는 아니다.
COMPARE
Sparse map은 위치 추정용이고, Navigation에는 충돌을 판단할 지도 표현이 필요하다.
DEMO
지도 작성은 환경 지도를 만들고, 위치 추정은 저장된 지도에서 현재 자세를 계산한다.
QUESTION
CONCEPT
RGB-D와 Stereo 뎁스는 보통 PointCloud2 또는 LaserScan으로 변환해 입력한다.
CONCEPT
비용이 낮은 칸을 이으면 안전한 경로가 된다.
COMPARE
CONCEPT
CONCEPT
지역 플래너는 실시간 장애물에 즉시 대응한다.
LANDSCAPE
| DWB | 속도 후보를 평가해 짧은 시간 구간의 이동 명령을 선택한다. |
|---|---|
| MPPI | 여러 제어 궤적을 샘플링하고 비용으로 가중해 명령을 계산한다. |
| Regulated Pure Pursuit | 경로 곡률과 장애물 거리에 맞춰 추종 속도를 조절한다. |
| TEB | 시간이 포함된 경로를 최적화하는 외부 플러그인 방식이다. |
CONCEPT
QUESTION
CONCEPT
map→odom과 odom→base_link의 최종 발행 주체는 각각 하나만 둔다.
CONCEPT
INTEGRATION
Nav2에는 전역 자세·TF와 충돌 지도를 역할에 맞게 연결한다.
CONCEPT
CONCEPT
FAILURE
실패 원인은 장면·센서 설정·알고리즘 가정으로 나누어 진단한다.
FAILURE
| 바닥 오인식 | 기울어진 뎁스 포인트클라우드가 바닥을 장애물로 등록한다. |
|---|---|
| 센서 사각 | 유리·검은 물체·낮은 장애물은 뎁스 값이 누락될 수 있다. |
| 잔상 장애물 | 지나간 물체가 Costmap에 남아 이동 가능한 통로를 막는다. |
| 전역 위치 보정 | 보정량이 크면 재계획이 필요하며, 로컬 제어기는 연속적인 odom을 사용한다. |
QUESTION
CASE STUDY
기성 SLAM 패키지 없이 토픽으로 공개된 값만 입력으로 사용한다.
FAILURE
RESULT

오차식은 스테레오 매칭을 전제하며, 시뮬레이터 뎁스는 렌더링된 Z-버퍼다.
FAILURE
RESULT

오른쪽 점유 격자에서는 자유 공간이 부챗살 모양으로만 채워진다.
FAILURE
FAILURE
FAILURE
| 시도 | 기대한 효과 | 측정 결과 |
|---|---|---|
| odom 시그마를 실측값으로 조정 | 구속이 강하면 잘못된 클로저가 드러난다 | 0.20 m → 1.8 m |
| 클로저 일관성 게이트 | 그래프와 어긋난 클로저를 제외한다 | 110개 중 105개 기각 |
| Cauchy 로버스트 커널 | 이상치의 가중치만 낮춘다 | 2.8 m 벗어남 |
| 퇴화 기하 프레임 거부 | 추정이 불안정한 방향을 제외한다 | ATE 6.7 → 30.4 cm |
| PnP 공분산으로 엣지 가중 | 엣지마다 측정 품질을 반영한다 | ATE 6.7 → 12.4 cm |
VO 오차는 잡음보다 편향에 가까워 한 걸음의 정밀도로 누적 결과를 예측할 수 없다. 드리프트가 미터 단위면 올바른 클로저의 잔차도 미터 단위여서 잔차 기준으로는 걸러지지 않는다. 다섯 가지는 모두 코드에서 제거했고, 프론트엔드 처리 시간은 26 % 줄었다.
ROOT CAUSE
같은 코드에서 리플레이 chi2는 32, 라이브는 11106이며 네 가지를 고치면 327이 된다.
METHOD
RECAP
PRACTICE
실습 1
주행 스택을 띄우고 /aeirobot/vslam_left_camera_info의 K에서 fx·cx를 읽어 화각을 계산한다.
aeirobot up driving --simros2 topic list | grep vslamros2 topic echo /aeirobot/vslam_left_camera_info --once2·atan(1280 / (2·fx)) ≈ 95°를 검산한다ros2 topic hz /aeirobot/vslam_left_image확인 cx·cy가 640·360이고 D가 전부 0이면 이미 rectify된 영상이다. frame_id는 zed_left_camera_optical_frame.
PRACTICE
실습 2
base_link에서 zed_left_camera_optical_frame까지의 변환을 뽑아 축이 어떻게 돌아가는지 확인한다.
ros2 run tf2_tools view_framesros2 run tf2_ros tf2_echo base_link zed_left_camera_optical_framebase_link 기준 카메라 높이다확인 쿼터니언은 교과서의 (−0.5, 0.5, −0.5, 0.5)가 아니다. RTAB-Map·Nav2의 기준 프레임은 base_footprint이고 base_link와 z로 0.127 m 어긋나 있다.
PRACTICE
실습 3
같은 자리로 되돌아왔을 때 휠 오도메트리와 EKF 융합 결과가 각각 얼마나 벌어지는지 숫자로 잰다.
ros2 topic echo /aeirobot/odometry --onceros2 topic echo /odometry/filtered --onceros2 bag record /aeirobot/odometry /odometry/filtered /tf /tf_static확인 둘 다 odom 기준이라 드리프트는 누적되기만 한다. 이걸 지우는 건 map→odom을 보정하는 SLAM·AMCL뿐이다 — 실습 4·5.
PRACTICE
실습 4
Gazebo TurtleBot3를 slam_toolbox로 돌려 맵을 만들고, 파일로 저장해 실습 5의 입력으로 쓴다.
ros2 launch nav2_bringup tb3_simulation_launch.py slam:=True headless:=False/scan이 없으면 SLAM은 한 발도 못 나간다ros2 topic hz /scan/map을 올리고 키보드로 천천히 몰며 맵을 채운다ros2 run teleop_twist_keyboard teleop_twist_keyboardros2 run nav2_map_server map_saver_cli -f my_map확인 벽이 두 겹으로 번져 있으면 루프가 닫히지 않은 것이다. my_map.yaml의 resolution 0.05와 origin을 적어 실습 5에서 그대로 쓴다.
PRACTICE
실습 5
저장한 맵으로 목표점까지 주행한 뒤, 위치를 일부러 틀어 무엇이 무너지는지 본다.
ros2 launch nav2_bringup tb3_simulation_launch.py map:=my_map.yaml headless:=False/plan이 어떻게 튀는지, 복구 행동이 뜨는지 관찰한다ros2 topic echo /amcl_pose --field pose.covariance확인 위치가 틀리면 Planner를 손봐도 소용없다 — 슬라이드 47의 진단 순서. /scan → TF → /amcl_pose → /plan 순으로 짚는다.
PRACTICE
실습 6
/aeirobot/vslam_depth의 거리값을 TF에서 잰 기선 B로 되짚어 disparity를 검산한다.
ros2 topic list -t | grep vslamros2 run tf2_ros tf2_echo zed_left_camera_frame zed_right_camera_frameros2 run rqt_image_view rqt_image_viewd = fx·B / Z로 disparity를 되짚는다 — 1 m면 70.4 px, 3 m면 23.5 px확인 거리가 2배면 오차는 4배 — 슬라이드 11의 오차식과 맞는지 본다. 멀수록 disparity 1 px 차이가 거리로 크게 벌어진다.