Pino-program namin ang voice control ng copter gamit ang Node.js at ARDrone

Pino-program namin ang voice control ng copter gamit ang Node.js at ARDrone

Sa tutorial na ito titingnan natin ang paglikha ng isang programa para sa isang drone na may kontrol sa boses gamit ang Node.js at Web speech API. Copter - Parrot ARDrone 2.0.

Pinapaalala namin sa iyo: para sa lahat ng mga mambabasa ng "Habr" - isang diskwento na 10 rubles kapag nag-enroll sa anumang kurso sa Skillbox gamit ang code na pang-promosyon ng "Habr".

Inirerekomenda ng Skillbox ang: Praktikal na kurso "Mobile Developer PRO".

Pagpapakilala

Ang mga drone ay kamangha-manghang. Talagang nasisiyahan akong maglaro kasama ang aking quad, kumuha ng mga larawan at video, o magsaya lang. Ngunit ang mga unmanned aerial vehicle (UAV) ay ginagamit para sa higit pa sa libangan. Nagtatrabaho sila sa sinehan, nag-aaral ng mga glacier, at ginagamit ng militar at mga kinatawan ng sektor ng agrikultura.

Sa tutorial na ito titingnan namin ang paglikha ng isang programa na magbibigay-daan sa iyo upang makontrol ang isang drone. gamit ang mga voice command. Oo, gagawin ng copter kung ano ang sasabihin mo. Sa dulo ng artikulo mayroong isang handa na programa at video ng kontrol ng UAV.

Iron

Kailangan namin ang sumusunod:

  • Parrot ARDrone 2.0;
  • Ethernet cable;
  • magandang mikropono.

Ang pagbuo at pamamahala ay isasagawa sa mga workstation na may Windows/Mac/Ubuntu. Sa personal, nagtrabaho ako sa Mac at Ubuntu 18.04.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС

I-download ang pinakabagong bersyon ng Node.js mula sa opisyal na site.

Kailangan din pinakabagong bersyon ng Google Chrome.

Pag-unawa sa copter

Subukan nating maunawaan kung paano gumagana ang Parrot ARDrone. Ang copter na ito ay may apat na motor.

Pino-program namin ang voice control ng copter gamit ang Node.js at ARDrone

Ang mga magkasalungat na motor ay gumagana sa parehong direksyon. Ang isang pares ay umiikot nang pakanan, ang isa pa ay pakaliwa. Ang drone ay gumagalaw sa pamamagitan ng pagpapalit ng anggulo ng pagkahilig na may kaugnayan sa ibabaw ng lupa, pagpapalit ng bilis ng pag-ikot ng mga motor at ilang iba pang mga maneuverable na paggalaw.

Pino-program namin ang voice control ng copter gamit ang Node.js at ARDrone

Tulad ng nakikita natin sa diagram sa itaas, ang pagbabago ng iba't ibang mga parameter ay humahantong sa isang pagbabago sa direksyon ng paggalaw ng copter. Halimbawa, ang pagbaba o pagtaas ng bilis ng pag-ikot ng kaliwa at kanang rotor ay lumilikha ng isang roll. Ito ay nagpapahintulot sa drone na lumipad pasulong o paatras.

Sa pamamagitan ng pagbabago ng bilis at direksyon ng mga motor, nagtatakda kami ng mga anggulo ng pagtabingi na nagpapahintulot sa copter na lumipat sa ibang direksyon. Sa totoo lang, para sa kasalukuyang proyekto ay hindi na kailangang pag-aralan ang aerodynamics, kailangan mo lamang na maunawaan ang mga pangunahing prinsipyo.

Paano gumagana ang Parrot ARDrone

Ang drone ay isang Wi-Fi hotspot. Upang makatanggap at magpadala ng mga utos sa copter, kailangan mong kumonekta sa puntong ito. Mayroong maraming iba't ibang mga application na nagbibigay-daan sa iyo upang makontrol ang mga quadcopter. Mukhang ganito ang lahat:

