Node.js์™€ ARDrone์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์˜ ์Œ์„ฑ ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ฉ๋‹ˆ๋‹ค.

Node.js์™€ ARDrone์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์˜ ์Œ์„ฑ ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” Node.js์™€ ์›น ์Œ์„ฑ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Œ์„ฑ ์ œ์–ด ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋“œ๋ก ์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ—ฌ๋ฆฌ์ฝฅํ„ฐ - ์•ต๋ฌด์ƒˆ ARDrone 2.0.

์•Œ๋ฆผ: "Habr"์˜ ๋ชจ๋“  ๋…์ž๋ฅผ ์œ„ํ•œ - "Habr" ํ”„๋กœ๋ชจ์…˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Skillbox ๊ณผ์ •์— ๋“ฑ๋กํ•  ๋•Œ 10 ๋ฃจ๋ธ” ํ• ์ธ.

Skillbox๋Š” ๋‹ค์Œ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์‹ค๊ธฐ ์ฝ”์Šค "๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์ž PRO".

์†Œ๊ฐœ

๋“œ๋ก ์€ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฟผ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๊ฑฐ๋‚˜, ์‚ฌ์ง„๊ณผ ๋น„๋””์˜ค๋ฅผ ์ฐ๊ฑฐ๋‚˜, ๊ทธ๋ƒฅ ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌด์ธ ํ•ญ๊ณต๊ธฐ(UAV)๋Š” ๋‹จ์ˆœํ•œ ์—”ํ„ฐํ…Œ์ธ๋จผํŠธ ์ด์ƒ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์˜ํ™”๊ณ„์—์„œ ์ผํ•˜๊ณ  ๋น™ํ•˜๋ฅผ ์—ฐ๊ตฌํ•˜๋ฉฐ ๊ตฐ๋Œ€์™€ ๋†์—… ๋ถ€๋ฌธ ๋Œ€ํ‘œ์ž๋“ค์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋“œ๋ก ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์Œ์„ฑ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ํ—ฌ๋ฆฌ์ฝฅํ„ฐ๋Š” ๊ท€ํ•˜๊ฐ€ ์ง€์‹œํ•œ ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ ๋์—๋Š” UAV ์ œ์–ด์— ๋Œ€ํ•œ ๊ธฐ์„ฑ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋น„๋””์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ 

์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ์•ต๋ฌด์ƒˆ ARDrone 2.0;
  • ์ด๋”๋„ท ์ผ€์ด๋ธ”;
  • ์ข‹์€ ๋งˆ์ดํฌ.

๊ฐœ๋ฐœ ๋ฐ ๊ด€๋ฆฌ๋Š” Windows/Mac/Ubuntu๊ฐ€ ์„ค์น˜๋œ ์›Œํฌ์Šคํ…Œ์ด์…˜์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” Mac๊ณผ Ubuntu 18.04๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด

๋‹ค์Œ์—์„œ ์ตœ์‹  ๋ฒ„์ „์˜ Node.js๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”. ๊ณต์‹ ์‚ฌ์ดํŠธ.

๋˜ํ•œ ํ•„์š” ์ตœ์‹  ๋ฒ„์ „์˜ Chrome.

ํ—ฌ๋ฆฌ์ฝฅํ„ฐ ์ดํ•ดํ•˜๊ธฐ

Parrot ARDrone์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•ด ๋ด…์‹œ๋‹ค. ์ด ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์—๋Š” XNUMX๊ฐœ์˜ ๋ชจํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Node.js์™€ ARDrone์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์˜ ์Œ์„ฑ ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€์ชฝ ๋ชจํ„ฐ๋Š” ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์Œ์€ ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ, ๋‹ค๋ฅธ ์Œ์€ ์‹œ๊ณ„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋ก ์€ ์ง€๊ตฌ ํ‘œ๋ฉด์— ๋Œ€ํ•œ ๊ฒฝ์‚ฌ๊ฐ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ชจํ„ฐ์˜ ํšŒ์ „ ์†๋„์™€ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์กฐ์ข… ๊ฐ€๋Šฅํ•œ ์›€์ง์ž„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์›€์ง์ž…๋‹ˆ๋‹ค.

