포스팅 목차
클라이언트 시스템은 실시간 및 신뢰성 요구사항을 만족하도록 여러 알고리즘을 통합합니다. 이 과정에서 몇 가지 어려움이 발생합니다. 센서에 생성된 방대한 양의 데이터를 충분히 처리할 수 있을 정도로 프로세싱 파이프라인이 빨라야 합니다. 어느 한 부분에서 오류가 발생해도 복구할 수 있을 정도로 충분히 견고해야 합니다. 그리고 모든 연산을 처리하는 데 있어 엄격한 에너지 및 리소스 제약사항도 만족해야 합니다.
ROS는 Robot Operating System의 약자입니다. 로보틱스 애플리케이션에 특화된 강력한 분산 컴퓨팅 프레임워크로서 현재 널리 사용되고 있습니다. ROS 노드는 토픽과 서비스를 통해 서로 통신합니다. 자율 주행 시스템 용도로 굉장히 뛰어난 프레임워크이지만 다음과 같은 문제점이 있습니다.
신뢰성과 성능, 보안입니다. ROS 2.0부터는 이러한 문제를 보완할 예정이지만 아직 엄격한 테스트를 거치지 않았고 상당수의 기능은 아직 사용할 수 없는 상태입니다. 따라서 자율 주행 시스템에 ROS를 사용하기 전에 이러한 문제에 대한 해결방안을 마련해야 합니다.
신뢰성
현재 나와 있는 ROS 구현은 마스터 노드가 하나뿐입니다. 따라서 마스터 노드가 죽으면 전체 시스템이 죽게 됩니다. 이는 자율 주행 시스템의 안전 요구사항에 어긋납니다. 이를 해결하기 위해 주키퍼와 유사한 메커니즘을 ROS에 구현했습니다. 메인 마스터 노드가 하나 있고 그 옆에 백업 마스터 노드가 하나 있습니다. 메인 노드가 죽으면 백업 노드가 이어받아 시스템이 휘청거리지 않고 정상적으로 구동하게 만듭니다. 또한 주키퍼 메커니즘을 통해 모니터링하다가 장애가 발생한 노드를 감지하면 이를 재구동함으로써 전체 ROS 시스템의 신뢰성을 보장합니다.
성능
ROS 구현은 성능 문제도 있습니다. ROS 노드 사이의 통신은 굉장히 빈번하게 일어나기 때문에 노드 사이의 통신을 반드시 효율적으로 처리해야 합니다. 로컬 노드끼리는 루프백 메커니즘으로 통신합니다. 이러한 루프백 파이프라인을 통과할 때마다 20ms 가량의 오버헤드가 발생합니다. 이러한 로컬 통신 오버헤드를 제거하기 위해 공유 메모리 메커니즘을 활용해 메시지가 TCP/IP 스택을 거치지 않고 목적지 노드로 곧바로 가도록 처리했습니다.
ROS 노드가 메시지를 브로드캐스팅하는 과정에서 여러 개의 복사본을 만들기 때문에 시스템의 대역폭을 상당히 잡아먹게 됩니다. 브로드캐스팅 대신 멀티캐스트 메커니즘으로 대체함으로써 전반적인 시스템 처리량을 크게 향상했습니다.
보안
ROS의 문제점 중 가장 중요한 것은 보안입니다. 예를 들어서 다음과 같이 두 가지 문제가 나타날 수 있습니다. 먼저, 악의적인 해커가 ROS 노드에 침투해 메모리를 끊임없이 할당하는 작업을 수행해 시스템 메모리 전체를 고갈시키는 방식으로 노드를 다운시킬 수 있습니다.
다른 하나는 ROS 노드끼리 주고받는 메시지를 중간에 가로채는 중간자 공격을 시도할 수 있습니다. 기본적으로 메시지를 암호화하지 않기 때문입니다. 첫 번째 문제는 LXC 리눅스 컨테이너를 사용해 각 노드마다 허용된 리소스 양을 제한하는 방식으로 해결할 수 있었습니다. 또한 LXC에서 제공하는 샌드박스 메커니즘을 통해 노드를 외부로부터 보호할 수 있어 리소스 누수 현상도 방지할 수 있습니다. 두 번째 문제는 통신 과정에서 주고받는 메시지를 암호화하면 됩니다.