Rydym yn rhaglennu rheolaeth llais ar y copter gan ddefnyddio Node.js ac ARDrone

Rydym yn rhaglennu rheolaeth llais ar y copter gan ddefnyddio Node.js ac ARDrone

Yn y tiwtorial hwn byddwn yn edrych ar greu rhaglen ar gyfer drôn gyda rheolaeth llais gan ddefnyddio Node.js ac API lleferydd Gwe. Copter - Parrot ARDrone 2.0.

Rydym yn atgoffa: i holl ddarllenwyr "Habr" - gostyngiad o 10 rubles wrth gofrestru ar unrhyw gwrs Skillbox gan ddefnyddio'r cod hyrwyddo "Habr".

Mae Skillsbox yn argymell: Cwrs ymarferol "Datblygwr Symudol PRO".

Cyflwyniad

Mae drones yn anhygoel. Rwy'n mwynhau chwarae gyda fy nghwad, tynnu lluniau a fideos, neu dim ond cael hwyl. Ond mae cerbydau awyr di-griw (UAVs) yn cael eu defnyddio ar gyfer mwy nag adloniant yn unig. Maent yn gweithio mewn sinema, yn astudio rhewlifoedd, ac yn cael eu defnyddio gan y fyddin a chynrychiolwyr y sector amaethyddol.

Yn y tiwtorial hwn byddwn yn edrych ar greu rhaglen a fydd yn caniatáu ichi reoli drôn. defnyddio gorchmynion llais. Bydd, bydd y copter yn gwneud yr hyn y dywedwch wrtho am ei wneud. Ar ddiwedd yr erthygl mae rhaglen a fideo parod o reolaeth UAV.

Haearn

Mae angen y canlynol arnom:

  • Parot ARDrone 2.0;
  • Cebl Ethernet;
  • meicroffon da.

Bydd gwaith datblygu a rheoli yn cael ei wneud ar weithfannau gyda Windows/Mac/Ubuntu. Yn bersonol, bûm yn gweithio gyda Mac a Ubuntu 18.04.

Meddalwedd

Lawrlwythwch y fersiwn diweddaraf o Node.js o safle swyddogol.

Angen hefyd fersiwn diweddaraf o Google Chrome.

Deall y copter

Gadewch i ni geisio deall sut mae Parrot ARDrone yn gweithio. Mae gan y copter hwn bedwar modur.

Rydym yn rhaglennu rheolaeth llais ar y copter gan ddefnyddio Node.js ac ARDrone

Mae moduron gwrthgyferbyniol yn gweithio i'r un cyfeiriad. Mae un pâr yn cylchdroi clocwedd, a'r llall yn wrthglocwedd. Mae'r drôn yn symud trwy newid ongl y gogwydd o'i gymharu ag wyneb y ddaear, gan newid cyflymder cylchdroi'r moduron a nifer o symudiadau maneuverable eraill.

Rydym yn rhaglennu rheolaeth llais ar y copter gan ddefnyddio Node.js ac ARDrone

Fel y gallwn weld yn y diagram uchod, mae newid paramedrau amrywiol yn arwain at newid cyfeiriad symudiad y copter. Er enghraifft, mae lleihau neu gynyddu cyflymder cylchdroi'r rotorau chwith a dde yn creu rholyn. Mae hyn yn caniatáu i'r drôn hedfan ymlaen neu yn ôl.

Trwy newid cyflymder a chyfeiriad y moduron, rydyn ni'n gosod onglau tilt sy'n caniatáu i'r copter symud i gyfeiriadau eraill. Mewn gwirionedd, ar gyfer y prosiect presennol nid oes angen astudio aerodynameg, does ond angen i chi ddeall yr egwyddorion sylfaenol.

Sut mae Parrot ARDrone yn gweithio

Mae'r drôn yn fan problemus Wi-Fi. Er mwyn derbyn ac anfon gorchmynion i'r copter, mae angen i chi gysylltu â'r pwynt hwn. Mae yna lawer o wahanol gymwysiadau sy'n eich galluogi i reoli quadcopters. Mae'r cyfan yn edrych fel hyn:

Rydym yn rhaglennu rheolaeth llais ar y copter gan ddefnyddio Node.js ac ARDrone

