支奕琛,谷玉海,龚志力,宋亮
(1.北京信息科技大学现代测控技术教育部重点实验室,北京 100192;2.北京信息科技大学机电工程学院,北京 100192)
随着经济和科学技术的迅速发展,智能手机在人们生活中的普及促进了二维码技术的发展与成熟,使用二维码技术进行信息存储与传递变得更加高效和便捷。二维码技术在物流行业应用越来越广泛,目前的快递车间基本上都是无人车间,均采用信息化处理数据。对此,精准投放是机器人物流要解决的首要问题。
二维码的另一个别名是二维条码,生活中的QR Code为常见的二维码种类。QR的英文是Quick Response,这种编码方式是最近几年非常流行的一种编码方式。二维码是以某种一定的几何图形规律记录数据符号信息并将它绘制在黑白相间的二维平面分布图中。这种编码方式将比特流概念合理且巧妙地运用其中,使用若干个与二进制相对应的几何形体来表示各种类型的数据信息。因此,关于二维码识别技术的应用和创新研究也越来越重要。
常见的用于识别二维码的算法有:BoofCV(一种基于Java实现的开源、实时的计算机视觉库)、OpenCV、Quirc(一种专门面向QR码的检测和解码库)、ZBar、ZXing(一种面向Java Android开发的各种条码检测识别库)。
ZBar算法是一种被广泛应用的条码检测识别库,支持Windows、ROS等多种平台,同时也支持Perl、Python、C++、Java等语言。因要在机器人小车ROS平台下进行二维码目标点的识别,ZBar算法针对ROS平台提供ZBar_ROS功能包,此功能包提供有效的接口和节点。综合对比以上二维码识别算法,最终选择ZBar算法在ROS平台下进行二维码识别。
如图1所示,机器人小车带有双目摄像头,双目摄像头的型号为IMX219-83 Stereo Camera。
图1 无人车摄像头
找到该型号摄像头在ROS中的驱动功能包为jetson_camera,驱动摄像头使摄像头可以捕捉到机器人小车前方的画面,当画面中出现二维码时即可提取到目标点二维码的图形信息。如图2所示,在rviz左下角显示双目摄像头捕捉到的画面信息。
图2 rviz中摄像头的画面信息
ZBar_ROS是专门识别二维码图像的算法功能包,现双目摄像头已经捕捉到二维码的实时图像帧信息,功能包需要配置的参数如下:
(1)订阅图像话题名称Image(Sensor_MSGS/Image),即可获得实时的图像帧信息;
(2)发布识别出二维码的图像信息话题名称Barcode(Std_MSGSString),订阅该话题即可在终端中查找到数据信息;
(3)配置参数Throttle_Repeated_Barcodes,识别二维码的延时时间。
上述参数配置完成后即可识别二维码且将识别结果以话题方式发布。
ZBar_ROS功能包工作流程如图3所示。该功能包订阅双目摄像头发布的图像话题image即可获得摄像头捕捉到的画面信息;然后识别二维码,识别成功后发布barcode话题,在终端中订阅该话题发布的消息即可查看二维码被识别后的数据信息。ZBar算法识别二维码的流程如图4所示。
图3 ZBar_ROS功能包工作流程
图4 ZBar算法流程
机器人小车的摄像头捕捉到画面中的二维码后需要在Cartographer-SLAM生成的地图上标记出二维码当前的位置,从而获得目标点的位置。
每个ROS中的SLAM算法都可以发布map话题,其中包含了ROS中通用的地图信息。因Geotiff格式的地图更为清晰准确,建成的SLAM地图视觉效果更好,故找到ROS中能生成Geotiff格式地图的算法:Hector-SLAM。该算法的功能包中提供两个Servic,即:Nav_MSGS/GetMap获得地图数据和Hector_Nav_MSGS/GetRobotTrajectory获得机器人轨迹。但机器人小车使用的SLAM算法是Cartographer,且Cartographer算法不提供上述2个服务,所以根据Hector-SLAM算法为Cartographer-SLAM算法编写这两个服务。
在Hector-SLAM算法的功能包Hector_Geotiff源码中有在Geotiff格式地图上绘制轨迹以及画标记的接口,使用ROS中的service/topic进行通信得到目标点二维码位置的、坐标,利用容器记录目标点二维码位置的、坐标,最后在保存地图时调用Hector_Geotiff中的drawpath接口将保存在容器中的目标点坐标绘制到地图上即可在SLAM生成的地图上得到目标点的位置。
实验所用的上位机硬件配置是Intel Core i7-10700K、3.8 GHz CPU、16.00 GB内存、NVIDIA RTX2080Ti显卡,操作系统为Ubuntu。实验所用的机器人小车如图5所示。将融合Cartographer-SLAM与Hector-SLAM算法的无人车SLAM建图算法定为方案一。
图5 实验所用无人车 图6 实验所用二维码示意
所用的目标点二维码如图6所示,共4个二维码,识别内容分别为QR1、QR2、QR3、QR4。
实验步骤:
步骤1,将上位机与3辆小车之间通过WiFi建立通信连接,上位机通过ssh远程连接小车,从而控制小车的运动;
步骤2,将4个目标点二维码放置到不同的固定位置,预设无人车在距离目标点50 cm可识别到二维码;
步骤3,将无人车放置到固定位置,在上位机中运行编写好的脚本文件Start_Robot.sh,即可启动rviz观察小车运行状态,启动SLAM建图生成Geotiff格式地图服务。脚本文件如图7所示。
图7 脚本文件
启动脚本文件后即可在rviz界面中观察到无人车的运动状态与周围环境的变化。
运行键盘控制节点即可控制无人车运动,根据rviz中实时图像控制无人车寻找4个固定位置的目标点。使用命令rostopic echo在上位机终端中查看zbar_ros功能包发布的话题/barcode的数据即可判断二维码是否识别成功。图8所示为摄像头捕捉到某一目标点二维码,图9所示为上位机终端中订阅该话题显示的二维码信息数据,即成功识别二维码。
图8 摄像头捕捉到的某一目标点的二维码
图9 二维码的数据信息
步骤4,测量无人车成功识别4个固定位置目标点二维码后无人车距离目标点的实际距离,实际距离如表1所示。
表1 无人车距离目标点的实际距离(方案一)
步骤5,4个固定目标点识别完毕后,在上位机中运行编写好的脚本文件Save_Geotiff.sh即可启动保存Geotiff格式地图的服务,从而将目标点二维码标记在生成的地图上,如图10所示。
图10 保存地图的脚本文件
保存Cartographer-SLAM建立的2D地图,如图11所示,图中的QR红色标记即是识别目标点二维码后预估的目标点所在的位置。
图11 方案一地图及目标点预估位置
步骤6,将无人车的SLAM建图算法调整为Hector-SLAM算法并定为方案二,Hector_Geotiff功能包包含在此算法中。利用同样的步骤识别固定位置的目标点二维码,测量无人车成功识别4个固定位置目标点二维码后无人车距离目标点的实际距离,结果如表2所示。
表2 无人车距离目标点的实际距离(方案二)
保存Hector_SLAM算法建立的2D地图,如图12所示,图中的QR红色标记即是目标点所在的预估位置。
图12 方案二地图及目标点预估位置
预设无人车距离目标点50 cm处可识别到二维码,综合表1和表2进行数据分析,结果如表3所示。
表3 无人车距离目标点的实际距离(预设距离为50 cm) 单位:cm
对比图11、图12和表4可得:方案一图中QR标记的预估位置和实际二维码目标点所在位置更为接近,标记的精度更高,综合表3数据可知,方案一在比预设距离更远的位置即可识别到二维码。
表4 SLAM地图中标记点对应的实际位置与目标点实际位置的距离
对比分析实验结果可知,与机器人小车基于ZBar算法和Hector-SLAM算法进行二维码目标点识别、建图相比,机器人小车基于ZBar算法和融合Cartographer-SLAM与Hector-SLAM算法的方法对二维码进行识别、标记、建图时效果更好。其优点主要体现在以下几个方面:
(1)能在较远的距离识别到目标点二维码;
(2)目标点的预估位置更加精确,平均精度可提高67.6%。
但是,所提方法预估位置还存在一定误差,因此下一步工作将考虑继续缩小误差,提高精度。