Προγραμματίζουμε τον φωνητικό έλεγχο του copter χρησιμοποιώντας το Node.js και το ARDrone

Προγραμματίζουμε τον φωνητικό έλεγχο του copter χρησιμοποιώντας το Node.js και το ARDrone

Σε αυτό το σεμινάριο θα εξετάσουμε τη δημιουργία ενός προγράμματος για ένα drone με φωνητικό έλεγχο χρησιμοποιώντας το Node.js και το API ομιλίας Ιστού. Copter - Parrot ARDrone 2.0.

Υπενθύμιση: για όλους τους αναγνώστες του "Habr" - έκπτωση 10 ρούβλια κατά την εγγραφή σε οποιοδήποτε μάθημα Skillbox χρησιμοποιώντας τον κωδικό προσφοράς "Habr".

Το Skillbox προτείνει: Πρακτικό μάθημα "Mobile Developer PRO".

Εισαγωγή

Τα drones είναι καταπληκτικά. Μου αρέσει πολύ να παίζω με το τετράγωνό μου, να βγάζω φωτογραφίες και βίντεο ή απλώς να διασκεδάζω. Αλλά τα μη επανδρωμένα εναέρια οχήματα (UAV) χρησιμοποιούνται για κάτι περισσότερο από απλή ψυχαγωγία. Εργάζονται στον κινηματογράφο, μελετούν παγετώνες και χρησιμοποιούνται από τον στρατό και τους εκπροσώπους του αγροτικού τομέα.

Σε αυτό το σεμινάριο θα εξετάσουμε τη δημιουργία ενός προγράμματος που θα σας επιτρέψει να ελέγξετε ένα drone. χρησιμοποιώντας φωνητικές εντολές. Ναι, το ελικόπτερο θα κάνει αυτό που του λέτε να κάνει. Στο τέλος του άρθρου υπάρχει έτοιμο πρόγραμμα και βίντεο ελέγχου UAV.

Σίδερο

Χρειαζόμαστε τα εξής:

  • Parrot ARDrone 2.0;
  • Καλώδιο Ethernet?
  • καλό μικρόφωνο.

Η ανάπτυξη και η διαχείριση θα πραγματοποιηθούν σε σταθμούς εργασίας με Windows/Mac/Ubuntu. Προσωπικά, δούλεψα με Mac και Ubuntu 18.04.

Λογισμικό

Κατεβάστε την πιο πρόσφατη έκδοση του Node.js από επίσημη ιστοσελίδα.

Επίσης χρειάζεται τελευταία έκδοση του Google Chrome.

Κατανοώντας το ελικόπτερο

Ας προσπαθήσουμε να καταλάβουμε πώς λειτουργεί το Parrot ARDrone. Αυτό το ελικόπτερο έχει τέσσερις κινητήρες.

Προγραμματίζουμε τον φωνητικό έλεγχο του copter χρησιμοποιώντας το Node.js και το ARDrone

Οι αντίθετοι κινητήρες λειτουργούν προς την ίδια κατεύθυνση. Το ένα ζεύγος περιστρέφεται δεξιόστροφα, το άλλο αριστερόστροφα. Το drone κινείται αλλάζοντας τη γωνία κλίσης σε σχέση με την επιφάνεια της γης, αλλάζοντας την ταχύτητα περιστροφής των κινητήρων και αρκετές άλλες κινήσεις με δυνατότητα ελιγμών.

Προγραμματίζουμε τον φωνητικό έλεγχο του copter χρησιμοποιώντας το Node.js και το ARDrone

Όπως μπορούμε να δούμε στο παραπάνω διάγραμμα, η αλλαγή διαφόρων παραμέτρων οδηγεί σε αλλαγή της κατεύθυνσης κίνησης του copter. Για παράδειγμα, η μείωση ή η αύξηση της ταχύτητας περιστροφής του αριστερού και του δεξιού ρότορα δημιουργεί ένα ρολό. Αυτό επιτρέπει στο drone να πετάξει προς τα εμπρός ή προς τα πίσω.

Αλλάζοντας την ταχύτητα και την κατεύθυνση των κινητήρων, ορίζουμε γωνίες κλίσης που επιτρέπουν στο ελικόπτερο να κινείται προς άλλες κατευθύνσεις. Στην πραγματικότητα, για το τρέχον έργο δεν χρειάζεται να μελετήσετε αεροδυναμική, απλά πρέπει να κατανοήσετε τις βασικές αρχές.

Πώς λειτουργεί το Parrot ARDrone

