Kami memprogram kawalan suara helikopter menggunakan Node.js dan ARDrone

Kami memprogram kawalan suara helikopter menggunakan Node.js dan ARDrone

Dalam tutorial ini kita akan melihat untuk mencipta program untuk dron dengan kawalan suara menggunakan Node.js dan API pertuturan Web. Helikopter - Parrot ARDrone 2.0.

Kami mengingatkan: untuk semua pembaca "Habr" - diskaun sebanyak 10 rubel apabila mendaftar dalam mana-mana kursus Skillbox menggunakan kod promosi "Habr".

Skillbox mengesyorkan: Kursus praktikal "Pro Pembangun Mudah Alih".

Pengenalan

Drone sangat mengagumkan. Saya sangat seronok bermain dengan quad saya, mengambil foto dan video, atau hanya berseronok. Tetapi kenderaan udara tanpa pemandu (UAV) digunakan untuk lebih daripada sekadar hiburan. Mereka bekerja di pawagam, mengkaji glasier, dan digunakan oleh tentera dan wakil sektor pertanian.

Dalam tutorial ini kita akan melihat untuk mencipta program yang akan membolehkan anda mengawal dron. menggunakan arahan suara. Ya, helikopter akan melakukan apa yang anda suruh. Pada akhir artikel terdapat program siap sedia dan video kawalan UAV.

Besi

Kami memerlukan perkara berikut:

  • Parrot ARDrone 2.0;
  • Kabel Ethernet;
  • mikrofon yang baik.

Pembangunan dan pengurusan akan dijalankan pada stesen kerja dengan Windows/Mac/Ubuntu. Secara peribadi, saya bekerja dengan Mac dan Ubuntu 18.04.

Perisian

Muat turun versi terkini Node.js daripada laman rasmi.

Juga diperlukan versi terkini Google Chrome.

Memahami helikopter

Mari cuba fahami cara Parrot ARDrone berfungsi. Helikopter ini mempunyai empat motor.

Kami memprogram kawalan suara helikopter menggunakan Node.js dan ARDrone

Motor lawan berfungsi dalam arah yang sama. Satu pasangan berputar mengikut arah jam, satu lagi mengikut lawan jam. Drone bergerak dengan menukar sudut kecenderungan berbanding permukaan bumi, menukar kelajuan putaran motor dan beberapa pergerakan lain yang boleh dikendalikan.

Kami memprogram kawalan suara helikopter menggunakan Node.js dan ARDrone

Seperti yang dapat kita lihat dalam rajah di atas, menukar pelbagai parameter membawa kepada perubahan dalam arah pergerakan helikopter. Contohnya, mengurangkan atau meningkatkan kelajuan putaran pemutar kiri dan kanan menghasilkan gulungan. Ini membolehkan dron terbang ke hadapan atau ke belakang.

Dengan menukar kelajuan dan arah motor, kami menetapkan sudut kecondongan yang membolehkan helikopter bergerak ke arah lain. Sebenarnya, untuk projek semasa tidak perlu mengkaji aerodinamik, anda hanya perlu memahami prinsip asas.

Cara Parrot ARDrone berfungsi

Drone ialah hotspot Wi-Fi. Untuk menerima dan menghantar arahan kepada helikopter, anda perlu menyambung ke titik ini. Terdapat banyak aplikasi berbeza yang membolehkan anda mengawal quadcopters. Semuanya kelihatan seperti ini:

Kami memprogram kawalan suara helikopter menggunakan Node.js dan ARDrone

Sebaik sahaja dron disambungkan, buka terminal dan telnet 192.168.1.1 - ini ialah IP helikopter. Untuk Linux anda boleh gunakan Linux Busybox.

Seni bina aplikasi

Kod kami akan dibahagikan kepada modul berikut:

  • antara muka pengguna dengan API pertuturan untuk pengesanan suara;
  • perintah menapis dan membandingkan dengan standard;
  • menghantar arahan kepada dron;
  • siaran video secara langsung.

API berfungsi selagi terdapat sambungan Internet. Untuk memastikan ini, kami menambah sambungan Ethernet.

Sudah tiba masanya untuk membuat aplikasi!

Kod

Mula-mula, mari buat folder baharu dan tukar kepadanya menggunakan terminal.

Kemudian kami membuat projek Node menggunakan arahan di bawah.

Pertama, kami memasang kebergantungan yang diperlukan.

npm memasangβ€Š

Kami akan menyokong arahan berikut:

  • berlepas;
  • pendaratan;
  • ke atas - dron naik setengah meter dan melayang;
  • turun - jatuh setengah meter dan membeku;
  • ke kiri - pergi setengah meter ke kiri;
  • ke kanan - pergi setengah meter ke kanan;
  • putaran - berputar mengikut arah jam 90 darjah;
  • ke hadapan - pergi ke hadapan setengah meter;
  • belakang - kembali setengah meter;
  • berhenti.

Berikut ialah kod yang membolehkan anda menerima arahan, menapisnya dan mengawal 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);

Dan inilah kod HTML dan JavaScript yang mendengar pengguna dan menghantar arahan kepada pelayan 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>

Dan juga kod JavaScript untuk berfungsi dengan arahan suara, menghantarnya ke pelayan 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'
 });
};

Melancarkan aplikasi

Program ini boleh dilancarkan seperti berikut (ia adalah penting untuk memastikan bahawa helikopter disambungkan ke Wi-Fi dan kabel Ethernet disambungkan ke komputer).

Buka localhost:3000 dalam penyemak imbas dan klik Mulakan Pengecaman.

Kami memprogram kawalan suara helikopter menggunakan Node.js dan ARDrone

Kami cuba mengawal dron dan gembira.

Menyiarkan video daripada dron

Dalam projek, buat fail baharu dan salin kod ini di sana:

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);

Dan inilah kod HTML, kami meletakkannya di dalam folder awam.

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

Lancarkan dan sambungkan ke localhost:8080 untuk melihat video dari kamera hadapan.

Kami memprogram kawalan suara helikopter menggunakan Node.js dan ARDrone

Petua yang Berguna

  • Terbangkan dron ini di dalam rumah.
  • Sentiasa letakkan penutup pelindung pada dron anda sebelum berlepas.
  • Periksa sama ada bateri telah dicas.
  • Jika dron berkelakuan pelik, tahan dan balikkannya. Tindakan ini akan meletakkan helikopter ke dalam mod kecemasan dan pemutar akan berhenti serta-merta.

Kod sedia dan demo

LIVE DEMO

MUAT TURUN

Terjadi!

Menulis kod dan kemudian melihat mesin mula mematuhi akan memberi anda keseronokan! Kini kami telah mengetahui cara mengajar dron untuk mendengar arahan suara. Malah, terdapat lebih banyak kemungkinan: pengecaman muka pengguna, penerbangan autonomi, pengecaman gerak isyarat dan banyak lagi.

Apakah yang anda boleh cadangkan untuk menambah baik program ini?

Skillbox mengesyorkan:

Sumber: www.habr.com

Tambah komen