×

带有EdgeImpulse的基于视觉的手势控制无人机

消耗积分:0 | 格式:zip | 大小:0.08 MB | 2022-11-14

王鑫

分享资料个

描述

介绍

“无人机”一词通常指任何无人驾驶飞机。这些飞行器有时被称为“无人机”(UAV),可以执行从军事行动到包裹递送等一系列令人印象深刻的任务。无人机可以像飞机一样大,也可以像手掌一样小。最初为军事和航空航天行业开发的无人机因其带来的安全性和效率的提高而成为主流。这些机器人无人机在没有飞行员的情况下运行并具有不同程度的自主性。无人机的自主性水平可以范围从远程驾驶(人类控制其运动)到高级自主,这意味着它依赖于传感器和探测器系统来计算其运动。

由于无人机可以远程控制,并且可以在不同的距离和高度飞行,因此它们是承担世界上一些最艰巨工作的理想人选。他们可以在飓风过后协助寻找幸存者,在恐怖局势期间让执法部门和军队密切关注天空,并在地球上一些最极端的气候条件下推进科学研究。无人机甚至进入了我们的家,成为业余爱好者的娱乐和摄影师的重要工具。

无人机有多种用途:

  • 军队
  • 送货
  • 紧急救援
  • 外太空
  • 野生动物和历史保护
  • 药物
  • 摄影等

==================================================== ===================

动机

这个项目背后的主要动机是我对探索小型无人机的各种控制方案的好奇心。微型无人机语音控制系统的设计与开发》一文讲述了无线电、GCS、手势、语音、操纵杆、PC、FPV和自主等各种无人机控制方法。在论文Design and Development of an Android Application for Voice Control of Micro Unmanned Aerial Vehicles中,观察到medium无线电和手势无人机控制方法的态势感知处于一定水平,而语音控制方法的态势感知能力较高。在这个项目中,我们将致力于基于视觉的手势控制,稍后我们将进行语音控制以及其他高级控制。

该项目的动机还源于需要在低成本可移植和可扩展的嵌入式平台中实现这些不同的控制方法,该平台具有边缘计算,而不依赖于外部资源的工作。

==================================================== ===================

方法

poYBAGNtrfOARsXAAABI455mHEA026.png
 

==================================================== ===================

DJI Tello 无人机

DJI Tello是一款小型无人机,将DJIIntel I的强大技术结合到一个非常小的封装中。它是一款轻巧、有趣且易于使用的无人机,是在投资更昂贵的选择之前学习无人机驾驶技巧的完美工具。Tello 拥有来自英特尔的 14 核处理器,其中包括板载Movidius Myriad 2 VPU(视频处理单元)用于高级成像和视觉处理。它配备了高质量的图像处理器,用于拍摄照片和视频。该相机具有 5MP (2592x1936) 照片和 HD720 视频。无人机的最长飞行时间为 13 分钟。这款令人难以置信的小型无人机可放在您的手掌中,仅重约 80 克(包括螺旋桨和电池)。您可以通过 Tello 应用程序或连接到 Tello 应用程序的受支持蓝牙遥控器直接控制 Tello。该无人机可通过 Python、C++、Scratch 和 DroneBlocks 进行编程。

 
 
眼镜
  • 重量:约 80 克(含螺旋桨和电池)
  • 尺寸:98mm*92.5mm*41mm
  • 螺旋桨:3英寸
  • 内置功能:测距仪、气压计、LED、视觉系统、WIFI 802.11n 2.4G、720P 实时取景
  • 端口:Micro USB 充电端口
  • 最大飞行距离:100m
  • 最大速度:8m/s
  • 最长飞行时间:13 分钟
  • 可拆卸电池:1.1Ah/3.8V
  • 照片:5MP(2592×1936)
  • 视场:82.6°
  • 视频:HD720P30
  • 格式:JPG(照片);MP4(视频)
  • 电子防抖:是
为项目准备 Tello Drone

Tello 无人机 SDK提供了有关如何通过 Tello 命令对无人机进行编程以完成任务大量信息,但在功能上有所限制。Tello SDK 通过 Wi-Fi UDP 端口连接飞行器,用户可以通过文本命令控制飞行器。我们使用 Wi-Fi 在 Tello 和 M5Stack 模块之间建立连接。开机后,Tello 充当软 AP Wi-Fi (192.168.10.1) 通过端口 8889 接受命令。

