Chúng tôi lập trình điều khiển giọng nói của máy bay trực thăng bằng Node.js và ARDrone

Chúng tôi lập trình điều khiển giọng nói của máy bay trực thăng bằng Node.js và ARDrone

Trong hướng dẫn này, chúng ta sẽ xem xét việc tạo một chương trình cho máy bay không người lái có điều khiển bằng giọng nói bằng cách sử dụng Node.js và API giọng nói trên Web. Copter - Vẹt ARDrone 2.0.

Chúng tôi nhắc nhở: cho tất cả độc giả của "Habr" - giảm giá 10 rúp khi đăng ký bất kỳ khóa học Skillbox nào bằng mã khuyến mại "Habr".

Hộp kỹ năng khuyến nghị: khóa học thực hành "Nhà phát triển di động PRO".

Giới thiệu

Máy bay không người lái thật tuyệt vời. Tôi thực sự thích chơi với chiếc quad của mình, chụp ảnh và quay video hoặc chỉ để giải trí. Nhưng máy bay không người lái (UAV) được sử dụng không chỉ cho mục đích giải trí. Chúng làm việc trong rạp chiếu phim, nghiên cứu về sông băng và được quân đội cũng như đại diện của ngành nông nghiệp sử dụng.

Trong hướng dẫn này, chúng ta sẽ xem xét việc tạo một chương trình cho phép bạn điều khiển máy bay không người lái. bằng cách sử dụng lệnh thoại. Có, máy photocopy sẽ làm những gì bạn bảo nó làm. Cuối bài viết có chương trình và video làm sẵn về điều khiển UAV.

Sắt

Chúng tôi cần những điều sau đây:

  • Vẹt ARDrone 2.0;
  • cáp Ethernet;
  • micro tốt.

Việc phát triển và quản lý sẽ được thực hiện trên các máy trạm chạy Windows/Mac/Ubuntu. Cá nhân tôi đã làm việc với Mac và Ubuntu 18.04.

Phần mềm

Tải xuống phiên bản mới nhất của Node.js từ trang web chính thức.

Cũng cần thiết phiên bản mới nhất của Google Chrome.

Hiểu về máy bay trực thăng

Chúng ta hãy cố gắng hiểu Parrot ARDrone hoạt động như thế nào. Máy bay trực thăng này có bốn động cơ.

Chúng tôi lập trình điều khiển giọng nói của máy bay trực thăng bằng Node.js và ARDrone

Động cơ đối diện làm việc theo cùng một hướng. Một cặp quay theo chiều kim đồng hồ, cặp kia quay ngược chiều kim đồng hồ. Máy bay không người lái di chuyển bằng cách thay đổi góc nghiêng so với bề mặt trái đất, thay đổi tốc độ quay của động cơ và một số chuyển động cơ động khác.

Chúng tôi lập trình điều khiển giọng nói của máy bay trực thăng bằng Node.js và ARDrone

Như chúng ta có thể thấy trong sơ đồ trên, việc thay đổi các tham số khác nhau sẽ dẫn đến thay đổi hướng chuyển động của máy photocopy. Ví dụ: giảm hoặc tăng tốc độ quay của rôto bên trái và bên phải sẽ tạo ra chuyển động cuộn. Điều này cho phép máy bay không người lái bay tiến hoặc lùi.

Bằng cách thay đổi tốc độ và hướng của động cơ, chúng tôi đặt các góc nghiêng cho phép máy photocopy di chuyển theo các hướng khác. Thực ra, đối với dự án hiện tại thì không cần phải nghiên cứu về khí động học, bạn chỉ cần hiểu những nguyên tắc cơ bản là được.

Cách thức hoạt động của Parrot ARDrone

Máy bay không người lái là một điểm phát sóng Wi-Fi. Để nhận và gửi lệnh đến máy photocopy, bạn cần kết nối với điểm này. Có nhiều ứng dụng khác nhau cho phép bạn điều khiển máy bay bốn cánh. Tất cả trông giống như thế này:

Chúng tôi lập trình điều khiển giọng nói của máy bay trực thăng bằng Node.js và ARDrone

