안녕하세요
최근 자율 주행 전기차가 미래 성장동력원으로 주목 받고 있습니다.
언론에 보도된 것처럼 고성능의 전기차 자율 주행 부품 개발을 위해 대기업간에 합작 회사를 만들기도 하고 기존 자동차 회사들은 경쟁력 있는 솔루션 회사를 인수 합병하여 경쟁력을 확보하려는 움직임이 두드러지고 있습니다. 이미 다른 회사에서는 고도화된 전기차 아키텍처를 구현하고 점차 가격 경쟁력을 높여가며 점차 성능이 뛰어난 자율 주행 전기차를 양산하고 있습니다.
자동차에 들어가는 전장 부품 네트워크 구조도 기능별로 별도의 ECU가 탑재되어 서로간의 통신을 통해 차량을 제어하는 방식에서 자율 주행, 주차를 포함한 큰 범주의 도메인별로 ECU가 통합된 도메인 아키텍처, 여기에 더해 차량을 소수의 구획으로 구분하여 하나의 ECU에서 해당 구획의 모든 전자장치를 제어하는 Zonal 아키텍처까지 점차 여러 기능을 하나의 ECU에 통합하여 운전자에게 편의를 제공하는 방향으로 진화하고 있습니다.
이것은 차량용 마이크로 컨트롤러의 성능이 그만큼 향상되었기 때문에 가능한 일이기도 합니다.
이미 유럽과 북미 선진 자동차 회사들은 오래 전부터 이러한 변화를 주도해 왔고 이를 구현할 수 있는 시스템 및 소프트웨어 아키텍처를 보유하고 있는 상황입니다.
소프트웨어 개발 방식도 과거에는 자동차 회사에서 각 ECU와 ECU에 탑재되는 소프트웨에 개발을 각 협력업체에 의뢰하고 차량 네트워크 레벨에서 각 ECU간에 통신이 정상적으로 이루어져 원하는 기능이 구현되는지 확인했던 것에 비해
수년 전부터는 자동차 회사에서 AUTOSAR 표준 소프트웨어 플랫폼 기반으로 기능 소프트웨어 컴포넌트 단위로 아키텍처를 만들고 연관된 소프트웨어 컴포넌트를 묶은 뒤 이를 ECU 단위로 나누어 협력사에서 AUTOSAR 플랫폼 기반으로 개발하도록 하고 있습니다.
(물론, 멀티미디어 ECU의 경우 리눅스 OS 기반 플랫폼을 사용하기도 합니다.)
AUTOSAR와 같은 표준 플랫폼을 사용할 경우 소프트웨어 재사용성이 높아지고 동일 플랫폼을 사용하는 ECU간에 통신 호환성이 확보되어개발 기간을 단축하고 검증 비용을 줄일 수 있다는 장점이 있습니다. (단, 완성차 제조사 입장에서)
물론 점차 다양한 기능 통합에 의해 증가되는 소프트웨어 개발 복잡도와 안정적인 플랫폼을 개발하고 확보하는데 들어가는 추가적인 비용 때문에 예전보다 개발이 더 어려워졌다고 느껴질 수도 있지만 플랫폼 기반의 개발 방법은 소프트웨어의 재사용성을 높여 여러가지 기능을 하나로 통합하고 확장하는데 많은 이점을 제공합니다.
그런데 AUTOSAR 플랫폼의 경우 사양은 표준화되어 문서로 만들어져 있으나 구현은 경쟁에 맡기고 있으므로 전체적인 구조와 제공하는 서비스 그리고 인터페이스 형식은 AUTOSAR 플랫폼을 만들어 배포하는 회사마다 동일하지만 그 상세 구현은 다릅니다. 때문에 AUTOSAR 플랫폼 기반으로 소프트웨어를 개발하는 당사를 포함한 회사에서는 서로 다른 개발사의 AUTOSAR 플랫폼에 대응하기 위해 AUTOSAR 플랫폼과 어플리케이션 소프트웨어 컴포넌트 사이의 통신 인터페이스(AUTOSAR에서 RTE라고 부름)에 의존하는 부분을 따로 분리해 둘 필요가 있습니다.
만약 소프트웨어 컴포넌트가 하위 모듈별로 중복 없이 구분되어 있고 계층화되어 있으며 컴포넌트간 통신 인터페이스를 논리적으로 세분화하여 잘 정의해 두고 이를 별도로 분리했다면 새로운 AUTOSAR 플랫폼에 소프트웨어 컴포넌트를 이식해야 하는 상황이 발생했을 때에 인터페이스에 해당하는 부분만 변경하여 쉽게 이식할 수 있을 것입니다.
위에서 설명한 소프트웨어 이식성(portability)의 문제와 함께 중요한 것이 바로 확장성(extensibility) 입니다.
사용자는 꾸준히 혁신적이고 새로운 기능을 요구합니다. 자동 주차 기능도 운전자가 탑승한 상태에서의 평행, 직각 주차에서 시작해 원격 자동 주차기능과 발렛 파킹 지원 기능까지 자동차의 안전과 편의를 향상시기기 위한 기능은 계속 발전하고 있고 각종 센서를 활용한 새로운 요구 사양이 추가되고 있습니다. 또한 자동차 보안, 고장 진단과 관련된 요구 사양도 점차 증가하고 있습니다.
보다 적은 시간과 비용으로 추가되는 요구 사항과 새로운 기능을 결합하기 위해서는 기존 소프트웨어가 확장성 있게 설계되어야 합니다. 외부 요구 사양의 변화에 대해 소프트웨어가 해당 사항을 쉽게 반영할 수 있는 유연성을 가지고 있으면서 그 변경의 범위가 적도록 코드를 구현해야 합니다. 이것은 현재 소프트웨어 구조에 대한 지속적인 개선 노력과 개발 경험 그리고 숙련도를 필요로 합니다. (여기에는 적합한 함수, 변수 이름을 짓는 센스도 포함됩니다.)
소프트웨어 아키텍처 관련 서적에서는 이식성과 확장성 있는 소프트웨어 개발을 위해 구조적이며 객체지향적인 프로그래밍을 할 것을 당부하고 있습니다. 리눅스를 비롯한 잘 알려진 오픈 소스, 그리고 Third party를 비롯한 솔루션 회사에서 공급하는 코드를 분석해 보면 좋은 소프트웨어 아키텍처를 유지하기 위한 원칙을 상당 부분 준수하고 있음을 알 수 있습니다.
잘못 생각할 수도 있는 부분이 있는데, JAVA나 C++같은 객체지향 언어로만 객체지향 프로그래밍을 할 수 있는 것은 아닙니다. C언어에서도 객체지향 언어의 객체를 모방할 수 있고 객체지향의 기본 요소인 은닉성과 다형성 그리고 단일 책임 법칙 같은 객체지향의 원칙을 적용할 수 있습니다. 리눅스도 C 언어로 개발되어 있지만 상당부분 객체지향적으로 소프트웨어가 설계되어 있습니다. 그리고 Matlab simulink를 사용한 모델 기반 디자인도 일부 객체지향 원리를 반영할 수 있다고 생각합니다.