AprilTag简介与简单实用(自用资料整理)

本文详细介绍了如何在ROS环境下使用AprilTag视觉标记系统,包括AprilTag的特性、apriltag_ros功能包的使用步骤,以及如何通过opencv生成和识别AprilTag。从生成二维码、校准相机到启动相关节点,最后在rviz中查看标签的位姿,整个流程清晰明了,适合ROS和AprilTag初学者参考。

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

AprilTag是由University of Michigan的APRIL Robotics Laboratory提出的,官网是这里。官方自己对AprilTag的描述是视觉基准系统(Visual Fiducial System),其应用领域包括AR、机器人、相机校正等。通过对AprilTag Marker的识别,可以确定相机的位姿(相对于Marker)。AprilTag除了常规的方形,还可以包含其它“奇形怪状”的样子,如下。.

一个普通的AprilTag大约长下面这个样子。

 

AprilTag

优点:

  • (1) BSD许可
  • (2) 更少的可调节参数
  • (3) 在长距离场景中表现依然较好
  • (4) 被NASA采用
  • (5) 更加灵活的marker设计(maker不一定是方形的)
  • (6) 计算量更少
  • (7) 支持Tag bundle,减少旋转歧义性
  • (8) 更多的误检测(默认参数)

apriltag_ros功能包简介

【注意:apriltags2_ros这个包已经被重新命名为apriltag_ros,所以如果去ROS-wiki官网上搜索apriltags2_ros会自动跳转到apriltag_ros上,但是其教程和内容还是写的apriltag2_ros,但是并不影响其使用,在此说明一下。】

由上图可知,此包通过接收

/camera/image_rect

和 /camera/camera_info

两个话题,并且通过自身的两个配置文件

tags.yaml 和 settings.yaml ,

通过算法处理以后,发布

/tf 、/tag_detections

和 /tag_detections_image

三个话题。

其中:

/camera/image_rect

话题发布消息类型为

/sensor_msgs/Image,该消息包含了从相机采集到的图像数据。

/camera/camera_info

话题发布消息类型为

/sensor_msgs/CameraInfo ,

该消息包含了相机的内参矩阵K和其他的一些标定参数。可以通过 camera_calibration

(camera_calibration - ROS Wiki)或者kalibr(GitHub - ethz-asl/kalibr: The Kalibr visual-inertial calibration toolbox)获得标定参数。

tag.yaml

文件中包含了用于检测的二维码信息。

settings.yaml

文件中包含了apriltag算法核心配置。

/tf 话题包含了每个被检测到的二维码相对于相机的位置和方向的数据。只有在settings.yaml文件中将 publish_tf 设置为 true 才会发布。

/tag_detections

话题发布的内容和 /tf 一样,只是包含了一个自定义消息 tag ID,该消息主要用于一簇标签(tag bundles)的检测。

/tag_detections_image

话题发布的内容和 /camera/image_rect 内容一样,只是包含了标签绑定的内容(即在输出的图像上实时高亮显示标签的位置)。只有在continuous_detection.launch文件中,设置publish_tag_detections_image==true才会发布。

2.AprilTag的使用(opencv)

2.1 AprilTag的生成

 apriltag功能包的使用

【注意:该包的使用需要

OpenCV库,Eigen3库,以及 cv_bridge包、usb_cam包、camera_calibration包】

1. 二维码的生成

下载

