在上一篇【Originbot探索发现②】自动回冲方案探索 中,分析了自动回冲对位的几种可行方案,最后依靠纯视觉对位的方案成为首选方案,本篇就继续探索视觉对位方案,先从AprilTag码入手

1. AprilTag码小试

1.1 安装工具包

Windows下:

pip install pupil-apriltags

Ubuntu下:

pip install apriltag

1.2 demo测试

首先从官网摘出来个测试用图:

跑个简单地代码试一试

import pupil_apriltags as apriltag  # Windows
# import apriltag     # Ubuntu
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imdecode(np.fromfile('C:/Users/***/Desktop/004.png', dtype=np.uint8), cv.IMREAD_COLOR)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

at_detector = apriltag.Detector(families='tag36h11 tag25h9')    # Windows
# at_detector = apriltag.Detector(apriltag.DetectorOptions(families='tag36h11 tag25h9'))    # Ubuntu
tags = at_detector.detect(gray)
print("tags: {}", tags)

for tag in tags:
    for i in range(4):
        print('tag', tag)
        cv.circle(img, tuple(tag.corners[i].astype(int)), 4, (255, 0, 0), 3)
    cv.circle(img, tuple(tag.center.astype(int)), 4, (0, 0, 255), 3)

cv.imshow('gray', img)
cv.waitKey()
cv.destroyAllWindows()



如下图,部分明显的AprilTag码就有效的标注出来了:


分析一下Detector的输出:

属性 说明
tag family 如tag25h9,tag36h11等
tag id Tag的编码ID
hamming 修正多少个错误bit位?(Note1:接受的错误修正越多,误报率越高;Note2:自此实现起,探测器无法检测汉明距离大于2的标签)
decision margin 二进制解码过程质量的度量:数据位强度与决策阈值之间的平均差。数字越高,解码越好。这是一个合理的检测精度衡量标准,仅适用于非常小的标签,对较大的标签无效(在这种情况下,我们可以在位单元格中的任何地方采样,但仍然得到了良好的检测)
homography 描述从“理想”标签(-1,1),(1,1),(1,-1)和(-1,-1)到图像中像素的投影的3x3单应矩阵
center Apriltag图片中心位置
corners Apriltag图片的四个角的位置
pose R* 姿态估计的旋转矩阵
pose t* 姿势估计的转换
pose err* 姿势估计的对象空间误差

1.3 Homography 单应矩阵

上节Detector的输出中,有一个homography参数,解释为:描述从“理想”标签(-1,1),(1,1),(1,-1)和(-1,-1)到图像中像素的投影的3x3单应矩阵,那么这个单应矩阵是啥呢

homography单应矩阵 定义了从二维码坐标系中的四个角点的齐次坐标到图像二维码四个角点坐标的映射。

在相机对于平面图像拍摄时,成像中的点与原始图片之间就是一个单应转换:


H = K [R|t]

其中:

H:单应矩阵;

K:相机内参;

R:旋转矩阵;

t:平移矩阵;


然后对单应矩阵H进行分解,用OpenCV的decomposeHomographyMat函数:

num, Rs, Ts, Ns  = cv2.decomposeHomographyMat(H, K)

其中输出为:

  • num:返回可能的方案;

  • Rs:包含旋转矩阵R的list;

  • Ts:包含平移矩阵t的list;

  • Ns:包含平面法向量的list;

两个输入:

  • H:单应矩阵homography;

  • K:相机内参;

可以看到,我们通过OpenCV的decomposeHomographyMat函数对单应矩阵H出的几个参数,可以计算出AprilTag码的位姿情况,此时就会发现我们除了H外,还缺少一个输入参数——相机的内参K

接下来我们通过相机标定来获取相机内参K。


1.4 相机标定

相机标定其实就是从世界坐标系到图像坐标系的转换,主要涉及四个坐标系:

  • 图像像素坐标系

  • 图像物理坐标系

  • 相机坐标系

  • 世界坐标系


简单来说标定的过程为:

  1. 世界坐标系 —> 相机坐标系,这一步是三维点到三维点的转换,包括R, t(外参)等参数;

  1. 相机坐标系 —> 图像坐标系,这一步是三维点到二维点的转换,包括 K(内参) 等参数;


在下一篇中会具体介绍如何对Originbot小车的相机进行标定,获取相机内参,之后然后通过AprilTag码来估算平面的法向量