我们使用Node.js和ARDrone对直升机的语音控制进行编程



在本教程中,我们将介绍如何在Node.js和Web语音API上创建语音激活的无人机程序。 直升机-鹦鹉ARDrone 2.0。
我们提醒您: 对于所有“ Habr”读者来说,使用“ Habr”促销代码注册任何Skillbox课程时均可享受10,000卢布的折扣。

Skillbox建议:实用课程“ Mobile Developer PRO”

引言


无人机太神奇了。 我真的很喜欢和直升机一起玩,录制照片和视频,或者只是很开心。 但是无人驾驶飞机(UAV)不仅用于娱乐。 他们在电影院工作,研究冰川,被军队和农业部门的代表所使用。

在本教程中,我们将介绍如何创建一个程序来控制无人机。 使用语音命令。 是的,直升机会照你说的去做。 在文章的最后-完成的程序和视频控制无人机。


我们需要以下内容:

  • 鹦鹉ARDrone 2.0;
  • 以太网线
  • 好的麦克风。

开发和管理将在装有Windows / Mac / Ubuntu的工作站上进行。 我个人使用Mac和Ubuntu 18.04。

软体类


官方网站下载最新版本的Node.js。

还需要最新版本的Google Chrome

我们处理直升机


让我们尝试了解Parrot ARDrone的工作原理。 这架直升机有四个马达。



反向电机沿一个方向工作。 一对顺时针旋转,另一对逆时针旋转。 无人机的运动是由于相对于地球表面的倾斜角度发生了变化,电动机的旋转速度发生了变化以及其他一些机动动作。



如上图所示,更改各种参数会导致直升机运动方向发生变化。 例如,左转子和右转子的旋转速度的减小或增大产生滚动。 这使无人机可以向前或向后飞行。

通过改变电动机的速度和运动方向,我们可以设置倾斜角度,从而使直升机可以在其他方向上运动。 实际上,当前的项目无需研究空气动力学,只需要了解基本原理即可。

鹦鹉ARDrone的工作原理


无人机是Wi-Fi接入点。 为了接收和发送命令到直升机,您需要连接到这一点。 有许多不同的应用程序可让您控制直升机。 一切看起来像这样:



连接好无人机后,打开终端,telnet 192.168.1.1是直升机的IP。 对于Linux,您可以使用Linux Busybox

应用架构


我们的代码将分为以下模块:

  • 具有语音API的用户界面,用于语音检测;
  • 命令过滤和与标准的比较;
  • 向无人机发送命令;
  • 实时视频广播。

该API的工作方式取决于互联网连接。 为了提供它,我们添加了以太网连接。

是时候创建一个应用程序了!

科迪姆


首先,创建一个新文件夹并使用终端切换到该文件夹​​。

然后使用以下命令创建一个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); 

这是HTML和JavaScript代码,它们侦听用户并将命令发送到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> 

以及更多的JavaScript代码可通过将语音命令发送到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' }); }; 

启动应用程序


可以按以下方式启动程序(确保将直升飞机连接到Wi-Fi并将以太网电缆连接到计算机很重要)。

在浏览器中打开localhost:3000,然后单击“开始识别”。



我们试图控制无人机并为之欢欣鼓舞。

从无人机广播视频


在项目中,创建一个新文件,并将此代码复制到此处:

 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以从前置摄像头观看视频。



有用的提示


  • 在室内控制这架无人机。
  • 起飞前务必将保护帽戴在无人机上。
  • 检查电池是否已充电。
  • 如果无人机的行为异常,请按住并翻转。 此操作将使直升机进入紧急模式,旋翼将立即停止。

准备好的代码和演示


现场演示

资料下载

原来!


编写代码,然后观看汽车如何开始服从,您会喜欢的! 现在我们想出了如何教无人机听语音指令的方法。 实际上,还有更多的可能性:用户的面部识别,自动飞行,手势识别等等。

您可以提供什么来改善该程序?
Skillbox建议:

Source: https://habr.com/ru/post/zh-CN445980/


All Articles