使用Apriltag2-ROS对相机进行定位

本文介绍如何使用Apriltag2ROS版本对USB相机进行定位,通过二维码利用PNP方法实现实时相机位姿信息定位,精度可达1厘米内,并通过Rviz可视化相机位姿及路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是对Manii博客,使用USB相机对其代码的复现

前言

使用Apriltag2 ROS版本对相机进行定位,主要思想是根据二维码,利用PNP的方法实现相机的定位。

代码主要实现如下功能:

1.根据二维码标签的位姿信息,实时定位相机的位姿信息(两者的位姿信息均为世界坐标系)

2.相机的坐标精度在1厘米以内

3.通过ROS自带的工具包Rviz实现相机位姿及路径的可视化

准备工作

1.系统:ubuntu 16.04

2.ROS:kinetic(ROS的安装教程查看ROS-kinetic)

3.USB摄像机驱动以及标定(若无请参考单目摄像头标定)

相机标定好的yaml文件一般会在/home/lab1712/.ros/camera_info路径下(可用Ctrl+H显示隐藏文件.ros)

4.下载Manii的源码

代码编译

1.将代码放入工作空间中,如catkin_ws1/src

2.由于Manii使用的intel realsense d435i相机,本人使用的USB相机,故而需修改源代码在/catkin_ws1/src/Apriltags2_VO/apriltags2_ros/launch文件夹下的continuous_detection.launch文件

修改为以下内容,目的是为了保证程序能订阅到相机发布的topic

3.对源码进行编译即可使用

cd catkin_ws1
catkin_make

代码运行

1.代码运行之前需要修改二维码标签在世界坐标系下的位姿,文件为catkin_ws1/src/Apriltags2_VO/apriltags2_ros/config路径下的tags.yaml文件

需要测量二维码的边长,A4纸打印出来测量的为0.139米,二维码的在世界坐标系下的位姿需根据自己的实际情况进行设定。我这里只修改了id_1的二维码进行测试

接下来按步骤启动程序就好

2.在Terminal中运行以下命令:

roscore

3.新开一个Terminal,打开摄像头

roslaunch usb_cam usb_cam-test.launch

4.新开一个Terminal,运行apriltags2_ros

cd catkin_ws1
source devel/setup.bash
roslaunch apriltags2_ros continuous_detection.launch

5.新开一个Terminal,运行标签检测节点

cd catkin_ws1
source devel/setup.bash
rostopic echo /tag_detections

此时如果USB相机捕捉到二维码时,已在命令窗口中实时显示相机的位姿信息(若未捕捉到二维码,不显示信息,如左图;若捕捉到二维码,实时显示信息如右图)

如果想可是话,还要运行如下命令

+1.新开一个Terminal,运行标签检测节点

cd catkin_ws1
source devel/setup.bash
rostopic echo /tag_detections_image

+2.新开一个Terminal,打开Ros的可视化工具包Rviz

rosrun rviz rviz

下面是Rviz的初始界面,需要注意两个圈红圈的地方

将红圈的map改为usb_cam,点击add按钮添加话题,首先把二维码检测的话题添加进去

二维码检测的话题添加进去后在左下角就可以看到被标记出来的二维码标签,再将路径和姿态两个话题添加进去

这事主图出现的是一个箭头,将蓝色圆圈的内容修改为Axes,就可以看到主图所示

++1.可以查看一下目前发布的话题,新开一个Terminal,运行如下命令

rostopic list

++2.可以查看话题发布与订阅的信息,新开一个Terminal,运行如下命令

rosrun rqt_graph rqt_graph

### 使用AprilTag实现精确定位 为了实现机器人的精确定位AprilTag技术提供了一种高效且可靠的方式。通过检测环境中预定义的特殊二维码(即AprilTags),机器人能够计算自身的相对位置和姿态。 #### 安装必要的库文件 首先需要安装Python环境下处理图像以及解析AprilTag的相关库: ```bash pip install apriltag opencv-python numpy ``` #### 初始化摄像头并读取视频流 建立一个脚本来初始化连接到计算机上的USB摄像机或其他类型的视觉传感器,并持续获取实时画面帧用于后续分析。 ```python import cv2 cap = cv2.VideoCapture(0) if not cap.isOpened(): print("Error opening video stream or file") while True: ret, frame = cap.read() if not ret: break # 显示捕获的画面 cv2.imshow('Frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` #### 加载AprilTag检测器并对每一帧执行匹配操作 引入`apriltag.Detector()`对象来查找当前视图中存在的所有标签实例;对于每一个发现的目标,提取其中心坐标(x,y),旋转角度θ以及其他有用的信息作为反馈给控制系统的输入参数[^1]。 ```python from apriltag import Detector detector = Detector() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) detections = detector.detect(gray) for detection in detections: center_x, center_y = detection.center rotation_matrix = detection.pose_R translation_vector = detection.pose_t.flatten() * 100 # 转换为厘米单位 print(f"Detected tag ID={detection.tag_id}, Center=({center_x:.2f},{center_y:.2f}), " f"Translation=(x:{translation_vector[0]:.2f}cm, y:{translation_vector[1]:.2f}cm, z:{translation_vector[2]:.2f}cm)") ``` 上述代码片段展示了如何利用AprilTag来进行基本的空间定位功能开发。需要注意的是,在实际部署过程中应当遵循一些最佳实践指导原则以确保良好的性能表现,比如保持足够的照明条件、精心规划场景内的标签分布模式等措施均有助于提升最终效果的质量[^2]。
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值