[2023-07-13] 1. Software Craftmanship
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로 돌아간다.
실패하는 테스트
테스트에는 기능상의 테스트가 있고 컴파일러 빌드 테스트가 있음
- 기능상의 테스트는 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
- 필요한 작업에만 집중할 수 있도록 단순 반복 작업을 자동화 해줌