简介
6D位置姿态在工业自动化、机器人、AGV等领域中有广泛的应用,6D位置姿态是指在三维空间中描述物体的位置和方向,即x、y、z和Roll(滚转)、Yaw(偏航)、Pitch(俯仰)。在slam的精确定位、机器人工具夹爪的快换、模拟末端进行遥操作、物体的定位等方面均可得到应用。这里提供一份示例代码,以供研究者和工程师交流。
算法思路
1、相机取流,这里以笔记本自带的Webcam为例
2、获取RGB对象
3、识别二维码角点
4、根据PnP(Perspective-n-Point)计算位姿
5、通过ROS2将位姿数据发出
依赖
stag、opencv-python、numpy、ROS2
二维码获取
通过该链接下载电子版:https://drive.google.com/drive/folders/0ByNTNYCAhWbIV1RqdU9vRnd2Vnc?resourcekey=0-9ipvecbezW8EWUva5GBQTQ
之后自行打印,贴在所需位置。
代码
在此之前,需要获取相机的内参和畸变矩阵,可以通过相机出场的标定内参获取,也可使用标定板进行标定。如果使用标定板进行标定,需要用相机拍摄若干不同位置的标定板图片。下面给出使用12*9的棋盘格标定板进行标定的代码:
import numpy as np
import glob
import cv2
# 准备棋盘格的3D点
objp = np.zeros((11 * 8, 3), np.float32)
objp[:, :2] = np.mgrid[0:11, 0:8].T.reshape(-1, 2)
objp = 3 * objp # 假设每个方格的大小为3个单位
# 存储棋盘格的3D点和图像点
obj_points = []
img_points = []
# 获取所有图片的路径
images = glob.glob("/home/lz/Documents/desk_camera/*.png")
print(images)
# 遍历每张图片,检测棋盘格角点
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
size = gray.shape[::-1]
ret, corners = cv2.findChessboardCorners(gray, (11, 8), None)
if ret:
obj_points.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1),
(cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001))
if [corners2]:
img_points.append(corners2)
else:
img_points.append(corners)
cv2.drawChessboardCorners(img, (11, 8), corners, ret)
cv2.waitKey(1)
# 相机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None,</