프로젝트 개요
핵심 문제 정의
기존 실내 내비게이션 시스템은 "3층 화장실 좌표(x:15.2, y:8.7)"처럼 수치 좌표 기반으로만
목적지를 설정했습니다. 그러나 실제 시각장애인 사용자는 "소파", "입구 안내 데스크", "엘리베이터"처럼
의미론적 특징으로 목적지를 인지합니다. 이는 단순 좌표 매칭으로 해결할 수 없는 본질적 간극이었습니다.
솔루션 접근법
Vision-Language Model인 CLIP을 도입하여 텍스트 쿼리를 시각적 공간 정보와 연결하는
멀티모달 아키텍처를 구축했습니다. 이를 통해 기존 좌표 기반 방식에 자연어 기반 목적지 설정 기능을
추가하여 시스템의 자유도와 접근성을 크게 향상시켰습니다.
87%
CLIP 목적지 인식 정확도
(Top-1 Accuracy)
0.09m
측위 평균 오차
(목표 대비 5배 우수)
기술적 구현
1. CLIP 통합 아키텍처
모델 선정 및 최적화
- 모델: OpenAI CLIP ViT-B/32 (약 151M 파라미터)
- 임베딩 공간: 512차원 벡터 공간에서 텍스트-이미지 유사도 계산
- 추론 최적화: 배치 처리 및 임베딩 사전 계산으로 실시간 추론 가능
목적지 인식 파이프라인
1
공간 매핑 단계 특징점 추출
DROID-SLAM이 생성한 3D 포인트 클라우드에서 주요 랜드마크 위치를 카메라 프레임과 함께 저장합니다.
각 랜드마크 지점에서 RGB 이미지를 추출하고, 해당 이미지의 SLAM 좌표(x, y, z)를 메타데이터로 연결합니다.
{
"landmark_id": "L001",
"position": {"x": 15.2, "y": 8.7, "z": 0.0},
"image_path": "landmarks/L001_redsofa.jpg",
"clip_embedding": [512차원 벡터]
}
2
텍스트 쿼리 처리
사용자가 음성 또는 텍스트로 목적지를 입력하면 ("빨간색 소파로 안내해주세요"),
CLIP의 텍스트 인코더가 이를 512차원 임베딩 벡터로 변환합니다.
3
유사도 기반 매칭
저장된 모든 랜드마크의 이미지 임베딩과 입력된 텍스트 임베딩 간 코사인 유사도를 계산합니다.
similarity = cosine_similarity(text_embedding, image_embedding)
# 가장 높은 유사도 점수를 가진 랜드마크의 SLAM 좌표를 최종 목적지로 결정
4
좌표 변환 및 경로 생성
CLIP이 반환한 랜드마크 좌표를 DROID-SLAM의 글로벌 좌표계로 변환하고,
이를 A* 알고리즘의 목표 노드로 설정합니다.
실험적 검증
테스트 환경: 경북대학교 IT대학 3층 복도
- 등록 랜드마크: 15개 (빨간 소파, 엘리베이터, 화장실 표지판, 자판기 등)
- Top-1 Accuracy: 87% (15개 중 13개 정확 매칭)
- Top-3 Accuracy: 100% (상위 3개 후보 내에 정답 포함)
* 오류 사례: "자판기" 쿼리 시 "정수기"를 1순위로 반환 →
해결책: 다중 앵글 촬영 및 텍스트 augmentation 적용
2. A* 알고리즘 기반 경로 최적화
그래프 구조 및 노드 정의
DROID-SLAM이 생성한 3D 포인트 클라우드를 2D 평면으로 투영(z축 제거)한 뒤,
이를 그리드 맵으로 변환했습니다.
- 그리드 해상도: 0.1m × 0.1m (실제 공간 10cm를 1셀로 표현)
- 장애물 판정: 포인트 밀도 기반 occupancy grid
- 그래프 연결: 각 그리드 셀을 노드로, 인접한 8방향 셀을 엣지로 연결
휴리스틱 함수 설계
A* 알고리즘의 핵심은 f(n) = g(n) + h(n) 평가 함수입니다.
g(n): 시작점에서 노드 n까지의 실제 이동 비용
- 직선 이동: 1.0
- 대각선 이동: √2 ≈ 1.414
- 회전 패널티: 추가 0.2 (급격한 방향 전환 시 시각장애인에게 혼란 야기)
h(n): 노드 n에서 목표까지의 추정 비용 (휴리스틱)
- 유클리드 거리 사용: h(n) = √((x_goal - x_n)² + (y_goal - y_n)²)
- Admissible 조건 충족: 실제 비용을 과대평가하지 않음
최적화 전략
경로 평활화
Catmull-Rom Spline 보간으로 계단형 경로를 부드럽게 변환하여
회전 각도 변화율 43% 감소
동적 장애물 회피
실시간 감지된 장애물 발생 시 그리드 비용 증가 및
A* 재계획으로 우회 경로 생성
계층적 경로 계획
경로를 세그먼트로 분할하여
계산 복잡도를 O(n²)에서 O(k·m²)로 감소
Pygame 기반 경로 시각화
RViz와 Gazebo 같은 로보틱스 전용 도구 대신 pygame을 선택했습니다.
경량 라이브러리로 빠른 동작과 리소스 효율성을 확보했으며,
팀원 간 실시간 디버깅과 빠른 프로토타이핑을 가능하게 했습니다.
- 그리드 맵: 흰색(자유 공간), 검은색(장애물), 회색(미탐색)
- 위치 표시: 현재 위치(파란색), 목표 지점(빨간색)
- 경로 표시: 계획 경로(초록색), 실시간 추적(노란색)
- 성능: 60 FPS 이상 유지, 경량 라이브러리로 리소스 효율 극대화
- 장점: 설치 간편, 2D 렌더링 속도 우수, 이벤트 처리 직관적
3. 통합 시스템 파이프라인
1
초기화 단계
DROID-SLAM 지도 로드 → CLIP 모델 로드 →
랜드마크 데이터베이스 로드 (이미지 임베딩 사전 계산)
2
사용자 입력 처리
음성 입력 → STT 변환 → 텍스트 쿼리 추출 → CLIP 텍스트 인코더 실행
3
목적지 결정
텍스트 임베딩 vs 랜드마크 임베딩 유사도 계산 →
Top-K 후보 추출 및 사용자 확인 (음성 피드백: "빨간색 소파가 맞습니까?")
4
경로 생성
현재 위치(SLAM 추정) → 목표 좌표(CLIP 매칭) →
A* 알고리즘 실행 → 최적 경로 생성 → 경로 평활화 및 세그먼트 분할
5
내비게이션 실행
실시간 위치 추적 (SLAM + IMU 센서 퓨전) → 경로 이탈 감지 → A* 재계획 →
음성 안내 ("3미터 직진 후 우회전", "목적지 도착")
6
예외 처리
SLAM 추적 실패 → IMU 기반 Dead Reckoning으로 전환 /
CLIP 매칭 신뢰도 낮음 → 사용자에게 목적지 재확인 요청