Kubernetes와 TCP를 이용한 저지연 실시간 자동차 제어
1. 소개
이 시스템은 원격에서 자동차를 제어할 수 있는 환경을 제공합니다. 이 프로젝트는 진성근 교수님의 실험실에서 나온 발췌입니다.
이 저장소에는 reader.sh를 비롯한 쉘로만 동작하는 초기 프로토타입 스크립트 몇 개를 제외하면 (reader.sh, car_controllser.sh, writer.sh, pod_car_run.sh와 같은 것) 쉘 스크립트, yaml, Go, C 모두 본인이 작성한 코드만 있으며, 타인의 코드는 포함되어 있지 않습니다. 전체 초기 파일은 깃허브에서 직접 작성자를 확인해야 하나 일부를 정리하자면
- reader.sh
- car_controller.sh
- pod_mk_tun.sh
- pod_car_run.sh
- writer.sh
프로젝트의 다른 일부에서 기여했던 구성원들이 있으나, 대부분의 자료는 유실된 상태입니다.
프론트엔드 및 상위 관리 구조는 김경빈, Abduolimov Alisherbek(@alisherfw) 가 맡았습니다.
구조 설계는 주로 김경빈이 담당했으며, 세부 아이디어는 저를 비롯하여, Abduolimov Alisherbek, Akhmad Kholmurodov가 기여했습니다. (예: 디바이스 드라이버 구조, TCP 흐름도, 통합 관리 아이디어 등)
기본적으로 모든 소스는 본인이 직접 구현했으며, 아이디어는 실험실 구성원 전체의 것입니다.
역할 정리:
- 메인 구조: 김경빈, 진성근
- TCP 흐름도: 이윤진, 김경빈, 진성근
- Kubernetes 배포 구조: 진성근
- 세부 K8S 구조: 이윤진
- 디바이스 드라이버 구조 세부 구현: 이윤진
- 내부 소프트웨어 구현: 이윤진, 진성근, 김경빈
- 프론트엔드 구현: 김경빈, Abduolimov Alisherbek, Akhmad Kholmurodov
- 소프트웨어 통합: 이윤진, Akhmad Kholmurodov, Abduolimov Alisherbek
기본 네트워크 구조
- 물리 자동차가 장치 상태를 송신
- 가상 자동차가 해당 정보를 받아 시뮬레이션 실행
- 시뮬레이션 결과를 물리 자동차에 전달
- 물리 자동차는 해당 결과를 실행
디바이스 드라이버 구현
- 모터 드라이버: IOCTL을 통한 I2C 드라이버 사용
- 터널 디바이스 드라이버: 이중 연결 리스트 기반
- 기타 장치: 일반적인 GPIO 문자 디바이스
프로젝트 트리 구조
.
├── driver-real-car
│ └── driver
├── config
│ └── k8s-deploy
├── exec
│ ├── cluster_pod_man
│ └── k8s_car_man
├── pod
│ ├── driver
│ └── tunnel
└── car
├── common
├── controller
├── driver
├── real-car
├── runner
├── sonic
├── tunnel
├── virt-carcon
└── virt-cartun
디렉토리 설명
config
Kubernetes Pod 배포 설정 파일
car
자동차의 디바이스 드라이버 및 제어 프로그램
- common: 공통 헤더 파일
- controller: 긴급 수동 제어용 Go 언어 및 쉘 스크립트
- driver: 실제 하드웨어 디바이스용 리눅스 디바이스 드라이버
- real-car: 정보 중계용 Go 및 쉘 스크립트
- runner: 간단한 회피 알고리즘을 갖춘 가상 자동차 애플리케이션
- sonic: 초음파 테스트용 드라이버
- virt-carcon: 가상 자동차 컨테이너에서 실행되는 제어 스크립트
- virt-cartun: 가상 터널 트리거 스크립트
- tunnel: 터널링 디바이스 드라이버
driver-real-car
물리 자동차 디바이스 드라이버 초기 설계 및 터널링 정보 송수신용 스크립트
exec
자동차 제어용 쉘 스크립트. 대부분 초기 프로토타입임.
car/controller
shelljs로 호출되던 실제 실행 타겟들이 위치함.
pod
이 프로젝트의 초기 및 추상적 구조 설계
실험 당시의 구조
-
실험 당시의 구조는, 드래그 앤 드롭으로 주행 방향 계산 어플리케이션의 실행 위지를 엣지 서버, 혹은 클러스터에 등록된 물리 자동차 기기로 지연 없이 옮기는 것이었습니다.
-
자동차 혹은 엣지 서버를 실행하기 위한 칸으로 드래그 앤 드롭을 하면, car/controller에 위치한 적절한 타겟 스크립트를 shelljs에서 호출, html 웹에서 가상, 물리 자동차의 로그 파일을 읽어서 보여 주는 형태의 웹서버였습니다.
-
실험 당시, Edge Server를 초기에는 AMD64 컴퓨터로 하였으나 네이티브 아키텍처를 서로 일치시켜 불필요한 Endianness 변환을 피하기 위해 라즈베리 파이 클러스터를 사용하였고, 실험 말기에는 M! 맥북에 AsahiLinux Kernel + Pearl Bootloader + Pearl 부트로더 Repo에 같이 첨부된 Debian 이미지로 진행하였습니다.
-
Tunnel Buffer의 최적화가 충분하지 않아 Sawtooth Pattern이 일부 관찰되었으며, 후속 과제가 확실하게 저지연 통신을 보장하는 것이었습니다.
-
후속 과제로 제대로 이어지지 못한 채 실험이 종료되어 지금 올리는 프로토타입 정도가 남았고, 당시 적절한 요소 제거가 정의되지 않은 배열 기반의 고정 크기 버퍼를 사용하였으나 그 코드는 유실되어 현재는 Linked List 기반으로 요소 삽입 공간이 부족할 때 FIFO로 요소를 버리는 구현으로 대체하였으나 메트릭 측정은 아직 하지 못했습니다(충분한 엣지 서버 역시 존재하지 않는 것이 문제입니다).