안동시 승객안내 시스템 2차 개발에서는 1차에서 구축한 티머니 통신 기반 오프라인 시스템을 확장하여 GNSS 기반 차량 위치 확인과 온라인 서버 통신을 결합한 승객안내 시스템으로 고도화했습니다.
또한 차량 내부 LCD와 앰프를 연동하여 화면과 음성으로 동시에 승객 안내가 가능하도록 기능을 확장하고, FTP를 이용한 데이터 및 APK 관리 기능도 구현했습니다.
[GNSS 기반 차량 위치 추적]
2차 개발의 핵심 기능 중 하나는 GNSS(Global Navigation Satellite System)를 이용한 차량 위치 확인이었습니다.
단말에서 위도와 경도 등의 위치 데이터를 지속적으로 수집하고 이를 현재 운행 노선 및 정류장 정보와 비교하여 차량이 어느 구간을 운행하고 있는지 판단하도록 구현했습니다.
GNSS는 지속적으로 위치 데이터를 제공하지만 실제 차량 환경에서는 위치가 순간적으로 튀거나 수신 정확도가 낮아지는 상황이 발생할 수 있습니다.
특히 정류장 인근에서는 작은 위치 오차만으로도 정류장 도착 여부가 잘못 판단될 가능성이 있기 때문에 단순히 특정 좌표와 가까워졌다는 이유만으로 도착 처리를 할 수 없었습니다.
이를 보완하기 위해 이전 위치, 현재 위치, 정류장과의 거리, 차량의 운행 진행 상태 등을 함께 고려하여 위치 데이터를 처리했습니다.
[온라인 서버 통신]
GNSS를 통해 확보한 차량 위치 및 단말 상태를 서버와 통신할 수 있도록 온라인 구조를 적용했습니다.
차량 단말은 서버에서 운행에 필요한 정보를 받아오고 현재 차량 및 단말 상태를 서버로 전달하도록 구성했습니다.
하지만 실제 버스는 이동하면서 통신하기 때문에 네트워크가 항상 안정적으로 유지되는 것은 아닙니다.
터널, 통신 음영지역 또는 이동통신 상태에 따라 서버 연결이 일시적으로 끊어질 수 있기 때문에 온라인 통신이 실패했다고 해서 승객안내 기능 전체가 중단되어서는 안 됐습니다.
따라서 온라인과 오프라인 상태를 모두 고려한 구조로 설계했습니다.
서버 연결이 정상적인 경우에는 최신 데이터를 사용하고, 연결이 불가능한 경우에는 단말에 저장되어 있는 기존 데이터를 활용하여 기본적인 운행 안내를 계속 수행하도록 구성했습니다.
이후 통신이 복구되면 다시 서버 데이터를 기준으로 상태를 동기화하도록 처리했습니다.
[LCD 승객안내 화면 연동]
2차 시스템에서는 차량 내부 LCD 장치와의 연동을 진행했습니다.
현재 정류장, 다음 정류장 및 운행에 필요한 안내 정보를 LCD 화면에 표시하고 차량의 운행 상태에 따라 화면 내용이 자동으로 변경되도록 구현했습니다.
LCD와 애플리케이션을 각각 독립적으로 동작시키는 것이 아니라 GNSS 위치 판단과 서버에서 받은 운행 데이터를 기반으로 하나의 상태를 공유하도록 구성했습니다.
이를 통해 차량의 현재 위치가 변경되면 승객에게 보여주는 정보 역시 자동으로 변경되는 구조를 구현했습니다.
[차량 앰프 연동 및 음성 안내]
1차 시스템에서는 화면을 통한 정보 제공이 중심이었지만 2차에서는 차량 앰프와 연동한 음성 안내 기능을 추가했습니다.
정류장 접근, 정류장 도착 등 특정 운행 이벤트가 발생하면 해당 상황에 맞는 안내 음성을 차량 앰프를 통해 출력하도록 구성했습니다.
이를 통해 LCD에서는 시각적인 정보를 제공하고 차량 스피커에서는 음성으로 동일한 운행 정보를 안내할 수 있게 됐습니다.
이 과정에서 중요한 문제 중 하나는 화면과 음성의 동기화였습니다.
GNSS 위치가 순간적으로 변경되거나 동일 이벤트가 반복적으로 발생할 경우 같은 정류장 안내방송이 여러 번 출력될 수 있었습니다.
이를 해결하기 위해 현재 정류장 상태와 이전 방송 이력을 관리하고 이미 안내한 정류장에 대해서는 동일한 방송이 불필요하게 반복되지 않도록 제어했습니다.
[FTP 및 APK 배포]
차량에 설치된 단말은 일반적인 모바일 애플리케이션처럼 사용자가 직접 앱스토어에서 업데이트하는 환경이 아닙니다.
다수의 차량에 설치된 단말을 관리해야 하기 때문에 원격으로 필요한 파일과 애플리케이션을 배포할 수 있는 구조가 필요했습니다.
이를 위해 FTP를 활용한 파일 전송 및 APK 배포 기능을 적용했습니다.
서버에 새로운 APK 또는 운행에 필요한 데이터를 업로드하고 차량 단말에서 파일과 버전을 확인한 뒤 필요한 데이터를 다운로드할 수 있도록 구성했습니다.
APK 버전 확인, 파일 다운로드 및 업데이트에 필요한 흐름을 구현하면서 현장에 설치된 단말을 효율적으로 관리할 수 있도록 했습니다.
특히 이동통신 환경에서는 다운로드 도중 네트워크가 끊어질 수 있기 때문에 다운로드 실패, 파일 손상, 재시도 등의 예외 상황도 고려했습니다.
[실제 차량 환경에서의 시행착오]
2차 개발에서는 기능이 많아진 만큼 서로 다른 시스템 간의 동기화가 중요한 문제였습니다.
GNSS는 위치를 계속 변경하고 서버에서는 새로운 운행 데이터가 전달되며 LCD와 음성 안내는 그 결과에 따라 동작해야 합니다.
이 중 하나의 데이터가 늦게 처리되거나 잘못 판단되면 화면에는 다음 정류장이 표시됐지만 이전 정류장 안내방송이 출력되는 것과 같은 문제가 발생할 수 있습니다.
따라서 각각의 기능을 단순히 따로 구현하기보다 차량의 현재 운행 상태를 하나의 기준으로 관리하고 각 장치가 동일한 상태를 바라보도록 만드는 작업이 중요했습니다.
또한 개발실의 고정된 네트워크 환경에서는 발견하기 어려웠던 통신 끊김, GNSS 위치 오차, 데이터 수신 지연, 앰프 출력 시점 등의 문제를 실제 운행 테스트 과정에서 확인하고 반복적으로 보완했습니다.
[1차에서 2차까지]
1차에서는 티머니 통신 데이터를 기반으로 오프라인에서도 동작할 수 있는 승객안내 시스템의 기본 구조를 구축했습니다.
2차에서는 이를 기반으로 GNSS 위치정보와 온라인 서버 통신을 추가하고 LCD와 차량 앰프를 연동하여 시각 및 음성 안내가 동시에 가능한 시스템으로 발전시켰습니다.
또한 FTP와 APK 관리 기능을 통해 현장에 설치된 단말을 원격으로 유지관리할 수 있는 기반도 마련했습니다.
티머니 데이터 수신부터 오프라인 운행 처리, GNSS 위치 판단, 온라인 서버 통신, LCD 정보 표출, 차량 앰프 음성 안내, FTP 및 APK 관리까지 구현하면서 실제 대중교통 환경에서 필요한 임베디드, 통신, 서버 및 애플리케이션 연동 경험을 확보할 수 있었습니다.
이번 프로젝트는 단순한 화면 개발을 넘어 실제 운행 중인 차량에서 여러 하드웨어와 통신 시스템이 안정적으로 함께 동작하도록 구현한 프로젝트라는 점에서 의미가 있었습니다.