Programamos o control de voz do helicóptero mediante Node.js e ARDrone
Neste tutorial veremos como crear un programa para un dron con control de voz usando Node.js e a API de voz web. Copter - Parrot ARDrone 2.0.
Recordámolo:para todos os lectores de "Habr" - un desconto de 10 rublos ao inscribirse en calquera curso de Skillbox usando o código promocional "Habr".
Os drones son incribles. Gústame moito xogar co meu quad, facer fotos e vídeos ou simplemente divertirme. Pero os vehículos aéreos non tripulados (UAV) úsanse para algo máis que entretemento. Traballan no cine, estudan glaciares e son utilizados polos militares e representantes do sector agrícola.
Neste tutorial veremos como crear un programa que che permita controlar un dron. utilizando comandos de voz. Si, o helicóptero fará o que lle dis que faga. Ao final do artigo hai un programa listo e un vídeo de control de UAV.
Ferro
Necesitamos o seguinte:
Parrot ARDrone 2.0;
cable Ethernet;
bo micrófono.
O desenvolvemento e xestión realizarase en estacións de traballo con Windows/Mac/Ubuntu. Persoalmente, traballei con Mac e Ubuntu 18.04.
Software
Descarga a última versión de Node.js de web oficial.
Intentemos entender como funciona o Parrot ARDrone. Este helicóptero ten catro motores.
Os motores opostos traballan na mesma dirección. Un par xira no sentido horario, o outro no sentido antihorario. O dron móvese cambiando o ángulo de inclinación en relación á superficie da terra, cambiando a velocidade de rotación dos motores e outros movementos manobrables.
Como podemos ver no diagrama anterior, o cambio de varios parámetros leva a un cambio na dirección de movemento do helicóptero. Por exemplo, diminuír ou aumentar a velocidade de rotación dos rotores esquerdo e dereito crea un rolo. Isto permite que o dron voe cara adiante ou cara atrás.
Ao cambiar a velocidade e a dirección dos motores, establecemos ángulos de inclinación que permiten que o helicóptero se mova noutras direccións. En realidade, para o proxecto actual non hai que estudar aerodinámica, só hai que comprender os principios básicos.
Como funciona Parrot ARDrone
O dron é un punto de acceso wifi. Para recibir e enviar comandos ao helicóptero, cómpre conectarse a este punto. Hai moitas aplicacións diferentes que che permiten controlar quadcopters. Todo parece algo así:
Axiña que o dron estea conectado, abra o terminal e telnet 192.168.1.1: esta é a IP do helicóptero. Para Linux podes usar Linux Busybox.
Arquitectura de aplicacións
O noso código estará dividido nos seguintes módulos:
interface de usuario con API de voz para detección de voz;
filtrar comandos e comparar cun estándar;
enviar ordes ao dron;
transmisión de vídeo en directo.
A API funciona sempre que haxa unha conexión a Internet. Para garantir isto, engadimos unha conexión Ethernet.
É hora de crear unha aplicación!
Código
En primeiro lugar, imos crear un novo cartafol e cambiar a el usando o terminal.
A continuación, creamos un proxecto Node usando os seguintes comandos.
En primeiro lugar, instalamos as dependencias necesarias.
npm instalar
Apoiaremos os seguintes comandos:
despegar;
aterraxe;
arriba - o dron sobe medio metro e flota;
abaixo - cae medio metro e conxélase;
á esquerda - vai medio metro á esquerda;
á dereita - vai medio metro á dereita;
rotación - xira no sentido horario 90 graos;
adiante - avanza medio metro;
atrás - retrocede medio metro;
parar.
Aquí tes o código que che permite aceptar comandos, filtralos e controlar o dron.
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);
E aquí está o código HTML e JavaScript que escoita ao usuario e envía un comando ao servidor 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>
E tamén código JavaScript para traballar con comandos de voz, enviándoos ao servidor 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'
});
};
Lanzamento da aplicación
O programa pódese iniciar do seguinte xeito (é importante asegurarse de que o helicóptero estea conectado a Wi-Fi e o cable Ethernet está conectado ao ordenador).
Abre localhost:3000 no navegador e fai clic en Iniciar recoñecemento.
Intentamos controlar o dron e estamos contentos.
Emisión de vídeo desde un dron
No proxecto, crea un novo ficheiro e copia alí este código:
Inicie e conéctese a localhost:8080 para ver o vídeo da cámara frontal.
Consellos útiles
Voa este dron no interior.
Coloca sempre a funda protectora do teu dron antes de despegar.
Comproba se a batería está cargada.
Se o dron se comporta de forma estraña, manténo presionado e dálle a volta. Esta acción poñerá o helicóptero en modo de emerxencia e os rotores pararán inmediatamente.
Escribir código e ver como a máquina comeza a obedecer dará pracer! Agora descubrimos como ensinarlle a un dron a escoitar comandos de voz. De feito, hai moitas máis posibilidades: recoñecemento facial de usuario, voos autónomos, recoñecemento de xestos e moito máis.