超市购物机器人 MarketBot「发布」

《超市购物机器人 MarketBot「发布」》的文章是傻大方资讯网小编转载于网络,如有侵权请联系删除。

其实本次要写的东西在之前

《机器人操作系统ROS | 简介篇》

中有简单提到过,内容大概就是如何利用 ROS 等开源工具,在一个月内搭建出一个移动机器人。不过,毕竟是两三年前做的东西了,而我基本每过三个月就会觉得之前做的东西不值一提,所以一直没有动力去专门炒冷饭。

但是,最近在公众号后台看到不少人对于这个东西的提问,我就想,或许写一写能对初学者起到不少帮助。

——题记

众所周知,我这个公众号一直是用下面这个图片作为 logo 的。

超市购物机器人 MarketBot「发布」

但是,却一直没有专门介绍这个 logo 是怎么来的。

 

如果有关注我早期写的一些技术文章的小伙伴们应该有印象,我曾经参加过一个奇怪的比赛,比赛中做了一个奇怪的智能超市购物小车 MarketBot,大概长下面那样:

超市购物机器人 MarketBot「发布」

我们来大概过一下当时的 PPT 吧,就当是看一遍 MarketBot 发布会:

超市购物机器人 MarketBot「发布」

大家应该都有玩过超市的购物篮吧,大概有上面三种:手提式、拖拉式和小推车式。当然,除了最后一个,另外两个用户体验都不是太好。

 

于是,我们做出了 MarketBot 1.0:

超市购物机器人 MarketBot「发布」

先看看上面这些我用PPT做的图标,了解一下 MarketBot 都有哪些功能:

 

1. 人体跟踪

 

超市购物机器人 MarketBot「发布」

 

目前所有的超市购物车都是需要用户推/拉/拖着,如果购物车能自己跟着我们走岂不完美?

 

为了实现这一功能,我们给MarketBot配备了一个 kinetic,然后直接在网上找到了 NITE 2 库,直接通过调用 NITE 2 进行人体骨架的识别,大概效果如下图:

超市购物机器人 MarketBot「发布」

当然,NITE 2 只能为我们提供骨架信息,为了防止其他客户乱入跟错人,或者防止客户忽然走出 kinect 视野跟丢,我们需要建立一个简单的跟踪模型:大概就是把人的运动当做一个加速度存在噪声的匀加速运动,之后利用 Kalman Filter 对 kinect 识别的人体位置进行滤波跟踪。

 

当然,为了进一步增加跟踪的可靠性,我们在 MarketBot 上增加了一个蓝牙模块,因为现在基本人手一个智能手机,而蓝牙又是智能手机的标配,所以用蓝牙作为身份标识还算靠谱。

 

在此,我们原计划利用蓝牙的 RSSI 原理直接测量用户与 MarketBot 之间的距离,测试效果大概如下图:

超市购物机器人 MarketBot「发布」

可以看出,蓝牙的能量衰减大致与距离成正比(距离越远,接收到的能量越低,衰减的能量越多),但是距离的测量稳定性太低。

 

于是,最终我们并没有把蓝牙用作距离测量,而只是用作跟丢提醒。也即,当蓝牙的能量衰减到一定阈值以下,我们便让 MarketBot 发出报警。

 

由于正常跟踪状态下,机器人与用户的距离保持在 2 米左右,因此,这种方法判断跟丢还是比较稳定的。

超市购物机器人 MarketBot「发布」

2. 手势识别

 

或许有小伙伴们发现问题了。

 

如果 MarketBot 一直处于跟踪模式的话,购物车与用户一直保持着 2 米左右的距离,实在不方便把商品放入购物车里。

 

于是,我们增加了手势识别功能。通过识别用户的手势切换不同模式(跟踪模式、放置模式)。

超市购物机器人 MarketBot「发布」

这项功能还是基于 NITE 2 提供的骨架进行。我们在获取人体骨架之后,计算出用户手臂各关节的角度,之后归一化训练出一个简单的 SVM 分类器即可。

 