Node.js์™€ ARDrone์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์˜ ์Œ์„ฑ ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ฉ๋‹ˆ๋‹ค.

์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‹ค์–‘ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์˜ ์ด๋™ ๋ฐฉํ–ฅ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์™ผ์ชฝ ๋ฐ ์˜ค๋ฅธ์ชฝ ๋กœํ„ฐ์˜ ํšŒ์ „ ์†๋„๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ๋Š˜๋ฆฌ๋ฉด ๋กค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋“œ๋ก ์ด ์•ž๋’ค๋กœ ๋น„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจํ„ฐ์˜ ์†๋„์™€ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ํ—ฌ๋ฆฌ์ฝฅํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ์šธ๊ธฐ ๊ฐ๋„๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ณต๊ธฐ์—ญํ•™์„ ๊ณต๋ถ€ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ๊ธฐ๋ณธ ์›๋ฆฌ๋งŒ ์ดํ•ดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Parrot ARDrone์˜ ์ž‘๋™ ๋ฐฉ์‹

๋“œ๋ก ์€ Wi-Fi ํ•ซ์ŠคํŒŸ์ž…๋‹ˆ๋‹ค. ์ฝฅํ„ฐ์— ๋ช…๋ น์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ ค๋ฉด ์ด ์ง€์ ์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋“œ์ฝฅํ„ฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Node.js์™€ ARDrone์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์˜ ์Œ์„ฑ ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ฉ๋‹ˆ๋‹ค.

๋“œ๋ก ์ด ์—ฐ๊ฒฐ๋˜์ž๋งˆ์ž ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  Telnet 192.168.1.1 - ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์˜ IP์ž…๋‹ˆ๋‹ค. Linux์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค ๋น„์ง€๋ฐ•์Šค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜

์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค:

  • ์Œ์„ฑ ๊ฐ์ง€๋ฅผ ์œ„ํ•œ ์Œ์„ฑ API๊ฐ€ ํฌํ•จ๋œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค;
  • ๋ช…๋ น์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ํ‘œ์ค€๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  • ๋“œ๋ก ์— ๋ช…๋ น์„ ๋ณด๋‚ด๋Š” ๊ฒƒ;
  • ๋ผ์ด๋ธŒ ๋น„๋””์˜ค ๋ฐฉ์†ก.

API๋Š” ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ํ•œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ด๋”๋„ท ์—ฐ๊ฒฐ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค!

์•”ํ˜ธ

๋จผ์ € ์ƒˆ ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ํ„ฐ๋ฏธ๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํด๋”๋กœ ์ „ํ™˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์•„๋ž˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Node ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋จผ์ € ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

npm ์„ค์น˜โ€Š

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ๋ช…๋ น์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  • ์ด๋ฅ™ํ•˜๋‹ค;
  • ์ฐฉ๋ฅ™;
  • ์œ„๋กœ-๋“œ๋ก ์ด XNUMXm ์ƒ์Šนํ•˜๊ณ  ํ˜ธ๋ฒ„๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜๋กœ - XNUMXm ๋–จ์–ด์ง€๊ณ  ์–ผ์–ด ๋ถ™์Šต๋‹ˆ๋‹ค.
  • ์™ผ์ชฝ์œผ๋กœ-์™ผ์ชฝ์œผ๋กœ XNUMXm ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ์œผ๋กœ-์˜ค๋ฅธ์ชฝ์œผ๋กœ XNUMXm ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ํšŒ์ „ - ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ž์œผ๋กœ - XNUMXm ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค.
  • ๋’ค๋กœ - ๋ฐ˜ ๋ฏธํ„ฐ ๋’ค๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  • ๋ฉˆ์ถ”๋‹ค.

๋‹ค์Œ์€ ๋ช…๋ น์„ ์ˆ˜๋ฝํ•˜๊ณ , ํ•„ํ„ฐ๋งํ•˜๊ณ , ๋“œ๋ก ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

