á€áááºáááºážá
á¬ááœáẠNode.js ááŸáá·áº Web speech API ááᯠá¡áá¯á¶ážááŒá¯á á¡áá¶ááááºážáá»á¯ááºááá¯ááºáá±á¬ ááá¯ááºážá¡ááœáẠáááá¯ááááºáá
áºáᯠáááºáá®ážááŒááºážááᯠáá±á·áá¬áá«áááºá Copter - Parrot ARDrone 2.0á
áá«ááá¯á·áááºážááá¯ááááá±ážááẠ"Habr" áá á¬áááºáá°á¡á¬ážáá¯á¶ážá¡ááœáẠ- "Habr" áááá¯ááá¯ážááŸááºážáá¯ááºááᯠá¡áá¯á¶ážááŒá¯á áááºááá·áº Skillbox áááºáááºážááœááºá á¬áááºážááœááºážááá·áºá¡áá« 10 áá°áááºáá»áŸá±á¬á·á á»á±ážá
Skillbox á០á¡ááŒá¶ááŒá¯áá¬ážáááº- áááºááœá±á·áááºáááºáž
"ááá¯ááá¯ááºáž Developer PRO" .
áááá«ááºáž
ááá¯ááºážááœá±á á¡á¶á·ááŒá áá¬áá«á áá»áœááºá¯ááºááẠáá»áœááºá¯ááºá quad ááŸáá·áº áá á¬ážááŒááºážá áá¬ááºáá¯á¶ááŸáá·áº áá®áá®ááá¯áá»á¬áž ááá¯ááºááŒááºáž (ááá¯á·) á¡áá»á±á¬áºáááºáž áá á¬ážááŒááºážááá¯á·ááᯠá¡ááŸááºáááẠááŸá áºáááºáá«áááºá ááá¯á·áá±á¬áº áá±á¬ááºážáá°áá²á·áá±áá¬ááºáá»á¬áž (UAV) áá»á¬ážááᯠáá»á±á¬áºááŒá±áá±ážáááºáááºááẠááá¯ááá¯á¡áá¯á¶ážááŒá¯ááŒáááºá áááºážááá¯á·ááẠáá¯ááºááŸááºáá¯á¶áá»á¬ážááœáẠá¡áá¯ááºáá¯ááºááŒááŒá®áž áá±áá²ááŒá áºáá»á¬ážááᯠáá±á·áá¬ááŒááŒá®áž á á áºáááºááŸáá·áº á áá¯ááºáá»áá¯ážáá±ážááá¹áá០ááá¯ááºá á¬ážááŸááºáá»á¬ážá á¡áá¯á¶ážááŒá¯ááŒáááºá
áá®áááºáááºážá á¬ááŸá¬áá±á¬á· áá±á¬ááºážáá°áá²á·áá±áá¬ááºááᯠááááºážáá»á¯ááºááá¯ááºááá·áº áááá¯ááááºáá áºáᯠáááºáá®ážáá¬ááᯠáá±á·áá¬ááŒáá·áºáá«áááºá á¡áá¶á¡áááá·áºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯. áá¯ááºáááºá áá±á¬áºááá¬á áááºážááŒá±á¬áá²á·á¡ááá¯ááºáž áá¯ááºáááá·áºáááºá áá±á¬ááºážáá«ážáá¡áá¯á¶ážááœáẠUAV ááááºážáá»á¯ááºááŸá¯ááá¯ááºáᬠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ áááá¯ááááºááŸáá·áº áá®áá®ááá¯áá áºáá¯ááŸááááºá
áá¶
áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá«ááá¯á·ááᯠááá¯á¡ááºáááº-
- ááŒááºáá°ááœá±áž ARDrone 2.0;
- á¡á®áá¬áááºááŒáá¯áž;
- ááá¯ááºáááá¯áá¯ááºážáá±á¬ááºáž
ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááŸáá·áº á á®áá¶ááá·áºááœá²ááŸá¯ááᯠWindows/Mac/Ubuntu ááŒáá·áº á¡áá¯ááºáá¯á¶áá»á¬ážááœáẠáá¯ááºáá±á¬ááºáááºááŒá áºáááºá ááá¯ááºááá¯ááºááá¯ááºáá»á áá« Mac ááŸáá·áº Ubuntu 18.04 ááŸáá·áºá¡áá¯ááºáá¯ááºáá²á·áááºá
áá±á¬á·áá»áá²
Node.js á áá±á¬ááºáá¯á¶ážáá¬ážááŸááºážááᯠáá±á«ááºážáá¯ááºáá¯ááºáá«á
ááá¯á¡ááºáááºáá»á¬ážáááºážááŸááááºá
áá±á¬áºááá¬áá¬ážáááºááŒááºážá
Parrot ARDrone á¡áá¯ááºáá¯ááºáá¯á¶ááᯠáá¬ážáááºá¡á±á¬áẠááŒáá¯ážá á¬ážááŒáá«á áá¯á·á á€áá±á¬áºááá¬ááœáẠáá±á¬áºáá¬áá±ážáá¯á¶ážáá«ááŸááááºá
ááá·áºáá»ááºáááºáá±á¬áºáá¬áá»á¬ážááẠáá°áá®áá±á¬áŠážáááºáá»ááºááœáẠá¡áá¯ááºáá¯ááºáááºá á¡ááœá²áá
áºááœá²ááẠáá¬áá®áááºáá¶á¡ááá¯ááºáž ááŸáá·áºáᬠáá±á¬ááºáá
áºáá¯ááẠáá¬áá®áááºáá¶á¡ááá¯ááºáž ááŸáá·áºáááºá ááá¯ááºážááẠááá¹áá¬ááŒá±áá»ááºááŸá¬ááŒááºááŸáá·áº áááºá
ááºáá±áá±á¬ ááááºážá
á±á¬ááºážááŸá¯áá±á¬áá·áºááᯠááŒá±á¬ááºážáá²ááŒááºážááŒáá·áº ááœá±á·áá»á¬ážáᬠáá±á¬áºáá¬áá»á¬ážá áááºáááºááŸá¯á¡ááŒááºááŸá¯ááºážááŸáá·áº á¡ááŒá¬ážáá±á¬ ááŸá±á¬ááºááœáŸá²ááá¯ááºáá±á¬ ááŸá¯ááºááŸá¬ážááŸá¯áá»á¬ážá
áœá¬ááᯠááŒá±á¬ááºážáá²ááŒááºážááŒáá·áº ááœá±á·áá»á¬ážáááºá
á¡áááºáá±á¬áºááŒáá« áá¯á¶ááœááºááŒááºáááá·áºá¡ááá¯ááºáž á¡áá»áá¯ážáá»áá¯ážáá±á¬ áá±á¬ááºáá»á¬ážááŒá±á¬ááºážáá²ááŒááºážááẠáá±á¬áºááá¬á ááœá±á·áá»á¬ážááŸá¯áááºážááŒá±á¬ááºážááᯠááŒá±á¬ááºážáá²á
á±áááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºáᬠááááºáá»á¬ážá áááºáááºááŸá¯ááºážááᯠáá»áŸá±á¬á·áá»ááŒááºáž ááá¯á·ááá¯áẠááá¯ážááŒáŸáá·áºááŒááºážááẠááááºááŒááºážááᯠáááºáá®ážáá±ážáááºá áááºážááẠááá¯ááºážá¡á¬áž ááŸá±á· ááá¯á·ááá¯áẠáá±á¬ááºááá¯á· áá»á¶áááºážááá¯ááºá
á±áá«áááºá
áá±á¬áºáá¬áá»á¬ážá á¡ááŸáááºááŸáá·áº áŠážáááºáá¬ááᯠááŒá±á¬ááºážáá²ááŒááºážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬áºááá¬á¡á¬áž á¡ááŒá¬ážáááºážááŒá±á¬ááºážááá¯á· ááœá±á·áá»á¬ážááá¯ááºá á±ááá·áº á á±á¬ááºážá á±á¬ááºážáá»á¬ážááᯠáááºááŸááºáá±ážáá«áááºá ááááºáá±á¬á· áááºááŸáááá±á¬áá»ááºá¡ááœáẠáá±ááœááºážá¡á¬ážááᯠáá±á·áá¬ááẠáááá¯á¡ááºáá² á¡ááŒá±áá¶áá°áá»á¬ážááᯠáá¬ážáááºáááºáᬠááá¯á¡ááºáá«áááºá
Parrot ARDrone á¡áá¯ááºáá¯ááºáá¯á¶
ááá¯ááºážááẠWi-Fi áá±á¬á·á áá±á«á·áá áºáá¯ááŒá áºáááºá áá±á¬áºááá¬áᶠá¡áááá·áºáá»á¬ážáááºáᶠáá±ážááá¯á·ááá¯ááºáááºá á€á¡áá»ááºááŸáá·áº áá»áááºáááºááẠááá¯á¡ááºáááºá quadcopters ááᯠááááºážáá»á¯ááºááá¯ááºá á±ááá·áº ááá°áá®áá±á¬ application áá»á¬ážá áœá¬ááŸááááºá á¡á¬ážáá¯á¶ážá á€áá²á·ááá¯á· ááŒá áºáááº-
ááá¯ááºážáá»áááºáááºááŒá®ážáááºááŸáá·áº terminal ááá¯ááœáá·áºááŒá®áž telnet 192.168.1.1 - áááºážááẠcopter á IP ááŒá
áºáááºá Linux á¡ááœáẠáááºáá¯á¶ážááá¯ááºáááºá
áá»áŸá±á¬ááºááœáŸá¬áááá¯áá¬
áá»áœááºá¯ááºááá¯á·ááá¯ááºááᯠá¡á±á¬ááºáá±á¬áºááŒáá« module áá»á¬ážá¡ááŒá Ạááá¯ááºážááŒá¬ážáá«áááºá
- á¡áá¶ááááŸáááá¯ááºááŸá¯á¡ááœáẠá áá¬ážááŒá±á¬ API áá«ááŸááá±á¬ á¡áá¯á¶ážááŒá¯áá° á¡ááºáá¬áá±á·á áºá
- á¡áááá·áºáá»á¬ážááᯠá á áºáá¯ááºááŒááºážááŸáá·áº á á¶áá áºáá¯ááŸáá·áº ááŸáá¯ááºážááŸááºááŒááºážá
- ááá¯ááºážááá¯á· á¡áááá·áºáá»á¬ážáá±ážááá¯á·ááŒááºážá
- ááá¯ááºááá¯ááºáá®áá®ááá¯áá¯ááºááœáŸáá·áºá
á¡ááºáá¬áááºáá»áááºáááºááŸá¯ááŸááá±áááœá±á· API ááẠá¡áá¯ááºáá¯ááºáá«áááºá áááºážááá¯áá±áá»á¬á á±áááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠEthernet áá»áááºáááºááŸá¯áá áºáá¯ááᯠááá·áºáá«áááºá
á¡ááºááá®áá±ážááŸááºážáá áºáá¯áááºáá®ážáááºá¡áá»áááºáá±á¬ááºááŒá®á
áá¯ááº
ááááŠážá áœá¬á ááá¯áá«á¡áá áºáá áºáá¯áááºáá®ážááŒá®áž terminal ááá¯á¡áá¯á¶ážááŒá¯á áááºážááá¯á·ááŒá±á¬ááºážááŒáá«á áá¯á·á
ááá¯á·áá±á¬áẠá¡á±á¬ááºáá±á¬áºááŒáá« command áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á Node ááá±á¬áá»ááºáá áºáá¯ááᯠáááºáá®ážáá«á
ááááŠážá áœá¬ áá»áœááºá¯ááºááá¯á·ááẠááá¯á¡ááºáá±á¬ ááŸá®ááá¯á¡á¬ážáá¬ážááŸá¯ááᯠááá·áºááœááºážáá«á
npm installâ
áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá« command áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá
- áá»á¶áááºáááº;
- áááºážáááº;
- á¡áá±á«áºááá¯á· - ááá¯ááºážááẠáá®áá¬áááºááá·áº áááºáá¬ááŒá®áž áá»á¶áá²áááºá
- á¡á±á¬áẠ- áá®áá¬áááºáá»áááºážááŒá®ážá¡á±ážáá²;
- áááºáááºááá¯á· - áááºáááºááá¯á· áá®áá¬áááºááá·áºááœá¬ážááẠá
- áá¬áááºá០- áá¬áááºááá¯á· áá®áá¬áááºááá·áºááœá¬ážááẠá
- ááŸáá·áºááŒááºáž - áááºáá¬áá Ạ90 áá®ááá®ááŸáá·áº;
- ááŸá±á·ááá¯á· - ááŸá±á·ááá¯á· áá®áá¬áááºá
- back - áá®áá¬áááºááŒááºááœá¬áž;
- áááºá
á€áááºááŸá¬ á¡áááá·áºáá»á¬ážááᯠáááºáá¶áááºá áááºážááá¯á·ááᯠá á áºáá¯ááºáááºááŸáá·áº ááá¯ááºážááᯠááááºážáá»á¯ááºááẠááœáá·áºááŒá¯ááá·áº áá¯ááºááŒá áºáááºá
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);
á€áááºááŸá¬ á¡áá¯á¶ážááŒá¯áá°á¡á¬áž áá¬ážáá±á¬ááºááŒá®áž Node áá¬áá¬ááá¯á· á¡áááá·áºáá±ážááá·áº 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>
ááá¯á·á¡ááŒáẠáááºážááá¯á·ááᯠNode áá¬áá¬ááá¯á· áá±ážááá¯á·ááŒááºážááŒáá·áº á¡áá¶ááŒáá·áº á¡áááá·áºáá±ážááŸá¯áá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááẠ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'
});
};
áá»áŸá±á¬ááºááœáŸá¬ááá¯ááœáá·áºááŒááºážá
á¡ááá¯áá«áááá¯ááááºááá¯á¡á±á¬ááºáá«á¡ááá¯ááºážá áááºáá¯ááºáá±á¬ááºááá¯ááºááẠ(copter ááᯠWi-Fi ááŸáá·áºáá»áááºáááºáá¬ážááŒá®áž Ethernet cable ááá¯ááœááºáá»á°áá¬ááŸáá·áºáá»áááºáááºáá¬ážááŒá±á¬ááºážáá±áá»á¬áááºá¡áá±ážááŒá®ážáááº) á
browser ááœáẠ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 á០á¡ááŒá¶ááŒá¯áá¬ážáááº-
- á¡áá¯á¶ážáá» á¡áœááºááá¯ááºážáááºáááºáž
"Python Data Analyst" .- á¡áœááºááá¯ááºážáááºáááºáž
"Profession Frontend Developer" .- áááºááœá±á· áá áºááŸá áºáááºáááºáž
"PHP developer 0 á០PRO" .
source: www.habr.com