随着工厂自动化、智能化发展,AGV小车在制造业领域运用的炉火纯青,它不仅提高了生产物流的自动化程度,还加快了生产效率,降低了人工成本。随着AGV小车的不断发展,AGV衍生出了电磁导航、磁带导航、惯性导航、激光导航、二维码导航等多种导航方式,其中激光导航及二维码导航优势比较明显。

二维码导航属于视觉识别,在铺设、改变路径上也较容易;对声光无干扰,便于控制。而且,无人,这种一听上去就是人工智能的idea,怎么能跟视觉没有关系呢?虽然大部分专业人士都看好激光导航,尤其是无反光板极光导航,但且不论价格能否降下来,就激光这种本身自带伤害属性的传感器,怎么能大规模的使用呢?所以,论及眼睛,视觉当然是首选。

本文将从技术层面以及思维层面展开,论述二维码如何用于无人AGV的导航。

一、技术层面

视觉的方法可以用来估计位置和姿态。最容易想到的是在目标上布置多个容易识别的特征,这样使用opencv相机标定和、相机畸变矫正、轮廓提取、solvepnp来获取目标相对于相机的位姿。在实际使用中只要相机和目标一方是估计的,那就可以得到全局坐标。如果相机和靶标都在移动,那只能获取到相对坐标。但是受限于相机视角和景深,这样多个特征的识别虽然精度可以很高,但是范围却很小。

对于如何扩大范围,使用二维码是一个很好的思路。首先,二维码具有多个特征,单个二维码可以用来实现上述方法的功能。其次,二维码本身带有信息,如果二维码的布置事先已知,那么位置和姿态估计的范围将只受限于二维码的数量。

1.二维码的生成细节和原理

二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据。二维条码的长度、宽度均记载着数据。二维条码有一维条码没有的“定位点”和“容错机制”。容错机制在即使没有辨识到全部的条码、或是说条码有污损时,也可以正确地还原条码上的信息。

选择的是比较常见的 QRCode 作为探索对象。QRCode 全名是 Quick Response Code,是一种可以快速识别的二维码。

QRCode 主要由以下部分组成:

  • Position Detection Pattern:位于三个角落,可以快速检测二维码位置。
  • Separators:一个单位宽的分割线,提高二维码位置检测的效率。
  • Timing Pattern:黑白相间,用于修正坐标系。
  • Alignment Patterns:提高二维码在失真情况下的识别率。
  • Format Information:格式信息,包含了错误修正级别和掩码图案。
  • Data:真正的数据部分。
  • Error Correction:用于错误修正,和 Data 部分格式相同。

2.二维码的识别与定位

1)识别部分

二维码源于日本,目前两个比较知名的library——ZBAR和ZXing,前者源于日本,后者源于谷歌。对于开发者而言,两者的源码都能从github上fork到,但用于实际工程,个人还是选择zbar,谁让是日本人的东西呢。对于两个库的优劣,可以参看这篇文章《二维码扫描之zxing与zbar的优劣》。

ps:使用zbar包进行二维码的解码时,不需要图片中二维码的区域为100%。二维码的区域占图片比例的50~100%时,使用zbar包便能够成功解码二维码的信息。

对于linux下zbar库的编译,就不多做文章了,主要是看下zbar库的识别流程:

  • 逐行逐列扫描根据梯度变换得到每行每列明暗宽度流
  • 用比例1:1:3:1:1对宽度流线段进行筛选并聚类得出横向纵向线段的交叉点
  • 对三个中心点排序后得到三点对QR码主体的仿射变换矩阵
  • 根据编码模式转换为相应的编码数据输出

2)定位部分

随着编程年龄的增长,慢慢的开始坚信一句话:你写的代码,永远比不上开源那些大牛们,所以放弃抵抗,拥抱开源吧

比如二维码定位,初步构想的识别步骤如下:

  • 加载图像,并且进行一些预处理,比如通过高斯模糊去噪。
  • 通过 Canny 边缘检测算法,找出图像中的边缘
  • 寻找边缘中的轮廓,将嵌套层数大于 4 的边缘找出,得到 Position Detection Pattern 。
  • 如果上一步得到的结果不为 3 ,则通过 Timing Pattern 去除错误答案。
  • 计算定位标记的最小矩形包围盒,获得三个最外围顶点,算出第四个顶点,从而确定二维码的区域。
  • 计算定位标记的几何中心,连线组成三角形,从而修正坐标,得到仿射变换前的 QRCode 。

后来经验证发现,这效果就是个渣渣!!!不稳定不说,各种框错位置,或者包围盒不知道包了些啥。后来仔细一看,原来zbar识别过程中,已经先定位出二维码的大致位置了,蓦然回首的感觉有木有。

经Google一番搜索后,看到了《Localization and navigation using QR code for mobile robot in indoor environment》,发现正是采用的此方法。

3.ROS下tf变换的发布

#include<ros/ros.h>
#include<tf/transform_broadcaster.h>

int main(int argc, char** argv) {
    ros::init(argc, argv, "tf_publisher");
    ros::NodeHandle n;
    ros::Rate r(100);
    tf::TransformBroadcaster broadcaster;
    tf::Transform transform;
    transform.setOrigin(tf::Vector3(0.1, 0, 0.2));
    tf::Quaternion q;
    q.setRPY(0, 0, 0);
    transform.setRotation(q);
    while(n.ok()) {
        broadcaster.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "base_link", "base_laser"));  //发布了base_link和base_laser之间的坐标关系
        r.sleep();
    }

    return 0;
}

二、思维层面

1.Advantage

It is suitable for indoor environment and is easy to set landmarks.

2.Disadvantage

Proper light conditions are needed in the environment. If QR code cannot be recognized or missing, othter sensors like odometry should be used for compensation.

In a word, QR code method is good for use.

更多精彩内容,请移步到古月课堂《ROS二维码识别应用指南》

参考文献:

【1】未来AGV小车主流的导航方式,激光导航OR二维码导航?

【2】二维码的生成细节和原理

【3】学习笔记:使用 OpenCV 识别 QRCode

【4】ubuntu zbar 安装

【5】Zbar算法流程介绍

【6】ROS之tf坐标变换

【7】ROS的tf包中坐标变换的方法