ํฌ๋ฐ๋ฏน ์ดํ โํํธ์กฑโ ์ด๋ผ๋ ๋ง์ด ์๊ธธ ๋งํผ ์ง์์ ์ด๋ํ๋ ์ฌ๋๋ค์ด ์ฆ๊ฐํ์๋ค. ํ์ง๋ง ์ง์์ ์ด๋์ ํ๋ค๋ณด๋ฉด ์์ง๊ฐ ๋ถ์กฑํด ์ด๋์ ๊ธ์ ๊ทธ๋ง๋๊ฑฐ๋, ์์ ์ด ์ฌ๋ฐ๋ฅธ ์์ธ๋ก ํ๊ณ ์๋์ง ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ๊ฐ ๋ง์, ์คํ๋ ค ์์ธ๊ฐ ํธ๋ฌ์ง๋ ๋ฑ ๋ถ์์์ด ์๊ธฐ๋ ํ๋ค. ์ด๋ํ๋ ์์ธ๋ฅผ ๋ณด์ฌ์ฃผ๋ฉด์ ์ด๋ ํ์๋ฅผ ์ธ์ฃผ๊ณ , ์ด๋ ์์ธ๋ฅผ ๋ถ์ํด์ฃผ๋ ์ฑ์ด ์๋ค๋ฉด ์ง์์ ํผ์ ์ด๋์ ํ๋ ๋ฐ ํธ๋ฆฌํ ๊ฒ์ด๋ฉฐ, Home++ ์ํจ๋๋ผ๋ ํ๋ซํผ์์ ๊ฐ๋ฐ์๋ค์ด ๋์๊ฐ์ผํ ๋ฐฉํฅ์ ๋ํด์ ์ด์ผ๊ธฐํด์ค๋ค.
Home ++ ์ํจ๋์ ์ด๋ ๋ณด์กฐ ๊ธฐ๋ฅ์ ์ฌ์ฉใ
์๊ฐ ๋
นํ ์์์ ๋๋ฅด๋ฉด, 2๋ฒ์งธ ๋ชจ๋ํฐ์์ ์์ ์ ์ด๋๋ชจ์ต์ ๋ณด์ฌ์ค๊ณผ ๋์์ ๋
นํ๋ฅผ ์์ํ๊ณ ์ด๋์ด ๋๋๊ณ ๋
นํ์ข
๋ฃ๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด ์ด๋ ๋ถ์์ด ์์๋๋ค. ์ด๋ ๋ถ์์ด ๋๋๊ฒ ๋๋ฉด(์ค๋ ๊ฑธ๋ฆผ) ์ด๋์ ์ด๋ ์ ๋์ ์๋๋ก ์งํํ์๋์ง์ ๋ํ ๋ถ์ ๊ทธ๋ํ์ ์ด๋ ์๊ฐ, ํ์, ์๋ชจ ์นผ๋ก๋ฆฌ ๋ฑ ๋ค์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ์ดํ ์์๋ณด๊ธฐ๋ฅผ ํตํด ์ด๋ค ์์ธ๊ฐ ์๋ชป๋์๋์ง ํ์ธํ ์ ์๊ฒ ํ์๋ค.
AWS EC2(ํด๋ผ์ฐ๋ ์๋ฒ):
- ๋ณด์ ๊ทธ๋ฃน์ ์ธ๋ฐ์ด๋ ๊ท์น์์ 8000ํฌํธ๋ฅผ ๊ฐ๋ฐฉํ์ฌ ํฌํธ ํฌ์๋ฉ์ ํ์๋ค.
- Express.js(์์ ์คํธ๋ฆฌ๋ฐ / ํ์ผ ์๋ฒ)
- Express ์๋ฒ์์ exercise๋ก routingํ์ฌ ํ์ผ์ POST, GET์ ํ ์ ์๊ฒ ํ์ฌ ENACT์์ ์์์ ์ ๊ทผํ ์ ์๊ฒ ํ์๋ค.
- Request.JS ๋ชจ๋์ ํตํด ์ด๋ ๋ถ์ ์์์ ์ ์กํ ์ ์๊ฒ ํ์๋ค.
- ์์์ webOS์ ๋ง๋ ์ฝ๋ฑ(libx264)์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ ffmpeg ๋ชจ๋์ ์ฌ์ฉํ์๋ค.
webOS(์ํจ๋):
-
ENACT(com.exercise.app)
- enact์ VideoPlayer๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋์ค๋ฅผ ์ฌ์ํ ์ ์๊ฒ ํ์๋ค.
- First panel์์๋ useEffect๋ฅผ ํตํด ์์ํ์๋ง์ serviceStart๋ฅผ ํตํด ์นด๋ฉ๋ผ ํ๊ฒฝ ์ค์ ๋ฐ ์คํธ๋ฆฌ๋ฐ ํ๊ฒฝ์ค์ ์ ํ๋ค.
-
Node.JS(com.exercise.app.service)
- serviceStart service: NodeJS์ ๊ธฐ๋ณธ ๋ชจ๋ ์ค ํ๋์ธ Child Process๋ฅผ ์ฌ์ฉํ์ฌ /usr/sbin/camera_window_manager_exporter ๋ฅผ ํตํด 2๋ฒ์งธ ๋ชจ๋ํฐ์ ์คํธ๋ฆฌ๋ฐ ์์ญ์ ์ง์ ํด์ค๋ค. ๋ํ com.webos.service.camera2 API์ com.webos.media ๋ฅผ ์ฌ์ฉํ์ฌ open -> setFormat -> startPreview -> load -> play์ ๊ณผ์ ์ ๊ฑฐ์ณ ์นด๋ฉ๋ผ ์ธํ ์ ์๋ฃํ๋ค.
- record service: com.webos.media/startCamerRecord ๋ฅผ ํตํด ๋ นํ๋ฅผ ์์ํ๋ค.
- child service: com.webos.service.camera2 API์ com.webos.media ๋ฅผ ์ฌ์ฉํ์ฌ stopCameraRecord -> unload -> stopPreview -> close๋ฅผ ํตํด ๋
นํ์ ์คํธ๋ฆฌ๋ฐ, ์นด๋ฉ๋ผ๋ฅผ ์ข
๋ฃํ๋ค. ๊ทธ๋ฆฌ๊ณ NodeJS์ ๊ธฐ๋ณธ ๋ชจ๋ ์ค ํ๋์ธ Child Process๋ฅผ ์ฌ์ฉํ์ฌ python ์ด๋ ๋ถ์์ ์์ํ๋ค. ์ด๋ ๋ถ์์ด ๋๋๋ฉด python์์ ์ถ๋ ฅ๋ JSON์ Parsingํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ๊ธฐํด์ค๋ค. ๋ํ Base64๋ก ์ ๋ฌ๋ ๊ทธ๋ํ๋ฅผ ๊ฐ์ ธ์์ enact์ ์ ๋ฌํด ์ฌ์ฉํ๋ค.
-
Python(Media Pipe)
- pushup.py์์๋ Media Pipe๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ ๋ถ์์ ํ๊ณ , ์ด๋ ๋ถ์์ ํ ๊ฒฐ๊ณผ๋ฅผ Matplotlib์ผ๋ก ๊ทธ๋ํ๋ฅผ ๋ง๋ค์ด base64๋ก ์ธ์ฝ๋ฉํ ํ, ๋ฐ์ดํฐ๋ฅผ json์ ํ์์ผ๋ก ์ถ๋ ฅํ์ฌ webOS์์ ๊ฐ์ parsingํ ์ ์๊ฒ ํ๋ค.
- upload.py์์๋ ์์์ AWS EC2์ requests ๋ชจ๋์ ์ฌ์ฉํ์ฌ POSTํ๋ค.
- ์ด์์ฒด์ : Windows 11, Ubuntu 20.04.5 LTS, webOS 2.18.0
- ๋๋ฐ์ด์ค ๊ตฌ์ฑ : Raspberry Pi 4B
- IDE : Visual Studio Code
- ๊ฐ๋ฐ ์ธ์ด : ENACT, Node.JS, Python
- package manager : npm, yarn
ares-setup-device์์ default๋ฅผ ์์ ์ด ์ค์นํ webOS์ IP๋ก ์ค์ ํ์ธ์.
source wallpad.setup.sh
- MediaPipe ์์ ์ฌ์ฉํ๋ tensorflow API ๋ webassembly(WASM)์ผ๋ก ๊ตฌํ๋์ด ์๋๋ฐ, webOS OSE ๋ WASM ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ MediaPipe JavaScript Solution์ด ๋์ํ์ง ์๋๋ค.
--> ์ด๋ ๋ถ์ ์๋น์ค ๋๋ ํ ๋ฆฌ ์์ python ์ผ๋ก mediapipe ๋ฅผ ์ด์ฉํ ์ด๋ ๋ถ์์ ๊ตฌํํ๊ณ , node.js ์ child_processs ๋ชจ๋์ ์ด์ฉํด service ๋จ์์ python ํ์ผ์ ์คํ์์ผ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ JSON ์ ํํ๋ก ๋ฐ์์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์๋ค. - local์ ์๋ ์์์ด Enact์์ ์ ๊ทผ์ด ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์๋ค.
--> ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์์ ์คํธ๋ฆฌ๋ฐ ์๋ฒ๋ฅผ EC2์ ๋ง๋ค์ด์ ์ฌ์ฉํด์ ์ธ๋ถ์ ์์์ URL์ ํตํ์ฌ ์ ๊ทผํ ์ ์๊ฒ ํ์๋ค.