임베디드 소프트웨어_지능형 휴머노이드

Stella Kim·2022년 9월 1일
0
post-thumbnail

1. 개발 개요

1) 개발 배경 및 동기

  • 2019년 12월 중국 우한을 시작으로, 현재까지도 COVID-19는 전 세계적으로 확산이 진행 중이며, 확진자와 사망자는 계속해서 증가하고 있는 상황이다.
  • 국가별로 COVID-19에 대한 대처 방법을 강구하고 있지만, 주변 환경과 시민 의식에 따라 전염력과 확산 범위에 많은 차이가 발생하여 어려움을 겪고 있다.
  • 팬데믹이 지속되고 있는 상황에서 인명 피해를 비롯한 사회, 경제적 손실을 최소화할 수 있는 최선의 방법은 로봇을 사용하여 인간이 개입하기 힘든 분야의 일들을 대신 수행하는 것이라 여겨진다.

2) 개발 목적 및 목표

  • 로봇은 인명 피해를 최소화하기 위해서 COVID-19 확진 지역에 위치한 사람들을 상황에 맞게 안전 지역으로 대피 시킴에 중점을 둔다.
  • 미션에 따라 로봇은 정확하게 상황을 인식하고 행동하는 것을 목표로 한다.
  • 맵을 오류 없이 파악하여 로봇의 행동에 이상이 없도록 하며 모든 지역을 탐색한 후에는 확진 지역만을 정확하게 음성으로 말하는 것을 목표로 한다.

3) 기대 효과

  • 사람들을 COVID-19 확진 지역에서 안전 지역으로 대피시킴으로써, 추가적인 인명 피해를 줄일 수 있다.
  • 로봇이 해당 지역을 확진 지역이라고 정확하게 판단하고 알림으로써, 투입되는 노동 비용을 감소시킬 수 있고 동선을 최소화해 상황 악화를 방지할 수 있다.

2. 개발 방향 및 전략

1) 기술적 요구 사항
가. Template Matching

Template Matching은 Reference image에서 템플릿 영상과 매칭되는 위치를 탐색하는 방법이다. 일반적으로 Template Matching은 이동 문제는 해결할 수 있는 반면, 회전 및 스케일링된 물체의 매칭은 어려운 문제이다. Template Matching에서 영상의 밝기를 그대로 사용할 수도 있고, 에지, 코너점, 주파수 변환 등의 특징 공간으로 변환하여 템플릿 매칭을 수행할 수 있으며, 영상의 밝기 등에 덜 민감하도록 정규화 과정이 필요하다. OpenCV에서는 Template Matching을 위한 matchTemplate 함수를 제공한다. 이는 참조 영상 image에서 template을 method의 방법에 따라 계산한 결과를 반환한다. image는 8비트 또는 32비트 실수이며, template은 image에서 찾으려는 작은 영역의 템플릿으로, 자료형은 image와 같고, 크기는 image와 같거나 작아야 한다. result는 결과를 저장할 32비트 실수 행렬이다. method는 비교하는 방법을 지정한다.

나. Region Of Interest

Shape Analysis, Object Detection에서 종종 사용되는 Contour Detection을 이용하여 문자 및 화살표 영역을 검출할 수 있다. OpenCV에서는 “cv2.findContours”라는 기능을 제공하고 있으며, 인자 값에 따라 Internal 또는 External Contour로 나타낼 수 있다. 이로써 비슷한 색상의 이어지는 부분들에 대해 일종의 Boundary를 찾아내어, 정확히 도형을 구분해낼 수 있다. 이 영역에 Bounding Box를 그려 좌표를 구한 후 본 이미지에서 추출하여 문자 인식 과정의 Input으로 넣는다.

다. Hough Transform
노란색을 추출한 후 직선을 검출하여 로봇이 걷는 동작을 수행하도록 한다. 이 부분은 Hough Transform을 사용하여 각 프레임에서 Line을 찾는다. OpenCV에서는 cv2.HoughLines() , cv2.HoughLinesP() 함수를 제공하고 있다.

라. Morphology

