임베디드소프트웨어공모대전 수상작



지식경제부 주최, 한국정보산업연합회 임베디드소프트웨어산업협의회 한국소프트웨어진흥원 주관의 제 6회 임베디드소프트웨어 공모대전이 지난해 5월14일부터 10월28일까지 대장정을 마쳤다. 이 공모대전의 대상에는 이니셜에프팀(Initial.F, 조선대학교 최성은 외 3명)의 '야생동물 보호관리 시스템' 작품이 선정됐다. 이 외에 금상에는 '지능형 휴머노이드' 등 2팀이, 은상에는 'URC 서비스' 등 2개 팀이 선정됐다. 본지는 이들 팀과 '지능형 자동차' 등 기업과제상을 받은 4개 팀의 작품을 연속 게재한다. 다양한 분야의 아이디어가 기업의 비즈니스 활용에 도움이 되길 바란다.

글 : 반바지 팀(임태현 외 5명)
자료제공 : 임베디드소프트웨어산업협의회
www.kesic.or.kr

연재 순서

1. 야생동물 보호관리시스템
2. Smobi(Smart Mobile)
3. 지능형 휴머노이드
4. 소리위치 추적 및 시각화 시스템
5. IRA(Interaction of Augmented Reality)

6. URC Service
7. Breath Control
8. SRLFS&RNFTL
9. ULM(Ubiquitous Library Manager)
10. COMS 이미지 센서와 I.R.을 이용한 터치스크린
11. Emotional MP3 player

소프트웨어 전체 요약

모듈별 기능 1 - 영상인식

쪾 이진화
- 그레이 영상에서 단일 값에 의한 이진화는 영상의 배경과 물체를 분할할 수 있는 가장 간단한 방법이다. 이 방법은 영상에서 물체 혹은 배경을 구성하는 픽셀들 값이 서로 비슷하다는 점을 이용한다. 영역 분할에 대한 수학적인 해석을 위해 그레이 영상 R을 유한개의 영역으로 완전 분할한다고 가정하여 영상 R은 분할된 영역을 나타내는 부분영상 R1, …, RS에 의해 수식 1의 식과 같이 나타낼 수 있다.

                S
R = ∪Ri, Ri∪Ri = φ, i ≠ j                           (수식 1)
               i=1
- 입력 영상 f(x,y)를 임계값을 사용하여 영상 분할하여 출력영상 g(x,y)를 수식 2와 같이 얻을 수 있다.

               1, f(x,y) ≤ T
