Table of Contents
1、摄像头内参标定
摄像头内参是否准确直接影响到定位是否准确,因此摄像头的内参标定十分重要
笔者标定使用的是ROS下的 camera_calibration 包,roswiki附有很详细的教程 http://wiki.ros.org/camera_calibration 。或者CSDN里搜索,也有很多中文的教程,可以参考 https://blog.csdn.net/heyijia0327/article/details/43538695 。
基本流程为:
1、启动摄像头,ROS下提供很多摄像头驱动包,如笔者使用的usb_cam,根据需要选择
2、打印标定板,官方使用的是很大的标定板,条件不允许的话,打印到一张A4纸上就行
3、开始标定,一定要注意标定板的size和square必须要选择准确(size 8×6意味着你的标定板应该是9×7的网格,square 0.108意味着每一个小方格的边长为108mm),如果报错,末尾添加 --no-service-check
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/my_camera/image camera:=/my_camera
4、保存标定文件(前面报错的童鞋,可能没办法直接保存,但是没关系,标定结果会打印在终端,人工复制过来,再用camera_calibration_parsers 转换到需要的yaml格式 http://wiki.ros.org/camera_calibration_parsers)
把标定得到的yaml文件放到,摄像头驱动读取的目录下,如笔者的为 /home/nubot/.ros/camera_info/head_camera.yaml 。
usb_cam会读取标定文件,并通过camera_info的消息发布出去。
2、Apriltags2_ros
包可以通过git clone下载,放在新建目录下的src中,编译即可使用
git clone https://github.com/dmalyuta/apriltags2_ros.git
同样ROSwik提供了很详细的教程 http://wiki.ros.org/apriltags2_ros/Tutorials/Detection%20in%20a%20video%20stream
由于时间原因,这里不做详细介绍,简单提一下几个小注意点,后面时间充裕了,笔者会做详细介绍。
1、tag的size
tag的size指的是tag的边长大小。这里放一张检测的照片,彩色框框出来的,就是要去测量的size。
2、continuous_detection节点的消息格式,会出现跟camera订阅不上的情况
教程里给的消息格式如下,订阅的消息来自命名空间 /camera 但实际上,使用continuous_detection时发现节点默认使用的命名空间是/camera_rect。因此会出现节点之间没有订阅上的情况,在提供的launch文件里找到 <arg name="camera_name" default="/camera_rect" />,改成<arg name="camera_name" default="/camera" />就行了
3、tag 生成
Apriltag官网提供的源图片分辨率很小,打印出来不符合要求
试了好多方法之后,最后通过openmv生成
官网提供openmv IDE的各种版本下载,https://openmv.io/pages/download 下载linux版本的,得到的是一个.run文件,使用办法(在.run文件目录下):
sudo chmod +x openmv-ide-linux-x86_64-2.0.0.run
./openmv-ide-linux-x86_64-2.0.0.run
我上传了生成的tag36h11共587张图片,嫌麻烦的可以到下面链接下载
高分辨率tag下载:https://download.csdn.net/download/weixin_41139709/10581276