Software Craftmanship

우리가 SLAM 시스템을 직접 만든다면?

  • 필요한 것

    • 하드웨어

    • 카메라 드라이버

    • 영상처리 라이브러리

    • 선형대수 라이브러리

    • 수치최적화 라이브러리

    • 시각화 라이브러리

  • 대략적인 과정

    • 카메라가 1대면 1개의 input data stream을 뚫어주면 되고 여러대라면 여러대의 input data stream을 뚫음

    • SLAM 알고리즘이 동작하는 동안 실시간으로 카메라의 데이터를 받기 위해 카메라 이미지를 grap 해서 가져오는데 이 떄 thread를 하나를 파서 공유자원인 이미지 큐로 보내주는 작업을 진행함

    • 카메라 센서 데이터를 받아서 영상처리 라이브러리를 적용할 수 있는 이미지 객체 형태로 바꿔야 함

    • 컬러 이미지를 흑백 이미지로 바꾸고 카메라 캘리브레이션 값을 이용해서 이미지를 Undistortion하고 노이즈를 제거하여 깔끔한 이미지를 만듬

    • 이미지에서 Local Feature을 뽑고 Feature Descriptor을 뽑음

  • 이와 같은 작업들을 병렬적으로 돌려야 짧은 시간에 끝낼 수 있음
    • 하나의 파이프라인을 가져가든, 여러개를 가져가든 결정해서 구현해야 함
  • 여러가지(다양한) 상황에 따라 시나리오 별로 준비해야 함
  • 사용되는 알고리즘들 마다 취약점이 있을텐데, 그에 맞는 예외 처리를 해야 함

SLAM은 굉장히 많은 알고리즘들이 돌아가는 큰 시스템 (SLAM 알고리즘은 따로 없음)

따라서 모든 SLAM 엔지니어는 SLAM 시스템을 만들게 됨

  • 영상처리 알고리즘, 추치 최적화 알고리즘, 로보틱스 등 사용하는 분야에 대한 깊은 역량 필요
  • 동시에 안정성이 높으면서, 분석이 가능하고 유지보수가 쉬운 소프트웨어를 개발할 수 있는 능력이 필요

SLAM 시스템을 만들기 위한 소프트웨어 엔지니어링 테크닉

TDD

  • Test Driven Development / Test Driven Design / 테스트 주도 개발
  • 개발을 하기 전에 테스트를 먼저 만드는 것
    • 구현을 다 하고 나서 테스트하는 방법과는 굉장히 다름
  • 좋은 소프트웨어 디자인과 안정성을 확보하게 해줌
  • 참고 사이트 : https://www.cv-learn.com/20220221-tdd/?highlight=test+dri
TDD Cycle
  1. 실패하는 테스트를 작성한다.
  2. 그 테스트가 패스할 수 있는 ‘최소한의 코드‘를 작성한다
  3. 리팩토링한다
  4. 원하는 기능을 다 만들었으면 끝낸다. 그게 아니라면 1로 돌아간다.

img

실패하는 테스트

테스트에는 기능상의 테스트가 있고 컴파일러 빌드 테스트가 있음

  • 기능상의 테스트는 GTest나 Catch2와 같은 프레임워크를 통해서 기능을 확인하는 테스트
  • 컴파일러 빌드 테스트는 컴파일러가 코드를 빌드할 수 있어야 빌드 가능한 코드임을 증명하는 테스트
테스트가 패스할 수 있는 최소한의 코드

테스트를 패스할 수 있는 최소한의 코드만 작성한다면 1. 빠르게, 2. 테스트가 요구하는 기능을 충족할 수 있음

  • 기능 개발에서 가장 중요한 부분에 집중할 수 있게 문제를 단순하게 만들어 줌
  • 아키텍쳐, Exception, 호환성 같은 것들이 중요하지 않다는 것이 아님
    • 이러한 점은 다음 스텝에서 고쳐짐
리팩토링

이전 단계에서 기능 개발은 끝났으니 클린 코드를 만들 단계

  • 가독성을 높이고 아키텍처를 고려
  • 이전 단계에서 작성한 테스트가 깨지지 않는 선에서 코드를 개선
  • TDD의 이점 중 하나는 테스트하기 쉬운 코드를 유도하는 것인데 이를 통해 기능의 모듈화나 인터페이스 분리와 같은 점들을 빠르게 고려해서 짜게 됨
    • 테스트 하기 어려운 코드는 아무래도 좋은 디자인을 가지지 않기 때문에 고치게 됨
종합
  • 개발을 할 때 test는 implementation test로써 개발의 진척도를 나타내는 지표가 됨
  • 개발이 완료되었을 때는 regression test로써 코드의 안정성을 나타내는 지표가 됨

  • TDD를 할 때 리팩토링 단계를 거침으로 써 테스트 하기 쉬운 코드를 짜야한다는 디자인 압박을 받게되는데 이 압박을 통해 테스트 하기 좋은 코드를 작성하게 되고 사용하기 쉬운 코드를 짜게 됨

  • TDD를 통해서 개발하면 항상 100% Coverage를 달성할 수 있음
  • Unit test를 넘어 그 다음 단계의 test들을 고려할 수 있게 됨

Profiler

  • SLAM에서는 C++을 주로 사용하는데 C++ 코드를 얼마나 잘 짜고 있는지 척도를 알려주는 기능
    • C++ 이 빠르고 CPU 사이클을 최소화하기 위해 사용

Logger

  • 여러 Thread를 동시에 돌리면 Debugging을 할 때 Breaking Point를 찍기 상당히 어려워지는데 이 때 사용하는 MultiThread Logging 시스템

CI/CD

  • 필요한 작업에만 집중할 수 있도록 단순 반복 작업을 자동화 해줌