g(x,y) = { 0, f(x,y) > T             (수식 2)

수식 2에서 T는 임계값을 의미하여, 출력 영상 g(x,y)에서 픽셀의 값이 1인 부분은 영상에서 물체로, 0인 부분은 영상의 배경으로 구분될 수 있으며, 경우에 따라서는 1인 부분이 배경, 0인 부분이 물체로 나타낼 수 있다.

- 임계값이 너무 낮거나 너무 높으면 영상의 훼손으로 인하여 처리할 수 없는 경우가 생길 수 있다.

그림 3에서 (b), (c), (d)는 각각 다른 값으로 원본영상 (a)를 이진화한 영상이다. (b)의 경우에는 영상에 적절한 값으로 이진화하여 선명한 영상이 나왔지만 임계값이 너무 낮은 (c)와 너무 높은 (d)는 왜곡된 영상이 나왔음을 알 수 있다.
- 임계값을 구할 때에는 배경과 물체 사이의 값을 사용해야 제대로 배경과 물체가 분할된 영상을 얻을 수 있다.

그림 4의 히스토그램을 보면 알 수 있듯이 물체와 배경이 존재하는 시각적 공간을 서로 다르기 때문에 물체와 배경 사이를 알아내는 것이 중요하다.
- 실제 로봇 영상

쪾 가우시안 필터
- 가우시안 필터는 일명 정규분포라고 불리는 가우스분포(그림 6)를 사용하는 저역 통과 필터이다.
- 가우시안 필터를 함수로 나타내면 수식 3과 같은 식으로 구성된다.
                    x²
                  -  契契
f(x) = e    2σ²                                                                           (수식 3)
- σ는 가우시안 곡선의 표준편차로 σ값이 클수록 곡선의 평탄도가 낮고 작을수록 뾰족한 특성을 가진다. 뾰족한 특성을 지닌 필터, 즉 더 좁은 주파수 영역 필터는 저주파를 더욱 감쇠시켜 평활화를 증가시키는 결과를 초래한다. 공간영역에서 이것은 더 넓은 필터, 즉 더 큰 마스크를 의미한다(그림 7).
- 가우시안 필터의 장점은 σ값에 따라 정도를 조절할 수 있고, 빠르다는 점이다.
- 그림 8을 보면 왼쪽과 오른쪽의 분포는 σ값에 따른 분포의 변화를 보여주고, 가운데는 가우시안이 두 번 적용되었을 경우의 분포를 보여주고 있다.

쪾 외곽선 추출
- 이진화를 통하여 영역분할을 한 이미지에서 실제 물체의 영역을 구하기 위하여 외곽선을추출하였다.
- 픽셀 값을 기준으로 주변의 8픽셀을 검색하여 연결성을 확인한다.
- 실제 로봇 영상
모듈별 기능 2 - 신경망 알고리즘
쪾 신경망 라이브러리 선택
- FANN(Fastest Artificial Neural Network)
FANN은 신경망을 쉽게 접할 수 있게 만들어 준다. 실제 나와 있는 모든 신경망의 알고리즘을 선택해서 사용할 수 있게 만들어져 있으며 학습률, 학습 오차 및 뉴런들의 가중치에 대해 상세한 조작이 가능하다. 사용자 편의성도 뛰어나 실제 학습 후에는 단순히 학습시킨 신경망 네트워크 파일을 불러와서 RUN 함수를 실행하는 것만으로 간단하게 신경망을 사용할 수 있다.

쪾 신경망 알고리즘 선택
- 신경망은 크게 퍼셉트론, 역전파망, 코호넨 자가구성지도가 있다. 우리가 사용한 FANN은 역전파망, 즉 Back propagation을 사용한다. 역전파망은 1969년 MIT의 민스키(Marvin Minsky)와 수학자 페퍼트(Seymour Papert)가 퍼셉트론의 한계를 지적하면서 나타났다. 역전파망은 여러 개의 중간계층으로 이루어진 은닉 계층을 가진다. 초기 시냅스에 무작위 가중치를 할당하고 학습 데이터 집합을 적용해 실제 출력과 기대 출력 값을 비교하면서 가중치를 조절하여 정확할 때까지 반복 학습을 진행시킨다.

쪾 신경망 데이터 크기 결정
- 신경망의 속도를 위해서는 신경망에 쓰이는 뉴런의 개수가 가장 중요하다. 실제 뉴런의 개수에 따라 신경망의 크기는 지수적으로 증가한다. 신경망 알고리즘에 대한 전북대의 논문을 보면 신경망에 24×24의 영상을 입력시켰을 경우 영상의 정확도는 높아지지만 실제로 정확한 인식을 하기 위해 필요한 뉴런의 크기가 많아지게 된다. 따라서 우선 뉴런의 개수에 따라 신경망 네트워크의 크기가 어느 정도인지를 확인하기 위해 여러 가지 뉴런의 크기로 신경망을 훈련시켰다. 실제 훈련시킨 신경망의 네트워크 크기는 표 3과 같다.
테스트 결과에서 볼 수 있듯이 신경망의 실행속도(표 4)는 네트워크의 크기와 비례하게 증가한다. 뉴런의 개수가 늘어날수록 학습이 쉬워지고 인식률이 증가하나 임베디드 보드라는 특수한 환경을 생각해 실제 영상의 입력 크기는 16×16의 크기로 정하고 인식률에 지장이 크게 없는 16개의 뉴런을 사용하였다.

쪾 학습 데이터 선정
- 영상처리에서 카메라를 이용하여 숫자와 문자들에 대한 사진을 찍은 후 각각의 숫자와 문자들을 16×16 크기의 이진배열의 비트 패턴으로 변환하여 이것을 모두 모아 샘플 통합 프로그램을 이용하여 하나의 파일로 작성한다(그림 18).

- 비트 패턴으로 저장된 각각의 숫자와 문자들에 대하여 그에 해당하는 목적코드를 정하여 목적 코드를 생성하는 프로그램을 이용하여 목적코드를 삽입하여 준다. 동시에 목적코드와 결합된 각각의 숫자와 문자들의 비트패턴 정보를 모두 하나의 파일에 작성하여 신경망 훈련이 가능한 데이터로 만들어준다(그림 19).

쪾 신경망 훈련
- 만들어진 숫자와 문자의 데이터를 이용하여 신경망을 훈련시킨다.
- 훈련을 위한 총 데이터의 개수는 14800개이며, 이 데이터를 이용하여 여러 가지 방법으로 세팅하여 훈련시킨다. 최종적으로 결정된 세팅은 다음과 같다.

* Input Node의 개수 = 256 ( 16×16 )
* Output Node의 개수 = 44 ( 원하는 목적코드의 총 개수 )
* Layer의 총 개수 = 4
* 첫 번째 Hidden Layer의 개수 = 100
* 두 번째 Hidden Layer의 개수 = 80
* Learning_Momentum = 0.9
* Min_Weight = -0.1
* Max_Weight = 0.1
* Learning_Rate = 0.2

- 같은 데이터들을 모아서 선형적으로 학습시키면 글자 각각에 대한 학습이 되지 않는 현상이 나타나 모든 학습데이터를 랜덤으로 섞고 그 데이터를 기반으로 학습을 시켰다(그림 20).

쪾 훈련 데이터 테스트
- 훈련이 끝난 신경망 파일을 가지고 어느 정도의 인식률을 가지고 있는지를 확인해 주는 프로그램을 따로 만들었다. 실제 테스트에 쓰는 시간을 줄이고 정확성을 높이기 위한 자동화의 결과로 30,000개가 넘는 데이터를 대상으로 테스트를 실시해도 시간의 낭비가 많지 않았다. 테스트 프로그램은 문자를 신경망에 삽입하여 첫 번째 확률로 어느 문자가 나오는지 비교한다. 실제 데이터와 신경망이 인식한 데이터의 결과가 같은지에 대해 판단하고 전체 문자에 대한 오차율을 합산하여 계산해준다. 그리고 잘못 인식한 문자가 있다면 원래 문자를 어떤 문자로 인식했는지에 대한 결과도 나타내준다.
- 그림 21은 테스트 프로그램의 예이며 정면에서 찍은 사진 3564개의 데이터(문자 당 99개의 데이터를 사용 )에 대하여 100%의 인식률을 보여준다. 잘못 인식된 문자가 없기 때문에 그에 대한 결과는 보여주지 않고 있다.
- 그림 22는 테스트 프로그램의 예이며 왼쪽에서 찍은 사진 3579개의 데이터에 대한 인식률과 어떤 문자를 잘못 인식 했는지에 대한 결과를 보여주고 있다.

모듈별 기능 3 - 미로탐색 알고리즘
쪾 방향파악
구역과 구역사이 구역번호의 차이는 남쪽에서 북쪽으로 이동할 때에는 4가 증가하고 반대방향은 4가 감소, 서에서 동으로 이동할 때에는 1이 증가하고, 동에서 서로 이동할 때에는 1만큼 감소한다. 따라서 처음출발구역의 번호와 한 칸 이동하여 로봇이 서있는 구역의 차를 계산하면 지금 로봇이 서있는 곳은 어디이며, 어느 방향으로 이동하고 있는지 알 수 있다.
방향인식은 int형 변수 direction과 turn을 선언하고, definition을 사용하여, NORTH: 0, WEST: 1, SOUTH: 2, EAST: 3으로 지정하고, 로봇이 출발지점에서 한 칸 이동한 구역의 번호와 출발지점의 구역번호와의 차가 +4라면 direction 변수에 NORTH를 대입하고, 차가 -4이라면 SOUTH를, +1라면 EAST를, -1라면 WEST를 대입한다(표 5).
그리고 한 구역 이동할 때마다 「direction = (direction + turn) % 4;」를 실행한다. turn 변수의 값은 지금 로봇이 이동하려는 방향에 따라, 직진은 0, 좌회전은 1, U턴은 2, 우회전은 3이다.

쪾 구역번호 파악
로봇의 다음 구역번호는 로봇이
북으로 가면 「현재구역번호 = 이전구역번호 + 4」
남으로 가면 「현재구역번호 = 이전구역번호 - 4」
동으로 가면 「현재구역번호 = 이전구역번호 + 1」
서로 가면   「현재구역번호 = 이전구역번호 - 1」
를 대입한다.

쪾 동작 계산
다음에 해야 할 행동을 알아내기 위해서는 현재 방향과 다음의 방향을 대입해 그 방향 사이의 차이를 알아낸다(표 6).
이때 nextbehavior값은 표 7과 같은 값을 가지며 만약 다음 방향에서 현재방향을 뺀 값이 0보다 작을 시에는 4를 더해줘 정확한 값이 나오게 한다.
쪾 최단 거리 이동
최단 거리를 이동할 때는 알고리즘 클래스의 ShortestPath( ) 함수를 이용해 원하는 현재 위치와 원하는 목적지를 입력하면 Path[ ]와 movement[ ]에 최단 경로 및 최단경로까지 가는데 행해야할 동작들이 세팅 된다. 세팅된 정보를 이용해 원하는 목적지로 찾아간다.
쪾 미로 탐색 방법
기본적인 확장 좌수 법을 약간 변형한 방법을 이용하였다. 좌, 우, 정면의 순서대로 맵을 탐색해 나가다가 만약 탐색했던 구역에 다시 도착했을 경우에는 가지 않았던 갈림길이 존재하는 구역으로 최단 거리 탐색을 통해 움직인다. 이때 좌, 우, 정면의 순서는 맵의 종류에 따라 다르게 정의 할 수 있다.
쪾 미로탐색 알고리즘 최적화
미로탐색 알고리즘의 최적화를 위하여 가장 처음 선택한 방법은 알고리즘을 선택하는 것이다. 각각 알고리즘에 따라 좌, 앞, 우의 우선순위가 섞여있어 미로에 따라 가장 적합한 알고리즘을 선택하는 것이다. 한 번의 주행으로 모든 미로를 지날 수 있는 방법인 확장 좌수법을 차용하여 확장 우선순위법이라 부른다.
그리고 두 번째 선택한 방법으로 확장 좌수법의 단점으로 많은 구역을 탐색한다는 점인데 이 점을 해결하기 위하여 다익스트라 알고리즘과 병행하여 해결하였다. 로봇을 확장 우선순위법에 따라 이동시키지만 결과적으로 로봇이 가상으로 이동하고 이동한 구역에 모르는 벽이나 표지판이 존재할 때 그 구역번호를 리턴하여 다익스트라로 그 구역까지의 최단거리를 구한다. 그리고 그 구역으로 최단 거리로 이동하는 방법이다. 이 방법을 사용하면 막힌 구역의 경우 직접 진입하지 않아도 가상으로 이동했을 때 막혔다는 것을 알 수 있으므로(여기에는 카메라의 벽인식, 적외선의 장거리 벽인식이 포함된다.) 진입하여 돌아오는 시간을 아낄 수 있다. 또한 3거리의 경우에도 확장 우선순위법에 의해서 맵을 가상으로 돈 후 가야하는 구역을 리턴하므로 그 구역까지의 거리를 다익스트라 알고리즘으로 최단거리 이동하게 된다.
또한 미리 알고 있는 벽에 대해서는 적외선 벽 정보를 미리 입력하여 적외선 측정자세를 취하지 않고도 벽의 거리를 판단할 수 있도록 한다. 그렇게 함으로써 측정자세를 취하기 위해 멈추는 시간을 아낄 수 있다.

모듈별 기능 4 - 최단거리 알고리즘
쪾 최단거리 파악
기본적으로 인접 행렬을 이용해서 최단 거리를 계산하며 인접 행렬의 초기 값은 0xff( No_Search )로 설정이 되어 있다. GraphSetting( ) 함수를 통해 로봇이 주행을 통해 저장한 맵데이터를 인접행렬인 Cost[ ]로 바꿔준다. ShortestPath( ) 알고리즘에서는 GraphSetting( )을 통해 변환된 Cost[ ]의 정보(Open_Edge 0x01 Tunnel_Edge 0x10 Blocked_Edge 0xffff) 등을 활용해 인접한 블록을 찾고 그 블록까지 이동하는데 드는 delay를 비교해 최단경로를 찾는데 활용한다.
계산된 결과는 path배열에 저장하고 그에 따른 이동 동작은 Movement 배열에 저장하여  RobotBrain에서 자유롭게 이용할 수 있도록 공개한다. 이러한 계산 결과로 실제 알고리즘 클래스는 RobotBrain의 탐색 과정을 통해 얻은 맵 데이터를 토대로 그 시점에서의 최단거리를 동작의 delay에 따라 구할 수 있게 된다. 또한 미인식벽을 포함한 맵 일지라도 가상의 판단을 통해 (Virtual_Opened, Virtual_Blocked)최단거리를 구한다. GraphSetting( )의 호출시 미인식벽을 막거나 열어서 상황에 따른 cost값의 세팅을 통해 최단경로를 구하는데 Virtual_Opened로 설정된 cost의 경우에는 미인식벽을 강제로 열어버림으로써 가상의 최단경로를 구하고 그 경로에 따라 이동하면서 갱신되는 맵의 데이터를 활용해 그 시점에서의 최단경로를 계속 구하는 방식이다. Virtual_Blocked로 설정된 cost는 cost를 세팅하는 시점에서 미인식벽을 강제로 막아버리면서 현재 인식한 벽의 정보만 활용해 최단경로를 구할 수 있다.

모듈별 기능 5 - 동작보정 알고리즘
2족 보행 로봇은 자동차 등과 같은 기계에 비해 정확한 방향의 직진 보행을 보장 받기가 상대적으로 어렵다. 바닥 재질과 발바닥 재질의 영향, 걸어 다닐 때 로봇이 휘청거리는 정도, 배터리의 잔량, 바닥의 흠집이나, 벽 등을 긁으면서 전진할 때 생기는 오차들, 영점 조절 부정확 등으로 인한 틀어짐 현상 등 많은 변수들로 인해 같은 걸음동작으로도 약간의 오차를 보인다. 따라서 매 일정 걸음걸이마다 보정이 필요하게 된다.

쪾 측면 적외선 값의 변화량 분석
로봇을 직진으로 움직인다고 하더라도 위의 작은 요인들이 모이면 약간 방향이 틀어 질 수 있게 된다. 직진 이동전의 적외선 값을 측정한 후 일정거리를 이동한 후의 적외선 값과 비교를 통해 로봇의 틀어짐 정도를 알 수 있다.
쪾 로봇의 전진 각도 측정
(n개의 적외선 값 추출시간동안의 적외선 값의 변화량÷n×[cm ·적외선 상수])의 값을 arc tangent 값을 취하면 현제 전진방향이 벽과 어느 정도 틀어져 있는지 각도로 얻어낼 수 있다. 이때, 오른쪽 벽과 왼쪽 벽 중에서 더 가까운 쪽의 벽을 이용하여 측정해서 오차를 줄이고 한쪽 벽이 없는 곳이라면, 존재하는 벽면을 이용하여 측정한다. 양쪽 벽이 트인 구역에서는 사진을 찍어서 그 사진과의 각도를 직선으로 맞춘 후 전진하여 일단 블록에 진입을 목표로 한다. 그 후 존재하는 벽을 통해 각도를 보정할 수 있다.
쪾 중복되는 적외선 값의 필터링
로봇의 적외선 값이 겹치는 구간이 존재하기 때문에 정상적인 측정으로는 벽과의 거리를 판단해 낼 수 없다. 현재 구역의 벽과 2블록 먼 곳의 벽의 측정값이 겹치는 등의 현상으로 인해 인접 벽의 유무 판단을 할 수 없기 때문에 팔을 구부리는 동작을 통해 현재구역의 블록 인지 아닌지를 판단 할 수 있다. 먼 블록의 경우 팔을 구부렸을 때도 무한대의 값이 나오지만 가까운 벽의 경우는 팔을 구부려서 측정해도 값이 들어오기 때문에 그 방법을 통해 벽을 체크를 한 후 체크된 벽의 정보를 전제로 한 후 벽과의 거리를 측정할 수 있다.
쪾 카메라 데이터를 통한 각도 보정
로봇이 카메라로 촬영한 표지판의 데이터를 통해 틀어진 각도를 계산해 낼 수 있다.이 방법은 사진이 찍힌 상을 절대각도로 나누어서 표지판의 중점이 사진에서 어느 위치에 존재하는지를 판단하고 로봇이 어느 방향으로 몇 도 정도 틀어야 하는지를 계산해서 실제 로봇이 그 방향으로 틀어서 정면을 바라보도록 해 준다.
쪾 초 근접거리 보정
로봇과 벽과의 거리가 5cm 미만일 경우 값이 급격히 뛰는 현상을 가지고 추출되는 적외선의 범위가 분석이 불가능 하도록 넓기 때문에 스레드(thread)를 사용하여 적외선 값을 분석해 로봇과 벽의 거리가 5cm 미만으로 판단 될 경우 flag를 켜서 가까운 벽에서부터 멀어질 수 있도록 하였다.
쪾 제자리에서의 각도보정
로봇이 이미 틀어진 상태에서 사진촬영을 시작할 경우 시야각 내에 표지판이 나오지 않을 수 있다. 최대한 제자리에서 빠른 시간 안에 틀어진 각도의 보정을 위해 앞뒤로 5cm씩의 이동을 통해 좌우 벽의 적외선 값을 추출, 비교해 틀어진 각도를 빠른 간에 보정할 수 있도록 하였다.

모듈별 기능 6 - 적외선 센서제어
쪾 적외선측정의 정확도 향상
99번의 적외선측정 후 측정된 값을 버블 정렬하여 가운데 값을 배열에 저장한다. 이 작업을 9번 반복하여 배열에 저장된 9개의 수를 정렬하여 가운데 값을 최종적으로 선택한다.
쪾 적외선의 상수 값을 이용하여 센티미터로 변환
적외선의 보정된 값을 이용하여, 센티미터 단위로 변환하는 시트를 이용하여 센티미터 값으로 변환하여 동작보정 및 알고리즘파트로 값을 전달한다.

모듈별 기능 7 - 동작제어
쪾 영점(Zero Point) 조절
1) 목표
- 로봇의 조립에서 발생되는 오차를 최소화 하여 로봇동작의 정확성과 안정성을 향상시킨다.
2) 기술적 사항
- 다관절 로봇을 조립하면, 아주 정밀하게 조립 위치를 맞출 수 없다. 즉, 조립하는 데 약간씩의 위치 오차가 발생하는데, 이러한 오차가 누적되면 로봇의 끝부분에서는 큰 오차가 발생하여, 기존의 동작 프로그램이 제대로 수행되지 못하고 로봇이 균형을 잃게 된다. 그러므로 로봇 조립 후 , 로봇의 기준자세를 이용하여 좀 더 정밀하게 로봇의 위치 오차를 보정하는 과정을 거치게 되며, 이런 과정을 영점 설정(Zero Setting) 이라고 한다.
- 로보노바는 접촉식 가변저항을 사용하기 때문에 각 중심에 대한 미세한 차이가 있고 기구적인 작은 편차의 누적으로 인한 좌우 위치가 똑같지 않기 때문에 조립 후 영점설정을 해야 한다. 로보노바를 운영하면서 영점의 미세한 변화가 있을 수 있기 때문에 가끔 다시 영점을 잡아 주어야 한다(그림 23).
- 로보베이직을 이용해 로보노바의 영점설정을 할 수 있다.