모폴로지 연산은 팽창(dilation)과 침식(erosion)을 기본 연산으로 사용해 고급 형태학을 적용하는 변환 연산이다. 열림(opening) 연산과 닫힘(closing) 연산이 존재하며, 열림 연산의 경우 침식 연산 후 팽창 연산을 수행한다. 열림 연산은 작은 객체를 제거하고 큰 객체의 크기와 모양은 보존하고자 할 때 유용하게 사용된다. 닫힘 연산은 열림 연산과 반대로 팽창 연산 후 침식 연산을 수행하며, 영상에서 작은 구멍을 메우고 객체의 크기와 모양을 보존하고자 할 때 유용하다. 닫힘 연산은 미션 간에 방위(W, E, S, N)와 방 이름(A, B, C, D) 인식의 정확도를 높이기 위해 사용되었다.

마. HSV

HSV란 색 공간을 Hue, Saturation, Value로 구분한 상태를 말한다. 여기서 Saturation은 채도, Value는 명도를 나타내며 우리가 주목해야 하는 부분은 바로 Hue이다. HSV에서 Hue는 순수한 색 정보를 가지고 있어, 보다 쉽게 색을 분류할 수 있고, 색상을 0°~360°의 각도 형태로 구분한다. OpenCV에서는 색상에 8비트만을 할당하여 개의 색상을 표현할 수 있으므로, 각도 형태의 값을 반을 나누어 0~180으로 표현하여 사용한다.

바. Color Extraction

특정 색을 검출하기 위해서는 위에서 설명한 HSV에서 H에 대한 정보에서 Range를 두어 해당 범위 안에 있는 색상만 출력하는 방법으로 특정 색을 검출할 수 있다. 안전지역과 확진구역에서 초록 및 검정색을 검출하는 부분, 방 이름 색에서 빨강 및 파랑색을 검출하는 부분, 로봇이 동작함에 따른 노란색 선을 검출하는 부분에서 사용된다.

사. Canny
Edge 검출은 노란색 선과 화살표의 방향을 인식할 때 사용된다. 이를 위해서 주로 사용하는 Edge Detection 알고리즘인 Canny를 사용한다.

아. Perspective Transform

Affine Transform이란 Translation, Rotation, Uniform Scaling, Skew를 모두 적용한 변환이다. 보통 그림 4와 같이 원본 영상을 평행사변형으로 투영할 때 사용되는데, 왜곡된 영상을 역변환하여 복원하는데에도 적용할 수 있다. 이 역변환을 Perspective Transform이라 하며 시점을 바로 앞으로 고정하여 영상의 본래의 이미지를 얻을 수 있다.

OpenCV에서는 “cv2.getPerspectiveTransform”, “cv2.warpPerspective”과 같은 다양한 기능을 제공한다. “cv2.getPerspectiveTransform”를 이용해 변환 행렬을 계산하고, 계산한 변환행렬을 기반으로“cv2.warpPerspective”를 사용하여 Template의 형태로 영상 변환을 실시한다. 문자판의 검출 영역의 좌표들을 이용해 변환 행렬을 구하고, Template 크기는 128x128사이즈로 고정하여 변환을 한다. 따라서 로봇의 위치에 상관없이 동일한 결과를 반환할 수 있으므로 문자 인식의 성능을 높일 수 있다.

2) 개발 방법


로봇에 탑재된 라즈베리 파이를 이용해 python과 OpenCV를 기반하여 영상처리를 한다. RoboBasic으로 로봇동작을 개발하여 사용한다.

3) 개발 세부 사항

가. 시작 시 방위 인식


시작하는 위치에서 로봇의 고래를 오른쪽 아래로 위치하게 하여 문자를 인식하기 위한 준비를 한다. 문자판이 있는 위치에서 Canny를 이용해 Edge Detection을 하고, 해당 위치의 Bounding Box 좌표를 얻는다. 얻어진 좌표를 이용해 Perspective Transform Matrix를 계산하고, 이 행렬을 이용해 128x128의 그레이스케일 영상으로 변환한다. 방위 인식을 위한 템플릿은 이러한 영상의 집합체이며 검출된 문자판을 기준으로 템플릿에서 가장 유사도가 높은 영역을 찾는다. 방위는 y좌표의 범위로 구분하며, 여러 유사도 방법 중 3가지를 사용하며 3개 모두가 80%이상, 그리고 동일한 문자로 인식하면 최종 결과를 반환한다. 방위에 알맞은 소리를 내기 위해서는 직접 녹음을 한 파일의 형식을 mrs로 변환하여 저장한다. 방위가 있을 위치에서 Edge Detection 후 가장 큰 영역을 찾는다. 인식된 문자가 방위에 해당하는 문자가 아니면 한 걸음 움직인 후 다시 수행한다. 문자 인식이 완료되면 동작을 하면서 소리를 낸다.

