Timakonza zowongolera mawu a copter pogwiritsa ntchito Node.js ndi ARDrone

Timakonza zowongolera mawu a copter pogwiritsa ntchito Node.js ndi ARDrone

Mu phunziro ili tiwona kupanga pulogalamu ya drone yokhala ndi mawu owongolera pogwiritsa ntchito Node.js ndi Web speaker API. Copter - Parrot ARDrone 2.0.

Tikukukumbutsani: kwa owerenga onse a Habr - kuchotsera ma ruble 10 polembetsa maphunziro aliwonse a Skillbox pogwiritsa ntchito nambala yotsatsira ya Habr.

Skillbox imalimbikitsa: Njira yothandiza "Mobile Developer PRO".

Mau oyamba

Drones ndi zodabwitsa. Ndimakonda kusewera ndi quad yanga, kujambula zithunzi ndi makanema, kapena kungosangalala. Koma magalimoto osayendetsedwa ndi ndege (UAVs) amagwiritsidwa ntchito mopitilira zosangalatsa. Amagwira ntchito m'mafilimu, amaphunzira za glaciers, ndipo amagwiritsidwa ntchito ndi asitikali ndi oimira gawo laulimi.

Mu phunziro ili tiwona kupanga pulogalamu yomwe ingakuthandizeni kuwongolera drone. kugwiritsa ntchito mawu. Inde, wojambulayo adzachita zomwe mukuwuza kuti achite. Kumapeto kwa nkhaniyo pali pulogalamu yopangidwa mokonzeka ndi kanema ya UAV control.

Iron

Tikufuna zotsatirazi:

  • Parrot ARDrone 2.0;
  • Ethernet chingwe;
  • maikolofoni yabwino.

Kupititsa patsogolo ndi kuyang'anira kudzachitika pa malo ogwirira ntchito ndi Windows/Mac/Ubuntu. Inemwini, ndinagwira ntchito ndi Mac ndi Ubuntu 18.04.

Software

Tsitsani mtundu waposachedwa wa Node.js kuchokera malo boma.

Komanso zofunika mtundu waposachedwa wa Google Chrome.

Kumvetsetsa copter

Tiyeni tiyese kumvetsetsa momwe Parrot ARDrone imagwirira ntchito. Copter iyi ili ndi ma mota anayi.

Timakonza zowongolera mawu a copter pogwiritsa ntchito Node.js ndi ARDrone

Ma injini otsutsa amagwira ntchito mofanana. Gulu limodzi limazungulira koloko, lina limayenda motsatira koloko. Drone imayenda posintha mbali yolowera padziko lapansi, kusintha liwiro la ma motors ndi zina zingapo zosunthika.

Timakonza zowongolera mawu a copter pogwiritsa ntchito Node.js ndi ARDrone

Monga tikuonera pa chithunzi pamwambapa, kusintha magawo osiyanasiyana kumabweretsa kusintha kwa kayendedwe ka copter. Mwachitsanzo, kuchepetsa kapena kuwonjezera liwiro la kuzungulira kumanzere ndi kumanja kumapanga mpukutu. Izi zimapangitsa kuti drone iwuluke kutsogolo kapena kumbuyo.

Mwa kusintha liwiro ndi njira ya ma motors, timayika ngodya zopendekera zomwe zimalola kuti copter ipite mbali zina. Kwenikweni, pa ntchito yamakono palibe chifukwa chowerengera aerodynamics, muyenera kumvetsetsa mfundo zoyambira.

Momwe Parrot ARDrone imagwirira ntchito

Drone ndi malo ochezera a Wi-Fi. Kuti mulandire ndi kutumiza malamulo ku copter, muyenera kulumikiza ku mfundo iyi. Pali mapulogalamu ambiri osiyanasiyana omwe amakupatsani mwayi wowongolera ma quadcopter. Zonse zikuwoneka motere:

Timakonza zowongolera mawu a copter pogwiritsa ntchito Node.js ndi ARDrone

Drone ikangolumikizidwa, tsegulani terminal ndi telnet 192.168.1.1 - iyi ndi IP ya copter. Kwa Linux mungagwiritse ntchito Linux Busybox.

Ntchito zomangamanga

Khodi yathu igawidwa m'ma module awa:

  • mawonekedwe ogwiritsa ntchito ndi API yolankhula kuti azindikire mawu;
  • malamulo osefa ndi kufanizitsa ndi muyezo;
  • kutumiza malamulo kwa drone;
  • kuwulutsa kwamavidiyo amoyo.

API imagwira ntchito bola ngati pali intaneti. Kuti tichite izi, timawonjezera kulumikizana kwa Ethernet.

Yakwana nthawi yoti mupange pulogalamu!

Kodi

Choyamba, tiyeni tipange chikwatu chatsopano ndikusintha nacho pogwiritsa ntchito terminal.

Kenako timapanga projekiti ya Node pogwiritsa ntchito malamulo omwe ali pansipa.

Choyamba, timayika zofunikira zofunika.

npm kukhazikitsa 

Tithandizira malamulo otsatirawa:

  • Nyamuka;
  • kutera;
  • mmwamba - drone ikukwera theka la mita ndikugwedezeka;
  • pansi - imagwera theka la mita ndikuzizira;
  • kumanzere - amapita theka la mita kumanzere;
  • kumanja - kupita theka la mita kumanja;
  • kuzungulira - kuzungulira 90 madigiri;
  • kutsogolo - kupita patsogolo theka la mita;
  • kumbuyo - kubwereranso theka la mita;
  • Imani.

Nayi kachidindo komwe kumakupatsani mwayi wovomereza malamulo, kusefa ndikuwongolera 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);

Ndipo nayi code ya HTML ndi JavaScript yomwe imamvera wogwiritsa ntchito ndikutumiza lamulo ku 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>

Komanso JavaScript code kuti mugwire ntchito ndi malamulo amawu, kuwatumiza ku 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'
 });
};

Kukhazikitsa ntchito

Pulogalamuyi ikhoza kukhazikitsidwa motere (ndikofunikira kuonetsetsa kuti copter ikugwirizana ndi Wi-Fi ndipo chingwe cha Efaneti chikugwirizana ndi kompyuta).

Tsegulani localhost:3000 mu msakatuli ndikudina Start Recognition.

Timakonza zowongolera mawu a copter pogwiritsa ntchito Node.js ndi ARDrone

Timayesetsa kulamulira drone ndi osangalala.

Kuwulutsa kanema kuchokera pa drone

Muntchitoyi, pangani fayilo yatsopano ndikukopera kachidindo aka:

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

Ndipo nayi nambala ya HTML, timayiyika mkati mwa chikwatu cha anthu onse.

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

Yambitsani ndikulumikiza ku localhost:8080 kuti muwone kanema kuchokera ku kamera yakutsogolo.

Timakonza zowongolera mawu a copter pogwiritsa ntchito Node.js ndi ARDrone

Malangizo othandiza

  • Thirani ndege iyi m'nyumba.
  • Nthawi zonse ikani chophimba choteteza pa drone yanu musananyamuke.
  • Yang'anani ngati batire yaperekedwa.
  • Ngati drone ikuchita modabwitsa, igwireni pansi ndikuitembenuza. Izi zidzayika copter muzochitika zadzidzidzi ndipo ma rotors adzasiya nthawi yomweyo.

Code yokonzeka ndi chiwonetsero

KHALA DEMO

DOWNLOAD

Zachitika!

Kulemba ndikuwonera makinawo akuyamba kumvera kungakusangalatseni! Tsopano tapeza momwe tingaphunzitsire drone kumvera malamulo amawu. M'malo mwake, pali zina zambiri: kuzindikira nkhope ya ogwiritsa ntchito, maulendo oyenda pandege, kuzindikira ndi manja ndi zina zambiri.

Kodi mungapangire chiyani kuti muwongolere pulogalamuyi?

Skillbox imalimbikitsa:

Source: www.habr.com

Kuwonjezera ndemanga