Nous programmons le contrôle vocal de l'hélicoptère à l'aide de Node.js et ARDrone

Nous programmons le contrôle vocal de l'hélicoptère à l'aide de Node.js et ARDrone

Dans ce didacticiel, nous examinerons la création d'un programme pour un drone avec commande vocale à l'aide de Node.js et de l'API Web Speech. Hélicoptère - Parrot ARDrone 2.0.

Nous rappelons: pour tous les lecteurs de "Habr" - une remise de 10 000 roubles lors de l'inscription à n'importe quel cours Skillbox en utilisant le code promotionnel "Habr".

Skillbox vous recommande : Cours pratique "Développeur mobile PRO".

introduction

Les drones sont incroyables. J'aime beaucoup jouer avec mon quad, prendre des photos et des vidéos, ou simplement m'amuser. Mais les véhicules aériens sans pilote (UAV) ne sont pas utilisés uniquement pour le divertissement. Ils travaillent au cinéma, étudient les glaciers et sont utilisés par les militaires et les représentants du secteur agricole.

Dans ce tutoriel, nous verrons comment créer un programme qui vous permettra de contrôler un drone. en utilisant des commandes vocales. Oui, l'hélicoptère fera ce que vous lui dites de faire. À la fin de l'article, vous trouverez un programme prêt à l'emploi et une vidéo de contrôle du drone.

Fer

Nous avons besoin des éléments suivants :

  • Parrot ARDrone 2.0 ;
  • Câble Ethernet;
  • bon micro.

Le développement et la gestion seront effectués sur des postes de travail avec Windows/Mac/Ubuntu. Personnellement, j'ai travaillé avec Mac et Ubuntu 18.04.

Logiciel

Téléchargez la dernière version de Node.js à partir de site officiel.

Également nécessaire dernière version de Google Chrome.

Comprendre l'hélicoptère

Essayons de comprendre comment fonctionne le Parrot ARDrone. Cet hélicoptère dispose de quatre moteurs.

Nous programmons le contrôle vocal de l'hélicoptère à l'aide de Node.js et ARDrone

Les moteurs opposés fonctionnent dans le même sens. Une paire tourne dans le sens des aiguilles d’une montre, l’autre dans le sens inverse. Le drone se déplace en modifiant l'angle d'inclinaison par rapport à la surface de la terre, en modifiant la vitesse de rotation des moteurs et plusieurs autres mouvements maniables.

Nous programmons le contrôle vocal de l'hélicoptère à l'aide de Node.js et ARDrone

Comme nous pouvons le voir sur le schéma ci-dessus, la modification de divers paramètres entraîne un changement de direction de déplacement de l'hélicoptère. Par exemple, diminuer ou augmenter la vitesse de rotation des rotors gauche et droit crée un roulis. Cela permet au drone de voler vers l'avant ou vers l'arrière.

En modifiant la vitesse et la direction des moteurs, nous définissons des angles d'inclinaison qui permettent à l'hélicoptère de se déplacer dans d'autres directions. En fait, pour le projet actuel, il n'est pas nécessaire d'étudier l'aérodynamique, il suffit d'en comprendre les principes de base.

Comment fonctionne le Parrot ARDrone

Le drone est un hotspot Wi-Fi. Afin de recevoir et d'envoyer des commandes à l'hélicoptère, vous devez vous connecter à ce point. Il existe de nombreuses applications différentes qui vous permettent de contrôler des quadricoptères. Tout ressemble à ceci :

Nous programmons le contrôle vocal de l'hélicoptère à l'aide de Node.js et ARDrone

Dès que le drone est connecté, ouvrez le terminal et telnet 192.168.1.1 - c'est l'adresse IP de l'hélicoptère. Pour Linux, vous pouvez utiliser Boîte occupée Linux.

Architecture des applications

Notre code sera divisé en modules suivants :

  • interface utilisateur avec API vocale pour la détection vocale ;
  • filtrer les commandes et comparer avec un standard ;
  • envoyer des commandes au drone ;
  • diffusion vidéo en direct.

L'API fonctionne tant qu'il existe une connexion Internet. Pour garantir cela, nous ajoutons une connexion Ethernet.

Il est temps de créer une application !

Code

Commençons par créer un nouveau dossier et y accéder à l'aide du terminal.

Ensuite, nous créons un projet Node à l'aide des commandes ci-dessous.

Tout d’abord, nous installons les dépendances requises.

npm installer 

Nous prendrons en charge les commandes suivantes :

  • décoller;
  • un atterrissage;
  • vers le haut - le drone s'élève d'un demi-mètre et plane ;
  • vers le bas - tombe d'un demi-mètre et gèle;
  • à gauche - va un demi-mètre vers la gauche ;
  • à droite - va d'un demi-mètre vers la droite ;
  • rotation - tourne dans le sens des aiguilles d'une montre de 90 degrés ;
  • en avant - avance d'un demi-mètre;
  • retour - recule d'un demi-mètre;
  • arrêter

Voici le code qui permet d'accepter les 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();
// 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);

Et 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>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>

Et aussi du code JavaScript pour travailler avec 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'
 });
};

Lancement de l'application

Le programme peut être lancé comme suit (il est important de s'assurer que l'hélicoptère est connecté au Wi-Fi et que le câble Ethernet est connecté à l'ordinateur).

Ouvrez localhost:3000 dans le navigateur et cliquez sur Démarrer la reconnaissance.

Nous programmons le contrôle vocal de l'hélicoptère à l'aide de Node.js et ARDrone

Nous essayons de contrôler le drone et sommes heureux.

Diffusion de vidéo depuis un 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);

Et voici le code HTML, nous le plaçons dans le dossier public.

<!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>

Lancez et connectez-vous à localhost:8080 pour visualiser la vidéo de la caméra frontale.

Nous programmons le contrôle vocal de l'hélicoptère à l'aide de Node.js et ARDrone

Conseils utiles

  • Pilotez ce drone à l'intérieur.
  • Mettez toujours la housse de protection sur votre drone avant de décoller.
  • Vérifiez si la batterie est chargée.
  • Si le drone se comporte étrangement, maintenez-le enfoncé et retournez-le. Cette action mettra l'hélicoptère en mode d'urgence et les rotors s'arrêteront immédiatement.

Code prêt et démo

DEMO EN DIRECT

TÉLÉCHARGER

Il s'est avéré!

Écrire du code puis regarder la machine commencer à obéir vous fera plaisir ! Nous avons maintenant compris comment apprendre à un drone à écouter les commandes vocales. En fait, il existe bien plus de possibilités : reconnaissance faciale des utilisateurs, vols autonomes, reconnaissance gestuelle et bien plus encore.

Que pouvez-vous suggérer pour améliorer le programme ?

Skillbox vous recommande :

Source: habr.com

Ajouter un commentaire