쪾 로봇 동작 프로그래밍
1) 목표
- 로봇의 동작을 제작하고 메인 프로그램과 연동하여 로봇을 동작시킨다.
2) 기술적 사항
- 로봇의 움직임을 프로그래밍하기위해선 로보베이직이란 툴을 사용하는데 로보베이직은 일반적인 베이직 언어에 로봇을 동작하는데 필요한 명령어가 추가된 로봇 제어 전용의 베이직 언어로, ㈜미니로봇에서 개발하여 등록한 소프트웨어이다.
- 다관절 로봇을 구동시키기 위해서는 사용자가 원하는 동작을 만들어야 할 필요가 있다. 로봇의 모터는 총 16개이며, 이 각각의 모터를 제어하여 하나의 동작을 만들어 내기 위해 로보베이직(그림 24)을 사용한다.

프로그램 사용법
개발환경(언어, 툴, 사용시스템)
프로그램 설명(파일 구성, 함수별 기능, 주요 함수의 흐름도)
개발 단계별 기간 및 투입 인원수
기타(개발기술, 특기사항 등의 설명)
위의 소프트웨어 개발환경, 프로그램 설명, 개발 단계별 기간 및 투입 인원수 및 기타(개발기술, 특기사항 등의 설명)에 관한 자세한 내용은 임베디드 월드 웹페이지(http://embeddednews.co.kr)의 자료실에서 찾아볼 수 있습니다.

응용 분야

쪾 재해지원
- 적외선 센서를 이용하여 위치를 파악하고 입구까지 최단경로를 지정하는 능력을 이용하면 재해발생시 인명구조 등에 사용될 수 있을 것으로 생각된다. 글자를 인식하는 영상처리부분을 변형 및 개선하고 기타 열 감지 센서 등을 추가 장착한다면 인명의 위치파악과 탈출할 수 있는 경로를 탐색하여 나올 수 있을 것이다.
쪾 물류관리
- 구역을 파악하는 능력을 이용하여 물류센터에서 재고관리에 사용할 수 있을 것이다. 물류에 장착된 바코드 등 식별코드를 분석하여 정해진 구역에 보관하고, 반대로 구역에 보관되어 있는 재고를 꺼내는 것도 가능할 것으로 생각된다.
쪾 위험물 제거
- 지뢰나 폭발물 같은 위험물질 등을 제거할 때 사람이 직접 접근하기보다 로봇을 이용하여 접근, 제거하는 방법을 이용하여 안전한 제거가 가능하다.
쪾 안내
- 구역을 인지할 수 있는 능력과 영상처리 능력을 사용하여 박물관 등의 공공시설 안내 등 안내시스템이나 도우미등의 역할을 해줄 수 있을 것으로 기대된다.
쪾 탐사
- 탐사를 위하여 사람은 우주, 혹은 깊은 대양과 같이 위험으로 가득한 곳에 흥미를 느낀다. 그래서 사람들은 로봇을 만들어 자신을 대신해 보내고, 로봇은 정보를 모으고, 그리고 그들의 오퍼레이터에게 그것을 돌려보낸다.

 

 분야 part 개발내용
 1 영상인식 디바이스 드라이버로 인하여 제한되어있는 카메라 성능을 원래 스펙상의 성능으로 끌어올리기 위하여 디바이스 드라이버를 손보았고 신경망 알고리즘인 FANN을 사용하여 최적의 속도와 정확도를 고려하여 영상 인식을 처리하였다.
 2 로봇동작 로봇의 움직임을 제어하는 부분으로 기존에 제공되는 동작과 인터넷, 직접 제작한 동작을 사용하여 구현 되어 있다.
 3 IrDA 적외선 센서는 생각보다 떨어지는 성능과 각도에 따라 차이가 생길 수 있는 상황에 가장 큰 문제가 되었다. 터널 및 바닥의 흰색에도 반응하여 가장 힘들게 구현한 핵심전략 중 하나이다.
 4 RobotBrain 모든 미로 찾기의 핵심으로 Algorithm 클래스를 상속하여 미로 찾기 알고리즘을 가지고 있다. 필요 행동을 로봇동작과 주고 받는다.
 5 MapManage 맵 정보를 저장하여 맵에 대한 데이터 처리용 함수들이 존재한다.
 6 버튼 로봇에게 알고리즘 선택, 시작방향 선택의 명령을 내린다.

 

Camera
-original_image:Cxlmage*
-copy_image:Cxlmage*
-board_image:Cxlmage*
-Character_image:Cxlmage*
-picture:BVTE[]

+Maplnit():void
+PostMarking():void
+PostBeingMarking():void
+WallMarking():void
+VistedMarking():void
+GoingMarking():void
+MapPrint():void
+MapIsUnaware():bool
+MapIsBlocked():bool
+ZoneAllowCheck():bool
-isTunnel():bool
-isVisted():bool
-blockTransform():void

 

Algorithm
-algorithm_number:Byte
-priority1:Ubyte
-priority2:Ubyte -priority3:Ubyte
-top:Int
-found:bool[]
-distance:Int[]
-prev:Int[]
-cost:Int[][]
-path:Int[]
-movement:Int[]

+ShortestPath():void
+GraphSetting():void
-setPath():void
-setMovement():void
-savePath():Byte
-nextBehavior():Int
-nextDirection():Int
-calculateDalay():Int
choose():Int
+EnhancedPriority():Ubyte
-printSelectPriority():void
-getDirectionWeight():Int
+VisitedOpended():bool
+NoVisitedOpend():bool

 

Algorithm
-algorithm_number:Byte
-priority1:Ubyte
-priority2:Ubyte -priority3:Ubyte
-top:Int
-found:bool[]
-distance:Int[]
-prev:Int[]
-cost:Int[][]
-path:Int[]
-movement:Int[]

+ShortestPath():void
+GraphSetting():void
-setPath():void
-setMovement():void
-savePath():Byte
-nextBehavior():Int
-nextDirection():Int
-calculateDalay():Int
choose():Int
+EnhancedPriority():Ubyte
-printSelectPriority():void
-getDirectionWeight():Int
+VisitedOpended():bool
+NoVisitedOpend():bool

 

Robotbrain
-direction:Byte
-Position:Byte
-turn:Byte
-camera:Camera
-robotmovement:RobotMovement
-mossion_code:MossionCode[]
-mapmanage:MapManage
-next_count:Byte
-post:Post
-irda:IrDa
-next_wall:Unit
-print_map:char[][]

+GetAdc():Adc*
+Firststart():void
+SecondStart():void
setPriority():void
-missionCodeInput():void
-setStartDirection():void
-searchZone():void
-nextPosition():Byte
-isCodeCount():void
-isBeingCode():bool
-isCodeZoneNumber():Byte
-thisZoneOK():bool
-warningPosition():bool
-nextWallMode():Unit
-setCameraData():void
-setCameraOpenWall():void
-setAdcData():void
-setTunnelData():void
-setThinkVisited():void
+Move():bool
-goRobot():void
-goTunnel():bool
-gotoSecondStartPoint():void
+Picture():Int
-takePicture():void
-moveForwardAllow():bool
-setMissionCode():void
-adcTwist():void -currentWall():void -helpAdc():void
+MapPrint():void
+DisplayMapSetting():void
-adcCapture():bool

 

 

RobotMovement
-serial_fd:Int
-old_termission:struct termios

+SimpleCapture:bool
+MoveForward:bool
+Move:bool
+Tune:bool
-moveDelay:bool
+CorrectAngle:bool
+CorrectSideDistance:bool
+CorrectFrontDistance:bool
+CorrectBackstep:bool
+SideStep:bool
+Getdc:Adc*

 

Adc
-mutex:pthread_mutex_t
-old-irda:IrDA
-adc_fd::Int
-left_buf:Int[
-right_buf:Int[]
-left:Int[]
-right:Int[]
-left_under:boo
-front_under:bool
-right_under:bool

+ALOG():void
+Alog():void
+GetMode():void
+Correction():void
-blockDistance()Int
-bubbleSort():void
-convert():void
-inInfinity():void
-whatLeftCM():Int
-whatFrontCM():Int
-whatRightCM():Int

 

 

Button
-algorithm_number:Byte
-button_fd:Int

+StartButton():Byte
-openButton():void
-closeButton():void
-readButton():Byte

 

 

 분류 소분류                                                                      기 능
  미로탐색  - 방향파악
  알고리즘 로봇이 움직이는 방향을 알 수 있도록 로봇의 나침반 역할을 해준다. 로봇이 구역을 이동할 때마다 구역번호의 차이를 이용하여 로봇의 방향을 구한다.
   - 구역번호 파악
   로봇이 위치하고 있는 구역의 번호를 파악하여 알려준다.
   - 동작 예측
   다음에 해야 할 동작을 알아내기 위해 로봇의 현재 방향과 다음에 향할 방향을 대입해 그 방향의 차이를 알아낸다.
   - 최단 거리 이동
   알고리즘 클래스가 구해준 최단거리를 따라 경로를 이동한다.
   - 미로 탐색 방법
   기본적인 확장 좌수법을 변형하여 맵의 구성에 따라 다른 방식으로 미로를 탐색한다. 가상으로 로봇을 이동시켜 그 구역이 모르는 정보가 존재할 때 그 구역으로 이동시킨다. 그 구역에 도착하여 다시 얻어진 정보를 이용하여 다시 가상으로 이동시킨다.
  최단거리  - 최단거리 파악
  알고리즘 미로를 탐색하면서 얻어낸 정보를 기반으로 다이스트라 알고리즘을 이용하여 최단거리를 파악한다.
 알고리즘 동작보정 - 측면 적외선 값의 변화량 분석
  알고리즘 적외선 센서로부터 받아온 좌측 우측 센티미터 값을 리스트에 저장하여 값이 변화하는 양을 분석한다.
   - 로봇의 전진 각도 측정
   변화량을 분석한 값을 각도(x°)로 환산하여 로봇이 현재 어느 정도의 각도로 틀어져서 진행하는지를 측정한다.
   - 12cm와 무한거리의 필터링
   팔을 접는 측정자세가 존재하여 바닥으로 적외선을 쏘아 무한거리를 나오게 한다. 그러나 그 값이 12cm와 겹치기 때문에 일반적으로 측정했을 때 같은 무한거리가 나온다면 근거리 벽으로 판단하여 cm로 거리를 환산한다.
   - 경계구역 통과 직전 각도보정
   틀어진 정도를 분석한 정보를 바탕으로 틀어진 방향과 반대방향으로 틀어진 각도만큼 턴하여 전진방향을 보정한다.
   - 구역 경계선 통과 시점 측정
   좌측 또는 우측 센서를 이용하여 측면 벽이 뚫려있다는 신호를 받은 시점에서 구역경계를 초기화한다.
   - 구역 중앙까지 이동 거리 계산
   구역 경계 통과 시점을 확인한 후에 다음 구역 중심부까지 가는 거리를 계산하여 다음 구역 중심부까지 가는 거리를 계산하고 이동한다.
   - 구역 중심부 도착 후 각도 보정
   도착 지점까지 적외선 값 변화량을 분석 후에  틀어진 방향과 반대방향으로 틀어진 각도만큼 턴하여 다시 한 번 전진방향 보정
   - 각 방향센서를 이용하여 벽과의 거리 측정
   각 벽면과 로봇과의 거리를 판단하여 너무 가깝지 않은지 판단하여 구역 중심으로 이동한다.
 영상처리 영상인식 - 촬영
   카메라를 이용하여 영상을 얻어낸다. 영상을 얻어낼 때 고해상도 이미지와 저해상도 이미지를 선택할 수 있다. 고해상도 이미지를 사용할 경우 정확도는 높아지지만 속도가 저해되고, 저해상도 이미지를 사용할 경우 정확도는 떨어지지만 속도를 향상시킬 수 있다.
   -가우시안 필터
   카메라를 이용하여 얻은 영상에는 잡음이 포함되어 있고 거칠기 때문에 영상처리하기에 맞지 않는다. 이러한 영상에서 잡음을 제거해주고 거친 영상을 부드럽게 만들어준다.
   - 히스토그램 스트레칭
   히스토그램 스트레칭은 낮은 명암대비 영상의 명암 값 분포의 히스토그램을 펼쳐 보다 넓은 영역으로 명암분포를 갖게 함으로써 표지판과 문자 사이의 낮은 명암차이를 보완해준다.
   - 자동이진화
   로봇이 돌아다닐 미로에는 그림자나 조명으로 인해 광량이 어느 정도 될지 알기 힘들다. 이러한 경우를 대비하여 카메라에서 얻은 영상의 픽셀 값들의 분산을 분석하여 자동으로 최적화된 임계값을 구해줌으로써 이러한 위험을 회피한다.
   - 수동이진화
   자동이진화는 컴퓨터가 자동으로 최적화된 임계값을 알려주는 대신 연산이 많아 속도저하가 일어난다. 영상에 적용할 임계값을 이미 알고
   있는 경우 이런 자동화 단계를 건너뛰고 수동으로 이진화하는 것이 속도향상에 도움이 된다.
   - 외곽선 추출
   우리는 표지판의 위치를 알아내고 표지판에서 글자를 추출하는데 외곽선 추출을 이용하였다. 외곽선 추출이 용이하도록 가우시안 필터를 이용하여 전처리 해주었다.
  신경망 -이미지를 문자로 변환
   알고리즘 영상인식에서 규격대로 잘라준 문자영상을 신경망 알고리즘을 통하여 문자로 변환해준다.
 H/W제어 동작제어 - MR-C3024와의 통신
   EV2440에서 실행되는 프로그램에서 요청하는 동작을 MR-C3024로 전송하고 그 결과를 받아온다.
   - 동작판단
   로봇이 넘어졌을 때 정보를 동작보정 알고리즘에게 알려주어 알고리즘이 로봇의 상태를 파악할 수 있도록 한다.
   - 시작 발의 선택
   로봇이 정확히 직진으로 움직이기 힘들기 때문에 시작하는 발을 선택하여 방향성을 조절하였다.
   - 오차보정 동작
   동작발생시 발생하는 오차를 보정하기 위해 동작보정 알고리즘이 명령하는 동작을 수행하여 오차를 수정한다.
  적외선 - 적외선 센서 값 측정
  센서제어 적외선 센서에서 추출되는 정수 값을 저장한다. 만약 적외선을 두 방향 이상을 번갈아가며 사용하는 경우에는 적외선 값의 버퍼가 밀리는 문제가 발생하므로, 다음 방향의 값을 현재 방향의 값으로 읽어 온다.
   - 적외선 값을 방향별로 큐에 저장하여 정렬 후 추출
   적외선 값으로 가끔씩 쓰레기 값이 들어오는 문제점을 해결하기 위한 첫 번째 단계로 필터링의 방법으로 일정한 크기의 큐에 각방향의 적외선 값 99개를 리스트로 저장한다.
   두 번째 단계로 큐의 리스트를 복사한 후에 리스트를 버블 정렬하여, 리스트의 가운데 부분의 값을 추출하여 배열에 넣는다. 이 작업을 9번하여 배열에 9개의 값이 들어가면 그것을 다시 정렬하여 가운데 값을 추출하여 사용한다.
   - 적외선의 상수 값을 이용하여 센티미터로 변환
   적외선의 보정된 값을 이용하여, 센티미터로 변환하는 시트를 이용하여 센티미터 값으로 변환하여 동작보정 및 알고리즘파트로 값을 전달한다.

 

 뉴런 개수 신경망 네트워크 파일 크기E2
 16 173251  Kbytes
 32 333972  Kbytes
 64 656624  Kbytes
 128 1301582 Kbytes

 

 뉴런 개수 신경망의 실행 속도
 16 0.034 sec
 32 0.070 sec
 64 0.150 sec
 128 0.300 sec

 

 구역번호 direction value
 현재구역번호 + 4 NORTH 0
 현재구역번호 - 4 SOUTH 2
 현재구역번호 + 1 EAST 3
 현재구역번호 - 1 WEST 1

 

nextbehavior=nextdirection-(direction);
if(nextbehavior<0)
{
nextbehavior+=4;
}

 

 방향 tune 값
 직진 0 
 좌회전 1 
 U턴 2 
 우회전  3

 

제7회 임베디드SW공모대전 개막
총 상금 규모 늘어나, 6월1일까지 제안서 제출 … 본사 후원

지식경제부가 주최하고 정보산업연합회 등이 주관하는 '제7회 임베디드SW 공모대전'이 4월 21일 대회 공고를 시작했다.
올해 대회는 대학(원)생 및 일반인 대상의 일반 부문(7개 과제), 전국 초·중·고등학생이 참여하는 주니어 부문(3개 과제)과 외국인을 대상으로 신설되는 국제 부문(1개 과제) 등 총 3개 부문 11개 과제로 진행한다.
특히 국제 부문은 해외 참가자 유치로 국제적 행사의 대회 이미지 제고에 기여하고 우수 해외 참가 작품으로 선진국의 연구 개발 동향을 파악하는 등 임베디드SW 글로벌 경쟁력 강화에 도움이 될 것으로 보이며 또 대회 로고를 개발·등록해 세계 시장에 알림으로써 향후 전 세계인들과 기량을 겨루는 임베디드SW 관련 국제전문대회로 도약할 수 있는 발판의 계기가 될 것으로 보인다.
우수 임베디드SW 인력의 참여를 유도하기 위해 지난해보다 상금 1000만원이 늘어난 일반 부문 대상(지식경제부장관상) 2000만원을 비롯해 54개 수상팀에게 총 상금 1억여원 및 8500만원 상당의 부상을 마련했다. 개발 장비를 지원하는 일반 부문 일부와 주니어 부문(초등부, 중등부, 고등부) 응모자는 6월 1일까지 제안서를 온라인으로 접수해야 한다. 월간 임베디드월드는 이번 공모대전의 후원사 중 한곳으로 참여한다.
회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지