openmv(https://openmv.io/pages/download

这里选用的是linux版本

找到下载的源文件,赋予运行权限

sudo chmod +x openmv-ide-linux-x86_64-2.6.5.run (这里要修改为自己下载的版本名称)

运行openmv./openmv-ide-linux-x86_64-2.6.5.run

然后选择 工具---机器视觉---ApirlTag生成器---TAG36H11,在弹出的对话框中选择需要的标签数量和对应的ID【这里选择的是TAG36H11,在

apriltag_ros/config/settings.yaml

文件中也要设置成对应的标签名称,否则算法将无法识别】

2. 启动相机

roslaunch usb_cam usb_cam-test.launch

3. 启动camera_calibration

校准相机

rosrun camera_calibration cameracalibrator.py --size 11x9 --square 0.100 image:=/usb_cam/image_raw camera:=/usb_cam

size 为棋盘标定板的大小,square为棋盘的边长,image为相机发布的图像信息(此处需要根据实际情况修改为自己相机发布的话题,可以通过 rostopic list 查看)

camera 为相机发布的相机消息,同样,根据实际情况修改为自己的相机

4. 启动apriltag_ros

roslaunch apriltag_ros continuous_detection.launch

需要注意的是,在

apriltag_ros/launch/continuous_detection.launch 文件下,

<arg name="camera_name" default="/usb_cam" />

<arg name="camera_frame" default="usb_cam" />

<arg name="image_topic" default="image_raw" />

将上面三个参数改为自己相机参数。

在apriltag_ros/config/tags.yaml 文件中修改为自己的标签设置。

standalone_tags:

[

{id: 0, size: 0.05},

{id: 1, size: 0.05},

{id: 2, size: 0.05},

{id: 3, size: 0.05},

{id: 4, size: 0.05},

{id: 5, size: 0.05},

{id: 6, size: 0.05},

{id: 7, size: 0.05},

{id: 8, size: 0.05},

{id: 9, size: 0.05},

]

上面为此次测试时用的标签参数,包含了标签的ID和每个标签的大小0.05m

5. 启动rqt_image_view

话题选择 /tag_detectios_image,就可以观看到带有标签高亮的图像

6. 启动rviz

将固定坐标设置为 相机的坐标系(这里为 /usb_cam),并且添加TF模块,就可以实时看见每个tag相对于相机的位置和方向了

3. ros上实现Apriltags位姿输出


在github上我们可以找到很多相关的代码,我用的是https://github.com/shijiwensjw/apriltags2_ros 下的代码实现了Apriltags位姿输出,既然有了算法,那麽我们需要通过摄像头输入图像,既然有了摄像头引入,我们便需要进行相机内参的标定,只有这样才可以保证精度。

具体实现:
首先下载usb_cam的包,然后在在launch文件修改如下:
“/dev/video1” /是插入usb摄像头具体的设备口
相机标定实现参考网址:https://blog.youkuaiyun.com/harrycomeon/article/details/91126256

然后在ros下,建立工作空间,将apriltags2,apriltags2_ros,camera_calibration,usb_cam文件夹复制到所建的工作空间的src目录下。catkin_make编译通过后,便可以依次运行
 

roslaunch usb_cam usb_cam-test.launch
roslaunch apriltags2_ros continuous_detection.launch

然后自己将两个launch文件整合到一起,只需要运行一个就可以

 roslaunch apriltags2_ros continuous_detection.launch

此时已经发布了话题,然后我们便可以查看话题下的内容,其中在/tag_detections和/tf话题下,发布了tag相对于相机的相对位姿。

注意下面文件下有指定识别tag的标号和实际大小
在这里插入图片描述
在这里插入图片描述

 参考博客:

技术分享 | apriltag_ros的基础讲解 - 知乎 (zhihu.com)

(8条消息) Apriltags+Ros+Ur5项目--Apriltags位姿输出_光头明明的博客-优快云博客_apriltags

<think>好的,用户想在ArcGIS或QGIS中对DEM进行重分类。首先,我需要回忆一下这两个软件中关于重分类的功能和步骤。记得在ArcGIS里,重分类通常是通过Spatial Analyst工具里的Reclassify工具完成的。而在QGIS中,可能使用的是Raster Calculator或者Reclassify by Table之类的插件或处理工具。 用户可能对DEM数据不太熟悉,所以需要先解释什么是重分类。重分类就是将栅格中的数值重新映射到新的类别或范围,比如将高程分成不同的等级,用于分析地形或制作地图。不过,用户已经提到了DEM,所以可能已经了解基本概念,但应用步骤是关键。 接下来,要分步骤说明在两个软件中的操作流程。对于ArcGIS,需要确保Spatial Analyst扩展模块已经启用,然后找到Reclassify工具,选择输入栅格,设置分类规则,比如手动划分间隔或使用分类方法(自然间断点、等间隔等),然后指定输出路径。需要提醒用户注意分类方法的适用场景,比如等间隔适合均匀分布的数据,而自然间断点则根据数据分布自动划分。 对于QGIS,可能步骤稍有不同。QGIS默认可能没有直接的Reclassify工具,但可以通过Raster Calculator使用条件语句来重新分类,或者安装Reclassify插件。比如使用GRASS GIS的r.reclass模块,或者SAGA GIS的重分类工具。需要详细说明每种方法的具体步骤,比如在Processing Toolbox里搜索相关工具,设置旧值到新值的映射表,或者使用表达式进行条件赋值。 另外,用户可能会遇到常见问题,比如分类后数据范围不正确,或者输出结果不显示。这时候需要检查输入数据的值域,确认分类规则是否正确覆盖了所有可能的值,或者检查是否忽略了某些特殊值(如Nodata)。此外,输出格式的选择也可能影响结果,建议使用GeoTIFF等常见格式以确保兼容性。 还要考虑用户的实际应用场景。例如,重分类可能用于洪水模拟,将高程分为淹没区和非淹没区;或者用于土地利用规划,划分不同的坡度等级。不同的应用可能需要不同的分类策略,因此提供一些实例会有帮助。 最后,生成相关问题时,需要围绕DEM处理的其他操作,比如坡度计算、山体阴影生成,或者其他软件的比较,比如如何选择ArcGIS和QGIS进行这类操作。可能还要涉及数据预处理步骤,比如如何纠正DEM中的错误或填补缺失值。</think>### 如何在 ArcGIS 或 QGIS 中对 DEM 进行重分类? #### **ArcGIS 操作步骤** 1. **启用 Spatial Analyst 扩展** 打开 ArcMap 或 ArcGIS Pro,依次点击 `Customize > Extensions`,勾选 `Spatial Analyst`[^1]。 2. **打开重分类工具** 在 `Toolbox` 中导航至 `Spatial Analyst Tools > Reclass > Reclassify`。 3. **设置参数** - 输入栅格:选择 DEM 数据。 - 分类方法:支持手动划分区间或自动分类(如自然间断点、等间隔)。 - 输出栅格:指定保存路径。 ```python # 示例:通过代码调用工具 arcpy.Reclassify_3d("dem.tif", "VALUE", "0 500 1;500 1000 2;1000 1500 3", "output_reclass.tif") ``` 4. **验证结果** 检查输出栅格的属性表,确认高程值已按规则映射到新类别。 --- #### **QGIS 操作步骤** 1. **使用 Raster Calculator** - 打开 `Raster Calculator`(Processing Toolbox 中搜索)。 - 输入条件表达式,例如将高程分为三类: ``` (dem@1 <= 500) * 1 + (dem@1 > 500 AND dem@1 <= 1000) * 2 + (dem@1 > 1000) * 3 ``` - 指定输出格式为 GeoTIFF。 2. **通过插件重分类(如 Reclassify by Table)** - 安装 `Reclassify by Table` 插件。 - 定义旧值范围新值的映射表,例如: | 旧值范围 | 新值 | |----------|------| | 0-500 | 1 | | 500-1000 | 2 | | >1000 | 3 | 3. **GRASS GIS 工具** 在 Processing Toolbox 中搜索 `r.reclass`,上传规则文件(如 `rules.txt`)定义分类规则。 --- #### **常见问题注意事项** - **数据范围不匹配**:检查 DEM 的元数据,确认高程值范围是否覆盖分类区间。 - **Nodata 处理**:在 QGIS 中可通过 `Raster Calculator` 添加条件 `ELSE 0` 或保留原值。 - **分类方法选择**: - 等间隔:适用于均匀分布的高程数据。 - 自然间断点:适合突出地形突变区域[^2]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值