×

一个机器人操作系统(ROS)节点系统

消耗积分:0 | 格式:zip | 大小:0.19 MB | 2023-07-06

王飞云

分享资料个

描述

垃圾战争

每年人类总共倾倒超过 20 亿吨垃圾,到 2050 年有望超过 34 亿吨/年。目前这直接影响到超过 6100 万人,约占温室气体排放量的 5%。

几乎一半的浪费是食物浪费,其中 40% 是由于质量标准过分强调外观而在零售和消费者层面造成的浪费。尽管有如此大量的垃圾来自食物,但其中只有一小部分被堆肥(当食物垃圾被放入垃圾填埋场时,它会产生甲烷而不是二氧化碳,参见堆肥与垃圾填埋场)。此外,由于体力劳动成本增加或缺乏全行业采用,许多用于升级回收食物浪费的方法根本没有实施。

单流回收的发展提高了回收率,因为消费者不必手动进行分类,并降低了回收厂的成本(只有一个收集系统)。然而,由于未经批准的材料或不干净的可回收物(回收厂清洁可回收物的成本通常太高)被放置在单流垃圾箱中,污染增加,这也导致回收材料的质量下降。

在过去几年中,随着边缘人工智能和物联网的兴起,已经开发了许多新产品来帮助解决浪费问题。其中一些包括 Alphabets X 的 Everyday Robot、Tomra 的 Container Deposit 以及对放入其中的物品进行分类的“智能垃圾箱”。虽然这些产品正在缓慢地帮助解决其中的一些问题,但采用起来可能很慢而且成本很高。

该项目将展示一些开发低成本开源废物管理系统的方法和流程,为回收行业的民主化开辟了可能性。虽然这不是一个端到端的项目和演示(由于资源有限),但它将讨论对废物类型进行分类所需的组件以及处理它们的建议方法。

建议系统

该项目提出了一个机器人操作系统 (ROS) 节点系统,可以使用和组合这些节点来构建一个功能齐全的系统,以最大限度地减少和处理浪费。当前的特别重点是减少与食物相关的浪费。使用 NVIDIA Jetson Nano 是因为其外形小巧且功耗低,使这些工作负载能够在边缘处理并本地化到手臂。

下面是一个 ROS 节点系统,用于对产品进行分类以最大程度地减少浪费。多光谱相机用于收集单个产品或产品集合(例如,系统监控已上架的大量产品)的 NIR 图像。该数据被送入成熟度指数节点,该节点量化给定项目的成熟度。决策引擎然后决定如何处理它,指示末端执行器或执行器(或可能是人类)进行相应处理。有关此系统的更多信息如下所示。

poYBAGOIPAaAFuYsAADHuBiPDIY132.jpg
用于农产品分类的 ROS 节点集合
 

目前的废物流需要大量人力和大型机器来分类废物。这些方法仅适用于具有更多“价值”的废物流(即单流可回收物)。一系列带有定制末端执行器的机械臂(例如,特定的末端执行器取决于贵重物品的类型,例如金属、纺织品等)可以处理额外的废物流。

虽然这些手臂比大型设施中运行的快速运行的气动系统慢得多,但在分散的废物经济中,这些手臂可以用来收集更具体的有价值的物品。它们也更灵活,能够分拣更多种类且用途更广泛(气动系统很大,通常只能分拣一种材料)。

相机执行首次通过对象检测和分类以确定对象的初始值。如果该物品是为该手臂指定的特定物品,则可以使用末端执行器内置的微型光谱仪对其进行进一步的材料分类。这可用于确定材料的成分,以便在其最终位置进行精细选择和沉积。

poYBAGOIPAmAUpV1AAC3WCwTqgw546.jpg
用于废物流分类的 ROS 节点集合
 

这样的系统可以从普通废物流中增加有价值的可回收物,对材料分类提供更精细的控制,从而产生更高价值的产品,并最大限度地减少人力劳动,从而实现更循环的经济。

在 Jetson Nano 上开始使用 ROS

由于其模块化设计和宽松许可,该项目的模块将使用机器人操作系统创建。它还允许模块更容易地集成到更大的系统中。使用 NVIDIA Jetson 是因为它是一个功能强大但体积小的 SBC,能够在其内置的 128 个 CUDA 内核上运行计算和其他机器学习任务。

请参阅 Jetson Nano启动说明以获取加载 Jetson Nano 开发工具包 SD 卡映像。

在大多数情况下,我们将使用 PIP 方法从源指令中遵循 ROS 。我们还必须从源代码构建所需的包。

初始更新和安装 pip

sudo apt update 
sudo apt upgrade -y
sudo apt install python-pip -y

安装依赖并初始化rosdep

sudo pip install --upgrade setuptools
sudo pip install -U rosdep rosinstall_generator wstool rosinstall
sudo rosdep init 
rosdep update

创建用于构建ros的catkin工作区

mkdir ~/ros_catkin_ws 
cd ~/ros_catkin_ws 
rosinstall_generator ros_comm --rosdistro melodic --deps --tar > melodic-ros_comm.rosinstall 
wstool init -j8 src melodic-ros_comm.rosinstall

解决依赖关系,构建工作区并获取它

rosdep install --from-paths src --ignore-src --rosdistro melodic -y
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
source ~/ros_catkin_ws/install_isolated/setup.bash

传感器:多光谱相机

pYYBAGOIPA2AHcvbAAInTaj2Lac681.jpg
多光谱相机每个通道的结果
 

