Бид Node.js болон ARDrone ашиглан нисдэг тэрэгний дуут хяналтыг програмчилдаг

Бид Node.js болон ARDrone ашиглан нисдэг тэрэгний дуут хяналтыг програмчилдаг

Энэ зааварт бид Node.js болон Web speaking API ашиглан дуут удирдлагатай дрон програмыг бүтээх талаар авч үзэх болно. Copter - Тоть ARDrone 2.0.

Бид танд сануулж байна: "Хабр" -ын бүх уншигчдад - "Habr" сурталчилгааны кодыг ашиглан Skillbox-ын аль ч курст бүртгүүлэхдээ 10 рублийн хөнгөлөлт.

Skillbox зөвлөж байна: Практик курс "Мобайл хөгжүүлэгч PRO".

Танилцуулга

Дронууд гайхалтай. Би квадтайгаа тоглох, зураг, бичлэг хийх, эсвэл зүгээр л хөгжилдөх дуртай. Гэвч нисгэгчгүй агаарын тээврийн хэрэгсэл (UAV) нь зөвхөн зугаа цэнгэлийн зориулалтаар ашиглагддаг. Тэд кино театрт ажиллаж, мөсөн голуудыг судалж, цэргийнхэн, хөдөө аж ахуйн салбарын төлөөлөгчид ашигладаг.

Энэ зааварт бид нисгэгчгүй онгоцыг удирдах боломжийг олгох програмыг бий болгох талаар авч үзэх болно. дуут команд ашиглах. Тиймээ, нисдэг тэрэг таны хэлсэн зүйлийг хийх болно. Өгүүллийн төгсгөлд UAV хяналтын бэлэн програм, видео бичлэг байна.

Төмөр

Бидэнд дараах зүйлс хэрэгтэй:

  • Тоть ARDrone 2.0;
  • Ethernet кабель;
  • сайн микрофон.

Windows/Mac/Ubuntu үйлдлийн системтэй ажлын станцууд дээр хөгжүүлэлт, менежмент хийгдэнэ. Би хувьдаа Mac болон Ubuntu 18.04 дээр ажиллаж байсан.

Програм хангамж

Node.js-ийн хамгийн сүүлийн хувилбарыг эндээс татаж авна уу албан ёсны сайт.

Мөн хэрэгтэй Google Chrome-ийн хамгийн сүүлийн хувилбар.

Коптерийг ойлгох

Parrot ARDrone хэрхэн ажилладагийг ойлгохыг хичээцгээе. Энэ нисдэг тэрэг дөрвөн мотортой.

Бид Node.js болон ARDrone ашиглан нисдэг тэрэгний дуут хяналтыг програмчилдаг

Эсрэг хөдөлгүүрүүд ижил чиглэлд ажилладаг. Нэг хос нь цагийн зүүний дагуу, нөгөө нь цагийн зүүний эсрэг эргэлддэг. Дрон нь дэлхийн гадаргуутай харьцуулахад налуу өнцгийг өөрчлөх, моторын эргэлтийн хурд болон бусад хэд хэдэн маневрлах хөдөлгөөнийг өөрчлөх замаар хөдөлдөг.

Бид Node.js болон ARDrone ашиглан нисдэг тэрэгний дуут хяналтыг програмчилдаг

Дээрх диаграммаас харахад янз бүрийн параметрүүдийг өөрчлөх нь коптерийн хөдөлгөөний чиглэлийг өөрчлөхөд хүргэдэг. Жишээлбэл, зүүн ба баруун роторын эргэлтийн хурдыг багасгах эсвэл нэмэгдүүлэх нь өнхрөхийг үүсгэдэг. Энэ нь дроныг урагш эсвэл хойшоо нисэх боломжийг олгодог.

Хөдөлгүүрийн хурд, чиглэлийг өөрчилснөөр бид нисдэг тэрэгний өөр чиглэлд шилжих боломжийг олгодог хазайлтын өнцгийг тогтоодог. Үнэн хэрэгтээ одоогийн төслийн хувьд аэродинамикийг судлах шаардлагагүй, та үндсэн зарчмуудыг ойлгох хэрэгтэй.

Parrot ARDrone хэрхэн ажилладаг

Дрон нь Wi-Fi холболтын цэг юм. Коптер руу команд хүлээн авах, илгээхийн тулд та энэ цэг рүү холбогдох хэрэгтэй. Квадрокоптерийг удирдах боломжийг олгодог олон төрлийн програмууд байдаг. Энэ бүхэн иймэрхүү харагдаж байна:

