[ Project ]
1. 프로젝트 개요
- 분류: 맵 애플리케이션
- 일시: 2020.05. ~ 2020.06.
- 스택: Java
- 주제: 서울과학기술대학교 내 길찾기를 도와주는 프로그램 제작
2. 프로젝트 소개
'서울과학기술대학교'는 52만㎡ (15.4만 평)의 캠퍼스 부지를 갖고 있습니다. 서울 소재 대학교 중에서 5번째로 넓습니다. 건물도 45 여개로 무척이나 많으며, 저 역시 졸업생이지만 모르는 건물들이 많습니다.
이렇게 학교가 넓다 보니, 외부인 및 신입생들은 길 찾기가 매우 어렵습니다.
또한 학교 내 지도 및 표지판도 부족하고, 시인성이 좋지 않아 길 찾기에 어려움이 있습니다. SNUT RoadSign 프로젝트는 이러한 어려움을 해결하고자 진행했습니다.
● 프로젝트 배경
- 캠퍼스가 너무 넓어서 '지도 및 표지판'으로는 찾기가 어려움
- 정문에서 지도를 보고 가더라도, 걷는 도중 방향을 잊어버리거나 잃는 경우가 많음
- 주로 차량을 위한 안내 표지판으로, 캠퍼스 내의 보행객에는 맞지 않음
- 타 학교보다 건물(특히 대형, 고층건물)이 많아서 복잡하고 난잡함
● 프로젝트 목표
- 웹 상에서 동작하는 Java 프로그램 개발 (URL로 접속해서 이용)
- 길 찾기를 안내하는 GUI(그래픽 유저 인터페이스) 구현
- 캠퍼스 지도, 경로, 거리, 예상 도착시간 정보 제공
3. 기능 및 구성
1) javaFX를 활용한 GUI 환경 구축
javaFX는 javaSE를 위한 표준 GUI 라이브러리로 웹 브라우저나 윈도우, 리눅스, macOS 등 다양한 곳에서 실행 가능합니다. java와 마찬가지로 그래픽 클래스와 객체를 만들어서 사용하며, 저는 ImageView, Line, ComboBox, TextField class를 주로 사용했습니다.
2) 다익스트라 알고리즘을 이용한 최단 경로 탐색
dist = new int[NODE + 1]; // 다익스트라 최적경로 비용(거리) 저장
parent = new int[NODE + 1]; // 경로 추적을 위한 부모노드 정보를 저장
Arrays.fill(dist, INFINITE); //거리를 무한대로 초기화
PriorityQueue<Spot> pq = new PriorityQueue<>();
boolean check[] = new boolean[NODE + 1];
pq.add(new Spot(startNode, 0));
dist[startNode] = 0;
while(!pq.isEmpty()){
Spot curSpot = pq.poll();
int cur = curSpot.end;
if(check[cur] == true) continue;
check[cur] = true;
for(Spot Spot : SpotList[cur]){
if(dist[Spot.end] > dist[cur] + Spot.cost){
dist[Spot.end] = dist[cur] + Spot.cost;
pq.add(new Spot(Spot.end, dist[Spot.end]));
parent[Spot.end] = cur;
}
}
}
다익스트라 알고리즘은 최적경로를 찾는 데에 사용됩니다. 그리디 알고리즘으로, 현재 찾은 최적 경로를 이용해서 다음 노드로의 최적 경로를 탐색합니다. 이전에 찾은 최적 경로는 추후에 찾을 최적 경로에 영향을 주지 않으며 (탐욕스런 선택 조건), 이전에 찾은 최단경로를 바탕으로 또 다른 최단경로를 탐색합니다. (최적 부분 구조 조건)
2022.03.22 - [Algorithm] - [Algorithm] 다익스트라(Dijkstra), 지름길의 지름길로 찾는 최적경로
if(dist[Spot.end] > dist[cur] + Spot.cost)
dist[Spot.end] = dist[cur] + Spot.cost;
다익스트라 알고리즘은 출발지로부터 인접한 노드를 하나하나 방문하며 각 노드로 가는 최단거리를 갱신합니다. 위 코드는 dist[v] = min(현재까지의 최단거리 비용, 새로운 노드를 거치는 거리비용) 를 뜻합니다. 현재 자신이 아는 최단거리와 새롭게 알게 된 노드를 통한 거리 비용을 비교하면서, 계속 갱신해나갑니다.
public static Stack<Integer> searchPath(int startNode, int endNode){
Stack<Integer> stack = new Stack<>();
int cur = endNode;
while(cur != startNode) {
stack.push(cur);
spotCnt++;
cur = parent[cur];
}
stack.push(cur);
spotCnt++;
return stack;
}
최단거리를 뿐만 아니라, 경로도 알아내야 합니다. Stack에 지나친 노드 정보를 저장하고 역추적해서 경로를 반환합니다.
예를 들어, 시작정점이 4, 도착 정점이 0이라고 하고, path[] = {7 2 3 5 –1 4 5 5} 라고 합시다. 여기서 path[0] = 7이므로 0번 노드로 가기 직전 노드는 7번 노드임을 알 수 있습니다. 이것을 이어서 path[7] = 5, path[5] = 4......., 이렇게 역추적하다 보면 경로를 찾을 수 있습니다.
3) 길 찾기 정보 제공
출발지와 도착지를 입력하면, 경로와 거리 그리고 예상 소요시간 정보를 제공합니다. 예상 소요시간은 평균 도보 속도인 시속 4km를 기준으로 계산했습니다.
이용자가 사용하며 발생할 수 있는 오류는 경고창을 띄워서 예외 처리했습니다.
4. 프로젝트 필요성 및 기대효과
1) 필요성
- 넓은 캠퍼스 부지와 복잡한 건물 배치로 길 찾기가 어려움
서울 소재 대학교 중 5번째로 넓으며, 총 52만㎡ (15.4만 평)에 이릅니다. 건물도 45여 개로 많으며, 복잡한 건물 배치 때문에 방문객이 혼란을 겪는 일이 많습니다.
- 차량 위주의 안내 표지판과 부족한 캠퍼스 지도
캠퍼스 내에는 캠퍼스 지도가 없으며, 도보로 이동하는 방문객을 위한 표지판이 부족합니다.
- 편의성 및 다양성을 고려하지 못함
기존 지도는 외국인을 배려한 영문 표기가 없으며, 노인분들이 보기 어렵습니다. 또한 시인성이 부족해서 넓은 캠퍼스 지도에서 건물 이름과 길을 찾기 힘듭니다.
2) 효과
- URL 혹은 QR코드를 통해 맞춤 지도 앱에 편리하게 접근 가능
정문 또는 안내책자에 적힌 URL로 접속하거나, QR코드를 인식하면 쉽게 맵 애플리케이션을 이용 가능합니다. 일회성 성격이 강하기 때문에, 설치 부담이 있는 앱보다는 웹에서 작동하여 접근성을 높였습니다.
- GUI 맵 네비게이션으로 쉽게 길 찾기 가능
캠퍼스 내 원하는 목적지까지의 경로를 쉽게 찾을 수 있으며, 캠퍼스를 둘러볼 수 있는 지도 기능도 수행합니다.
- 다양한 편의 기능을 탑재
경로, 거리, 예상 도착시간을 제공하며, 시력이 좋지 않은 노인분들도 이용하실 수 있습니다. 또한 영문명도 병기하여 외국인도 쉽게 이용할 수 있습니다.
'Projects' 카테고리의 다른 글
[Project] ST Fair Route: 모두가 공평한 네비게이션 앱 (0) | 2022.03.23 |
---|---|
[Project] Cartpole: DQN, DDQN, Dueling DQN 강화학습 (0) | 2022.03.22 |
[Project] Patent Big Data Analysis: 자연어 처리를 이용한 특허문서 분석 (1) | 2022.03.17 |
[Project] Seoultech Explore: 모교 홍보를 위한 웹 게임(퀴즈) (0) | 2022.03.15 |
[Project] 게시판 소개 (0) | 2022.01.09 |
댓글