Ngay sau khi máy bay không người lái được kết nối, hãy mở thiết bị đầu cuối và telnet 192.168.1.1 - đây là IP của máy photocopy. Đối với Linux bạn có thể sử dụng Linux Busybox.

Kiến trúc ứng dụng

Mã của chúng tôi sẽ được chia thành các mô-đun sau:

  • giao diện người dùng với API giọng nói để phát hiện giọng nói;
  • lọc lệnh và so sánh với chuẩn;
  • gửi lệnh đến máy bay không người lái;
  • phát sóng video trực tiếp.

API hoạt động miễn là có kết nối Internet. Để đảm bảo điều này, chúng tôi thêm kết nối Ethernet.

Đã đến lúc tạo một ứng dụng!

Mã số

Đầu tiên, hãy tạo một thư mục mới và chuyển sang thư mục đó bằng terminal.

Sau đó, chúng ta tạo một dự án Node bằng cách sử dụng các lệnh bên dưới.

Đầu tiên, chúng tôi cài đặt các phụ thuộc cần thiết.

NPM cài đặt 

Chúng tôi sẽ hỗ trợ các lệnh sau:

  • cởi;
  • đổ bộ;
  • lên - máy bay không người lái bay lên nửa mét và bay lơ lửng;
  • xuống - rơi nửa mét và đóng băng;
  • bên trái - đi nửa mét về bên trái;
  • bên phải - đi nửa mét về bên phải;
  • xoay - xoay theo chiều kim đồng hồ 90 độ;
  • về phía trước - đi về phía trước nửa mét;
  • lùi lại - lùi lại nửa mét;
  • Dừng lại.

Đây là mã cho phép bạn chấp nhận lệnh, lọc chúng và điều khiển máy bay không người lái.

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

Và đây là mã HTML và JavaScript lắng nghe người dùng và gửi lệnh đến máy chủ 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>

Và cả mã JavaScript để hoạt động với lệnh thoại, gửi chúng đến máy chủ 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'
 });
};

Khởi chạy ứng dụng

Chương trình có thể được khởi chạy như sau (điều quan trọng là đảm bảo rằng máy photocopy được kết nối với Wi-Fi và cáp Ethernet được kết nối với máy tính).

Mở localhost:3000 trong trình duyệt và nhấp vào Bắt đầu nhận dạng.

Chúng tôi lập trình điều khiển giọng nói của máy bay trực thăng bằng Node.js và ARDrone

Chúng tôi cố gắng điều khiển máy bay không người lái và rất vui.

Phát video từ máy bay không người lái

Trong dự án, tạo một tệp mới và sao chép mã này vào đó:

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

Và đây là mã HTML, chúng tôi đặt nó bên trong thư mục chung.

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

Khởi chạy và kết nối với localhost:8080 để xem video từ camera trước.

Chúng tôi lập trình điều khiển giọng nói của máy bay trực thăng bằng Node.js và ARDrone

Lời khuyên hữu ích

  • Bay máy bay không người lái này trong nhà.
  • Luôn đặt vỏ bảo vệ trên máy bay không người lái của bạn trước khi cất cánh.
  • Kiểm tra xem pin đã được sạc chưa.
  • Nếu máy bay không người lái hoạt động kỳ lạ, hãy giữ nó xuống và lật nó lại. Hành động này sẽ đưa máy photocopy vào chế độ khẩn cấp và cánh quạt sẽ dừng ngay lập tức.

Mã sẵn sàng và bản demo

BẢN THỬ TRỰC TIẾP

TẢI VỀ

Đã xảy ra!

Viết mã và sau đó xem máy bắt đầu tuân theo sẽ mang lại cho bạn niềm vui! Bây giờ chúng tôi đã tìm ra cách dạy máy bay không người lái nghe lệnh thoại. Trên thực tế, còn có nhiều khả năng hơn: nhận dạng khuôn mặt người dùng, chuyến bay tự động, nhận dạng cử chỉ và nhiều hơn thế nữa.

Bạn có thể đề xuất gì để cải thiện chương trình?

Hộp kỹ năng khuyến nghị:

Nguồn: www.habr.com

Thêm một lời nhận xét