나. 문 인식
방위 인식 후 로봇의 고개를 내리고 노란선을 따라 움직인다. 그리고 적외선 거리 센서의 AD Port 값을 70이상으로 주어 로봇과 문과의 거리가 약 17cm 이하일 시 문을 감지하고 시작할 때 알아냈던 방위 텍스트 파일을 읽어와 각 방위에 맞는 동작을 수행하고 소리를 낸다. 그리고 문을 여는 동작을 수행한다.

다. 화살표 인식

정면 벽에 있는 화살표를 Contour로 추출한다. Contour를 추출한 화살표의 좌표들을 points 변수에 저장하고 x축을 기준으로 정렬시킨다. 이 좌표의 최댓값 2개와 최솟값 2개를 이용해 화살표를 인식한다. 여기서 두 좌표의 차이가 크면 화살표의 머리 부분에 해당하고, 작으면 꼬리 부분에 해당한다. 최댓값 좌표의 차는 maximum, 최솟값 좌표의 차는 minimum으로 변수를 지정하고 만약 maximum의 값이 minimum 값보다 작으면 왼쪽 방향, maximum 값이 minimum 값보다 크면 오른쪽 방향임을 인식하고 방향에 대한 정보를 텍스트 파일에 저장한다.

라. 미션 수행 지역까지의 이동
화살표 인식 후 라인 트레이싱을 통해 로봇이 라인의 중심에 위치하도록 한 후 기울기를 정확하게 맞춘다. 이 후 미션 수행 지역 까지의 이동을 위해 화살표의 방향으로 옆으로 일정하게 이동하여 신속하고 정확하게 위치하도록 한다. 이렇게 이동하다가 노란색 마스크의 직선 형태가 나타나면 미션 지역에 위치했다는 것으로 하여 미션을 수행한다.

마. 구역 인식

[안전 지역]
고개를 돌린 상태에서 초록색 마스크를 씌워 초록색만 검출할 수 있도록 한다. 이때 픽셀의 개수가 15,000개 이상일 경우 안전 지역으로 인식한다. 마지막으로 지역에 대한 정보를 텍스트 파일에 저장한 후 “안전 지역”이라고 소리를 낸다. 빛에 의한 오류를 해결하기 위하여 검정색 픽셀의 최소 개수도 조건에 포함한다.

[확진 구역]
고개를 돌린 상태에서 검정색 마스크를 씌워 검정색만 검출할 수 있도록 한다. 이때 검정색 마스크의 픽셀이 0이 아닐 때 개수를 계산하고 픽셀의 개수가 15,000개 이상일 경우 확진 구역으로 인식한다. 마지막으로 지역에 대한 정보를 텍스트 파일에 저장한 후 “확진 구역”이라고 소리를 낸다.

바. 방 이름 및 색상 인식


방 이름의 경우 색상은 2가지(빨강, 파랑)으로 구성되고 A~D까지의 방 이름을 인식해야 한다. 이는 방위 인식과 동일하게 Template Matching을 사용한다. 모든 문자의 경우 문자판의 Edge를 검출하기 위해 Canny와 같은 기본적인 영상처리 기술을 사용하여 관심 영역을 추출한다. 이어서 문자판의 좌표 위치를 이용해 변환행렬을 계산하고 이에 따라 Perspective Transform을 하여 문자판을 올바르게 복원한다. 이 때 변환된 문자판의 크기는 128x128로 하며 그레이스케일 영상과 Template를 비교하여 문자를 인식한다. 단, 방위의 템플릿과는 다르게 조금 흐린 경향이 있어 최소의 유사도를 조금 낮게 설정한다.

색상의 경우 Resize된 컬러 영상을 기반으로 진행한다. 빨강 혹은 파랑의 마스크를 이용해 각각의 검출된 픽셀의 개수를 세고, 이를 통하여 가장 많은 개수에 해당하는 색깔로 인식한다.

사. 시민 탐색

