이번 캡스톤디자인 프로젝트에서 사용된 프레임워크인 opencv가 해당 프로젝트에서 어떤 역할을 하는지 그리고 어떤 문제점이 있었는지 적으려고 합니다.
이번 프로젝트에서 OPENCV의 역할

이번 프로젝트에서는 OPENCV를 중심으로 모든 알고리즘과 동작이 돌아가게 되어있습니다.

기본 설정
천장에 휴대폰 거치대를 부착한 뒤, 거치대에 카메라를 설치 후 카메라 아래 지점에 트랙을 설치합니다.
휴대폰 카메라가 촬영하는 화면은 IP WEBCAM 앱을 통하여 휴대폰과 같은 와이파이에 접속하여 있는 노트북과 화면을 공유하며, cap 코드에 화면 공유 아이피를 작성하여 코드를 실행하였을 때 휴대폰이 촬영하는 화면을 통해 opencv를 이용할 수 있도록 합니다.
OPENCV (좌표 관련)
우선 OPENCV 프레임워크 사용을 할 때 언어를, python을 이용하였으며,
python에는 포인터라는 개념이 없기에 좌표계라는 개념을 넣기 위해선 numpy라는 프레임워크를 이용하여 좌표계를 생성하여야 했습니다.
numpy의 경우 촬영되는 화면에 눈에 보이지 않는 행렬을 깔아 XY 좌표계를 만들어내는 방식으로 사용하였으며
해상도, 카메라의 높이 등 모든 것을 계산하여야 더 정확하게 좌표계가 깔리고 동작 또한 정확하게 이뤄질 수 있습니다.
좌표를 통한 이동의 경우
카메라가 촬영하고 화면에 클릭하게 될 경우 클릭한 위치가 출발점에 대한 XY 좌표가 저장되며, 이후 한 번 더 클릭하게 될 경우 도착점에 대한 XY 좌표가 저장되며 이후 나중에 설명하게 될 A* 알고리즘에 전달됩니다.

클릭하게 되면 이런식으로 터미널에 뜨게 됩니다. (밑에 mjpeg는 그래픽을 받아오는 데에 있어 랙이 걸려 생긴 오류임)
OPENCV (색깔 관련)
해당 프로젝트에서는 초록색, 파란색, 노란색을 인식하도록 하였습니다.
파란색은 차량의 현재 위치를 표현
파란색과 초록색은 차량의 기울어진 각도를 표현
노란색은 장애물을 표현합니다.
이 데이터들은 모두 A* 알고리즘과 Pure Pursuit 알고리즘에 전송되는 데이터로 최단 경로와 제어에서 중요하게 이용되며

수정 전 사진이긴 하나,
C는 차량의 현재 위치,
Angle은 차량이 기울어진 정도를 의미하고 있으며
둘은 특정 지점에 대한 값과 두 지점 사이의 값으로 하나의 값만 나오면 되지만
노란색의 경우 위의 사진과 같이 장애물이 길기 때문에 노란색이 감지된 좌표를 배열에 넣어 데이터로 전송하는 방식을 택하였으며
노란색을 인식할 때 opencv에서 제공하는 무게 중심점을 찾는 코드 이용해 무게 중심점을 찾은 뒤
해당 지점으로부터의 보정을 넣는 방식으로 기존에 좌푯값을 다 배열에 넣는 것보다 더 정확하게 인식할 방법을 이용하여 동작하였습니다.

노란색을 인식하고 추가로 보정 값을 넣은 사진
보정을 넣지 않을 경우 차량이 최단 경로를 찾기에 노란색에 붙어가기 때문에 선을 밟는 문제점이 생겨 추가로 보정을 넣었습니다..

파란색과 초록색이 이어진 하얀 선이 각도를 측정하는 선이며
하얀 선에 연결된 파란색 점은 현재 위치
하얀 선이 연결되어 있지 않은 파란 점은 출발점을 찍은 것이며
큰 빨간 점은 도착점을 찍었으며,
중간에 빨간 점들은 추후 설명하게 될 A* 알고리즘입니다.
프로젝트 진행 중 OPENCV로 인해 힘들었던 점
1. 인간에게 쉬운 것은 컴퓨터에게 어렵고 반대로 인간에게 어려운 것은 컴퓨터에게 쉽다
인간은 색을 인식할 때 일반적으로 힘들어하지 않는데 컴퓨터는 조명 하나에도 인식이 잘 안될 수도 있다.
사실 처음에는 차량 위에 스티커를 붙여 색을 인식하려고 하였으나
스티커 겉에 코팅이 기본적으로 있기 때문에 코팅 면에 의해 빛이 반사되며 색을 인식하는 데에 있어 어려움이 발생하였고 또한 빛이 반사되면서 빛 번짐으로 인해 아무것도 없는 위치에 파란색이 인식되는 등 오류가 발생하였다.

이런 식으로 물체가 빛을 반사하여 빛 번짐이 발생하여 색이 없는 곳을 인식해 버리는 문제가 발생한다.
2. 높이
아파트 15층에서 밖에 있는 사람을 보는 것과 아파트 2층에서 밖에 있는 사람을 볼 때 크기가 다른 것처럼
이 프로젝트에서도 카메라를 설치하고 차량을 트랙에 둔 다음 높이를 잰 다음 그것에 맞게 코드를 수정해야 동작한다.
그렇지 않으면 도착점이라고 찍은 위치보다 더 움직이거나 덜 움직이게 되어 정확한 제어가 이뤄지지 않기에
높이를 직접 측정하여 계산한 다음 그 값을 코드에 작성해야 한다는 어려움이 존재합니다.
아마 다음 내용은 A* 알고리즘으로 올 것 같습니다.
A* 알고리즘부턴 제가 한 파트가 아니라서 정확한 글은 조금 어렵습니다 ;;
'프로젝트 > 캡스톤디자인(졸업작품)' 카테고리의 다른 글
[캡스톤디자인] 동작 방식 - 2 (도망치는 건 부끄럽지만 도움이 된다) (1) | 2024.04.12 |
---|---|
[캡스톤디자인] 재료 - 1 (0) | 2024.04.12 |
[캡스톤디자인] 프롤로그 - 0 (1) | 2024.04.12 |