원격 자동차 제어 시스템

Posted by Lee Yunjin on May 09, 2025 · 4 mins read

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로 요소를 버리는 구현으로 대체하였으나 메트릭 측정은 아직 하지 못했습니다(충분한 엣지 서버 역시 존재하지 않는 것이 문제입니다).