Tech
Foros : 자동차에 합의 알고리즘을?
2022.10.14

미래 기술이라 생각했던 자율주행차를 정식 교통수단으로 이용할 수 있는 시대가 되었습니다. 이에 따라 42dot 은 자율주행 안정성을 높이기 위한 연구 개발을 진행하고 있으며, 그중 ‘합의 알고리즘 기반 애플리케이션 다중화 기술’에 대해서 이야기하려고 합니다.




안전하고 신뢰성 있는 자율주행을 위한 OS 개발


1. AKit OS


42dot은 안전하고 최적화된 자율주행 애플리케이션 실행 환경 제공을 위해 자율주행 OS(이하 AKit OS)를 자체 개발하고 있으며, ‘failsafe’, ‘OTA updatable’, ‘security evaluated’, ‘ROS2 based’를 그 지향점으로 지속적인 연구 개발을 진행하고 있습니다.



ROS?


애플리케이션 간 메시지 버스를 제공하는 미들웨어입니다. 이전 세대인 ROS1과 달리 중앙화된 서버가 존재하지 않는 구조를 도입하여 안정성을 크게 향상시켰습니다.



2. Failsafe?


자율주행차는 측위, 인지, 판단, 제어 등 애플리케이션들이 유기적으로 연동되어 스스로 주행하는 자동차를 뜻합니다. 그리고 애플리케이션 중 어느 하나라도 고장이 발생하면 생명을 태우고 달리는 차의 안정적인 운행이 불가능해집니다.

따라서, AKit OS는 고장 발생 시 빠르게 안전을 확보하고 고장을 해결할 수 있도록 기본적인 진단, 복구 기능뿐 아니라 가용성이 중요한 애플리케이션을 위한 다중화 기능도 함께 제공하고 있습니다.

특히, 고가용성(high availability) 클라우드 서비스 제공을 위해 사용하는 합의 알고리즘 기반 다중화 기술을 임베디드 환경에 맞게 경량화하여 Foros라는 오픈소스로 개발을 진행하고 있습니다.



Foros : Fail-Over ROS Framework


1. Foros?


배경에서 소개한 바와 같이 Foros는 가용성이 중요한 ROS2 애플리케이션에 “아주 적은 노력” 만으로 다중화 기능을 부여해 주는 애플리케이션 프레임워크입니다. Foros의 원리는 클라우드 서비스 다중화와 매우 유사하게 동일 미션을 가진 애플리케이션들을 하나의 클러스터로 구성하여 장애 허용 서비스를 제공할 수 있게 해주는 것입니다. 애플리케이션 다중화 수에 따른 장애 허용 가능 수치는 아래 표와 같습니다.




2. 주요 기능


Foros는 RAFT 합의 알고리즘 기반으로 리더 선출 및 로그 복제 기능을 제공합니다.



2.1 리더 선출


Foros 기반으로 다중화된 애플리케이션들은 follower, candidate, leader 중 하나의 상태를 가지며 기본 상태는 follower 상태입니다. 이후, leader 부재 시 candidate으로 상태 변경 후 선거를 열고 과반 수 이상 표를 받은 애플리케이션이 leader가 되는 방식으로 동작합니다. 세부적인 상태 변경은 아래 state machine과 같습니다.

단, 이렇게 복잡한 리더 선출 과정은 모두 Foros 프레임워크 내부에서 처리되며 애플리케이션 개발자는 active, standby 상태만 고려하도록 구현되어 있습니다. 그리고 active 상태가 아닌 애플리케이션이 송신하는 ROS2 topic 및 수신하는 ROS2 service 요청은 모두 필터링 되는 장치도 제공됩니다.

[리더 선출 예: 클러스터 크기 3, 정족수 2, 장애 허용 1]



2.2 로그 복제


선출된 리더는 Foros API로 순차적인 런타임 데이터를 클러스터에 분산 저장할 수 있습니다. 이 기능을 이용해서 리더는 서비스 상태를 저장(check pointing) 할 수 있고, 다른 리더로 변경되어도 서비스의 상태 및 데이터를 쉽게 복구할 수 있습니다.


데이터 저장 과정은 아래와 같습니다.


1) 리더가 데이터 저장을 요청하면 다른 애플리케이션과 데이터 sync를 수행합니다.

2.1) 정족수 이상의 애플리케이션들에게 sync 되면 데이터 저장 요청은 성공합니다.

2.2) 정족수 이상의 애플리케이션들에게 sync 되지 않으면 데이터 저장 요청은 실패합니다.

3. 사용법


3.1 다중화


