แแ แแแแแแแแแจแ แฉแแแ แจแแแฎแแแแแ แแ แแแ แแแแก แจแแฅแแแแก แแ แแแแกแแแแก แฎแแแแแแ แแแแขแ แแแแก แแแแแงแแแแแแ Node.js แแ แแแ แแแขแงแแแแแแแก API. Copter - Parrot ARDrone 2.0.
แจแแแแฎแกแแแแแ: "Habr"-แแก แงแแแแ แแแแแฎแแแแแกแแแแก - แคแแกแแแแแแแ 10 แ แฃแแแแแแ Skillbox-แแก แแแแแกแแแแ แแฃแ แกแแ แฉแแ แแชแฎแแแกแแก "Habr" แกแแ แแแแแแ แแแแแก แแแแแงแแแแแแ.
Skillbox แแแ แฉแแแ: แแ แแฅแขแแแฃแแ แแฃแ แกแ
"Mobile Developer PRO" .
แจแแกแแแแแ
แแ แแแแแ แกแแแชแแ แแ. แแ แซแแแแแ แแกแแแแแแแแแก แฉแแแก แแแแแ แแกแแแ แแแแแจแ, แคแแขแแแแแก แแ แแแแแแแแแก แแแแแฆแแแ แแ แฃแแ แแแแ แแแ แแแแ. แแแแ แแ แฃแแแแแขแ แกแแคแ แแแ แแแแ แแขแแแ (UAVs) แแแแแแงแแแแแ แแ แ แแฎแแแแ แแแกแแ แแแแแ. แแกแแแ แแฃแจแแแแแ แแแแแจแ, แกแฌแแแแแแแ แแงแแแแแ แแแก แแ แแงแแแแแแ แกแแแฎแแแ แแแแ แแ แแแ แแ แฃแแ แกแแฅแขแแ แแก แฌแแ แแแแแแแแแแแแ.
แแ แขแฃแขแแ แแแแจแ แแแแแแฎแแแแแ แแ แแแ แแแแก แจแแฅแแแแก, แ แแแแแแช แกแแจแฃแแแแแแก แแแแชแแแ แแแ แแแ แแ แแแ. แฎแแแแแแ แแ แซแแแแแแแแก แแแแแงแแแแแแ. แแแแฎ, แแแแแแคแ แแแแแ แแแแแแแแแก แแแแก, แ แแกแแช แแฅแแแ แแขแงแแแ. แกแขแแขแแแก แแแแแก แแ แแก แแแ แแ แแแ แแแ แแ แแแแแ แฃแแแแแขแ แกแแคแ แแแ แแแแ แแขแแแแก แแแ แแแแก แจแแกแแฎแแ.
แ แแแแแก
แฉแแแ แแแญแแ แแแแ แจแแแแแแ:
- แแฃแแแงแฃแจแ ARDrone 2.0;
- Ethernet แแแแแแ;
- แแแ แแ แแแแ แแคแแแ.
แแแแแแแแ แแแ แแ แแแ แแแ แแแแฎแแ แชแแแแแแแ Windows/Mac/Ubuntu-แแก แแฅแแแ แกแแแฃแจแแ แกแแแแฃแ แแแแ. แแแ แแแแ แแ แแแฃแจแแแแแ Mac-แแแ แแ Ubuntu 18.04-แแแ.
แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแ
แฉแแแแขแแแ แแแ Node.js-แแก แฃแแฎแแแกแ แแแ แกแแ
แแกแแแ แกแแญแแ แแ
แแแแขแแ แแก แแแแแแ
แจแแแแชแแแแ แแแแแแแ, แแฃ แ แแแแ แแฃแจแแแแก แแฃแแแงแฃแจแ ARDrone. แแ แแแ แขแแคแ แแแก แแฅแแก แแแฎแ แซแ แแแ.
แกแแแแ แแกแแแ แ แซแ แแแแแ แแฃแจแแแแแ แแแแแ แแแแแ แแฃแแแแแ. แแ แแ แฌแงแแแแ แแ แฃแแแแก แกแแแแแก แแกแ แแก แแแแแ แแฃแแแแแ, แแแแ แ แแ แกแแแแแก แแกแ แแก แกแแฌแแแแแฆแแแแแแ. แแ แแแ แแแซแ แแแแก แแแแแแแฌแแก แแแแแแแ แแแ แจแแแแ แแแแ แแแฎแ แแแแแแก แแฃแแฎแแก แจแแชแแแแ, แซแ แแแแแแก แแ แฃแแแแก แกแแฉแฅแแ แแก แจแแชแแแแ แแ แ แแแแแแแแ แกแฎแแ แแแแแแ แแ แแแแแ แแแซแ แแแแแ.
แ แแแแ แช แแแแแ แแแชแแแฃแ แแแแแ แแแแแ แแฎแแแแแ, แกแฎแแแแแกแฎแแ แแแ แแแแขแ แแก แจแแชแแแ แแฌแแแแก แกแแแแแแซแแก แแแซแ แแแแแก แแแแแ แแฃแแแแแก แชแแแแแแแแก. แแแแแแแแแ, แแแ แชแฎแแแ แแ แแแ แฏแแแแ แ แแขแแ แแแแก แแ แฃแแแแก แกแแฉแฅแแ แแก แจแแแชแแ แแแ แแ แแแแ แแ แฅแแแแก แ แแแก. แแก แกแแจแฃแแแแแแก แแซแแแแก แแ แแแก แแคแ แแแแก แฌแแ แแ แฃแแแ.
แซแ แแแแแแก แกแแฉแฅแแ แแกแ แแ แแแแแ แแฃแแแแแก แจแแชแแแแ, แฉแแแ แแแงแแแแแ แแแฎแ แแก แแฃแแฎแแแแก, แ แแแแแแแช แกแแจแฃแแแแแแก แแซแแแแก แแแแขแแ แก แแแแแแแแแแแแก แกแฎแแ แแแแแ แแฃแแแแแ. แกแแแแแแแแแแจแ, แแแแแแแแ แ แแ แแแฅแขแแกแแแแก แแ แแ แแก แกแแญแแ แ แแแ แแแแแแแแแแก แจแแกแฌแแแแ, แแฅแแแ แฃแแ แแแแ แฃแแแ แแแกแแแแแ แซแแ แแแแแ แแ แแแชแแแแแ.
แ แแแแ แแฃแจแแแแก แแฃแแแงแฃแจแ ARDrone
แแ แแแ แแ แแก Wi-Fi-แแก แชแฎแแแ แฌแแ แขแแแ. แแแแกแแแแแก, แ แแ แแแแฆแแ แแ แแแแแแแแแ แแ แซแแแแแแแ แแแ แขแแ, แแฅแแแ แฃแแแ แแแฃแแแแจแแ แแแ แแ แฌแแ แขแแแก. แแ แกแแแแแก แแ แแแแแ แแแแกแฎแแแแแแฃแแ แแแแแแแชแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแ แแแ แแแแแแแแขแแ แแแ. แแก แงแแแแแคแแ แ แแกแ แแแแแแงแฃแ แแแ:
แ แแแแ แช แแ แแ แแแ แจแแแ แแแแแ, แแแฎแกแแแแ แขแแ แแแแแแ แแ แขแแแแแขแ 192.168.1.1 - แแก แแ แแก แแแแขแแ แแก IP. Linux-แแกแแแแก แจแแแแซแแแแ แแแแแแงแแแแ
แแแแแชแฎแแแแก แแ แฅแแขแแฅแขแฃแ แ
แฉแแแแ แแแแ แแแงแแคแแแ แแฅแแแแ แจแแแแแ แแแแฃแแแแแ:
- แแแแฎแแแ แแแแแก แแแขแแ แคแแแกแ แแแขแงแแแแแแแก API-แแ แฎแแแก แแแแชแแแแแกแแแแก;
- แแ แซแแแแแแแแก แแแคแแแขแแ แ แแ แกแขแแแแแ แขแแแ แจแแแแ แแแ;
- แแ แแแแกแแแแก แแ แซแแแแแแแแก แแแแแแแแ;
- แแแ แแแแแ แ แแแแแ แแแแแชแแแ.
API แแฃแจแแแแก แแแแแ, แกแแแแ แแ แแก แแแขแแ แแแขแ. แแแแก แฃแแ แฃแแแแแกแแงแแคแแ, แฉแแแ แแแแแขแแแ Ethernet แแแแจแแ แก.
แแแแแแแชแแแก แจแแฅแแแแก แแ แแ!
แแแแ
แฏแแ แจแแแฅแแแแ แแฎแแแ แกแแฅแแฆแแแแ แแ แแแแแแแแแ แแแกแแ แขแแ แแแแแแแก แแแแแงแแแแแแ.
แจแแแแแ แฉแแแ แแฅแแแแ Node แแ แแแฅแขแก แฅแแแแแ แแแชแแแฃแแ แแ แซแแแแแแแแก แแแแแงแแแแแแ.
แแแ แแแ แ แแแจแ, แฉแแแ แแแงแแแแแ แกแแญแแ แ แแแแแแแแแแฃแแแแแแก.
npm แแแกแขแแแแชแแโ
แฉแแแ แแฎแแ แก แแฃแญแแ แ แจแแแแแ แแ แซแแแแแแแก:
- แแคแ แแแ;
- แกแแแแกแแแขแ;
- แแแแแ - แแ แแแ แแแแก แแแฎแแแแ แ แแแขแ แแ แแ แชแฃแ แแแก;
- แฅแแแแแ - แแชแแแ แแแฎแแแแ แแแขแ แแ แแ แแงแแแแแ;
- แแแ แชแฎแแแ - แแแแแก แแแฎแแแแ แ แแแขแ แ แแแ แชแฎแแแ;
- แแแ แฏแแแแ - แแแแแก แแแฎแแแแ แ แแแขแ แ แแแ แฏแแแแ;
- แ แแขแแชแแ - แแ แฃแแแแก แกแแแแแก แแกแ แแก แแแแแ แแฃแแแแแ 90 แแ แแแฃแกแแ;
- แฌแแ - แฌแแ แแแแแก แแแฎแแแแ แ แแแขแ แแ;
- แฃแแแ - แแแแแก แฃแแแ แแแฎแแแแ แ แแแขแ แแ;
- แแแฉแแ แแแ.
แแฅ แแ แแก แแแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแแฆแแ แแ แซแแแแแแแ, แแแคแแแขแ แแ แแกแแแ แแ แแแแแขแ แแแแ แแ แแแ.
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 แแแแ, แ แแแแแแช แฃแกแแแแก แแแแฎแแแ แแแแแก แแ แแแแแแแแก แแ แซแแแแแแก Node แกแแ แแแ แแ.
<!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 แแแแ แฎแแแแแ แแ แซแแแแแแแแแ แแฃแจแแแแแกแแแแก, แแแแ แแแแแแแแ Node แกแแ แแแ แแ.
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-แแแ แแ Ethernet แแแแแแ แแแแแแจแแ แแแฃแแแ แแแแแแฃแขแแ แแแ).
แแแฎแกแแแแ localhost:3000 แแ แแฃแแแ แจแ แแ แแแแญแแ แแ Start Recognition-แก.
แแชแแแแแแ แแ แแแ แแแแแแแแขแ แแแแ แแ แแแแแแแ แแแ แแแ แ.
แแแแแแก แแแแแชแแแ แแ แแแแแแ
แแ แแแฅแขแจแ แจแแฅแแแแแ แแฎแแแ แคแแแแ แแ แแแแแแแแ แแ แแก แแแแ แแฅ:
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-แก, แ แแ แแแฎแแ แแแแแ แฌแแแ แแแแแ แแแแ.
แกแแกแแ แแแแแ แ แฉแแแแแ
- แแคแ แแแแ แแก แแ แแแ แจแแแแแแจแ.
- แงแแแแแแแแก แแแแแแ แแแแชแแแ แกแแคแแ แ แแฅแแแแก แแ แแแก แแคแ แแแแแแ.
- แจแแแแแฌแแแ แแแขแแ แแ แแแขแแแฃแแแ แแฃ แแ แ.
- แแฃ แแ แแแ แฃแชแแแฃแ แแ แแฅแชแแแ, แแแแญแแ แแ แแ แแแแแแขแ แแแแแ. แแก แฅแแแแแแ แแแแแแงแแแแแก แแแ แขแแคแ แแแก แแแแแฃแแแแแ แ แแแแแจแ แแ แ แแขแแ แแแ แแแฃแงแแแแแแแแ แแแฉแแ แแแแ.
แแแ แแแแ แแ แแแแ แแแ แกแแ
แแแฎแแ!
แแแแแก แแแฌแแ แ แแ แจแแแแแ แแแแฅแแแแก แแแแแ แฉแแแแแแก แงแฃแ แแแ แกแแแแแแแแแแก แแแแแแแญแแแ! แแฎแแ แฉแแแ แแแแแ แแแแแ, แ แแแแ แแแกแฌแแแแแ แแแแแแคแ แแแแแก แฎแแแแแแ แแ แซแแแแแแแแก แแแกแแแแ. แกแแแแแแแแแแจแ, แแแชแแแแแแ แแแขแ แจแแกแแซแแแแแแแแ: แแแแฎแแแ แแแแแก แกแแฎแแก แแแแชแแแแ, แแแขแแแแแแฃแ แ แคแ แแแแแ, แแแกแขแแแแก แแแแชแแแแ แแ แแ แแแแแ แกแฎแแ.
แ แแก แแแ แฉแแแ แแ แแแ แแแแก แแแกแแฃแแฏแแแแกแแแแแ?
Skillbox แแแ แฉแแแ:
- แแแแแ แแ แแแแแแ แแฃแ แกแก
"แแแแแแแก แแแแแชแแแแ แแแแแแขแแแแกแ" .- แแแแแแ แแฃแ แกแ
"แแ แแคแแกแแแก แคแ แแแขแแแแแก แแแแแแแแแ แ" .- แแ แแฅแขแแแฃแแ แฌแแแก แแฃแ แกแ
"PHP แแแแแแแแแ แ 0-แแแ PRO-แแแ" .
แฌแงแแ แ: www.habr.com