Tunapanga udhibiti wa sauti wa copter kwa kutumia Node.js na ARDrone

Tunapanga udhibiti wa sauti wa copter kwa kutumia Node.js na ARDrone

Katika somo hili tutaangalia kuunda programu ya drone yenye udhibiti wa sauti kwa kutumia Node.js na API ya hotuba ya Wavuti. Copter - Parrot ARDrone 2.0.

Tunakukumbusha: kwa wasomaji wote wa "Habr" - punguzo la rubles 10 wakati wa kujiandikisha katika kozi yoyote ya Skillbox kwa kutumia msimbo wa uendelezaji wa "Habr".

Skillbox inapendekeza: Kozi ya vitendo "Pro ya Msanidi Programu wa Simu".

Utangulizi

Drones ni ajabu. Ninafurahia sana kucheza na quad yangu, kupiga picha na video, au kufurahiya tu. Lakini magari ya angani yasiyo na rubani (UAVs) hutumiwa kwa zaidi ya burudani tu. Wanafanya kazi katika sinema, wanasoma barafu, na hutumiwa na wanajeshi na wawakilishi wa sekta ya kilimo.

Katika somo hili tutaangalia kuunda programu ambayo itawawezesha kudhibiti drone. kwa kutumia amri za sauti. Ndiyo, copter itafanya kile unachoiambia ifanye. Mwishoni mwa kifungu kuna programu iliyotengenezwa tayari na video ya udhibiti wa UAV.

Iron

Tunahitaji yafuatayo:

  • Parrot ARDrone 2.0;
  • Cable ya Ethernet;
  • kipaza sauti nzuri.

Maendeleo na usimamizi utafanywa kwenye vituo vya kazi na Windows/Mac/Ubuntu. Binafsi, nilifanya kazi na Mac na Ubuntu 18.04.

Programu

Pakua toleo jipya zaidi la Node.js kutoka tovuti rasmi.

Pia inahitajika toleo la hivi karibuni la Google Chrome.

Kuelewa copter

Hebu jaribu kuelewa jinsi Parrot ARDrone inavyofanya kazi. Copter hii ina motors nne.

Tunapanga udhibiti wa sauti wa copter kwa kutumia Node.js na ARDrone

Motors kupinga kazi katika mwelekeo huo. Jozi moja huzunguka saa, nyingine kinyume cha saa. Drone husogea kwa kubadilisha angle ya mwelekeo kuhusiana na uso wa dunia, kubadilisha kasi ya mzunguko wa motors na harakati zingine kadhaa zinazoweza kusongeshwa.

Tunapanga udhibiti wa sauti wa copter kwa kutumia Node.js na ARDrone

Kama tunavyoona kwenye mchoro hapo juu, kubadilisha vigezo mbalimbali husababisha mabadiliko katika mwelekeo wa harakati ya copter. Kwa mfano, kupunguza au kuongeza kasi ya mzunguko wa rotors ya kushoto na ya kulia huunda roll. Hii inaruhusu drone kuruka mbele au nyuma.

Kwa kubadilisha kasi na mwelekeo wa motors, tunaweka pembe za tilt ambazo huruhusu copter kuhamia kwa njia nyingine. Kweli, kwa mradi wa sasa hakuna haja ya kujifunza aerodynamics, unahitaji tu kuelewa kanuni za msingi.

Jinsi Parrot ARDrone inavyofanya kazi

Drone ni mtandao-hewa wa Wi-Fi. Ili kupokea na kutuma amri kwa copter, unahitaji kuunganisha kwenye hatua hii. Kuna programu nyingi tofauti zinazokuwezesha kudhibiti quadcopters. Yote inaonekana kama hii:

Tunapanga udhibiti wa sauti wa copter kwa kutumia Node.js na ARDrone

Mara tu drone inapounganishwa, fungua terminal na telnet 192.168.1.1 - hii ni IP ya copter. Kwa Linux unaweza kutumia Linux Busybox.

Usanifu wa maombi

Nambari yetu itagawanywa katika moduli zifuatazo:

  • interface ya mtumiaji na API ya hotuba ya kutambua sauti;
  • kuchuja amri na kulinganisha na kiwango;
  • kutuma amri kwa drone;
  • matangazo ya moja kwa moja ya video.

API inafanya kazi mradi tu kuna muunganisho wa Mtandao. Ili kuhakikisha hili, tunaongeza muunganisho wa Ethaneti.

Ni wakati wa kuunda programu!

Kanuni

Kwanza, hebu tuunde folda mpya na tubadilishe kwa kutumia terminal.

Kisha tunaunda mradi wa Node kwa kutumia amri hapa chini.

Kwanza, tunaweka tegemezi zinazohitajika.

npm kufungaβ€Š

Tutaunga mkono amri zifuatazo:

  • ondoka;
  • kutua;
  • juu - drone hupanda nusu ya mita na hovers;
  • chini - huanguka nusu ya mita na kufungia;
  • upande wa kushoto - huenda nusu ya mita kwenda kushoto;
  • kwa kulia - huenda nusu ya mita kwenda kulia;
  • mzunguko - huzunguka saa 90 digrii;
  • mbele - inakwenda mbele nusu ya mita;
  • nyuma - inarudi nusu ya mita;
  • acha.

Hapa kuna nambari inayokuruhusu kukubali amri, kuchuja na kudhibiti 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);

Na hapa kuna nambari ya HTML na JavaScript ambayo inasikiza mtumiaji na kutuma amri kwa seva ya 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>

Na pia msimbo wa JavaScript kufanya kazi na amri za sauti, kuzituma kwa seva ya 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'
 });
};

Kuzindua maombi

Programu inaweza kuzinduliwa kama ifuatavyo (ni muhimu kuhakikisha kuwa copter imeunganishwa kwenye Wi-Fi na cable ya Ethernet imeunganishwa kwenye kompyuta).

Fungua localhost:3000 kwenye kivinjari na ubofye Anza Utambuzi.

Tunapanga udhibiti wa sauti wa copter kwa kutumia Node.js na ARDrone

Tunajaribu kudhibiti drone na tunafurahi.

Inatangaza video kutoka kwa ndege isiyo na rubani

Katika mradi, unda faili mpya na unakili nambari hii hapo:

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

Na hapa kuna nambari ya HTML, tunaiweka ndani ya folda ya umma.

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

Zindua na uunganishe kwa localhost:8080 ili kutazama video kutoka kwa kamera ya mbele.

Tunapanga udhibiti wa sauti wa copter kwa kutumia Node.js na ARDrone

Useful Tips

  • Ingiza ndege hii isiyo na rubani ndani ya nyumba.
  • Daima weka kifuniko cha kinga kwenye drone yako kabla ya kupaa.
  • Angalia ikiwa betri imechajiwa.
  • Ikiwa drone itafanya kazi kwa njia ya ajabu, ishikilie na uipindue. Hatua hii itaweka copter katika hali ya dharura na rotors itaacha mara moja.

Msimbo tayari na onyesho

AISHI DEMO

PAKUA

Imetokea!

Nambari ya kuandika na kutazama mashine ikianza kutii itakupa raha! Sasa tumegundua jinsi ya kufundisha drone kusikiliza amri za sauti. Kwa kweli, kuna uwezekano mkubwa zaidi: utambuzi wa uso wa mtumiaji, ndege za uhuru, utambuzi wa ishara na mengi zaidi.

Unaweza kupendekeza nini ili kuboresha programu?

Skillbox inapendekeza:

Chanzo: mapenzi.com

Kuongeza maoni