如果你按照我上面所说的一步一步地实验到这里,你的无人机肯定已经坠落过了——至少好几次。我已经无数次地把我的无人机的保护外壳给它粘回机身上,直到它解体,随后我只好再买了一个新的。我不得不说,其实 Parrot AR.Drone 型在没有保护外壳的时候飞行得更好。但这种方式会使无人机变得很危险。因为没有保护外壳的话,一旦无人机撞到东西,它的螺旋桨就会直接打到物体上,并留下刮痕。 - 从网页上控制无人机飞行 为无人机开发一个基于网页的控制页面挺简单且效果不错。用如下所示的 express.js 框架就可以搭建一个很小巧的网页服务器。 var express = require(‘express’); app.get(‘/’, function (req, res) { res.sendFile(path.join(__dirname + ‘/index.html’)); }); app.get(‘/land’, function(req, res) { client.land(); }); app.get(‘/takeoff’, function(req, res) { client.takeoff(); }); app.listen(3000, function () { }); 我用下面的代码来通过一个按钮发送 AJAX 请求。 Takeoff Land - 从无人机上导出视频流 我发现把无人机上的摄像头拍摄的视频导出的方法就是:建立一个持续的连接,并把摄像头拍摄的 PNG 图片发送到我的网站的网页上。通过使用 AR.Drone 无人机的库(见下面的代码),网页服务器不断地把无人机摄像头拍摄的 PNG 画面拉取出来。 var pngStream = client.getPngStream(); pngStream .on(‘error’, console.log) .on(‘data’, function(pngBuffer) { sendPng(pngBuffer); } function sendPng(buffer) { res.write(‘–daboundary\nContent-Type: image/png\nContent-length: ‘ + buff er.length + ‘\n\n’); res.write(buffer); }); - 对从无人机获取的图像进行人脸识别 微软的 Azure Face API 系统很容易上手,且功能强大。你上传你朋友的照片给它,这个系统就能识别出他们是谁。它也能猜测人物的年龄和性别。我发现这两个功能的识别准确率是惊人的高。整个识别的延迟大概是200毫秒。识别1000次请求花费1.5美元。对我而言,这个价格对于这种应用是相当合理的。下面是我的代码,它实现了发送图片给 API 来做人脸识别的功能。 var oxford = require(‘project-oxford’), oxc = new oxford.Client(CLIENT_KEY); loadFaces = function() { chris_url = “https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAALyAJGMyNmIzNWM0LTA5MTYtNDU4Mi05YjExLTgyMzVlMTZjYjEwYw.jpg”; lukas_url = “https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/3/000/058/147/34969d0.jpg”; oxc.face.faceList.create(‘myFaces’); oxc.face.faceList.addFace(‘myFaces’, {url => chris_url, name=> ‘Chris’}); oxc.face.faceList.addFace(‘myFaces’, {url => lukas_url, name=> ‘Lukas’}); } oxc.face.detect({ path: ‘camera.png’, analyzesAge: true, analyzesGender: true }).then(function (response) { if (response.length > 0) { drawFaces(response, filename) } }); 我用了 ImageMagick 库来对我收集的PNG图片做打标签,效果相当好。对于这个部分其实可以有很多的扩展可能。比如用一个情感 API 来识别人脸所表现出来的情感。 - 运用语音来控制无人机 进行语音识别部分开发的难点并不是识别本身,而是如何把语音流从运行在我本地服务器上的网页里转换成微软 Speech API 可以使用格式。下面的代码就是实现这个功能的。一旦你能把语音保存成单声道和以正确的采样频率采样后,这个语音识别 API 就能很方便地识别语音内容。这个 API 的花费是1000次请求4美元。对于业余应用来说,直播,基本相当于是免费了。 RecordRTC 是一个很好的库,可以用来作为以网页为客户端的语音采集的新手入门的工具。在客户端,我就加入了保存语音文件的代码。 app.post(‘/audio’, function(req, res) { var form = new formidable.IncomingForm(); // 设定允许客户在一个请求里上传多个文件 form.multiples = true; form.uploadDir = path.join(__dirname, ‘/uploads’); form.on(‘file’, function(field, file) { filename = “audio.wav” fs.rename(file.path, path.join(form.uploadDir, filename)); }); // 记录发生的错误日志 form.on(‘error’, function(err) { console.log(‘An error has occured: \n’ + err); }); // 一旦所有文件上传完成,才给客户端发相应 form.on(‘end’, function() { res.end(‘success’); }); // 解析出请求里包含的表单数据 form.parse(req) speech.parseWav(‘uploads/audio.wav’, function(text) { console.log(text); controlDrone(text); }); }); 我使用 FFmpeg 工具来降低音频的采样率,并把多声道合并成单声道,以供微软 API 使用。 exports.parseWav = function(wavPath, callback) { var cmd = ‘ffmpeg -i ‘ + wavPath + ‘ -ar 8000 -ac 1 -y tmp.wav’; exec(cmd, function(error, stdout, stderr) { console.log(stderr); // command output is in stdout }); postToOxford(callback); }); 尽管我开发的功能就是这些,但是还是可以继续扩展。比如用微软的文字变语音的 API 来让无人机说话! - 开发自主搜索路径 (责任编辑:本港台直播) |