当 MarketBot 识别出特定手势后,自动从跟踪模式切换到放置模式,运动到用户跟前,并停止。这时候,用户就可以将商品放入购物车了。

超市购物机器人 MarketBot「发布」

3. 基本的运动能力

 

由于 MarketBot 是自己运动的,所以我们需要通过一些机构选型与设计让其具有一定的安全行驶功能。

超市购物机器人 MarketBot「发布」

例如,能够直接跨越一些在超市中可能出现的小障碍,如坡度较小的斜坡与跨度较小的沟槽:

超市购物机器人 MarketBot「发布」

可以通过超声传感器感知无法跨越的障碍,如墙面、台阶等,并作出规避动作:

超市购物机器人 MarketBot「发布」

4. 商品计价

 

我们有时候会希望知道购买的东西总价多少,而不是等结账的时候才发现自己买多了,所以我们就给 MarketBot 增加了扫码计价功能:

超市购物机器人 MarketBot「发布」

当然,这部分可以通过直接购买扫码器来实现。但是,我们为了省钱,直接使用普通摄像头来识别条形码,进行自动计价。

 

其中,条形码识别采用的是 ZBar 开源项目的成果(http://zbar.sourceforge.net/),利用 ZBar,我们可以识别出图像中条形码的商品码,之后与后台数据库对比就可以获得商品价格。

 

在显示部分,我们依旧为了省钱,直接使用 STM32 单片机加数码管实现了价码计算与显示。

超市购物机器人 MarketBot「发布」

5. 自主结算

超市购物机器人 MarketBot「发布」

想必各位应该有在超市收银台前排队的经历。我们想到,既然 MarketBot 计算好了商品总价,我们完全可以对信用较高的用户开放自主结算功能,减少排队时间。

 

为了省事,我直接贴了一个我的付款码作为示意:

超市购物机器人 MarketBot「发布」

当然,整个项目包括硬件都是在一个月内完成的,所以肯定还有很多可改进的地方。

 

回到最前面那个图:

超市购物机器人 MarketBot「发布」

实际上我们为 MarketBot 的「后续版本」也设计好了相应拓展功能:

 

MarketBot 1 Plus:增加手机 App 功能,毕竟整个流程涉及很多需要跟手机交互的地方,如连接蓝牙、支付等,设计一个 App 感觉也简单(就差一个程序员系列);

 

MarketBot 1S:增加自动充电功能,这个各种扫地机器人都有了,所以技术上难度应该还好,但是可以大大降低超市的管理成本;

MarketBot 1S Plus:自主导航功能,只需增加一个激光传感器,我们就可以实现MarketBot在超市内的自主导航,这样就可以实现机器人导购功能,把像我这样目的明确的顾客直接带到需要购买的商品面前。

 

当然,对于自主导航功能,我们原来也设想过一些低成本方案:

 

1)参照 TurtleBot,利用 ROS 里的 depthimage_to_laserscan 功能,将 kinect的点云转换成二维激光信号(就是按一定高度截取点云),但是精度实在惨不忍睹;

 

2)RGB-D SLAM,但是由于我们为了省钱,买的是800人民币的小电脑,实在带不动 RGB-D SLAM 算法。

 

做 SLAM 是不可能的,这辈子都不可能做 SLAM 的。

结语:

 

虽然目前看来,这个项目确实没什么可以说的了,但是它至少可以告诉初学者,掌握一些开源工具可以大大提高开发效率。

 

当然,开源工具也不是万能的,如果没有其他靠谱小伙伴把硬件和通讯之类的问题搞定,一个月也不可能把这个东西做出来。开源工具只是工具而已。

 

对于人体跟踪这块,NITE 2 效果实在没法跟现在的各种深度学习方法对比,如 OpenPose。所以,对于研究者来说,有必要跟踪最新的研究成果。

超市购物机器人 MarketBot「发布」

然后,其实我这个 logo 是会动的:

超市购物机器人 MarketBot「发布」

最后是一个简单的视频: