通过二维码计算6D位置姿态(基于Stag码和ROS2实现)

简介

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,</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值