사실 이번 주차에는 별로 쓸 수 있는 내용이 별로 없습니다.

이슈를 겪으며 별로 구현한 내용이 없었습니다.

카메라상의 좌표와 현실 세계의 좌표를 매핑하기 .

이것은 생각보다 어려운 난제였습니다.

1.PID 제어

화면상에서 탐지된 레이저 좌표와 객체간의 오차를 피드백으로 P,I, D gain의 최적값을 찾기 위해 노력해보았습니다.

Camera(Hanwha Vision) <-> host(Ubuntu) <-> STM32(ESP)
의 무선 통신 속에서 두 가지 문제가 있었습니다.

  1. 카메라 Delay : FHD 영상의 인코딩 및 디코딩 과정에서 발생하는 300ms 정도의 딜레이는 Gstreamer pipeline 혹은 설정 변경을 통해 줄일 수는 없었습니다. 실제로 레이저 on 이후 카메라가 탐지되어 다시금 STM으로 넘어오기까지의 시간이 평균적으로 320ms 정도 소요되었습니다.
    해당 Delay는 PID 제어에서 오차를 누적시켜 Overshoot를 일으켰습니다.
    그렇지만 overshoot를 잡기 위해 P를 낮추는 경우 실제 객체를 따라가기는 하지만 실시간으로 추적하기에는 어려움이 있었습니다 .

  2. 레이저 탐지 정확도
    카메라의 영상을 수신하여 해당 영상에서 레이저 포인트만을 정확하게 찾아내는 것 또한 한계가 있었습니다. 비교적 근거리에서는 레이저 포인터만을 분리할 수 있었습니다. HSV 색변환을 통한 색, 밝기 기반의 탐지가 가능했지만 실제 환경처럼 카메라를 세팅하고 레이저를 포인팅 하였을 때는 실제 영상에서 차지하는 픽셀이 너무 적을 뿐만 아니라 색상 정보도 기대한 값(빨강)으로 들어오지 않았습니다.

2. 카메라 캘리브레이션

인턴쉽에서 카메라 캘리브레이션을 진행해본 경험을 바탕으로 단안 거리 추정을 위한 카메라 캘리브레이션을 진행해보았습니다.

Python , OpenCV를 이용하여 직접 구현할 수도 있었겠지만 MATLAB
이용해보았습니다. 살짝 궁금하기도 했꺼든요

checkerboard를 출력하고 내부 파라미터를 측정했습니다.
그 결과 평균 오차가 0.3 이하로 비교적 수월하게 얻어낼 수 있었습니다.
(간편하게 사용할 수 있는 유용한 도구라고 느껴졌습니다. ).

이후 내부 파라미터를 가지고 외부 파라미터를 구해보았습니다.

기존에 사용했던 체커보드의 경우 사이즈가 작아져 바닥 평면에서는 체커보드로 인식되지 않아 A2크기의 체커보드를 새로 출력후 한번 실제 거리를 측정해보았습니다.

화면상의 원점 좌표가 실제 거리는 3940mm 이지만 파라미터 기반 추정 거리는 4554mm 로 측정 되었고 오차가 약 12%에 달했습니다.

상당한 좌절감 .

3. Homography 기반 좌표 추정

edge 기반 화면 매핑

point를 4개 지정후 실제 좌표 매핑 → itgeotrans 으로 Z plane 좌표 변환.

앞서 취득한 내부 파라미터를 가지고 영상을 undistort()해서 z-plane ==0 의 평면을 지정하고 이를 실제 좌표와 매칭합니다.

이는 이동하는 사람의 발(바운딩 박스 최하단)은 항상 바닥에 있다는 가정에서 시작한 접근법입니다.

실제로도 여지껏 했던 시도중 가장 적은 오차를 보였고 실제 레이저를 쏴보면서 테스트를 하려고 했습니다 .

그래서 영상 <-> 객체 <-> 레이저 제어를 통해 오차를 확인해보려던 찰나 또 한가지의 문제점을 발견했습니다 .

테스트 환경 내에 많은 책상과 모니터들로 인해 사람의 하반신이 가려지게 된다면 실제로 바운딩 박스의 크기가 제한되어 실제 발의 위치를 측정할 수 없다는 문제를 발견했습니다 .

4. 백래시

기계적 백래시

실질적으로 오차를 확인하기 위해 수동으로 제어를 하던 중 현재 사용하고 있는 서보모터에 기계적 백래시가 있다는 것을 확인했습니다.

기계 시스템에서 백래시(Backlash)란, 서로 맞물린 두 부품 사이에 존재하는 유격(遊隙), 즉 의도하지 않은 자유 운동(free play)을 말합니다. 입력이 방향을 바꿀 때, 출력이 즉각 반응하지 않고 일정 구간 동안 "헛도는" 현상이 바로 백래시입니다.

발생 원인

뭐. 클로드한테 물어보니 이런 이유가 있다고 하네요...

해당 문제가 왜 프로젝트에서 치명적인지는 실제로 값을 조정하면서 확인할 수 있었습니다.

실제로 동일한 pwm 값을 pan, tilt에 전달했을 때 매번 출력되는 각도가 달라졌습니다.

특히나 진행 중이던 방향과 반대되는 방향의 값을 주었을 때 차이는 더욱 커졌습니다 ..


피드백 및 구현 계획

위에서 언급된 이슈들을 각각 확인하다보니 성과가 없이 한 주가 지나갔습니다.
engineer의 입장에서 문제를 해결하기 위해 고민하다 보니 이렇다 할 결과가 없이 한주가 흘러가는 것이 너무나 속상하기도한 한 주였습니다..

해결 방안

  1. 좌표 변환
    z-plane = 1300 지점에서의 z 평면을 한번 Homography로 좌표를 구하고 사람이 가려지지 않는 범위 내에서 최적의 값을 찾아야합니다.
    - 발생가능한 추가적 문제
    사람마다 키와 넓이가 달라 사람의 1300 위치를 어떻게 특정할 것인가 ?
    하는 문제가 남아있습니다. 이를 해결하기 위해 탐지되는 얼굴과 상체의 비율을 통해 포인트를 찾아나갈 계획입니다.
  2. 기계적 백래시
    이는 조금 더 방안을 구체화 해봐야할 것 같습니다.

이제 어느덧 2주 조금을 남겨두고 있습니다..

빠른 시일 내에 데모 버전을 만들기 위해 21주차는 조금더 열심히 분발해보도록 하겠습니다. VEDA 파이탱~

Embedded not Easy.

항상 뒷통수를 조심할 것.

profile
세상의 어려운 문제를 해결하자

0개의 댓글