我用了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来让无人机说话! 开发自主搜索路径 我使用ardrone-autonomy库来为无人机开发自主搜索路径。在此过程中,我无数次地把无人机弄得撞到了客厅的家具和植物上。最后,我妻子很“客气”地建议我去车库里继续我的项目,因为那里没多少可以撞的东西。但是车库的地方有点小,使得操控空间有限。
图3:在我的“实验室”里试飞无人机。图片由Lukas Biewald授权使用 在我能有一个更大的实验空间后,我会尝试更智能的搜索算法。不过,现在我还是只会让无人机做起飞和旋转的动作,以此来搜索发现人,并识别是敌还是友。 var autonomy = require(‘ardrone-autonomy’); var mission = autonomy.createMission({ip: ‘10.0.1.3’, frameRate: 1, imageSize: ‘640:320’}); console.log(“Here we go!”) mission.takeoff() .zero() // 把当前状态作为参考基准 .altitude(1) .taskSync(console.log(“Checkpoint 1”)) .go({x: 0, y: 0, z: 1, yaw: 90}) .taskSync(console.log(“Checkpoint 2”)) .hover(1000) .go({x: 0, y: 0, z: 1, yaw: 180}) .taskSync(console.log(“Checkpoint 3”)) .hover(1000) .go({x: 0, y: 0, z: 1, yaw: 270}) .taskSync(console.log(“Checkpoint 4”)); .hover(1000) .go({x: 0, y: 0, z: 1, yaw: 0 .land() 最终效果 看下面的视频。我让无人机起飞并去找我的朋友Chris:
结论 (责任编辑:本港台直播) |