目录
前言
一、 usb摄像头的安装和使用
二、AprilTag_ros包的安装
三、单目摄像机的标定
四、AprilTag_ros的使用
五、其他
平台:VM虚拟机
ROS版本:noetic
Ubuntu:20.04LTS
1. 下载源码
cd catkin_ws/src #安装在一个ROS工作空间上
git clone https://github.com/bosch-ros-pkg/usb_cam.git #下载源码
2.编译工作空间
cd .. #回到工作空间
ctakin_make #进行编译
3. 添加usb_cam属性文件(用于终端窗口可检索到usb_cam功能包)
source ./devel/setup.bash #每打开一次工作空间窗口都要
4. 编译usb_cam源码
回到工作空间的src文件中,再去usb_cam中进行编译
cd usb_cam
mkdir build
cd build
cmake .. ##注意后面的两点
make #####
5.测试USB摄像头
1)运行ROS
roscore
2) 回到usb_cam的launch文件夹中,运行usb_cam的功能包
cd launch
roslaunch usb_cam usb_cam-test.launch
1. 安装依赖库apriltag
安装方法如下。这个注意不要把它放到ROS的工作空间里,看你自己放在哪吧。
git clone https://github.com/AprilRobotics/apriltag.git # 这个不是ros的功能包
2. 编译依赖库apriltag
进入apriltag 文件夹中,然后新建文件夹build
mkdir build
cd build
cmake .. ## 注意两点
make
sudo make install #安装到ros中
3. 安装AprilTag_ros包
将源码拷贝到你的工作空间中的src工作目录下
git clone https://github.com/AprilRobotics/apriltag_ros.git #在src文件夹内
4. 回到工作空间进行编译
catkin_make
摄像机标定是通过寻找对象在图像与现实世界的转换数学关系,找出其定量的联系,从而实现从图像中测量出现实中实际数据的目的,基于此才能实现后面的位姿检测。
1. 安装标定功能包
sudo apt-get install ros-melodic-camera-calibration
2. 打开摄像头进行标定
roslaunch usb_cam usb_cam-test.launch #启动摄像头
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam
第二条命令参数说明:
size:棋盘内交叉点的个数,行*列
square:一个格子的边长,单位是m
image:订阅摄像头发布的图像话题(ROS topic)
camera:寻找相应的设备相机名(现实情况应该是/dev,仿真的话,不清楚)
摄像机的校准是以一个由黑白方块组成的棋盘为基准进行的,如图8-8所示。从下面的地址下载8x6国际象棋棋盘,并打印出来后将其贴到一个平坦的纸箱。有时也会打印成超过1米的棋盘,但这里用的是A4纸。作为参考,8x6棋盘横向有9个方块,所以有8个交叉点,而竖向有7个方块,有6个交叉点,所以它被称为8x6棋盘。
attachment:check-108.pdf of camera_calibration/Tutorials/MonocularCalibration - ROS Wikihttp://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration?action=AttachFile&do=view&target=check-108.pdf
3. 开始标定
上/下/左/右移动摄像头,等各个方向绿条满了之后,标定完成时,CALIBRATE会有颜色,点击它,然后点击save,再点击COMMIT。这是会自动保存标定文件。
点击save 后,标定文件会自动保存在/tmp路径下,文件名为calibrationdata.tar.gz压缩包
4. 输出标定参数
1)这是一个方法
writing calibration data to /home/jiang/.ros/camera_info/head_camera.yaml #ros默认自动找这个路径的文件
我是用该方法生成的标定参数,此后每次打开相机就会引用head_camera.yaml 文件
2) 另一个方法(没有用过)
打开并解压校准参数文件,解压缩calibrationdata.tar.gz文件后,可以查看图像文件(*.png)和记录了校准中使用的校准参数的ost.txt文件。
cd /tmp
tar -xvzf calibrationdata.tar.gz
修改校准参数文件,把ost.txt文件改名为ost.ini,并使用camera_calibration_parsers功能包
的convert节点创建相机参数文件(camera.yaml)。创建完成后,将其保存在~/.ros/camera_info/目录中,则ROS中使用的相机相关功能包会引用此信息。
mv ost.txt ost.ini #修改名字
rosrun camera_calibration_parsers convert ost.ini camera.yaml #转换成相机引用信息
mkdir ~/.ros/camera_info #创建相机信息文件夹
mv camera.yaml ~/.ros/camera_info/ #移动到该文件下
重新运行相机节点,打印标定信息:
rostopic echo /camera_info
至此,摄像机标定完成
1. 编辑运行的配置文件
进入apriltag_ros/apriltag_ros/config文件夹中,会看到两个文件
1)settings.yaml (配置apriltag算法)
tag_family: 'tag36h11' # options: tagStandard52h13, tagStandard41h12, tag36h11, tag25h9, tag16h5, tagCustom48h12, tagCircle21h7, tagCircle49h12 #支持单一标签类型
tag_threads: 2 # default: 2 # 设置Tag_Threads允许核心APRILTAG 2算法的某些部分运行并行计算。 典型的多线程优点和限制适用
tag_decimate: 1.0 # default: 1.0 #减小图像分辨率
tag_blur: 0.0 # default: 0.0 #设置tag_blur> 0模糊图像,tag_blur < 0锐化图像
tag_refine_edges: 1 # default: 1 #增强了计算精度,但消耗了算力
tag_debug: 0 # default: 0 #1为保存中间图像到~/.ros
max_hamming_dist: 2 # default: 2 (Tunable parameter with 2 being a good choice - values >=3 consume large amounts of memory. Choose the largest value possible.)
# Other parameters
publish_tf: true # default: false #发布tf坐标
这里有两点注意:
I. tag_family:时设置检测的标签类型(二维码图片类型),一般用’tag36h11’ 。openmv的IDE可以生成这个标签。
II. 如果想发布TF坐标,需要把publish_tf设置为true。
2)tags.yaml (定义要查找的标签和标签簇)
# 这个标签中至少要填入三个参数
standalone_tags:
[
{id: 1, size: 0.05}, # id 对应于生成标签的ID号,size对应标签的大小
{id: 2, size: 0.05},
{id: 22, size: 0.05},
{id: 45, size: 0.05},
]
#这个标签是根据大小和位置检测的
tag_bundles:
[
{
name: 'my_bundle',
layout:
[
{id: 10, size: 0.05, x: 0.0000, y: 0.0000, z: 0.0, qw: 1.0, qx: 0.0, qy: 0.0, qz: 0.0} # id 对应于生成标签(二维码)的ID号,size对应标签的大小
{id: 22, size: 0.05, x: 0.0000, y: 0.0000, z: 0.0, qw: 1.0, qx: 0.0, qy: 0.0, qz: 0.0}, # 我选用的是22和45号标签
{id: 45, size: 0.05, x: 0.0000, y: 0.0000, z: 0.0, qw: 1.0, qx: 0.0, qy: 0.0, qz: 0.0}, # id 对应于生成标签(二维码)的ID号,size对应标签的大小
]
}
]
注意添加你要设定的二维码标签的ID,和size(单位是 m),后面的 x,y,z 等表示的是坐标
2. 修改launch 文件
这里主要是为了启用对应的相机话题(topic)和图像话题(topic)
进入apriltag_ros/apriltag_ros/launch文件夹中,会看到三个launch文件,主要修改这个continuous_detection.launch文件
#发布一个坐标系
3. 使用功能包
1) 先打开相机
roslaunch usb_cam usb_cam-test.launch #启动摄像头
2)运行功能包
roslaunch apriltag_ros continuous_detection.launch
3)运行标签检测节点
这是查看检测标签的各个参数,如坐标(xyz),方向(xyzw),成功检测到标签会出现相应的id,size, pose等信息,实时显示相机的位姿信息,注意看下图
rostopic echo /tag_detections
左边没检测到, 右边检测到
4)可视化标签坐标
运行如下命令,新开一个Terminal,先打开rqt_image_view,然后在里面选择tag_detections_imgage 话题,就可以看到apr检测的图像
也可以在terminal中输入以下命令,获取话题的具体消息
rostopic echo /tag_detections_image #这个不好用,说实话,我没看懂
建议使用下面工具
rosrun rviz rviz
这是rviz 的初始界面。
将红圈的map改为usb_cam,点击add按钮添加话题,首先把二维码(标签)检测的话题添加进去
二维码检测的话题添加进去后在左下角就可以看到被标记出来的二维码标签,再将TF坐标显示(不是话题!)添加进去。
出现下图,然后就可以查看标签位姿了 。
###.可以查看话题发布与订阅的关系信息系,新开一个Terminal(终端),运行如下命令
rosrun rqt_graph rqt_graph
1.标签的产生
使用open_mv的ide 产生的:工具 -> 机器视觉 ->Apriltag生成器-> TAG36H11家族(这个是根据你修改配置文件setting.yaml定的)
选择生成0到10号的标签,最多有586号标签
2. apriltags2_ros的运行(参考,这是其前身)
其订阅的topic:
(1)/camera/image_rect:包含图像的sensor_msgs/Image话题(例如,来自摄像机的视频流的帧)。 假定图像是无畸变的,即由针孔照相机产生。 笔记本电脑网络摄像头通常已经提供了这种图像,而其他相机可能需要中间节点(例如image_proc)进行处理,我购买的是无畸变的外接usb摄像头。
(2)/camera/camera_info: sensor_msgs/CameraInfo话题,其中包含/camera/camera_info/K中的相机内参矩阵。可以通过使用例如 camera_calibration 工具包进行相机标定。
其发布的topic:
(1)/tf:摄像机坐标与每个检测到的标签或标签簇的坐标之间的相对位姿关系。仅在publish_tf:config / settings.yaml中为true时才发布/tf。
(2)/tag_detections:与/tf话题提供的信息相同,但作为自定义消息,其中包含标签ID,大小和geometry_msgs/PoseWithCovarianceStamped姿势信息。
(3)/tag_detections_image:与/camera/image_rect输入的图像相同,但突出显示检测到的标签。仅在launch/continuous_detection.launch中的publish_tag_detections_image==true时才发布。
3. 参考文章
使用Apriltag2-ROS对相机进行定位_Tian Fangzheng的博客-CSDN博客_apriltag ros
ros下实现usb相机功能,并基于apriltag_ros实现定位_programmer_wangmj的博客-CSDN博客
ROS学习笔记(实践二)--AprilTag_ros包的使用_知之至知的博客-CSDN博客_apriltag ros 安装
AprilTag的Tag识别,定位以及跟随_lifuguan的博客-CSDN博客_opencv识别apriltag码
未完待续