Tello SDK 包括三种基本命令类型。

控制命令 (xxx)

如果命令成功,则返回“ok”。

如果命令失败,则返回“错误”或信息性结果代码。

Set Command (xxx a) 设置新的子参数值

如果命令成功,则返回“ok”。

如果命令失败,则返回“错误”或信息性结果代码。

读取命令 (xxx?)

返回子参数的当前值。

尽管 Tello 非常灵活,我们可以通过许多不同的轴来控制无人机,但在这个项目中,我们将使用以下命令。

  • 起飞:自动起飞。
  • 土地:自动着陆。
  • up x:上升到“x”厘米。
  • down x :下降到“x”厘米。
  • left x:向左飞行“x”厘米。
  • right x :向右飞行“x”厘米。
  • forward x:向前飞“x”厘米。
  • back x :向后飞“x”厘米。

全套命令请参考SDK 。

作为一项安全功能,如果 15 秒内没有命令,Tello 将自动着陆。

Tello API

我们将使用自定义 C++ API ctello ,它允许我们通过 UDP 与 DJI Tello 无人机通信。

==================================================== ===================

基于视觉的手势控制方法

手势命令

为了使用视觉手势控制我们的 Tello 无人机,我们将使用手势检测。6 种基本手势被考虑用于控制(怠速、起飞/着陆、前进、后退、左、右)。

Takeoff

起飞命令是通过使用竖起大拇指的手势发出的。

Land

使用拇指向下的手势发出 Land 命令。

通过使用张开手掌手势发出前进命令。

通过使用闭合的拳头手势发出向后命令。

使用拇指向左手势发出向左命令。

使用拇指向右手势发出向右命令。

==================================================== ===================

使用边缘脉冲的基于视觉的手势识别

在Edge Impulse Studio的帮助下,我们将使用机器学习构建在微控制器上运行的手势识别系统。

为项目准备 Edge Impulse Studio
poYBAGNtrguAYVvCAAAIgiyQbJ4978.png
 
  • 提供项目名称并单击创建。
poYBAGNtrg2ABQVuAAAm_gCkTUA256.png
 
  • 从左侧菜单转到“设备”选项卡,然后选择“连接新设备”。
pYYBAGNtrg-ATKR0AAAbR54XiD4072.png
 
  • 您将看到各种设备选项。
pYYBAGNtrhOAUK9YAACE87kXZCM358.png
 
  • 为简单起见,让我们连接我们的智能手机设备。由于所有现代智能手机都有板载加速度计,因此很容易。
  • 接下来,您将获得一个二维码和一个链接,以允许从您的智能手机收集数据。
  • 扫描此二维码或通过您的智能手机设备打开链接。
pYYBAGNtrheAOX1aAAA5_JvNg2A680.png
 
  • 通过智能手机打开链接后,智能手机将显示在“设备”部分。
poYBAGNtrhmAC23ZAAAu4LwWQFc011.png
 

==================================================== ===================

数据采集

为了为我们的机器学习模型收集数据,我们将使用智能手机上的摄像头传感器。为了让您的机器学习模型能够看到,捕获这些对象的大量示例图像非常重要。在训练模型时,这些示例图像用于让模型区分它们。

  • 将智能手机连接到 Edge Impulse 后,转到“ Data Acquisition”选项卡。
  • 在手机中,选择Collecting images并授予对相机的访问权限。
  • 在下一个屏幕上,给标签名称 Eg: takeoff,在相机前显示手势,然后单击Capture开始采样。
 
 
  • 一旦设备完成每个采样,它就会将文件上传回 Edge Impulse。采样后,数据将出现在数据采集中。
  • 您会在工作室的“ ”下看到一个新行。Collected data
  • 当您单击它时,您现在会看到原始图像。
pYYBAGNtrh-AAto0AADmnXhS7vI861.png
 
  • 重复此过程以收集尽可能多的样本。
  • 对其他标签重复起飞、着陆、前进、后退、左、右。
  • 还包括一些噪声图像。
  • 确保对手势进行变化调整。例如,稍微改变手势的方向。您永远不会知道您的用户将如何使用该设备。
  • 收集到足够的数据后,它们将显示在同一选项卡下。
