本篇是根据《ROS机器人编程》一文(作者:表允晳 赵汉哲 郑黎蝹 林泰勋),8.1-8.3节实验记录:
环境:VMware(PS.VirtualBox6.0对笔记本摄像头usb3.0支持不好,会绿屏)
一、安装uvc-cam(笔记本自带摄像头3.0)
版本:kinetic
sudo apt-get install ros-kinetic-uvc-camera
二、ROS图像显示
- 声明环境
roscore
- 运行uvc_camera节点(新终端)
rosrun uvc_camera uvc_camera_node
- 查看话题消息(第三个终端)
以下话题消息显示正在发布相机信息(/camera_info)和图像信息(/image_raw)rostopic list
- 打印出相机信息
rostopic echo /camera_info
三、三种方式查看图像
-
方法一:使用image_view节点查看图像
rosrun image_view image_view image:=/image_raw
遇见问题:
1、黑屏(没安装虚拟机扩展模块或者usb格式未选到3.0)
[解决方法略过、事实证明virtualbox安装了也只会有其他错误-》绿屏]
2、在VirtualBox下cheese
显示图像,但ros查看时显示绿屏(因为VirtualBox6.0对笔记本自带摄像头usb3.0格式不支持)
解决方法:
这里我改用VMware移植镜像(前面一篇文章说过移植镜像方法),注意设置usb为3.0
-
方法二:用rqt_image_view节点检查
rqt_image_view image:=/image_raw
-
方法三:用RViz查看
rviz
RViz运行后,先更改“Displays”选项。单击RViz左下方的[Add],在[By display type]选项卡中选择[Image],以此加载图像显示功能
然后将[Image] → [Image Topic]的值更改为“/image_raw”。则会如图所示显示图像。如果图像看起来很小,则可以用鼠标调整该image视图的边缘,以增加视图尺寸。
四、摄像头标定
-
安装校准包
sudo apt-get install ros-kinetic-camera-calibration
-
运行uvc_camera_node节点(两个终端)
roscore rosrun uvccamera uvccameranode
-
打印相机信息
rostopic echo /camera_info
注意相机原始信息
D、K、R、P
都为0
-
准备棋盘
摄像机的校准是以一个由黑白方块组成的棋盘为基准进行的,如图8-8所示。从下面的
地址下载8x6国际象棋棋盘,并打印出来后将其贴到一个平坦的纸箱。有时也会打印成超过1米的棋盘,但这里用的是A4纸。作为参考,8x6棋盘横向有9个方块,所以有8个交叉点,而竖向有7个方块,有6个交叉点,所以它被称为8x6棋盘。
http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration?action=AttachFile&do=view&target=check-108.pdf
-
运行校准程序包:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/image_raw camera:=/camera
在校准过程中需要将棋盘对着相机朝着左/右/上/下/前/后移动
,还需要倾斜棋盘。激活update;点击update
,等待处理,激活SAVE;点击SAVE
,
-
打开另一个新的终端,创建相机参数文件
下面,我们来创建一个包含相机校准参数的相机参数文件(camera.yaml)。如下例
所示,解压缩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
注意相机信息
D、K、R、P
都已被填充
标定完成!