Pino-program namin ang voice control ng copter gamit ang Node.js at ARDrone

Sa sandaling nakakonekta ang drone, buksan ang terminal at telnet 192.168.1.1 - ito ang IP ng copter. Para sa Linux maaari mong gamitin Linux Busybox.

Arkitektura ng aplikasyon

Ang aming code ay mahahati sa mga sumusunod na module:

  • user interface na may speech API para sa voice detection;
  • pag-filter ng mga utos at paghahambing sa isang pamantayan;
  • pagpapadala ng mga utos sa drone;
  • live na video broadcast.

Gumagana ang API hangga't mayroong koneksyon sa Internet. Upang matiyak ito, nagdaragdag kami ng koneksyon sa Ethernet.

Panahon na upang lumikha ng isang application!

Code

Una, gumawa tayo ng bagong folder at lumipat dito gamit ang terminal.

Pagkatapos ay lumikha kami ng isang proyekto ng Node gamit ang mga utos sa ibaba.

Una, i-install namin ang mga kinakailangang dependencies.

install npmβ€Š

Susuportahan namin ang mga sumusunod na utos:

  • tangalin;
  • landing;
  • pataas - ang drone ay tumataas ng kalahating metro at lumilipad;
  • pababa - bumaba ng kalahating metro at nagyeyelo;
  • sa kaliwa - napupunta kalahating metro sa kaliwa;
  • sa kanan - pupunta ng kalahating metro sa kanan;
  • pag-ikot - umiikot sa clockwise 90 degrees;
  • pasulong - pasulong kalahating metro;
  • pabalik - bumalik kalahating metro;
  • huminto.

Narito ang code na nagbibigay-daan sa iyong tanggapin ang mga utos, i-filter ang mga ito at kontrolin ang 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);

At narito ang HTML at JavaScript code na nakikinig sa user at nagpapadala ng command sa Node server.

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

At pati na rin ang JavaScript code upang gumana sa mga voice command, na ipinapadala ang mga ito sa server ng 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'
 });
};

Ilunsad ang application

Maaaring ilunsad ang programa bilang mga sumusunod (mahalagang tiyakin na ang copter ay konektado sa Wi-Fi at ang Ethernet cable ay konektado sa computer).

Buksan ang localhost:3000 sa browser at i-click ang Start Recognition.

Pino-program namin ang voice control ng copter gamit ang Node.js at ARDrone

Sinusubukan naming kontrolin ang drone at masaya kami.

Pag-broadcast ng video mula sa isang drone

Sa proyekto, lumikha ng isang bagong file at kopyahin ang code na ito doon:

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

At narito ang HTML code, inilalagay namin ito sa loob ng pampublikong folder.

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

Ilunsad at kumonekta sa localhost:8080 upang tingnan ang video mula sa front camera.

Pino-program namin ang voice control ng copter gamit ang Node.js at ARDrone

Kapaki-pakinabang na mga tip

  • Ilipad ang drone na ito sa loob ng bahay.
  • Palaging ilagay ang proteksiyon na takip sa iyong drone bago umalis.
  • Suriin kung naka-charge ang baterya.
  • Kung kakaiba ang pag-uugali ng drone, hawakan ito at i-flip ito. Ilalagay ng pagkilos na ito ang copter sa emergency mode at agad na titigil ang mga rotor.

Handa na ang code at demo

LIVE DEMO

DOWNLOAD

Nangyari!

Ang pagsulat ng code at pagkatapos ay panoorin ang makina na nagsimulang sumunod ay magbibigay sa iyo ng kasiyahan! Ngayon ay naisip na namin kung paano magturo ng drone na makinig sa mga voice command. Sa katunayan, marami pang posibilidad: pagkilala sa mukha ng user, autonomous flight, pagkilala sa kilos at marami pa.

Ano ang maaari mong imungkahi upang mapabuti ang programa?

Inirerekomenda ng Skillbox ang:

Pinagmulan: www.habr.com

Magdagdag ng komento