Koptera balss vadību programmējam izmantojot Node.js un ARDrone

Koptera balss vadību programmējam izmantojot Node.js un ARDrone

Šajā apmācībā apskatīsim, kā izveidot programmu dronam ar balss vadību, izmantojot Node.js un Web runas API. Kopteris - Parrot ARDrone 2.0.

Atgādinām: visiem "Habr" lasītājiem - atlaide 10 000 rubļu, reģistrējoties jebkurā Skillbox kursā, izmantojot "Habr" reklāmas kodu.

Skillbox iesaka: Praktiskais kurss "Mobile Developer PRO".

Ievads

Droni ir pārsteidzoši. Man ļoti patīk spēlēties ar savu kvadraciklu, fotografēt un filmēt vai vienkārši izklaidēties. Taču bezpilota lidaparātus (UAV) izmanto ne tikai izklaidei. Viņi strādā kino, pēta ledājus, tos izmanto militārpersonas un lauksaimniecības nozares pārstāvji.

Šajā apmācībā mēs apskatīsim, kā izveidot programmu, kas ļaus jums vadīt dronu. izmantojot balss komandas. Jā, kopteris darīs to, ko jūs tam liksit. Raksta beigās ir gatava UAV vadības programma un video.

dzelzs

Mums ir nepieciešams:

  • Parrot ARDrone 2.0;
  • Ethernet kabelis;
  • labs mikrofons.

Izstrāde un pārvaldība tiks veikta darbstacijās ar Windows/Mac/Ubuntu. Personīgi es strādāju ar Mac un Ubuntu 18.04.

Programmatūra

Lejupielādējiet jaunāko Node.js versiju no oficiālā vietne.

Vajadzīgs arī jaunākā Google Chrome versija.

Izpratne par kopteri

Mēģināsim saprast, kā darbojas Parrot ARDrone. Šim kopterim ir četri motori.

Koptera balss vadību programmējam izmantojot Node.js un ARDrone

Pretējie motori darbojas tajā pašā virzienā. Viens pāris griežas pulksteņrādītāja virzienā, otrs pretēji. Drons pārvietojas, mainot slīpuma leņķi attiecībā pret zemes virsmu, mainot motoru griešanās ātrumu un vairākas citas manevrējamas kustības.

Koptera balss vadību programmējam izmantojot Node.js un ARDrone

Kā redzams diagrammā augstāk, dažādu parametru maiņa noved pie koptera kustības virziena maiņas. Piemēram, samazinot vai palielinot kreisā un labā rotora rotācijas ātrumu, tiek izveidots rullītis. Tas ļauj dronam lidot uz priekšu vai atpakaļ.

Mainot motoru ātrumu un virzienu, mēs iestatām slīpuma leņķus, kas ļauj kopterim pārvietoties citos virzienos. Patiesībā šim projektam nav nepieciešams pētīt aerodinamiku, jums tikai jāsaprot pamatprincipi.

Kā darbojas Parrot ARDrone

Drons ir Wi-Fi tīklājs. Lai saņemtu un nosūtītu komandas kopterim, jums ir jāpieslēdzas šim punktam. Ir daudz dažādu lietojumprogrammu, kas ļauj vadīt kvadrokopterus. Tas viss izskatās apmēram šādi:

Koptera balss vadību programmējam izmantojot Node.js un ARDrone

Tiklīdz drons ir pievienots, atveriet termināli un telnet 192.168.1.1 - tas ir koptera IP. Linux varat izmantot Linux Busybox.

Lietojumprogrammu arhitektūra

Mūsu kods tiks sadalīts šādos moduļos:

  • lietotāja interfeiss ar runas API balss noteikšanai;
  • filtrēšanas komandas un salīdzināšana ar standartu;
  • komandu nosūtīšana dronam;
  • video tiešraide.

API darbojas tik ilgi, kamēr ir pieejams interneta savienojums. Lai to nodrošinātu, mēs pievienojam Ethernet savienojumu.

Ir pienācis laiks izveidot aplikāciju!

Kods

Vispirms izveidosim jaunu mapi un pārslēdzamies uz to, izmantojot termināli.

Pēc tam mēs izveidojam Node projektu, izmantojot tālāk norādītās komandas.

Pirmkārt, mēs instalējam vajadzīgās atkarības.

npm instalēt 

Mēs atbalstīsim šādas komandas:

  • vāc nost;
  • nosēšanās;
  • uz augšu - drons paceļas pusmetru un lidinās;
  • uz leju - nokrīt pusmetru un sasalst;
  • pa kreisi - iet pusmetru pa kreisi;
  • pa labi - iet pusmetru pa labi;
  • rotācija - griežas pulksteņrādītāja virzienā par 90 grādiem;
  • uz priekšu - iet uz priekšu pusmetru;
  • atpakaļ - atgriežas pusmetru;
  • Apstājies.

Šeit ir kods, kas ļauj pieņemt komandas, filtrēt tās un vadīt dronu.

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

Un šeit ir HTML un JavaScript kods, kas klausās lietotāju un nosūta komandu Node serverim.

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

Un arī JavaScript kods darbam ar balss komandām, nosūtot tās uz Node serveri.

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

Lietojumprogrammas palaišana

Programmu var palaist šādi (svarīgi ir pārliecināties, ka kopteris ir savienots ar Wi-Fi un Ethernet kabelis ir pievienots datoram).

Pārlūkprogrammā atveriet localhost:3000 un noklikšķiniet uz Sākt atpazīšanu.

Koptera balss vadību programmējam izmantojot Node.js un ARDrone

Cenšamies vadīt dronu un esam priecīgi.

Video pārraide no drona

Projektā izveidojiet jaunu failu un nokopējiet tur šo kodu:

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

Un šeit ir HTML kods, mēs to ievietojam publiskajā mapē.

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

Palaidiet un izveidojiet savienojumu ar localhost:8080, lai skatītu video no priekšējās kameras.

Koptera balss vadību programmējam izmantojot Node.js un ARDrone

Noderīgi padomi

  • Lidojiet ar šo dronu telpās.
  • Pirms pacelšanās dronam vienmēr uzlieciet aizsargapvalku.
  • Pārbaudiet, vai akumulators ir uzlādēts.
  • Ja drons uzvedas dīvaini, turiet to nospiestu un apgrieziet to otrādi. Šī darbība pārslēgs kopteri avārijas režīmā, un rotori nekavējoties apstāsies.

Gatavs kods un demonstrācija

TIEŠRAIDES DEMO

DOWNLOAD

Notika!

Rakstot kodu un pēc tam vērojot, kā iekārta sāk paklausīt, sagādās jums prieku! Tagad esam izdomājuši, kā iemācīt dronam klausīties balss komandas. Patiesībā ir daudz vairāk iespēju: lietotāja sejas atpazīšana, autonomi lidojumi, žestu atpazīšana un daudz kas cits.

Ko jūs varat ieteikt programmas uzlabošanai?

Skillbox iesaka:

Avots: www.habr.com

Pievieno komentāru