로봇의 시야는 한정적이기 때문에 시민이 위치한 곳을 한 번에 찾기가 힘들다. 따라서 탐색을 하기 위해, 먼저 후진 걸음을 통해 시야를 넓히는 방법을 택한다. 하지만 이 방법 또한 한계가 있다. 추가적으로 고개를 좌, 우로 돌려 탐색하여 시민이 위치할 수 있는 전 영역에 기반하여 시민을 찾을 수 있다. 문자의 색상에 따른 시민을 잡아 구역에 맞는 시나리오대로 미션을 수행해야 한다. 해당 색상에 해당하는 마스크를 사용하여 해당 색상만 검출한 상태에서 바운딩 박스(left,top), (right,bottom)의 좌표를 사용한다. left와 right의 중간값을 사용하여 로봇의 좌우 위치를 판단하고, bottom의 좌표가 180 이상인 경우가 3번 이상 지속될 경우 시민을 잡는 행동을 한다.

아. 시민 이동
[안전 지역]
안전 지역은 확진 구역과는 다르게 우유갑이 위치할 수 있는 범위가 넓다는 것이다. 따라서 로봇의 시야가 좁기 때문에 우유갑을 찾지 못할 수도 있다. 따라서 로봇의 고개를 돌려 있을 수 있는 모든 영역을 탐색한다. 방 이름 색상 인식에서 검출된 색상을 기준으로 해당 색이 있는 지 고개를 돌리면서 찾는다. 고개가 좌우에 있는 경우에는 해당 방향으로 로봇이 회전하고 위치가 멀리 있는 경우 큰 걸음을 한번 실시한다. 범위 내로 들어오면 고개를 숙이고 우유갑을 잡기 위해 가까이 간 후 중심에 위치하도록 한다. 이때 우유갑의 위치를 Bounding Box의 중간값을 이용한다. 우유를 잡은 후 고개의 반대 방향으로 이동하고 초록색이 일정 개수 이상 2번 검출되면 우유갑을 놓고 반대 방향으로 되돌아온다. 고개가 중앙에 있는 경우에는 가로 픽셀을 4등분하여 위치에 따라 우유갑을 잡은 후 해당 저장한 움직임의 반대 방향으로 이동하여 중앙 위치에서 움직이도록 한다.

[확진 구역]
확진 구역은 안전 지역과는 다르게 우유갑이 위치할 수 있는 범위가 한정되어 있다. 따라서 로봇을 대각선으로 회전하여 위치한 곳에서 바라보고 색상의 위치를 인식한다. 안전 지역과는 다르게 고개를 돌리지 않고 해당 방향으로 로봇이 회전하고 위치가 멀리 있는 경우 큰 걸음을 한번 실시한다. 범위 내로 들어오면 고개를 숙이고 우유갑을 잡기 위해 가까이 간 후 중심에 위치하도록 한다. 이때 우유갑의 위치를 Bounding Box의 중간값을 이용한다. 잡은 후 후진 걸음을 실시하고 검정색 카운트의 일정 범위 아래로 들어오면 확진 영역 바깥으로 인식하고 우유갑을 놓는다.

자. 미션 수행 후 복귀
미션 수행 후 계속 진행하기 위해 가장 중요한 것은 역방향으로 이동하지 않는 것이다. 따라서 미션 수행 간에 이동한 방향을 기록한다. 큰 걸음과 작은 걸음으로 나눈 후 역방향으로 이동하여 본래의 위치로 돌아오는 방법을 택한다. 종종 걸음, 우유 위치를 위한 좌우 걸음의 경우 1, 우유갑을 들고 좌우 이동하는 경우 3, 큰 걸음의 경우 4로 설정하여 방향에 따른 리스트에 값을 더하여 저장해둔다. 복귀시에는 상황에 맞게 큰 걸음을 높은 우선순위로 하여 걸음을 나누어 복귀한다. 단, 중간의 위치에서 우유갑을 찾은 경우 좌우를 이동하지 않는다. 복귀 후 지나온 라인을 기준으로 기울기를 10이상으로 하여 중심을 맞춘다. 단, 확진 구역의 경우 우유갑을 잡는 동작부터 포함된다.