多光谱相机能够看到超越我们人类所能看到的东西。通过观察特定波长的光,我们可以识别独特的特征。这对于分选植物性食品特别有用,因为成熟度特征出现在近红外 (NIR) 区域。

可以从这样的系统中建立一个减少易腐烂食物垃圾的系统。从超市常用的先进先出 (FIFO) 做法过渡到根据产品成熟度推出产品的系统可以减少食物浪费。通过监控已经出炉的农产品,系统可以监控成熟度并有选择地去除即将成熟的农产品(从而防止成熟连锁反应)

通过遵循与 Microsoft HyperCam 类似的方法,我们可以创建便宜(低于一百美元)的 NIR 多光谱成像设备。使用Raspberry Pi NoIR相机是因为它没有红外滤光片(这使我们能够看到高达 1000 纳米左右的波长)。连接到简单晶体管驱动威廉希尔官方网站 的不同波长的 IR LED 网格允许我们使用Jetson GPIO控制我们想要检查的波长。

上图显示了用多光谱相机拍摄的不同波长的成熟鳄梨。与 830nm 相比,890nm 在成熟和未成熟区域之间具有最高的对比度,830nm 仅非常轻微地显示出这种差异。

 
 
 
pYYBAGOIPBKAF6IBAAge7OHBwCQ550.jpg
 
1 / 4多光谱相机原型
 

蓝色滤光片阻挡蓝色波长,但允许我们感兴趣的 NIR 波长,因为传感器的蓝色通道对这些波长敏感。通过仅查看此通道,我们可以将蓝色换成 NIR。

这可以在 opencv 中完成

#... load image
(r, g, b) = cv2.split(img)  # Split channels of image
nir = cv2.merge([b,b,b])    # merge only blue into NIR channel
cv2.imshow("NIR", nir)      # or only show the blue channel with grayscale selected

通过在不同的通道中组合这些图像,我们可以比较每个波长的细节差异。例如,下图显示通道 e、c 和 f 合并为 RGB 图像。

您可以在我的网站上找到构建所需 ROS 包的依赖项列表从源代码构建所需的所有依赖项都可以在我的网站上找到。为了获得更高的光谱分辨率,我们需要使用光谱仪。我使用Sparkfun Triad Spectroscopy传感器做了一些实验。

该传感器在 NIR 范围内只有几个通道,光谱分辨率相对较低,约为 40nm。

poYBAGOIPBiAT8ONAAGezAXgXUc348.png
光谱响应(来源:AS7​​265X 数据表)
 

为了创建能够进行准确材料分类的高分辨率设备,我们需要使用能够在宽波长范围(高达 2000nm 左右)、超过 1000nm 并具有高光谱分辨率(大约 20nm 或更小)的传感器). 例如,使用Hamamatsu MEMS-FPI光谱传感器构建的传感器能​​够实现 1350 至 1650 nm 的光谱范围和 18 nm 的光谱分辨率(对于 C14272)。该设备足够小,可以嵌入机械臂的末端执行器中,允许在运动过程中同时进行分类。然而,获得这个模块对于爱好者来说是具有挑战性的。

我使用 AS7265X 传感器创建了一个小型数据集。这可以作为包含类然后通道的 csv 文件使用。该数据可以传递到分类器中以推导材料成分

对象检测:暗网和 ROS

为了执行对象检测和初始分类,我们可以使用Darket 的 ROS 节点并训练一组自定义权重来指定专用模型。带有 YOLOv3 Tiny 的 Darknet ROS(roslaunch 文件在我的存储库的分支中)在 Jetson Nano 上以大约 10-15fps 的速度运行。

可以将边界框和分类输入到价值引擎中,以具体选择目标项目类型。然后可以使用某种形式的机械臂收集这些信息以供进一步分析。

显示 yolov3-tiny 配置的 ROS Launch 文件示例


<launch>

<arg name="network_param_file"         default="$(find darknet_ros)/config/yolov3-tiny.yaml"/>
<arg name="image" default="camera/rgb/image_raw" />

<include file="$(find darknet_ros)/launch/darknet_ros.launch">
<arg name="network_param_file"    value="$(arg network_param_file)"/>
<arg name="image" value="$(arg image)" />
include>
launch>

要使用 Darknet 构建专门的分类器,我们可以遵循pjreddie 的训练 CIFAR10 所使用的数据集应该围绕所需的价值项目进行训练,以获得最佳效率。如JK Jung 的 TensortRT ONNX YOLOv3所示,在 TensorRT 上运行暗网可以产生更高的帧速率

价值引擎和末端执行器

ROS节点中的价值引擎(单流排序)是为执行排序的实际硬件提供一个目标。它以两阶段方式运行,初始值(通常具有较低或较低的特定概率)随后是用于高置信度材料成分分类的特定分类器(利用光谱仪),以便可以将其放入正确的容器中。

这导致更高质量的输出被重复使用,这很重要,因为回收或废物设施的输出必须与原始材料竞争。这对于回收纺织品等敏感材料也很重要。

末端执行器必须专用于它们需要收集的材料。这就是价值引擎具有初始分类的原因,以便它可以传递到正确的子系统。

进一步探索

去中心化、民主化的废物和回收过程的目标需要大量的工作。该项目只是探索了一些传感器和使用设备对边缘物质进行分类的方法。

还探索了其他用于材料分类的传感器,例如雷达,它们可能是光谱仪的低成本替代/增强。


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

评论(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.obk20.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:'一个机器人操作系统(ROS)节点系统',//标题 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.obk20.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);