
Dans ce tutoriel, nous allons examiner la création d'un programme pour un drone avec contrôle vocal utilisant Node.js et l'API Web Speech. Le drone est un Parrot ARDrone 2.0.
Rappelons-le : pour tous les lecteurs de « Habr » — une réduction de 10 000 roubles lors de l'inscription à tout cours Skillbox avec le code promo « Habr ».
Skillbox recommande : Cours pratique .
Introduction
Les drones sont incroyables. J'adore jouer avec mon drone, capturant des photos et des vidéos ou tout simplement pour le plaisir. Mais les drones (UAV) ne sont pas seulement utilisés pour le divertissement. Ils sont employés dans le cinéma, étudient les glaciers, et sont utilisés par des militaires et des professionnels de l'agriculture.
Dans ce tutoriel, nous allons explorer la création d'un programme qui permettra de contrôler le drone à l'aide de commandes vocales. Oui, le drone fera ce que vous lui dites. À la fin de l'article, vous trouverez le programme complet et une vidéo de contrôle de l'UAV.
Matériel
Nous avons besoin de ce qui suit :
- Parrot ARDrone 2.0;
- Câble Ethernet;
- un bon microphone.
Le développement et le contrôle se feront sur des stations de travail sous Windows/Mac/Ubuntu. Personnellement, j'ai travaillé avec Mac et Ubuntu 18.04.
Logiciel
Téléchargez la dernière version de Node.js sur .
Une version à jour de .
Découverte du drone
Essayons de comprendre comment fonctionne le Parrot ARDrone. Ce drone est équipé de quatre moteurs.

Les moteurs opposés tournent dans la même direction. Une paire tourne dans le sens des aiguilles d'une montre, l'autre dans le sens inverse. Le drone se déplace en modifiant son angle par rapport au sol, en changeant la vitesse de rotation des moteurs et en effectuant quelques manœuvres.

Comme nous le voyons sur le diagramme ci-dessus, modifier différents paramètres entraîne un changement de direction du drone. Par exemple, diminuer ou augmenter la vitesse de rotation des rotors gauche et droit crée un inclinaison. Cela permet au drone de voler en avant ou en arrière.
En modifiant la vitesse et la direction des moteurs, nous définissons des angles d'inclinaison, permettant au drone de se déplacer dans d'autres directions. Pour ce projet spécifique, il n'est pas nécessaire d'étudier l'aérodynamique, il suffit de comprendre les principes de base.
Fonctionnement du Parrot ARDrone
Le drone fonctionne comme un point d'accès Wi-Fi. Pour recevoir et envoyer des commandes au drone, il faut s'y connecter. Il existe de nombreuses applications diverses permettant de contrôler les drones. Cela ressemble à peu près à ceci :

Une fois le drone connecté, ouvrez le terminal et tapez telnet 192.168.1.1 — il s'agit de l'IP du drone. Pour Linux, vous pouvez utiliser .
Architecture de l'application
Notre code sera divisé en plusieurs modules :
- une interface utilisateur avec une API vocale pour la détection de la voix ;
- filtrage des commandes et correspondance avec la référence ;
- envoi des commandes au drone ;
- diffusion en direct de la vidéo.
L'API fonctionne à condition d'avoir une connexion Internet. Pour cela, nous ajoutons une connexion Ethernet.
Il est temps de créer l'application !
Codons
Pour commencer, créons un nouveau dossier et basculons dessus à l'aide du terminal.
Ensuite, créons un projet Node en utilisant les commandes ci-dessous.
Pour commencer, installons les dépendances requises.
npm install
Nous allons prendre en charge les commandes suivantes :
- décollage ;
- atterrissage ;
- vers le haut — le drone monte d'un demi-mètre et se maintient en l'air ;
- vers le bas — il descend d'un demi-mètre et se maintient en l'air ;
- vers la gauche — il se déplace vers la gauche d'un demi-mètre ;
- vers la droite — il se déplace vers la droite d'un demi-mètre ;
- rotation — il tourne dans le sens des aiguilles d'une montre de 90 degrés ;
- vers l'avant — il avance d'un demi-mètre ;
- vers l'arrière — il recule d'un demi-mètre ;
- arrêt.
Voici le code qui permet de recevoir des commandes, de les filtrer et de contrôler le drone.
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();
// désactiver l'urgence
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('commande reçue ', req.body);
console.log('commandes existantes', commands);
let command = req.body.command.replace(/ /g,'');
if(commands.indexOf(command) !== -1) {
switch(command.toUpperCase()) {
case "TAKEOFF":
console.log('décolle le drone');
drone.takeoff();
break;
case "LAND":
console.log('atterrissage du drone');
drone.land();
break;
case "UP":
console.log('élève le drone d'un demi-mètre');
drone.up(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "DOWN":
console.log('descend le drone d'un demi-mètre');
drone.down(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOLEFT":
console.log('déplace le drone à gauche de 1 mètre');
drone.left(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "GORIGHT":
console.log('déplace le drone à droite de 1 mètre');
drone.right(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "TURN":
console.log('fait tourner le drone');
drone.clockwise(0.4);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOFORWARD":
console.log('déplace le drone en avant de 1 mètre');
drone.front(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOBACKWARD":
console.log('déplace le drone en arrière de 1 mètre');
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);Voici le code HTML et JavaScript qui écoute l'utilisateur et envoie une commande au serveur Node.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Application de notes contrôlées par la voix</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>Drone contrôlé par la voix</h1>
<p class="page-description">Une petite application qui vous permet de contrôler un drone AR par la voix</p>
<h3 class="no-browser-support">Désolé, votre navigateur ne prend pas en charge l'API Web Speech. Essayez d'ouvrir cette démo dans Google Chrome.</h3>
<div class="app">
<h3>Donnez la commande</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Créez une nouvelle note en tapant ou en utilisant la reconnaissance vocale." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Commencer l'enregistrement">Commencer la reconnaissance</button>
<button id="pause-record-btn" title="Mettre l'enregistrement en pause">Mettre la reconnaissance en pause</button>
<p id="recording-instructions">Appuyez sur le <strong>Commencer la reconnaissance</strong> bouton et accordez l'accès.</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>Et voici le code JavaScript pour gérer les commandes vocales en les envoyant au serveur 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'
});
};Démarrer l'application
L'application peut être lancée de la manière suivante (il est important de s'assurer que le drone est connecté au Wi-Fi et que le câble Ethernet est branché sur l'ordinateur).
Ouvrez localhost:3000 dans le navigateur et cliquez sur Démarrer la reconnaissance.

Essayez de contrôler le drone et amusez-vous.
Diffusion de vidéo depuis le drone
Dans le projet, créez un nouveau fichier et copiez-y ce code :
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);Voici le code HTML, placez-le dans le dossier public.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Flux en tant que module</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Flux vidéo de drone</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>Lancez et connectez-vous à localhost:8080 pour visionner la vidéo de la caméra frontale.

Conseils utiles
- Contrôlez ce drone à l'intérieur.
- Mettez toujours le capot de protection sur le drone avant le décollage.
- Vérifiez si la batterie est chargée.
- Si le drone se comporte étrangement, prenez-le par le bas et retournez-le. Cela mettra le drone en mode d'urgence, et les rotors s'arrêteront immédiatement.
Code prêt et démonstration
C'est réussi !
Écrire du code et ensuite voir la machine commencer à obéir vous procurera du plaisir ! Maintenant, nous avons compris comment faire écouter le drone les commandes vocales. En réalité, il y a bien plus de possibilités : reconnaissance faciale de l'utilisateur, vols autonomes, reconnaissance de gestes et bien plus encore.
Quelles améliorations pouvez-vous suggérer pour le programme ?
Skillbox recommande :
- Cours en ligne appliqué .
- Cours en ligne .
- Cours pratique d'un an .
Source : habr.com
