Decawave사의 MDEK1001 키트를 사용하여 간단한 Indoor positioning system을 만드는 예제이다.

1. Background

해당 키트는 UWB(초광대역) 기술을 활용한 제품이라고 하는데, 자기들끼리 위치 파악을 함에 있어 UWB 기술을 사용한다는 것 같다. 제품을 구입해서 사용하는 입장이라 자세한 부분은 저도 잘 몰라요.

 

우선, 키트는 위와 같이 생겼다. 이러한 키트를 Anchor, Tag, Listener 3가지 역할로 배정하여 사용할 수 있다. 

  • Anchor: Tag의 상대적 위치를 잡기 위한 기준점
  • Tag: 위치를 알고 싶은 물체
  • Listener: Tag의 위치를 읽고 통신으로 쏴주는 역할

그림으로 나타내면 이런 느낌이다.

 

2. Setup

필자는 일단 Anchor를 4개만 설치했다. 4개보다 많이 설치하게 되면 Tag의 위치를 구할 때 최적의 Anchor를 자동적으로 4개 선택하여 계산한다고 메뉴얼에 적혀 있다. Anchor 설치 시 주의할 점은 키높이 정도에 설치해야 하며, 4개 모두 동일한 높이로 설치해야 한다는 것이다. 

 

설치가 끝나면 안드로이드 어플리케이션을 통해 초기 세팅을 해줘야 한다. www.decawave.com/product/mdek1001-deployment-kit/ 에 접속하면 안드로이드용 Apk를 다운받을 수 있다.

이런 식으로 어떤 키트가 Anchor이고 어떤 키트가 Tag인지 설정해주고 나면 

 

위와 같이 좌표가 잡히면서 설정이 완료된다.

 

3. 유니티 Setup

이제 위 설정을 바탕으로 유니티를 설정할 차례이다.

 

어플리케이션이 설정해준 Anchor들의 위치에 4개의 기둥을 세우고 Tag는 파란색 원기둥으로 만들었다.

4. 시리얼 통신

실시간으로 변하는 Tag의 위치와 유니티 상의 Tag의 위치를 동기화 하기 위해 키트 하나를 Listener로 두고 PC와 usb로 연결했다. 이 값이 어떤식으로 들어오는지 확인해보기 위해 터미널에 띄워보았다.

주의할 점은 Baud Rate를 115200으로 설정해야 한다는 것이다. baud rate는 초당 변조횟수인데, 키트가 데이터를 쏴주는 속도와 동일해야 우리가 아는 형태의 문자로 받아올 수 있어서 설정값을 지켜야 하는 것 같다.

 

값이 잘 통신되어 들어오는 것을 확인했으니 유니티로 받아올 차례이다.

 

유니티로 시리얼 통신을 하기 위해서는 다음과 같은 2가지 구조를 깔고 들어가야 한다.

 

  • 유니티는 구조적으로 단일 스레드로 모든 update함수를 돌린다.
  • C#함수는 시리얼 포트에서 데이터를 읽어올 때 pending방식을 사용하기 때문에 읽을 데이터가 존재하지 않아도 timeout이 될 때까지 기다렸다가 데이터를 읽어온다. 

위와 같은 이류로 update 함수에서 포트 데이터를 읽게 하면 timeout을 기다리면서 작업이 실행되기 때문에 정상적인 작동을 하지 않는다. 따라서 별도의 thread를 통해 통신 데이터를 가져와야 한다. 

 

데이터를 받아오는 thread를 선언하여 시리얼포트가 열리면 값을 받아오는 Recieve 메소드를 수행하도록 했다.

 

1초동안 읽어온 데이터 Log를 찍은 결과이다. 불필요한 데이터와 중복된 데이터가 있는 것을 확인할 수 있다.

 

필요한 데이터는 좌표 데이터뿐이므로 위와 같은 데이터 문자열에서 필요 없는 데이터를 제거하는 데이터 정제 작업이 필요하다.

 

약간의 노가다를 통해 문자열을 잘라서 포지션 데이터만 받을 수 있도록 메소드를 수정했다. 더불어, 약간의 예외처리도 넣어 주었다. 분명히 더 좋은 방법이 있을거라 확신한다.

 

위의 작업을 통해 원하는 데이터만 깔끔하게 추출한 것을 확인할 수 있다.

 

원하는 값을 얻었으니, 마지막으로 Tag 물체를 해당 위치로 움직여줄 차례이다.

 

물체를 이동시키는 방법은 다양하지만, 필자는 Lerp함수를 사용해서 구현했다.

  • 구입한 키트의 아쉬운 점이 높낮이 오차가 꽤나 크다는 것이다. 때문에 높이는 고정시켜서 이동하도록 했다.
  • 현실의 Tag가 가만히 있어도 받아오는 위치 데이터마다 차이가 조금 있기 때문에 10cm 정도의 여유를 줬다. 

5. 결과

야호

+ Recent posts