기본적으로 ROS2 애플리케이션은 메시징을 위해 ‘노드’ 인스턴스를 생성합니다. 이때, 기존 rclcpp의 node 클래스 대신 Foros의 ClusterNode 클래스를 사용하면 다중화 및 리더 선출이 활성화됩니다.



[코드 예제]

auto node = akit::failover::foros::ClusterNode::make_shared(
   "Test_cluster",                           
   0,                                        
   std::initializer_list{0, 1, 2}  
);



3.2 로그 복제


Foros는 내부적으로 leveldb를 이용해서 데이터를 관리하며 데이터 저장, 데이터 query, 데이터 변경 콜백 등록 API를 제공합니다.


3.2.1. 데이터 클래스


Foros에서 로그 복제 관련 데이터는 모두 command라는 클래스로 관리됩니다. 기본적인 사용법은 아래와 같습니다.


[코드 예제] 1이 저장된 1byte 데이터 생성 및 getter 사용

auto command = akit::failover::foros::Command::make_shared(
   std::initializer_list{1}); 
 
auto data = command()->data();


3.2.2 데이터 저장 API


리더는 ClusterNode 클래스의 commit_command API를 이용해서 byte array 데이터 저장을 요청할 수 있고 인자로 제공하는 콜백 함수를 통해서 요청 결과를 응답받을 수 있습니다.


[코드 예제] 1이 저장된 1byte 데이터 저장 요청

node->commit_command(
   akit::failover::foros::Command::make_shared(
       std::initializer_list{1}),    
   [&](akit::failover::foros::
           CommandCommitResponseSharedFuture  
               response_future) {             
     auto response = response_future.get();
     if (response->result() == true) {        
       RCLCPP_INFO(logger, "commit completed: %lu %d", response->id(),
                   response->command()->data()[0]);
     }
   });


3.2.3 데이터 Query API


모든 애플리케이션은 ClusterNode 클래스의 get_command API를 이용해서 특정 ID의 데이터를 query 할 수 있습니다.


[코드 예제] ID가 0인 데이터 query

auto command = node->get_command(0);


3.2.4 데이터 변경 콜백 API


모든 애플리케이션은 ClusterNode 클래스의 register_on_committed, register_on_reverted API를 이용해서 데이터 변경에 대한 콜백을 등록할 수 있습니다.



[코드 예제]

node->register_on_committed(
     [&](int64_t id, akit::failover::foros::Command::SharedPtr command) {
       RCLCPP_INFO(logger, "command committed : %ld, %c", id,
                   command->data()[0]);
     });
 node->register_on_reverted([&](int64_t id) {
   RCLCPP_INFO(logger, "command reverted to : %ld", id);
 });



4. 동작 예


아래 환경으로 리더 선출, 토픽 필터링, 로그 복제 동작을 데모를 통해 확인해 보겠습니다.




4.1 리더 선출


다중화된 애플리케이션들을 실행, 종료하며 리더 선출 상황을 확인해 보겠습니다.


[시나리오]


[결과]



4.2 로그 복제


다중화된 모든 애플리케이션들이 주기적으로 1바이트 크기의 데이터를 저장하도록 구성하고 데이터 저장 및 동기화 과정을 확인해 보겠습니다.


[시나리오]


[결과]


Details 테이블의 data size 열에서 저장된 데이터의 크기를 확인할 수 있습니다.



정원국 | Framework (Tech Lead)


안전하고 최적화된 자율주행을 위한 OS를 개발하고 있습니다.

Active Learning을 통한 지속적인 모델 성능 개선
Tech
2024.12.30
42dot LLM 1.3B
Tech
2024.12.30
42dot at CES 2024: Software-Defined Vehicle Technology
Tech
2024.12.30
영지식 증명과 블록체인 그리고 SDV, 모빌리티
Tech
2024.12.30
Team 42dot Wins 2nd Place in the Autonomous Driving Challenge at CVPR 2023
Tech
2024.12.30
Joint Unsupervised and Supervised Learning for Context-aware Language Identification
Publication
2024.12.30
AWS IoT Core Resource Deployment via CDK
Tech
2024.12.30
ML Data Platform for Continuous Learning
Tech
2024.12.30
속도와 보안이 강화된 OTA 업데이트
Tech
2024.12.30
Self-Supervised Surround-View Depth Estimation with Volumetric Feature Fusion
Publication
2024.12.30
42dot MCMOT(Multi-Camera Multi-Object Tracking) 챌린지
Tech
2024.12.30
42dot이 그리는 미래 모빌리티 세상
Insight
2024.12.30