Το drone είναι ένα hotspot Wi-Fi. Για να λάβετε και να στείλετε εντολές στο copter, πρέπει να συνδεθείτε σε αυτό το σημείο. Υπάρχουν πολλές διαφορετικές εφαρμογές που σας επιτρέπουν να ελέγχετε τετρακόπτερα. Όλα μοιάζουν κάπως έτσι:

Προγραμματίζουμε τον φωνητικό έλεγχο του copter χρησιμοποιώντας το Node.js και το ARDrone

Μόλις συνδεθεί το drone, ανοίξτε το τερματικό και το telnet 192.168.1.1 - αυτή είναι η IP του ελικόπτερου. Για Linux μπορείτε να χρησιμοποιήσετε Linux Busybox.

Αρχιτεκτονική εφαρμογών

Ο κώδικας μας θα χωριστεί στις ακόλουθες ενότητες:

  • διεπαφή χρήστη με API ομιλίας για ανίχνευση φωνής.
  • φιλτράρισμα εντολών και σύγκριση με ένα πρότυπο.
  • αποστολή εντολών στο drone.
  • ζωντανή μετάδοση βίντεο.

Το API λειτουργεί όσο υπάρχει σύνδεση στο Διαδίκτυο. Για να το διασφαλίσουμε αυτό, προσθέτουμε μια σύνδεση Ethernet.

Ήρθε η ώρα να δημιουργήσετε μια εφαρμογή!

Κώδικας

Αρχικά, ας δημιουργήσουμε έναν νέο φάκελο και ας μεταβούμε σε αυτόν χρησιμοποιώντας το τερματικό.

Στη συνέχεια δημιουργούμε ένα έργο Node χρησιμοποιώντας τις παρακάτω εντολές.

Αρχικά, εγκαθιστούμε τις απαιτούμενες εξαρτήσεις.

npm install 

Θα υποστηρίξουμε τις ακόλουθες εντολές:

  • απογείωση;
  • προσγείωση;
  • επάνω - το drone ανεβαίνει μισό μέτρο και αιωρείται.
  • κάτω - πέφτει μισό μέτρο και παγώνει.
  • προς τα αριστερά - πηγαίνει μισό μέτρο προς τα αριστερά.
  • προς τα δεξιά - πηγαίνει μισό μέτρο προς τα δεξιά.
  • περιστροφή - περιστρέφεται δεξιόστροφα 90 μοίρες.
  • προς τα εμπρός - πηγαίνει μπροστά μισό μέτρο.
  • πίσω - πηγαίνει πίσω μισό μέτρο.
  • να σταματήσει.

Εδώ είναι ο κωδικός που σας επιτρέπει να δέχεστε εντολές, να τις φιλτράρετε και να ελέγχετε το 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);

Και εδώ είναι ο κώδικας 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.

Προγραμματίζουμε τον φωνητικό έλεγχο του copter χρησιμοποιώντας το Node.js και το ARDrone

Προσπαθούμε να ελέγξουμε το drone και είμαστε ευχαριστημένοι.

Μετάδοση βίντεο από drone

Στο έργο, δημιουργήστε ένα νέο αρχείο και αντιγράψτε αυτόν τον κώδικα εκεί:

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 για προβολή βίντεο από την μπροστινή κάμερα.

Προγραμματίζουμε τον φωνητικό έλεγχο του copter χρησιμοποιώντας το Node.js και το ARDrone

Χρήσιμες συμβουλές

  • Πετάξτε αυτό το drone σε εσωτερικούς χώρους.
  • Τοποθετείτε πάντα το προστατευτικό κάλυμμα στο drone σας πριν απογειωθείτε.
  • Ελέγξτε εάν η μπαταρία είναι φορτισμένη.
  • Εάν το drone συμπεριφέρεται περίεργα, κρατήστε το πατημένο και αναποδογυρίστε το. Αυτή η ενέργεια θα θέσει το ελικόπτερο σε κατάσταση έκτακτης ανάγκης και οι ρότορες θα σταματήσουν αμέσως.

Έτοιμος κώδικας και επίδειξη

LIVE DEMO

ΛΗΨΗ

Συνέβη!

Το να γράψετε κώδικα και μετά να παρακολουθήσετε το μηχάνημα να αρχίζει να υπακούει θα σας δώσει ευχαρίστηση! Τώρα καταλάβαμε πώς να διδάξουμε ένα drone να ακούει φωνητικές εντολές. Στην πραγματικότητα, υπάρχουν πολύ περισσότερες δυνατότητες: αναγνώριση προσώπου χρήστη, αυτόνομες πτήσεις, αναγνώριση χειρονομιών και πολλά άλλα.

Τι μπορείτε να προτείνετε για τη βελτίωση του προγράμματος;

Το Skillbox προτείνει:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο