Kita program kontrol swara saka copter nggunakake Node.js lan ARDrone

Kita program kontrol swara saka copter nggunakake Node.js lan ARDrone

Ing tutorial iki kita bakal katon ing nggawe program kanggo drone karo kontrol swara nggunakake Node.js lan Web wicara API. Copter - Parrot ARDrone 2.0.

Kita ngelingake: kanggo kabeh sing maca "Habr" - diskon 10 rubel nalika ndhaptar kursus Skillbox nggunakake kode promosi "Habr".

Skillbox nyaranake: Kursus praktis "Mobile Developer PRO".

Pambuka

Drone apik tenan. Aku seneng banget muter quad, njupuk foto lan video, utawa mung seneng-seneng. Nanging kendaraan udara tanpa awak (UAV) digunakake luwih saka mung hiburan. Dheweke kerja ing bioskop, sinau gletser, lan digunakake dening militer lan wakil saka sektor pertanian.

Ing tutorial iki, kita bakal ndeleng nggawe program sing ngidini sampeyan ngontrol drone. nggunakake printah swara. Ya, copter bakal nindakake apa sing sampeyan suruh. Ing pungkasan artikel ana program siap-digawe lan video kontrol UAV.

Wesi

We kudu ing ngisor iki:

  • Parrot ARDrone 2.0;
  • kabel Ethernet;
  • mikropon apik.

Pangembangan lan manajemen bakal ditindakake ing workstation kanthi Windows/Mac/Ubuntu. Secara pribadi, aku kerja karo Mac lan Ubuntu 18.04.

Piranti lunak

Download versi paling anyar saka Node.js saka situs resmi.

Uga dibutuhake versi paling anyar saka Google Chrome.

Ngerti copter

Ayo coba ngerti cara kerjane Parrot ARDrone. Kopter iki duwe papat motor.

Kita program kontrol swara saka copter nggunakake Node.js lan ARDrone

Motor sing nglawan kerja ing arah sing padha. Siji pasangan muter searah jarum jam, sing liyane nglawan arah jarum jam. Drone gerakane kanthi ngganti sudut kecondongan relatif marang permukaan bumi, ngganti kecepatan rotasi motor lan sawetara gerakan maneuver liyane.

Kita program kontrol swara saka copter nggunakake Node.js lan ARDrone

Nalika kita bisa ndeleng ing diagram ndhuwur, ngganti macem-macem paramèter ndadékaké kanggo owah-owahan ing arah gerakan saka copter. Contone, mudun utawa nambah kacepetan rotasi rotor kiwa lan tengen nggawe muter. Iki ngidini drone mabur maju utawa mundur.

Kanthi ngganti kacepetan lan arah motor, kita nyetel sudut miring sing ngidini copter pindhah menyang arah liyane. Bener, kanggo proyek saiki ora perlu sinau aerodinamika, sampeyan mung kudu ngerti prinsip dhasar.

Cara kerjane Parrot ARDrone

Drone minangka hotspot Wi-Fi. Kanggo nampa lan ngirim printah kanggo copter, sampeyan kudu nyambung menyang titik iki. Ana macem-macem aplikasi sing ngidini sampeyan ngontrol quadcopter. Kabeh katon kaya iki:

Kita program kontrol swara saka copter nggunakake Node.js lan ARDrone

Sanalika drone disambungake, bukak terminal lan telnet 192.168.1.1 - iki IP copter. Kanggo Linux sampeyan bisa nggunakake Linux Busybox.

Arsitektur aplikasi

Kode kita bakal dipΓ©rang dadi modul ing ngisor iki:

  • antarmuka panganggo karo API wicara kanggo deteksi swara;
  • printah nyaring lan mbandhingakΓ© karo standar;
  • ngirim printah menyang drone;
  • siaran video langsung.

API bisa digunakake anggere ana sambungan Internet. Kanggo mesthekake iki, kita nambah sambungan Ethernet.

Wektu kanggo nggawe aplikasi!

Kode

Pisanan, ayo nggawe folder anyar lan ngalih nganggo terminal.

Banjur kita nggawe proyek Node nggunakake printah ing ngisor iki.

Pisanan, kita nginstal dependensi sing dibutuhake.

npm nginstalβ€Š

Kita bakal ndhukung printah ing ngisor iki:

  • lepas landas;
  • ndharat;
  • munggah - drone munggah setengah meter lan hovers;
  • mudhun - tiba setengah meter lan beku;
  • ngiwa - dadi setengah meter ing sisih kiwa;
  • sisih tengen - dadi setengah meter ing sisih tengen;
  • rotasi - muter searah jarum jam 90 derajat;
  • maju - maju setengah meter;
  • bali - bali setengah meter;
  • mandheg.

Iki kode sing ngidini sampeyan nampa printah, nyaring lan ngontrol 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);

Lan iki kode HTML lan JavaScript sing ngrungokake pangguna lan ngirim perintah menyang 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>

Lan uga kode JavaScript kanggo nggarap printah swara, dikirim menyang 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'
 });
};

Bukak aplikasi

Program bisa dibukak minangka nderek (iku penting kanggo mesthekake yen copter disambungake menyang Wi-Fi lan kabel Ethernet disambungake menyang komputer).

Bukak localhost:3000 ing browser banjur klik Start Recognition.

Kita program kontrol swara saka copter nggunakake Node.js lan ARDrone

Kita nyoba ngontrol drone lan seneng.

Siaran video saka drone

Ing proyek kasebut, gawe file anyar lan salin kode iki ing kana:

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

Lan iki kode HTML, kita sijine ing folder umum.

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

Bukak lan sambung menyang localhost:8080 kanggo ndeleng video saka kamera ngarep.

Kita program kontrol swara saka copter nggunakake Node.js lan ARDrone

Tip sing mbiyantu

  • Mabur drone iki ing njero ruangan.
  • Tansah sijine tutup protΓ¨ktif ing drone sadurunge njupuk.
  • Priksa manawa baterei wis diisi.
  • Yen drone tumindak aneh, terus mudhun lan flip. Tindakan iki bakal sijine copter menyang mode darurat lan rotors bakal langsung mandheg.

Kode siap lan demo

DEMO LANGSUNG

DOWNLOAD

Kedadeyan!

Nulis kode lan banjur nonton mesin wiwit manut bakal menehi kesenengan! Saiki kita wis ngerti carane ngajar drone kanggo ngrungokake printah swara. Nyatane, ana luwih akeh kemungkinan: pangenalan rai pangguna, penerbangan otonom, pangenalan gerakan lan liya-liyane.

Apa sampeyan bisa menehi saran kanggo nambah program kasebut?

Skillbox nyaranake:

Source: www.habr.com

Add a comment