O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

오픈소스로 쉽게 따라해보는 Unreal과 IoT 연계 및 개발 방법 소개.pdf

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
오픈소스로 쉽게 따라해보는
Unreal(언리얼)과 IoT 연계 및 개발 방법 소개
저자 – 강태욱
laputa99999@gmail.com
2023.2.1
Revion history
날짜 버전 내용 작성자
2021.7.2 0.1 초안 강태욱
2021.7.6 0.5 초안. 리비전. Node.js, Light control etc. 강태욱
2021.7.8 0.6 초안. 강태욱...
Table of Contents
머리말 1
1. IoT 란 2
2. 센서란 2
3. Arduino 기반 IoT 데이터 취득 방법 4
3.1 아두이노와 전자 부품 5
3.2 아두이노 개발환경 준비 8
3.3 아두이노 예제...
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Carregando em…3
×

Confira estes a seguir

1 de 35 Anúncio

오픈소스로 쉽게 따라해보는 Unreal과 IoT 연계 및 개발 방법 소개.pdf

Baixar para ler offline

이 소품은 메타버스 구현이란 제목으로 출판하려했던 내용 중 일부입니다. 2021년에 시작했었는 데, 함께 하기로 한 분들이 너무 바쁜 상황이라, 거의 2년 이상 묵혀둔 내용이 되어 버렸습니다.
이 내용을 필요한 분들도 있을 듯하여 eBook으로 정리해 공유합니다. 일부 URL은 너무 오래되어, 최대한 확인해 갱신하였습니다. 이 책은 메타버스나 디지털트윈을 언리얼과 같은 게임엔진으로 개발할 때, IoT와 어떻게 연결해야 하는 지에 대한 기본적인 방법을 다루고 있습니다. 이런 목적에서 내용은 복잡한 부분은 최대한 제거하고, 목적에만 충실히 구현하였습니다.
참고로, 여기에 사용된 언리얼 버전은 Unreal 4입니다(설치 링크 - https://unreal-engine.en.uptodown.com/windows). 그럼에도 이 글에서 사용된 기술은 계속 유지관리되고 있으니 활용 가능하시리라 생각합니다.
언리얼 게임엔진 기반 외부 센서 연결 및 데이터 교환 방법
아두이노 사용방법
간단한 Node.js 서버 개발
IoT 기반 디지털 트윈 및 메타버스 구현
오픈소스 및 하드웨어 사용법
사례 소개

이 소품에 설명된 코드는 아래 링크에서 다운로드 받을 수 있습니다.

링크 - https://github.com/mac999/UnrealSensingCube

몇몇 개발 화면 캡쳐 이미지 화질이 나쁘나 소스를 참고해 보시면 도움이 되실 겁니다.

이 소품은 메타버스 구현이란 제목으로 출판하려했던 내용 중 일부입니다. 2021년에 시작했었는 데, 함께 하기로 한 분들이 너무 바쁜 상황이라, 거의 2년 이상 묵혀둔 내용이 되어 버렸습니다.
이 내용을 필요한 분들도 있을 듯하여 eBook으로 정리해 공유합니다. 일부 URL은 너무 오래되어, 최대한 확인해 갱신하였습니다. 이 책은 메타버스나 디지털트윈을 언리얼과 같은 게임엔진으로 개발할 때, IoT와 어떻게 연결해야 하는 지에 대한 기본적인 방법을 다루고 있습니다. 이런 목적에서 내용은 복잡한 부분은 최대한 제거하고, 목적에만 충실히 구현하였습니다.
참고로, 여기에 사용된 언리얼 버전은 Unreal 4입니다(설치 링크 - https://unreal-engine.en.uptodown.com/windows). 그럼에도 이 글에서 사용된 기술은 계속 유지관리되고 있으니 활용 가능하시리라 생각합니다.
언리얼 게임엔진 기반 외부 센서 연결 및 데이터 교환 방법
아두이노 사용방법
간단한 Node.js 서버 개발
IoT 기반 디지털 트윈 및 메타버스 구현
오픈소스 및 하드웨어 사용법
사례 소개

이 소품에 설명된 코드는 아래 링크에서 다운로드 받을 수 있습니다.

링크 - https://github.com/mac999/UnrealSensingCube

몇몇 개발 화면 캡쳐 이미지 화질이 나쁘나 소스를 참고해 보시면 도움이 되실 겁니다.

Anúncio
Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Semelhante a 오픈소스로 쉽게 따라해보는 Unreal과 IoT 연계 및 개발 방법 소개.pdf (20)

Anúncio

Mais de Tae wook kang (20)

Mais recentes (20)

Anúncio

오픈소스로 쉽게 따라해보는 Unreal과 IoT 연계 및 개발 방법 소개.pdf

  1. 1. 오픈소스로 쉽게 따라해보는 Unreal(언리얼)과 IoT 연계 및 개발 방법 소개 저자 – 강태욱 laputa99999@gmail.com 2023.2.1
  2. 2. Revion history 날짜 버전 내용 작성자 2021.7.2 0.1 초안 강태욱 2021.7.6 0.5 초안. 리비전. Node.js, Light control etc. 강태욱 2021.7.8 0.6 초안. 강태욱 2021.7.16 0.7 내용 추가 강태욱 2021.7.17 0.8 따라하기 형식으로 1 차 변경. 강태욱 2023.2.1 1.0 오픈 북으로 공개 위해 내용 정리. 강태욱
  3. 3. Table of Contents 머리말 1 1. IoT 란 2 2. 센서란 2 3. Arduino 기반 IoT 데이터 취득 방법 4 3.1 아두이노와 전자 부품 5 3.2 아두이노 개발환경 준비 8 3.3 아두이노 예제 실행 9 3.4 센서 데이터 취득 예제 개발 12 4. 언리얼 기반 IoT 데이터 연결 및 가시화 15 4.1 RS232 기반 센서 장치와 언리얼 연결 15 4.2 Node.js 인터넷 서버 기반 센서 장치와 언리얼 연결 23 5. 마무리 32
  4. 4. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 1 of 35 머리말 이 소품은 메타버스 구현이란 제목으로 출판하려했던 내용 중 일부입니다. 2021 년에 시작했었는 데, 함께 하기로 한 분들이 너무 바쁜 상황이라, 거의 2 년 이상 묵혀둔 내용이 되어 버렸습니다. 이 내용을 필요한 분들도 있을 듯하여 eBook으로 정리해 공유합니다. 일부 URL은 너무 오래되어, 최대한 확인해 갱신하였습니다. 이 책은 메타버스나 디지털트윈을 언리얼과 같은 게임엔진으로 개발할 때, IoT와 어떻게 연결해야 하는 지에 대한 기본적인 방법을 다루고 있습니다. 이런 목적에서 내용은 복잡한 부분은 최대한 제거하고, 목적에만 충실히 구현하였습니다. 참고로, 여기에 사용된 언리얼 버전은 Unreal 4 입니다(설치 링크 - https://unreal- engine.en.uptodown.com/windows). 그럼에도 이 글에서 사용된 기술은 계속 유지관리되고 있으니 활용 가능하시리라 생각합니다.  언리얼 게임엔진 기반 외부 센서 연결 및 데이터 교환 방법  아두이노 사용방법  간단한 Node.js 서버 개발  IoT 기반 디지털 트윈 및 메타버스 구현  오픈소스 및 하드웨어 사용법  사례 소개 이 소품에 설명된 코드는 아래 링크에서 다운로드 받을 수 있습니다. 링크 - https://github.com/mac999/UnrealSensingCube 몇몇 개발 화면 캡쳐 이미지 화질이 나쁘나 소스를 참고해 보시면 도움이 되실 겁니다. 아래 라이선스로 관련 내용을 재활용할 수 있으니 참고하시길 바랍니다. CC BY-NC
  5. 5. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 2 of 35 1. IoT 란 최근 IoT (Internet of Things) 기술이 다양한 분야에 많은 영향을 주기 시작했다. IoT 이전에는 특정 벤더사에 종속된 센서 네트워크를 통해, 데이터를 취득하여, 처리했으며, 인터넷에 연결된 디바이스로, 이런 데이터를 모니터링하기 위해서는 별도의 개발이 필요했다. IoT는 인터넷에 연결되어 동작되는 장치들을 통칭한다. 이 장치들은 인터넷에 연결된 다른 장치나 서버들과 데이터를 교환할 수 있다. 언리얼이 물리적 환경과 반응하기 위해서는 환경을 센서로 인식하고 처리된 데이터를 컴퓨터로 전달해 본인이 모델링한 알고리즘을 수행할 수 있는 작은 컴퓨터가 필요하다. 최근 컴퓨터 가격이 저렴해져 대안이 많아졌지만 이런 용도로 개발된 초소형 컴퓨터들이 별개로 있다. 아두이노(Arduino), 라스베리파이(Rasberry Pi), 비글본(BeagleBone)와 같은 초소형 컴퓨터는 손바닥보다 작은 크기로 5V전력으로도 동작되며 아날로그 및 디지털 센서를 연결해 데이터를 취득할 수 있다. CPU가 있으므로 모델링된 알고리즘을 실행할 수 있고 처리된 결과를 무선네트웍을 통해 서버에 전송할 수 있다. 반대로 아이폰과 같은 기기와 연동해 데이터를 전송하여 초소형 컴퓨터와 연결된 액추레이터를 작동시킬 수도 있다. IoT 확산되고 있는 요즘, 언리얼과 IoT 장치를 연결하는 방법을 설명한다. 2. 센서란 주변 환경과 반응하기 위해서는 바람, 온도, 습기와 같은 환경을 전기(전압) 신호로 전달해 주는 센서(Sensor)가 있어야 하며 전기 신호를 받아 움직이는 모터와 같은 액추레이터(Actuator)가 있어야 한다. 이는 소프트웨어를 이용해 특정 알고리즘을 프로그래밍하여 처리하는 데 이때 필요한 센서 신호는 ADC(Analog-to-Digital Converter) 회로를 통해 디지털 언어로 변환되어 처리된다.
  6. 6. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 3 of 35 우리가 살아가는 세계는 물리적 현상이 지배하는 아날로그(analog)의 세상이다. 우리가 느끼는 온도, 습도, 무게, 마찰력 등은 아날로그적으로 표현된다. 예를 들어, 온도가 약간 높거나, 습도가 아주 낮거나 하는 식의 연속적으로 연결된 강도로 느껴진다. 이러한 강도를 컴퓨터가 인식할 수 있는 디지털 데이터(data) 값으로 변환하는 장치를 센서(sensor)라 한다. 센서는 온도, 습도, 힘, 마찰력, 중력, 자세와 같은 수많은 물리적 현상을 측정해 디지털 데이터 신호(digital data signal)로 변환한다. 아두이노와 같은 컴퓨터가 있으면, 센서에서 값을 얻어, 여러가지 계산을 할 수 있다. 또한, 계산한 값을 반대로 물리적 현상으로 재현할 수 있다. 이런 역활을 하는 장치를 액추에이터(actuator)라 한다. 아두이노보드와 각종 센서들
  7. 7. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 4 of 35 센서는 여러가지 종류가 있으며 이는 전자부품 온라인 쇼핑몰 등에서 쉽게 구할 수 있다. 피에조 음향, 광 센서, 기울기 및 방향 센서, 온도 센서, 습도 센서, 방향 센서, 거리 측정 센서, 물체 감지 센서, 가속도 센서, 압력 센서, 변형율 센서 등이 있으며 각 센서별 출력 특성이 다르다. 그러므로 출력 특성별로 정규화하는 과정이 필요하다. 또한, 센서에서 출력되는 전압은 불안전하게 튀는 신호가 포함되어 있으므로 안정화 처리할 필요가 있다. 3. Arduino 기반 IoT 데이터 취득 방법 이 글에서는 아두이노 보드에서 센서 데이터를 얻고 언리얼에 그래픽을 출력하는 데 촛점을 맞출 것이다. 이 작업은 언리얼 프로그램에 데이터를 입력하고 아두이노 프로그래머가 그래픽적으로 센서 신호를 볼 수 있도록 할 수 있다. 이런 입력은 아두이노 보드에 붙일 수 있는 어떤 것이든 가능하며, 거리 센서부터 나침판이나 온도, 압력, 변위 등 센서, 로보틱스 기기, 컴퓨터 비전 회로, 네트워크 메쉬 망까지 다양할 수 있다. 아두이노는 물리적인 세계와 디지털 세계를 효과적으로 연결할 수 있는 오픈 소형 하드웨어 플랫폼이다. 마이크로 컨트롤러 보드와 이를 실행할 수 있는 소프트웨어를 포함한 전자 프로토타이핑 플랫폼으로써 많은 분야에 기여하고 있다. 아두이노는 활용 목적에 따라 여러가지 보드 종류를 제공하고 있는 데 여기서는 아두이노 우노(ARDUINO UNO)를 사용할 것이다. 아두이노 우노는 아래와 같은 특징이 있다. - 마이크로 컨트롤러: ATmega328
  8. 8. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 5 of 35 - 구동전압: 5V - 입력 전압: 7~12V - 디지털 입출력 핀: 14(이 중 6 개는 PWM출력) - 아날로그 입력 핀: 6 - 입출력 핀의 DC전류: 40mA - 3.3V 핀의 DC전류: 50mA - 플래시 메모리: 32KB(이중 부트로더가 0.5KB 사용함) - SRAM: 2KB - EEPROM: 1KB - 클록속도: 16MHz 데이터는 프로세싱 시리얼(Serial) 라이브러리를 이용해 프로세싱 스케치와 아두이노 보드 사이에 전달될 수 있다. Serial 은 하번에 한 바이트(byte)씩 데이터를 보내는 형식이다. 아두이노에서는 byte는 자료형이며, 0 에서 255 가지 값을 저장할 수 있다. 바이트는 int와 유사하지만 좀 더 작고, 큰 수를 전달해 주기 위해서는 바이트 열로 그 수를 쪼갠 다음 나중에 재조합해야 한다. 3.1 아두이노와 전자 부품 아두이노와 작업할 때 몇 가지 알고 있으면 좋은 전자 부품들이 있다. 브래드보드 전자회로를 쉽게 만들고 구동하기 위해 필요한 부품으로 아래와 같은 모양의 회로를 가지고 있다.
  9. 9. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 6 of 35 저항 저항은 회로의 전압이나 전류를 제어할 때 활용한다. 저항 중 크기가 작은 것은 아래와 같이 색상코드로 저항값을 표시하고 있다. 아래는 색상코드이다.
  10. 10. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 7 of 35 LED 빛을 내는 발광 다이오드이다. 한쪽 방향으로만 전류를 흘러보낸다. 전류가 흐르면서 발광부에서 빛이 나는 소자이다. LED는 전류가 흐르는 방향인 +/-극성이 있다. 한쪽 다리가 긴쪽이 +극이다. 조도(광) 센서 센서 종류는 매우 다양하지만, 그 중에서 가장 예제로 많이 사용하는 센서는 조도 센서이다. 이 센서는 주변 빛의 밝기를 측정할 수 있다.
  11. 11. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 8 of 35 3.2 아두이노 개발환경 준비 1. 아두이노 우노 보드 준비 아두이노 우노 보드는 아마존, 네이버 쇼핑 등에서 구입할 수 있다. 아두이노 우노 스타터키트를 구입하면, 필요한 시리얼 통신 케이블 등이 포함되어 있으니 참고 바란다. 아두이노 우노 스타터 키트(아마존) 및 보드(네이버 쇼핑) 2. 아두이노 개발 환경 설치 아두이노는 편리한 개발을 지원하는 통합 개발 환경 프로그램을 제공한다. 이 프로그램 설치는 해당 홈페이지의 다운로드(https://www.arduino.cc/en/software)에서 받아 설치하면 된다. 설치와 동시에 구동에 필요한 드라이버 등은 자동 설치된다. 설치 후 컴퓨터를 재부팅한다.
  12. 12. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 9 of 35 3.3 아두이노 예제 실행 1. 아두이노 개발환경 실행 이제 아두이노 개발환경을 실행한다.
  13. 13. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 10 of 35 참고로, 아두이노 개발환경은 무선 통신, 모터, 로봇 등을 제어할 때 필요한 라이브러리를 애드인 형식으로 제공한다. 기본으로 제공하는 라이브러리는 다음과 같다. [스케치][라이브러리 포함하기][라이브러리 관리] 메뉴에서 필요하면 설치해 사용할 수 있다. 2. Blink 예제 불러오기
  14. 14. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 11 of 35 다음 그림과 같이 [파일][예제]에 있는 예제파일들을 확인해 본다. 아날로스 센서 값 얻기, 디지털 출력, 모터 제어, 출력 등 다양한 예제들이 보일 것이다. 이 중 Blink 예제를 선택한다. 3. 아두이노 보드 및 통신 포트 설정 아두이노 보드는 종류가 다양하다. 우노 보드는 [도구][보드]에서 설정한다. 컴퓨터와 아두이노의 통신은 보통 시리얼 통신 COM포트를 통해 처리되는 데, 통신 포트 이름을 [도구][시리얼 포트]에서 확인할 수 있다. 이 메뉴에서 활성화되어 있는 포트를 설정한다.
  15. 15. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 12 of 35 4. 소스코드 업로드 및 실행 [스케치][업로드] 메뉴를 선택하거나, 다음 그림과 같이 소스코드를 업로드한다. 그럼, 다음과 같이 아두이노 보드의 LED가 1 초마다 깜빡깜빡할 것이다. 3.4 센서 데이터 취득 예제 개발 조도센서를 사용해 빛에 밝기에 따라 LED가 켜지는 실습해 보기로 한다. 이를 위해 조도센서를 이용해 이에 따라 점멸 주기가 바뀌도록 프로그램해본다.
  16. 16. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 13 of 35 1. 전자 부품 준비 미리 조도센서, 저항, LED를 준비한다.  조도센서 x 1  저항 x 2 (220 옴, 4.7k 옴)  LED x 2 2. 아두이노 회로 구성 그림과 같이 광센서 핀을 5V와 연결한다. 광센서 다른 핀 연결은 저항, A0 핀, GND를 함께 연결한다. LED는 디지털 출력 D9 번과 GND를 각각 연결한다. 모두 연결한 후에는 아두이노 보드와 컴퓨터를 시리얼 케이블로 연결한다. 3. 코딩하기 소스 코드는 다음과 같다. #define LED 9
  17. 17. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 14 of 35 void setup() { pinMode(LED, OUTPUT); } void loop() { int val = analogRead(A0); int intensity = map(sensorValue, 0, 1023, 0, 255); analogWrite(LED, intensity); delay(100); } 4. 소스코드 업로드 및 실행 [스케치][업로드] 메뉴를 선택하거나, 다음 그림과 같이 소스코드를 업로드한다. 잠시 후, 아두이노 우노보드에서 자동으로 실행될 것이다. 제대로 회로가 구성되었다면, 광센서 주변 밝기(조도)에 따라 LED가 비례해서 켜질 것이다.
  18. 18. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 15 of 35 4. 언리얼 기반 IoT 데이터 연결 및 가시화 4.1 RS232 기반 센서 장치와 언리얼 연결 아두이노와 언리얼(Unreal) 게임엔진을 연결하는 간단한 방법을 설명한다. 이 글은 실시간으로 시리얼 통신에서 얻은 센서값을 언리얼의 액터 메쉬의 머터리얼(재질) 색상에 직접 설정하는 방법을 포함한다. 센서와 언리얼 연결 방법을 보여주기 위해, 별도 상용 언리얼 플러그인을 사용하지 않고, C++에서 통신 모듈을 간단히 개발해 사용한다. 이 글에서 설명하는 같은 방식으로 텍스처, 광원, 메쉬 위치 등을 센서 값에 따라 실시간으로 변경할 수 있다. 이 장의 개발 결과물은 언리얼 화면에서 각 큐브는 물리적 센서에서 얻은 데이터값을 색상으로 표시한다. 개발 환경은 다음과 같다.  아두이노 IDE설치: https://www.arduino.cc/en/software 구현을 위해, 센서는 아두이노에서 얻은 값을 사용하고, RS232 시리얼 통신을 이용한다. 센서 - 아두이노 보드 - RS232 시리얼 통신 - 언리얼 - 데이터 가시화 주요 개발 순서는 다음과 같다. 1. 아두이노 IDE에서 센서 데이터 획득하는 회로와 프로그램 작성. 아두이노 A0 핀에 광센서 등 사용해 시그널을 A0 에 입력. LED는 9 번핀에 연결.
  19. 19. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 16 of 35 코드는 다음과 같음. const int analogInPin = A0; // Analog input pin that the potentiometer is attached to const int analogOutPin = 9; // Analog output pin that the LED is attached to int sensorValue = 0; // value read from the pot int outputValue = 0; // value output to the PWM (analog out) void setup() { Serial.begin(9600); } void loop() { // read the analog in value: sensorValue = analogRead(analogInPin); // map it to the range of the analog out: outputValue = map(sensorValue, 0, 500, 0, 255); analogWrite(analogOutPin, outputValue); // print the results to the Serial Monitor:
  20. 20. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 17 of 35 Serial.write(outputValue); delay(50); } 2. 언리얼 실행. 빈 프로젝트를 C++ 형식으로 생성 3. 블루프린트 작성. 기본 클래스는 Actor에서 파생받음. 이름은 ColoredCube로 설정. 블루프린트에서 Cube 메쉬 객체 설정 4. 액터의 메쉬 객체에 적용할 재질 작성 및 설정. 재질 이름은 Colors로 설정하고 다음과 같이 재질 작성
  21. 21. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 18 of 35 LinearInterpolate ScalarParameter
  22. 22. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 19 of 35 5. ColoredCube에 Color 재질을 설정 6. Visual Studio에서 Serial Port로 부터 센서 데이터를 얻는 모듈을 작성. 헤더 파일은 다음과 같음. #pragma once #include "CoreMinimal.h" #include "CoreTypes.h" /** * */ class IOT6_API SerialPort { public: SerialPort(); ~SerialPort(); bool open(const TCHAR* sPort, int nBaud = 9600); void close(); int write(TArray<uint8>& Buffer); int read(TArray<uint8>& Buffer);
  23. 23. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 20 of 35 private: void* _PortHandle; }; 7. Visual Studio에서 액터 소스 파일 편집. Serial Port에서 얻은 센서 데이터로 액터 메쉬의 머터리얼을 얻어 생상을 설정함. 주요 코드는 다음과 같음. #include "ColoredCube.h" #include "Materials/MaterialInstanceDynamic.h" #include "Components/StaticMeshComponent.h" #include "Materials/MaterialInterface.h" #pragma optimize("", off) class SerialPortInstance { public: SerialPortInstance(); ~SerialPortInstance(); SerialPort _port; }; SerialPortInstance::SerialPortInstance() { _port.open(_T("COM3")); // 이 부분은 각자 시리얼 통신 포트 이름으로 변경해야 함 } SerialPortInstance::~SerialPortInstance() { _port.close(); } SerialPortInstance _serial;
  24. 24. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 21 of 35 // Sets default values AColoredCube::AColoredCube() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; } // Called when the game starts or when spawned void AColoredCube::BeginPlay() // 최초 액터 생성 시 실행 { Super::BeginPlay(); auto Cube = FindComponentByClass<UStaticMeshComponent>(); auto Material = Cube->GetMaterial(0); _DynamicMaterial = UMaterialInstanceDynamic::Create(Material, NULL); Cube->SetMaterial(0, _DynamicMaterial); _randomColor = FMath::Rand() % 64; } // Called every frame void AColoredCube::Tick(float DeltaTime) // 프레임 렌더링 전에 호출됨 { Super::Tick(DeltaTime); TArray<uint8> Buffer; Buffer.Add(0); int len = _serial._port.read(Buffer); if (len) { FString string = FString::Printf(TEXT("Data = %d"), Buffer[0]); GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, string); float blend = ((float)Buffer[0] + _randomColor) / (255.0); // float blend = 0.5f + FMath::Cos(GetWorld()->TimeSeconds) / 2;
  25. 25. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 22 of 35 _DynamicMaterial->SetScalarParameterValue(TEXT("Blend"), blend); } } #pragma optimize("", on) 이 결과는 다음과 같다. 센서 값에 따라 큐브 색상에 실시간으로 변화하는 것을 확인할 수 있다. 이 방법을 응용하면 IoT와 같은 객체에서 얻은 센서값을 언리얼과 연결할 수 있다. 이렇게 연결하여, 물리세계를 게임엔진 기반 3 차원 가상세계로 맵핑하여 가시화하거나 그 반대로 액추에이터를 제어하는 앱을 개발할 수 있다.
  26. 26. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 23 of 35 4.2 Node.js 인터넷 서버 기반 센서 장치와 언리얼 연결 이 장은 IoT 연결을 위한 언리얼기반 인터넷 서버 데이터 실시간 획득 방법을 간략히 설명한다. 이 글에서 사용하는 방법을 이용해 IoT와 언리얼을 연결해, 물리 세계와 가상 세계를 연결하는 간단한 메타버스, 디지털 트윈 앱을 개발할 수 있다. 서버 개발은 Node.js를 사용한다. 물리 세계 - 센서 - 아두이노 - 시리얼포트 - 인터넷 서버 - 언리얼 - 가상 디지털 세계 언리얼 네트워크 통신 방법은 다양하다. 제일 편한 방법은 누군가 만들어놓은 플러그인을 사용하는 것이다. 그럼 코딩없이 블루프린트에서 데이터를 교환할 수 있다. 직접 개발하려면 C++을 사용해야 한다. 이 경우, 라이센스 비용 없이 기능을 구현할 수 있고, 실무적으로는 이런 방식이 복잡한 문제인 경우 유연성이 높아 자주 사용한다. IoT 장치와 연결하기 위해서는 다양한 데이터소스와 연결하는 프로토콜을 구현해야 한다. 데이터소스는 Serial port, Socket, Websocket, HTTPsocket, MQTT, TCP/IP, UDP 외에 MySQL, MongoDB와 같은 데이터베이스가 될 수도 있다. C++로 구현할 경우, 언리얼 개발사에서 제공하는 예제가 그리 많지 않다. 그래서, 소스코드를 확인하고, 개발 문서를 체크해야 한다. 이는 기본 제공하는 SocketIOClient 컴포넌트를 블루프린트에서 개발하는 방법이다. 개발 방법을 이해하기 쉽게, IoT에서 데이터를 받아 그 값을 인터넷으로 방송하는 new wind서버를 만든다. new wind 토픽의 값은 랜덤값으로 한다. 이 값만 차후 IoT 센서 값으로 변경하면 된다. 개발 순서는 다음과 같다. 1. 아두이노와 Node.js를 연결하기 위해 아두이노 IDE를 실행. IDE의 예제>펌웨어 선택하고, 업로드함
  27. 27. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 24 of 35 2. Socket이란 이름의 블루프린터를 액터를 파생받아 생성 3. 블루프린트를 다음과 같이 코딩함
  28. 28. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 25 of 35 4. 서버 개발을 위한 폴더 생성 후, node.js 및 패키지 설치 아래 링크에서 node.js를 설치. 각자 운영체제에 맞게 다운로드한 후 설치함 ⚫ node.js 다운로드 링크: https://nodejs.org/ko/download 명령창을 실행하고, 아래 명령을 입력함 mkdir IoT_server cd IoT_server
  29. 29. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 26 of 35 npm install --save express npm install johnny-five --save npm install serialport npm i socket.io npm i http npm i util 5. 텍스트 편집기를 사용해 server.js 파일 이름으로 코딩. 단, 아래의 "COM3"는 각자 연결된 아두이노 시리얼포트 이름으로 수정해야 함. var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var util = require('util'); var five = require('johnny-five'); var SerialPort = require("serialport").SerialPort; var clients = []; io.on('connection', function(socket){ clients.push(socket.id); var clientConnectedMsg = 'User connected ' + util.inspect(socket.id) + ', total: ' + clients.length; console.log(clientConnectedMsg); socket.on('disconnect', function(){ clients.pop(socket.id);
  30. 30. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 27 of 35 var clientDisconnectedMsg = 'User disconnected ' + util.inspect(socket.id) + ', total: ' + clients.length; console.log(clientDisconnectedMsg); }) }); var sensorValue = 0; var board = new five.Board({ port: new SerialPort("COM3", { // 각자 아두이노 연결 환경에 맞게 수정요. baudrate: 9600, buffersize: 1 }) }); board.on('ready', function () { var sensor = new five.Sensor("A0"); // Scale the sensor's data from 0-1023 to 0-10 and log changes sensor.on("change", function() { sensorValue = this.scaleTo(0, 10); console.log(sensorValue); }); }); http.listen(3000, function(){
  31. 31. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 28 of 35 console.log('listening on *:3000'); }); function getRandomInRange(min, max) { return Math.random() * (max - min) + min; } function sendWind() { console.log('Wind sent to user'); io.emit('new wind', sensorValue); } setInterval(sendWind, 3000); 6. 서버 실행 node server.js 7. 언리얼 편집기에서 레벨에 개발된 블루프린트 socket 액터를 드래그&드롭함
  32. 32. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 29 of 35 8. 언리얼 플레이 다음은 실행 결과이다. 서버로 부터 데이터를 네트워크로 잘 받아오고 있는 것을 확인할 수 있다. 9. 센서값에 따라 조명이 변화하도록 해 보자. 블루프린터로 SensorLight를 만든다.
  33. 33. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 30 of 35 다음과 같이 센서 값에 따라 라이트 밝기가 변화하게 코딩해 본다. 10. 개발 결과 실행 개발된 SensorLight를 캔버스에 드래그&드롭한다.
  34. 34. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 31 of 35 실행 결과는 다음과 같다. 센서값에 따라 빛 밝기가 변화하는 것을 알 수 있다.
  35. 35. Unreal과 IoT 연계 및 개발 방법 소개 © 강태욱 Page 32 of 35 5. 마무리 이 장에서는 IoT와 언리얼을 연결하기 위한 개발 순서 및 방법들을 살펴보았다. 이를 응용하면, 디지털 트윈과 같이 물리와 가상 세계를 서로 연결해 표현해 줄 수 있는 앱을 언리얼로 쉽게 개발할 수 있을 것이다.

×