차. 라인 트레이싱
[전진]
로봇이 촬영한 영상에서 노란색만 검출하도록 마스킹을 한다. 이후에 허프 변환을 통해 직선을 찾는데, 이 경우에는 한 영상에 대해 무수히 많은 직선을 검출하게 된다. 본 개발에서는 검출된 직선에 대하여 y값이 가장 큰 (화면의 아래와 가장 가까운) 직선 하나에 대하여 로봇의 위치를 판정한다. 노란색 선 검출을 위하여 일정 범위를 두어 노란색을 검출한 뒤, Hough Transform을 사용하여 선을 찾는다. 검출된 선 중 로봇과 가장 가까운 좌표에서 x값이 카메라의 오른쪽 부분에 있다면 로봇을 오른쪽으로 한 걸음 이동하고, 왼쪽에 있다면 왼쪽으로 한 걸음 이동한다. 중앙 부근에 있다면 앞으로 이동한다.

[회전]
검출된 직선에 대하여 기울기를 사용하여 회전을 판정한다. 검출된 직선의 경우 y=ax + b의 그래프 형식으로 나타낼 수 있고 a는 해당 직선의 기울기(1차 미분값)에 해당된다. 허프 변환을 사용하여 검출한 직선의 경우 시작점(x1, y1)과 종착점(x2, y2)의 두 좌표값을 알 수 있는데 즉 (y2-y1)/(x2-x1)으로 a값을 알아낼 수 있다.

4) 기타 세부 사항

가. 파일 입출력
미션 수행 시나리오를 살펴보면 화살표에 따라 좌측, 우측으로 로봇동작이 상이하게 구성되며, 최종 맵을 탈출 하였을 때 확진 구역인 방의 이름을 음성적 기능을 통해 출력해야 한다. 다중파일 프로그래밍을 하게 되면 프로그램이 실행 중일 때, 메모리에 저장을 하여도 해당 프로그램이 종료되면 메모리가 초기화되는 단점이 있다. 따라서 본 개발에서는 화살표 인식 및 확진 구역 방 이름 발언에 대한 내용을 파일 입출력을 통하여 해결하였다. 예를 들어 확진 구역인 구역이 A, C였다면 A와 C를 ./data/result.txt에 저장을 한 후 모든 미션을 완료한 후 ./data/result.txt만을 읽어 저장된 문자를 말하는 식으로 할 수 있다. 또한 화살표 방향에 관한 ./data/arrow.txt에 ‘left’ 혹은 ‘right’를 저장 후 다음 파일에서 읽었을 때 해당 방향으로만 이동하도록 할 수 있다.

나. 멀티 스레드 및 Frame Buffer
로봇 동작이 수행중일 때에는 영상처리의 동작을 멈추어야 한다. 그렇지 않으면 동작 수행간의 다른 순차적인 코드에 의해 조건이 통과되어 정상적인 동작을 할 수가 없다. 따라서 본 개발에서는 시리얼 통신의 read 부분을 Receiving이라는 함수와 영상처리를 담당하는 loop함수를 멀티 스레드로 동작하게 하여, 동시적인 작동을 가능하게 하였다. 또한 이전의 Frame을 기준으로 영상처리가 되는 방법을 해결하기 위하여 선언한 FPS를 0.5, 0.33, 0.05 등으로 변환하는 기능을 개발하였다.

3. 개발 중 장애요인과 해결방안

1) 문자 및 화살표를 잘못 인식한 경우

[문자]
개발 계획 과정에서는 Tesseract를 이용해 OCR을 기반으로 문자 인식을 하려 했으나 시간이 많이 소요되고 인식률이 좋지 않았다. 문자 인식이 고정된 위치에서 한다는 가정하에 Template Matching에 기초한 방법으로 변경하여 해결하였다. 비교하기 위한 Template을 여러 장으로 구성하여 인식의 정확도를 높였다.

[화살표]
화살표는 머리 부분이 영역에 위치하면 쉽게 인식이 되지만 그렇지 못한 경우에 대해서 인식률이 매우 낮았다. 따라서 인식률 향상을 위해 로봇의 위치를 좀 더 뒤로 이동하여 이를 해결하였다.

2) 색상을 잘못 검출한 경우

미션 수행 간에 색상 인식에는 문자 및 시민(빨강,파랑), 지역(초록, 검정), 라인(노랑)으로 크게 총 5가지 색을 구분해야 한다. 색상 인식의 오류는 대부분은 빛의 세기에 따라 다르게 인식되는 색상 때문이었다. 따라서 HSV로 변환했을 때에 설정한 색의 범위를 수정하여 색상 인식의 정확도를 향상시켰다.

profile
취업 준비 용으로 사용했던 기술 블로그입니다. 이제는 업로드 거의 안 할지도..

0개의 댓글