poYBAGNtriKAQuv-AAEv3yHzfzg092.png
 
  • 单击每个数据行以查看其原始图像。
  • 现在我们有足够的数据,我们需要将数据拆分为atraining dataset和atest dataset.
  • 不用担心。Edge Impulse Studio 也为我们提供了便利。
  • 前往“ Dashboard section”并向下滚动至“ Danger Zone”。
  • 点击“ Rebalance datasheet”,自动将数据集拆分为训练和测试,比例为 80/20。
pYYBAGNtrjeAP16QAAAtjEWpTIk158.png
 
  • 现在我们已经获取并设置了我们的训练数据以供进一步处理。
  • 现在,我们的 Edge Impulse 项目中有一个平衡良好的数据集。
  • 我们可以使用小部件上方的两个按钮在您的训练和测试数据之间切换Data collected

==================================================== ===================

手势模型训练

由于我们已经获取了所有数据,是时候训练数据集以适应手势模型了,Edge Impulse 使我们无需编写任何代码就可以更轻松地生成模型。

有了训练集,我们就可以设计一个冲动。脉冲获取原始图像,使用预处理块来处理图像,然后使用学习块对新数据进行分类。预处理块总是为相同的输入返回相同的值,而学习块从过去的经验中学习。

  • 转到“ Impulse Design”选项卡。
  • 我们已经Image data为我们填充了该部分。
  • 选择一个image widthof48x48和 Resize 模式为Squash
  • 现在单击Add a processing block并选择Image
  • 该块接收彩色图像,可选地使图像灰度化,然后将数据转换为特征数组。
  • 参数将为我们自动填充。
  • 现在单击Add a learning block并选择Transfer Learning (Images)
  • 参数将为我们自动填充。
  • 该块采用这些特征数组并学习区分六个(空闲、起飞、前进、后退、左、右)类。
  • Output features块将具有我们获得的所有标签。
poYBAGNtrjmAXqyFAADOHl7FVB4491.png
 
  • 现在单击Save Impulse以保存配置。
  • 前往Image标签。
  • 这将在屏幕顶部显示原始数据(您可以通过下拉菜单选择其他文件),并在右侧显示预处理步骤的结果。
  • 您可以使用选项在“RGB”和“灰度”模式之间切换,但现在,将颜色深度保留为“RGB”。
poYBAGNtrjyAJiClAACz19FBVoE345.png
 
  • 单击Save parameters这会将您发送到Transfer learning屏幕。
  • 在这里,我们将调整所有数据的大小,对所有这些数据应用处理块,并创建完整数据集的 3D 可视化。
  • 单击Generate features
  • Feature explorer加载。这是我们数据集中所有数据的图。
poYBAGNtrj6AT0HzAAEY6gdbgAg083.png
 
  • 因为图像有很多维度(这里:48x48x3=6912 个特征),我们在可视化之前在数据集上运行一个称为“降维”的过程。
  • 在这里,6912​​ 个特征被压缩到只有 3 个,然后根据相似度进行聚类。
  • 即使我们的数据很少,您已经可以看到一些簇正在形成,并且可以单击这些点来查看哪个图像属于哪个点。
pYYBAGNtrkCAT8GrAABzoSxe-J8331.png
 
  • 对于我们的数据集,特征数据或多或少是分开的,这是一个好兆头。如果您的功能重叠,最好获取更多数据。
  • 该页面还显示了预期的设备性能以及用于计算特征的处理时间和峰值 RAM 使用率。
pYYBAGNtrkOAWvg6AAAh3mdUK7Q158.png
 

处理完所有数据后,就该开始训练神经网络了。神经网络是一组算法,松散地模仿人脑,旨在识别模式。我们在这里训练的网络将信号处理数据作为输入,并尝试将其映射到四个类之一。

那么神经网络如何知道要预测什么?神经网络由多层神经元组成,所有神经元相互连接,每个连接都有一个权重。输入层中的一个这样的神经元将是 X 轴的第一个峰值的高度(来自信号处理块),而输出层中的一个这样的神经元将是takeoff(其中一个类)。在定义神经网络时,所有这些连接都是随机初始化的,因此神经网络将进行随机预测。在训练期间,我们然后获取所有原始数据,要求网络进行预测,然后根据结果对权重进行微小的更改(这就是标记原始数据很重要的原因)。

