Kami memprogram kontrol suara helikopter menggunakan Node.js dan ARDrone

Kami memprogram kontrol suara helikopter menggunakan Node.js dan ARDrone

Dalam tutorial ini kita akan melihat cara membuat program untuk drone dengan kontrol suara menggunakan Node.js dan Web Speech API. Helikopter - Burung Beo ARDrone 2.0.

Kami mengingatkan: untuk semua pembaca "Habr" - diskon 10 rubel saat mendaftar di kursus Skillbox apa pun menggunakan kode promosi "Habr".

Skillbox merekomendasikan: Tentu saja praktis "Pengembang Seluler PRO".

pengenalan

Drone memang luar biasa. Saya sangat menikmati bermain dengan quad saya, mengambil foto dan video, atau sekadar bersenang-senang. Namun kendaraan udara tak berawak (UAV) digunakan lebih dari sekedar hiburan. Mereka bekerja di bioskop, mempelajari gletser, dan digunakan oleh militer dan perwakilan sektor pertanian.

Dalam tutorial ini kita akan melihat cara membuat program yang memungkinkan Anda mengendalikan drone. menggunakan perintah suara. Ya, helikopter akan melakukan apa yang Anda perintahkan. Di akhir artikel terdapat program dan video pengendalian UAV yang sudah jadi.

Besi

Kami membutuhkan yang berikut ini:

  • Burung beo ARDrone 2.0;
  • Kabel Ethernet;
  • mikrofon yang bagus.

Pengembangan dan pengelolaan akan dilakukan pada workstation dengan Windows/Mac/Ubuntu. Secara pribadi, saya bekerja dengan Mac dan Ubuntu 18.04.

Perangkat lunak

Unduh Node.js versi terbaru dari situs resmi.

Juga diperlukan versi terbaru Google Chrome.

Memahami helikopter

Mari kita coba memahami cara kerja Parrot ARDrone. Helikopter ini memiliki empat motor.

Kami memprogram kontrol suara helikopter menggunakan Node.js dan ARDrone

Motor lawan bekerja dalam arah yang sama. Satu pasang berputar searah jarum jam, yang lainnya berlawanan arah jarum jam. Drone bergerak dengan cara mengubah sudut kemiringan relatif terhadap permukaan bumi, mengubah kecepatan putaran motor dan beberapa gerakan manuver lainnya.

Kami memprogram kontrol suara helikopter menggunakan Node.js dan ARDrone

Seperti yang bisa kita lihat pada diagram di atas, perubahan berbagai parameter menyebabkan perubahan arah pergerakan helikopter. Misalnya, menurunkan atau menambah kecepatan putaran rotor kiri dan kanan akan menimbulkan gulungan. Hal ini memungkinkan drone untuk terbang maju atau mundur.

Dengan mengubah kecepatan dan arah motor, kami mengatur sudut kemiringan yang memungkinkan helikopter bergerak ke arah lain. Sebenarnya untuk proyek kali ini tidak perlu mempelajari aerodinamika, cukup memahami prinsip dasarnya saja.

Bagaimana Parrot ARDrone bekerja

Drone adalah hotspot Wi-Fi. Untuk menerima dan mengirim perintah ke helikopter, Anda harus terhubung ke titik ini. Ada banyak aplikasi berbeda yang memungkinkan Anda mengontrol quadcopter. Semuanya terlihat seperti ini:

Kami memprogram kontrol suara helikopter menggunakan Node.js dan ARDrone

Segera setelah drone terhubung, buka terminal dan telnet 192.168.1.1 - ini adalah IP helikopter. Untuk Linux Anda dapat menggunakan Kotak Busy Linux.

Arsitektur aplikasi

Kode kita akan dibagi menjadi beberapa modul berikut:

  • antarmuka pengguna dengan API ucapan untuk deteksi suara;
  • memfilter perintah dan membandingkannya dengan standar;
  • mengirimkan perintah ke drone;
  • siaran video langsung.

API berfungsi selama ada koneksi Internet. Untuk memastikan hal ini, kami menambahkan koneksi Ethernet.

Saatnya membuat aplikasi!

Kode

Pertama, mari buat folder baru dan alihkan ke folder tersebut menggunakan terminal.

Kemudian kita membuat proyek Node menggunakan perintah di bawah ini.

Pertama, kita menginstal dependensi yang diperlukan.

instalasi npmβ€Š

Kami akan mendukung perintah berikut:

  • lepas landas;
  • pendaratan;
  • ke atas - drone naik setengah meter dan melayang;
  • turun - jatuh setengah meter dan membeku;
  • ke kiri - berjalan setengah meter ke kiri;
  • ke kanan - berjalan setengah meter ke kanan;
  • rotasi - berputar searah jarum jam sebesar 90 derajat;
  • maju - maju setengah meter;
  • kembali - mundur setengah meter;
  • berhenti.

Berikut adalah kode yang memungkinkan Anda menerima perintah, memfilternya, dan mengendalikan 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);

Dan berikut adalah kode HTML dan JavaScript yang mendengarkan pengguna dan mengirimkan perintah ke server 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 kode JavaScript untuk bekerja dengan perintah suara, mengirimkannya ke server 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'
 });
};

Meluncurkan aplikasi

Program ini dapat diluncurkan sebagai berikut (penting untuk memastikan bahwa helikopter terhubung ke Wi-Fi dan kabel Ethernet terhubung ke komputer).

Buka localhost:3000 di browser dan klik Mulai Pengenalan.

Kami memprogram kontrol suara helikopter menggunakan Node.js dan ARDrone

Kami mencoba mengendalikan drone dan merasa senang.

Menyiarkan video dari drone

Di proyek, buat file baru dan salin kode 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 ini kode HTMLnya, kita letakkan di dalam folder 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>

Luncurkan dan sambungkan ke localhost:8080 untuk melihat video dari kamera depan.

Kami memprogram kontrol suara helikopter menggunakan Node.js dan ARDrone

Tips Berguna

  • Terbangkan drone ini di dalam ruangan.
  • Selalu pasang penutup pelindung pada drone Anda sebelum lepas landas.
  • Periksa apakah baterai sudah terisi.
  • Jika drone berperilaku aneh, tahan dan balikkan. Tindakan ini akan menempatkan helikopter ke mode darurat dan rotor akan segera berhenti.

Kode dan demo siap

LIVE DEMO

DOWNLOAD

Telah terjadi!

Menulis kode dan kemudian melihat mesin mulai patuh akan memberi Anda kesenangan! Sekarang kita telah menemukan cara mengajari drone untuk mendengarkan perintah suara. Faktanya, ada lebih banyak kemungkinan: pengenalan wajah pengguna, penerbangan otonom, pengenalan gerakan, dan banyak lagi.

Apa yang dapat Anda sarankan untuk meningkatkan program ini?

Skillbox merekomendasikan:

Sumber: www.habr.com

Tambah komentar