const express = require('express');
const bodyparser = require('body-parser');
var arDrone = require('ar-drone');
const router = express.Router();
const app = express();
const commands = ['takeoff', 'land','up','down','goleft','goright','turn','goforward','gobackward','stop'];
 
var drone  = arDrone.createClient();
// disable emergency
drone.disableEmergency();
// express
app.use(bodyparser.json());
app.use(express.static(__dirname + '/public'));
 
router.get('/',(req,res) => {
    res.sendFile('index.html');
});
 
router.post('/command',(req,res) => {
    console.log('command recieved ', req.body);
    console.log('existing commands', commands);
    let command = req.body.command.replace(/ /g,'');
    if(commands.indexOf(command) !== -1) {
        switch(command.toUpperCase()) {
            case "TAKEOFF":
                console.log('taking off the drone');
                drone.takeoff();
            break;
            case "LAND":
                console.log('landing the drone');
                drone.land();
            break;
            case "UP":
                console.log('taking the drone up half meter');
                drone.up(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "DOWN":
                console.log('taking the drone down half meter');
                drone.down(0.2);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOLEFT":
                console.log('taking the drone left 1 meter');
                drone.left(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "GORIGHT":
                console.log('taking the drone right 1 meter');
                drone.right(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },1000);
            break;
            case "TURN":
                console.log('turning the drone');
                drone.clockwise(0.4);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOFORWARD":
                console.log('moving the drone forward by 1 meter');
                drone.front(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "GOBACKWARD":
                console.log('moving the drone backward 1 meter');
                drone.back(0.1);
                setTimeout(() => {
                    drone.stop();
                    clearTimeout();
                },2000);
            break;
            case "STOP":
                drone.stop();
            break;
            default:
            break;    
        }
    }
    res.send('OK');
});
 
app.use('/',router);
 
app.listen(process.env.port || 3000);

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ์‚ฌ์šฉ์ž์˜ ๋ง์„ ๋“ฃ๊ณ  ๋…ธ๋“œ ์„œ๋ฒ„์— ๋ช…๋ น์„ ๋ณด๋‚ด๋Š” HTML ๋ฐ JavaScript ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Voice Controlled Notes App</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/shoelace-css/1.0.0-beta16/shoelace.css">
        <link rel="stylesheet" href="styles.css">
 
    </head>
    <body>
        <div class="container">
 
            <h1>Voice Controlled Drone</h1>
            <p class="page-description">A tiny app that allows you to control AR drone using voice</p>
 
            <h3 class="no-browser-support">Sorry, Your Browser Doesn't Support the Web Speech API. Try Opening This Demo In Google Chrome.</h3>
 
            <div class="app">
                <h3>Give the command</h3>
                <div class="input-single">
                    <textarea id="note-textarea" placeholder="Create a new note by typing or using voice recognition." rows="6"></textarea>
                </div>    
                <button id="start-record-btn" title="Start Recording">Start Recognition</button>
                <button id="pause-record-btn" title="Pause Recording">Pause Recognition</button>
                <p id="recording-instructions">Press the <strong>Start Recognition</strong> button and allow access.</p>
 
            </div>
 
        </div>
 
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="script.js"></script>
 
    </body>
</html>

๋˜ํ•œ ์Œ์„ฑ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” JavaScript ์ฝ”๋“œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

try {
 var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
 var recognition = new SpeechRecognition();
 }
 catch(e) {
 console.error(e);
 $('.no-browser-support').show();
 $('.app').hide();
 }
// other code, please refer GitHub source
recognition.onresult = function(event) {
// event is a SpeechRecognitionEvent object.
// It holds all the lines we have captured so far.
 // We only need the current one.
 var current = event.resultIndex;
// Get a transcript of what was said.
var transcript = event.results[current][0].transcript;
// send it to the backend
$.ajax({
 type: 'POST',
 url: '/command/',
 data: JSON.stringify({command: transcript}),
 success: function(data) { console.log(data) },
 contentType: "application/json",
 dataType: 'json'
 });
};

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฝฅํ„ฐ๊ฐ€ Wi-Fi์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  ์ด๋”๋„ท ์ผ€์ด๋ธ”์ด ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค).

๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:3000์„ ์—ด๊ณ  ์ธ์‹ ์‹œ์ž‘์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Node.js์™€ ARDrone์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์˜ ์Œ์„ฑ ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋“œ๋ก ์„ ์ œ์–ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ํ–‰๋ณตํ•ฉ๋‹ˆ๋‹ค.

๋“œ๋ก ์œผ๋กœ ์˜์ƒ ๋ฐฉ์†กํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ์—์„œ ์ƒˆ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์—ฌ๊ธฐ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

const http = require("http");
const drone = require("dronestream");
 
const server = http.createServer(function(req, res) {
 
require("fs").createReadStream(__dirname + "/public/video.html").pipe(res);
 });
 
drone.listen(server);
 
server.listen(4000);

์—ฌ๊ธฐ์— HTML ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ณต์šฉ ํด๋”์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

<!doctype html>
 <html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>Stream as module</title>
 <script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
 </head>
 <body>
 <h1 id="heading">Drone video stream</h1>
 <div id="droneStream" style="width: 640px; height: 360px"> </div>
 
<script type="text/javascript" charset="utf-8">
 
new NodecopterStream(document.getElementById("droneStream"));
 
</script>
 
</body>
</html>

์ „๋ฉด ์นด๋ฉ”๋ผ์˜ ๋น„๋””์˜ค๋ฅผ ๋ณด๋ ค๋ฉด localhost:8080์„ ์‹คํ–‰ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜์„ธ์š”.

Node.js์™€ ARDrone์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ฌ๋ฆฌ์ฝฅํ„ฐ์˜ ์Œ์„ฑ ์ œ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ฉ๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ํŒ

  • ์ด ๋“œ๋ก ์„ ์‹ค๋‚ด์—์„œ ์กฐ์ข…ํ•ด๋ณด์„ธ์š”.
  • ์ด๋ฅ™ํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ๋“œ๋ก ์— ๋ณดํ˜ธ ์ปค๋ฒ„๋ฅผ ์”Œ์›Œ์ฃผ์„ธ์š”.
  • ๋ฐฐํ„ฐ๋ฆฌ๊ฐ€ ์ถฉ์ „๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • ๋“œ๋ก ์ด ์ด์ƒํ•˜๊ฒŒ ํ–‰๋™ํ•˜๋ฉด ๋“œ๋ก ์„ ์žก๊ณ  ๋’ค์ง‘์œผ์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ—ฌ๋ฆฌ์ฝฅํ„ฐ๊ฐ€ ๋น„์ƒ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜๊ณ  ๋กœํ„ฐ๊ฐ€ ์ฆ‰์‹œ ์ •์ง€๋ฉ๋‹ˆ๋‹ค.

์ค€๋น„๋œ ์ฝ”๋“œ ๋ฐ ๋ฐ๋ชจ

๋ผ์ด๋ธŒ ๋ฐ๋ชจ

๋‹ค์šด๋กœ๋“œ

๊ทธ๊ฒƒ์€ ๋‚˜์™”๋‹ค!

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ธฐ๊ณ„๊ฐ€ ๋ณต์ข…ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ง€์ผœ๋ณด๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์ฆ๊ฑฐ์›€์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋“œ๋ก ์ด ์Œ์„ฑ ๋ช…๋ น์„ ๋“ฃ๋„๋ก ๊ฐ€๋ฅด์น˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž ์–ผ๊ตด ์ธ์‹, ์ž์œจ ๋น„ํ–‰, ๋™์ž‘ ์ธ์‹ ๋“ฑ ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ๊ฐœ์„ ์„ ์œ„ํ•ด ๋ฌด์—‡์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

Skillbox๋Š” ๋‹ค์Œ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€