这样,经过多次迭代,神经网络就会学习;并且最终将在预测新数据方面变得更好。

  • 前往Transfer learning标签。
  • 设置Number of training cycles20Learning rate0.0005Minimum confidence rating 0.60您可以使用这些值来调整训练模型的准确性。
poYBAGNtrkaAJl5CAACSHKxvWeg710.png
 
  • 暂时将其他参数保留为默认值,然后单击Start training
  • 现在该Training Output部分被填充。
pYYBAGNtrkuAMgzIAAD22Rblbnw850.png
 
  • 它显示了网络的准确性和混淆矩阵。该矩阵显示了网络何时做出正确和不正确的决定。
  • 它还显示了此模型的预期设备性能。
  • 现在我们已经生成了模型,我们需要对其进行测试。

==================================================== ===================

手势模型测试
  • 前往Model Testing标签。
  • 我们可以在这里看到我们的训练数据集。单击Classify all
pYYBAGNtrlOAYqiaAAFRknS2-Jk921.png
 
  • 这将使用模型未知的训练数据生成模型验证结果。我们可以看到,我们的训练模型能够以 100% 的准确率进行分类,考虑到在训练部分提供给模型的少量训练数据,这非常好。
  • 它还显示了错误预测的标签。
  • 通过检查这些结果Feature explorer,我们可以了解是否有任何标签被错误分类,并使用更多的训练数据来重新训练我们的模型,以便更好地分类这些数据。
  • 您还可以通过选项卡对来自智能手机的数据进行实时分类Live classification您的设备应在 下显示为在线Classify new data将 Sensor 设置为Camera,单击Start sampling,开始采集样本。
pYYBAGNtrliAU7H-AAEBTepgm9c419.png
 
  • 之后,您将获得有关网络认为您所做的事情的完整报告。
  • 现在我们已经训练和测试了我们的模型,让我们部署它。

==================================================== ===================

手势模型部署

通过设计、训练和验证的冲动,您可以将此模型部署回您的设备。这使得模型在没有互联网连接的情况下运行,最大限度地减少延迟,并以最低的功耗运行。Edge Impulse 可以将完整的脉冲(包括信号处理代码、神经网络权重和分类代码)打包到单个 C++ 库中,您可以将其包含在嵌入式软件中。

  • 前往Deployment标签。
  • 选择C++ library
  • 如果您需要构建特定 Edge Impulse 支持的硬件,请在Build firmware选择您的开发板下
  • 单击Build这将导出冲动,并构建一个将在开发板上一步运行的库。
  • 我们将看到一个弹出窗口,其中包含有关如何将模型部署到我们的设备的文本和视频说明。
poYBAGNtrluAc_DVAAAlAiM8fgQ152.png
 
  • 构建完成后,系统会提示您下载库 zip 文件。
  • 将 zip 文件保存到我们的项目目录中。

==================================================== ===================

界面

现在我们已经准备好我们的无人机和手势模型,让我们在代码中将所有内容连接在一起。

本项目教程的部分提供了完整的接口代码。Code

在此处获取代码:https ://github.com/crisdeodates/Tello_EI_vision_gesture_control

运行以下命令:

$ git clone https://github.com/crisdeodates/Tello_EI_vision_gesture_control
$ cd Tello_EI_vision_gesture_control
$ APP_CAMERA=1 make -j4

现在将您的笔记本电脑连接到 Tello Wifi 并执行二进制文件以启动控件。

$ ./build/Tello_EI_vision_gesture_control 0

==================================================== ===================

测试

现在让我们测试一下手势控制,看看它的效果如何。

以下是起飞和降落视觉手势的快速测试。

 

==================================================== ===================

结论

尽管推理引擎无法准确分类某些手势,但总体性能令人满意。此外,在某些情况下,手势命令被错误分类。

我们相信这些问题可以通过添加更多的训练数据集并使模型更加灵活来得到更好的解决。

该模型已经针对低功耗、资源受限的模块(例如 ESP32-CAM)进行了优化。

==================================================== ===================

接下来是什么 !!

  • 将模型移植到低功耗模块,例如 ESP32-CAM(正在进行中)。
  • 使用更多测试数据训练模型以实现更准确的分类。
  • 使用更多样化的手势。

==================================================== ===================

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'带有EdgeImpulse的基于视觉的手势控制无人机',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);