Cyn gynted ag y bydd y drôn wedi'i gysylltu, agorwch y derfynell a telnet 192.168.1.1 - dyma IP y copter. Ar gyfer Linux gallwch chi ei ddefnyddio Linux Busybox.

Pensaernïaeth cais

Bydd ein cod yn cael ei rannu i'r modiwlau canlynol:

  • rhyngwyneb defnyddiwr gydag API lleferydd ar gyfer canfod llais;
  • hidlo gorchmynion a chymharu â safon;
  • anfon gorchmynion i'r drôn;
  • darllediad fideo byw.

Mae'r API yn gweithio cyn belled â bod cysylltiad Rhyngrwyd. Er mwyn sicrhau hyn, rydym yn ychwanegu cysylltiad Ethernet.

Mae'n bryd creu cais!

Côd

Yn gyntaf, gadewch i ni greu ffolder newydd a newid iddo gan ddefnyddio'r derfynell.

Yna rydyn ni'n creu prosiect Node gan ddefnyddio'r gorchmynion isod.

Yn gyntaf, rydym yn gosod y dibyniaethau gofynnol.

npm gosod 

Byddwn yn cefnogi'r gorchmynion canlynol:

  • esgyn;
  • glanio;
  • up - mae’r drôn yn codi hanner metr ac yn hofran;
  • down - cwympo hanner metr a rhewi;
  • to the left - mynd hanner metr i’r chwith;
  • to the right - mynd hanner metr i’r dde;
  • cylchdro - cylchdroi clocwedd 90 gradd;
  • forward - mynd ymlaen hanner metr;
  • back - mynd yn ôl hanner metr;
  • stopio.

Dyma'r cod sy'n eich galluogi i dderbyn gorchmynion, eu hidlo a rheoli'r drôn.

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

A dyma'r cod HTML a JavaScript sy'n gwrando ar y defnyddiwr ac yn anfon gorchymyn i'r gweinydd 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>

A hefyd cod JavaScript i weithio gyda gorchmynion llais, gan eu hanfon at y gweinydd 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'
 });
};

Lansio'r cais

Gellir lansio'r rhaglen fel a ganlyn (mae'n bwysig sicrhau bod y copter wedi'i gysylltu â Wi-Fi a bod y cebl Ethernet wedi'i gysylltu â'r cyfrifiadur).

Agor localhost: 3000 yn y porwr a chliciwch ar Start Recognition.

Rydym yn rhaglennu rheolaeth llais ar y copter gan ddefnyddio Node.js ac ARDrone

Rydyn ni'n ceisio rheoli'r drôn ac yn hapus.

Darlledu fideo o drôn

Yn y prosiect, crëwch ffeil newydd a chopïwch y cod hwn yno:

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

A dyma'r cod HTML, rydyn ni'n ei osod y tu mewn i'r ffolder cyhoeddus.

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

Lansio a chysylltu â localhost: 8080 i weld fideo o'r camera blaen.

Rydym yn rhaglennu rheolaeth llais ar y copter gan ddefnyddio Node.js ac ARDrone

Awgrymiadau Defnyddiol

  • Hedfan hon drôn dan do.
  • Rhowch y gorchudd amddiffynnol ar eich drôn bob amser cyn tynnu.
  • Gwiriwch a yw'r batri wedi'i wefru.
  • Os yw'r drôn yn ymddwyn yn rhyfedd, daliwch ef i lawr a'i droi drosodd. Bydd y cam hwn yn rhoi'r copter yn y modd brys a bydd y rotorau'n stopio ar unwaith.

Cod parod a demo

DEMO BYW

LAWRLWYTHO

Digwyddodd!

Bydd ysgrifennu cod ac yna gwylio'r peiriant yn dechrau ufuddhau yn rhoi pleser i chi! Nawr rydyn ni wedi darganfod sut i ddysgu drôn i wrando ar orchmynion llais. Mewn gwirionedd, mae yna lawer mwy o bosibiliadau: adnabod wynebau defnyddwyr, hediadau ymreolaethol, adnabod ystumiau a llawer mwy.

Beth allwch chi ei awgrymu i wella'r rhaglen?

Mae Skillsbox yn argymell:

Ffynhonnell: hab.com

Ychwanegu sylw