Node.js ve ARDrone kullanarak helikopterin ses kontrolünü programlıyoruz

Node.js ve ARDrone kullanarak helikopterin ses kontrolünü programlıyoruz

Bu eğitimde Node.js ve Web konuşma API'sini kullanarak ses kontrolüne sahip bir drone için program oluşturmaya bakacağız. Helikopter - Papağan ARDrone 2.0.

Hatırlatıyoruz: tüm "Habr" okuyucuları için - "Habr" promosyon kodunu kullanarak herhangi bir Skillbox kursuna kayıt olurken 10 ruble indirim.

Skillbox şunları önerir: pratik kurs "Mobil Geliştirici PRO".

Giriş

Dronlar muhteşem. Quad'ımla oynamaktan, fotoğraf ve video çekmekten veya sadece eğlenmekten gerçekten keyif alıyorum. Ancak insansız hava araçları (İHA'lar) eğlenceden çok daha fazlası için kullanılıyor. Sinemada çalışıyorlar, buzulları inceliyorlar ve ordu ve tarım sektörü temsilcileri tarafından kullanılıyorlar.

Bu derste bir drone'u kontrol etmenizi sağlayacak bir program oluşturmaya bakacağız. sesli komutları kullanarak. Evet, helikopter ona yapmasını söylediğiniz şeyi yapacaktır. Yazının sonunda İHA kontrolünün hazır programı ve videosu bulunmaktadır.

demir

Aşağıdakilere ihtiyacımız var:

  • Papağan ARDrone 2.0;
  • Ethernet kablosu;
  • iyi mikrofon.

Geliştirme ve yönetim Windows/Mac/Ubuntu'lu iş istasyonlarında gerçekleştirilecektir. Şahsen Mac ve Ubuntu 18.04 ile çalıştım.

Yazılım

Node.js'nin en son sürümünü şu adresten indirin: resmi sitesi.

Ayrıca gerekli Google Chrome'un en son sürümü.

Helikopteri anlamak

Parrot ARDrone'un nasıl çalıştığını anlamaya çalışalım. Bu helikopterin dört motoru var.

Node.js ve ARDrone kullanarak helikopterin ses kontrolünü programlıyoruz

Karşılıklı motorlar aynı yönde çalışır. Bir çift saat yönünde, diğeri saat yönünün tersine döner. Drone, dünya yüzeyine göre eğim açısını değiştirerek, motorların dönüş hızını ve diğer birçok manevra kabiliyetini değiştirerek hareket eder.

Node.js ve ARDrone kullanarak helikopterin ses kontrolünü programlıyoruz

Yukarıdaki diyagramda da görebileceğimiz gibi çeşitli parametrelerin değiştirilmesi helikopterin hareket yönünün değişmesine neden olur. Örneğin sol ve sağ rotorların dönüş hızının azaltılması veya arttırılması bir yuvarlanma meydana getirir. Bu, drone'nun ileri veya geri uçmasını sağlar.

Motorların hızını ve yönünü değiştirerek helikopterin başka yönlere hareket etmesini sağlayacak eğim açılarını ayarlıyoruz. Aslında mevcut proje için aerodinamiği incelemenize gerek yok, sadece temel prensipleri anlamanız gerekiyor.

Parrot ARDrone nasıl çalışır?

Drone bir Wi-Fi erişim noktasıdır. Helikoptere komut alıp göndermek için bu noktaya bağlanmanız gerekmektedir. Quadcopterları kontrol etmenizi sağlayan birçok farklı uygulama vardır. Her şey şuna benziyor:

Node.js ve ARDrone kullanarak helikopterin ses kontrolünü programlıyoruz

Drone bağlanır bağlanmaz terminali açın ve telnet 192.168.1.1 - bu helikopterin IP adresidir. Linux için kullanabilirsiniz Linux Meşgul Kutusu.

Uygulama mimarisi

Kodumuz aşağıdaki modüllere ayrılacaktır:

  • ses algılama için konuşma API'sine sahip kullanıcı arayüzü;
  • komutların filtrelenmesi ve bir standartla karşılaştırılması;
  • drone'a komutlar göndermek;
  • canlı video yayını.

API, İnternet bağlantısı olduğu sürece çalışır. Bunu sağlamak için bir Ethernet bağlantısı ekliyoruz.

Bir uygulama oluşturmanın zamanı geldi!

Kod

Öncelikle yeni bir klasör oluşturalım ve terminali kullanarak ona geçiş yapalım.

Daha sonra aşağıdaki komutları kullanarak bir Node projesi oluşturuyoruz.

Öncelikle gerekli bağımlılıkları kuruyoruz.

npm kurulumu 

Aşağıdaki komutları destekleyeceğiz:

  • çıkarmak;
  • iniş;
  • yukarı - drone yarım metre yükselir ve havada asılı kalır;
  • aşağı - yarım metre düşer ve donar;
  • sola - yarım metre sola gider;
  • sağa - yarım metre sağa gider;
  • dönüş - saat yönünde 90 derece döner;
  • ileri - yarım metre ileri gider;
  • geri - yarım metre geriye gider;
  • Durdurun.

İşte komutları kabul etmenizi, filtrelemenizi ve drone'yu kontrol etmenizi sağlayan kod.

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

Ve işte kullanıcıyı dinleyen ve Node sunucusuna komut gönderen HTML ve JavaScript kodu.

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

Ayrıca sesli komutlarla çalışmak ve bunları Node sunucusuna göndermek için JavaScript kodu.

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

Uygulamayı başlatma

Program şu şekilde başlatılabilir (helikopterin Wi-Fi'ye bağlı olduğundan ve Ethernet kablosunun bilgisayara bağlı olduğundan emin olmak önemlidir).

Tarayıcıda localhost:3000'i açın ve Tanıma Başlat'a tıklayın.

Node.js ve ARDrone kullanarak helikopterin ses kontrolünü programlıyoruz

Drone'u kontrol etmeye çalışıyoruz ve mutluyuz.

Drone'dan video yayınlama

Projede yeni bir dosya oluşturun ve bu kodu buraya kopyalayın:

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

Ve işte HTML kodu, onu ortak klasörün içine yerleştiriyoruz.

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

Ön kameradan video görüntülemek için localhost:8080'i başlatın ve bağlanın.

Node.js ve ARDrone kullanarak helikopterin ses kontrolünü programlıyoruz

Faydalı İpuçları

  • Bu drone'u iç mekanlarda uçurun.
  • Kalkıştan önce daima drone'nuzun koruyucu kapağını takın.
  • Pilin şarjlı olup olmadığını kontrol edin.
  • Drone garip davranıyorsa onu basılı tutun ve ters çevirin. Bu eylem helikopteri acil durum moduna geçirecek ve rotorlar hemen duracaktır.

Hazır kod ve demo

CANLI DEMO

İNDİR

Çıktı!

Kod yazmak ve ardından makinenin uymaya başlamasını izlemek size keyif verecektir! Artık bir drone'a sesli komutları dinlemeyi nasıl öğreteceğimizi bulduk. Aslında çok daha fazla olasılık var: Kullanıcının yüz tanıması, otonom uçuşlar, jest tanıma ve çok daha fazlası.

Programı geliştirmek için neler önerebilirsiniz?

Skillbox şunları önerir:

Kaynak: habr.com

Yorum ekle