Бид Node.js болон ARDrone ашиглан нисдэг тэрэгний дуут хяналтыг програмчилдаг

Дрон холбогдсон даруйд терминал болон telnet 192.168.1.1-ийг нээнэ үү - энэ бол коптерийн IP юм. Линуксийн хувьд та ашиглаж болно Linux Busybox.

Хэрэглээний архитектур

Манай код дараах модулиудад хуваагдана.

  • дуу хоолой илрүүлэх ярианы API бүхий хэрэглэгчийн интерфейс;
  • командуудыг шүүж, стандарттай харьцуулах;
  • дрон руу тушаал илгээх;
  • шууд видео нэвтрүүлэг.

Интернэт холболт байгаа тохиолдолд API ажилладаг. Үүнийг баталгаажуулахын тулд бид Ethernet холболтыг нэмнэ.

Аппликешн үүсгэх цаг боллоо!

Код

Эхлээд шинэ хавтас үүсгээд терминал ашиглан түүн рүү шилжье.

Дараа нь бид доорх командуудыг ашиглан Node төслийг үүсгэнэ.

Эхлээд бид шаардлагатай хамаарлыг суулгана.

npm суулгах 

Бид дараах тушаалуудыг дэмжих болно.

  • нисэх;
  • буух;
  • дээш - нисгэгчгүй онгоц хагас метрээр дээшилж, нисдэг;
  • доошоо - хагас метр унаж, хөлддөг;
  • зүүн тийш - хагас метр зүүн тийш явдаг;
  • баруун тийш - баруун тийш хагас метр явдаг;
  • эргэлт - цагийн зүүний дагуу 90 градус эргэдэг;
  • урагшлах - хагас метр урагшлах;
  • буцах - хагас метр ухрах;
  • Зогс.

Команд хүлээн авч, шүүж, дроныг удирдах боломжтой код энд байна.

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

Энд хэрэглэгчийг сонсож, Node сервер рүү команд илгээдэг HTML болон JavaScript код байна.

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

Мөн дуут командтай ажиллах JavaScript кодыг зангилааны сервер рүү илгээдэг.

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

Програмыг ажиллуулна уу

Хөтөлбөрийг дараах байдлаар ажиллуулж болно (хүрээлэгч нь Wi-Fi-д холбогдсон, Ethernet кабель компьютерт холбогдсон эсэхийг шалгах нь чухал).

Хөтөч дээр localhost:3000-г нээгээд "Танилтыг эхлүүлэх" дээр дарна уу.

Бид Node.js болон ARDrone ашиглан нисдэг тэрэгний дуут хяналтыг програмчилдаг

Бид дроныг удирдахыг хичээдэг бөгөөд баяртай байдаг.

Дроноос видео цацаж байна

Төсөлд шинэ файл үүсгээд энэ кодыг тэнд хуулна уу:

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

Энд HTML код байна, бид үүнийг нийтийн хавтас дотор байрлуулна.

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

Урд камераас видео үзэхийн тулд localhost:8080-г ажиллуулж, холбогдоно уу.

Бид Node.js болон ARDrone ашиглан нисдэг тэрэгний дуут хяналтыг програмчилдаг

Ашигтай зөвлөмжүүд

  • Энэ дроныг дотор нь нисгээрэй.
  • Хөөрөхөөсөө өмнө нисгэгчгүй онгоцондоо хамгаалалтын бүрээсийг байнга зүүж байгаарай.
  • Зай цэнэглэгдсэн эсэхийг шалгана уу.
  • Хэрэв дрон хачирхалтай авирлаж байвал доош нь бариад эргүүлээрэй. Энэ үйлдэл нь нисэгчийг яаралтай горимд оруулах бөгөөд роторууд нэн даруй зогсох болно.

Бэлэн код болон демо

ХАЙРТАЙ ДЕМО

Татаж авах

Боллоо!

Код бичээд дараа нь машин дагаж эхлэхийг харах нь танд таашаал өгөх болно! Одоо бид дроныг дуут командыг сонсохыг хэрхэн сургах талаар олж мэдсэн. Үнэн хэрэгтээ илүү олон боломжууд бий: хэрэглэгчийн нүүр царай таних, бие даасан нислэг, дохио зангаа таних гэх мэт.

Хөтөлбөрийг сайжруулахын тулд юу санал болгох вэ?

Skillbox зөвлөж байна:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх