系统环境:ubuntu 16.06
ROS: kinetic
1. 设计目标
我们这里是基于ros系统实现usb摄像头的摄像、录bag数据包及rviz中观察数据功能。
2. 安装软件
在实现我们目标之前,我们需要在我们的linux系统的terminal中执行如下命令:
2.1 安装ros
sudo apt-get update -qq && apt-get upgrade -y -qq
sudo apt-get install -y sudo lsb-release iputils-ping libelf-dev kmod usbutils pciutils dirmngr gnupg2
sudo apt-get install -y -qq build-essential python-dev python3-dev python-pip python-all-dev libatlas-base-dev gfortran libopenblas-dev
sudo apt-get install -y -qq libboost-all-dev cmake libpcap-dev libglew-dev sysstat ntpdate ifstat libopencv-dev
sudo apt-get install -y -qq git htop vim sshfs nfs-common screen openssh-server libyaml-cpp-dev
# setup ros environment
sudo echo "Installing ros related packages..."
sudo apt-get install -y python-rosdep python-rosinstall python-vcstools
sudo rosdep init && rosdep update
sudo pip install -q -U Cython geopy bitarray catkin_tools psutil future
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get install -y -qq ros-desktop-full
sudo apt-get install -y -qq ros-kinetic-can-msgs ros-kinetic-laser-proc ros-kinetic-urg-c ros-kinetic-laser-geometry
sudo apt-get install -y -qq ros-kinetic-diagnostic-updater ros-kinetic-cv-bridge ros-kinetic-dynamic-reconfigure
sudo apt-get install -y -qq ros-kinetic-geodesy ros-kinetic-roslint
sudo apt-get install -y -qq ros-kinetic-pcl-conversions ros-kinetic-pcl-ros
sudo sh -c 'echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc'
2.2 安装usb_cam
通过apt来便捷安装usb_camsudo apt install ros-kinetic-usb-cam
当我们通过命令方便快捷的安装好usb_cam后,接下来简单查看下该软件包我们需要注意的部分:
一般情况下如果我们不需要对usb_cam进行深度修改定制的话,直接使用apt来安装就可以,我们只需要在自己创建的软件包中创建自己的launch文件,按照上图的usb_cam-test.launch文件内容格式复制一份差不多的,然后根据自己的需要修改下其中的param参数即可。
2.3 通过源码安装usb_cam软件包
当我们需要对usb_cam进行深度定制修改时就只能通过下载其源码,然后根据需要修改代码,最后编译启动运行就可以了,不过这个属于高级功能,一般情况下大家是不用下载源码来修改的,除非你非常熟悉usb_cam源码结构,自己需要的功能usb_cam无法满足时才需要下载源码修改。
下面我们在github上来下载该源码,github上的usb_cam源码网址如下:git clone https://github.com/ros-drivers/usb_cam
通过下图来查看整个下载操作流程:
注意:
如果在笔记本上运行外置usb的camera,则需要作如下修改:vim launch/usb_cam-test.launch
2.4 编译usb_cam节点
catkin build
roslaunch usb_cam usb_cam-test.launch
启动之后将弹出一个小窗口,显示摄像头数据:
2.5 在rviz中查看相机输出
0x05 校准摄像头
2.6 rviz 显示相关topic数据
Add -> By Topic -> Image
3. 摄像头校准
一般我们在使用usb_cam来启动相机时,如果没有校准过的话,都会收到如下警告信息:
如果启动的摄像头有自动对焦功能,则没有上述警告提示信息。
3.1 对焦操作
一般情况如果只是拿摄像头作为视频监控功能的话就不用对相机做校准操作,只有在需要调用opencv功能对相机的视频流做图像处理,例如人脸识别,物体识别,使用立体相机或双目相机进行测距时才需要对相机进行校准。
为了从相机图像信息获得准确的距离信息,则需要多种附加信息,如每台相机各不相同的镜头特性、镜头与图像传感器之间的距离以及扭转角度等信息。这是因为相机是一个将我们生活的三维空间世界投影到二维空间的图像投影设备,所以在投影过程中,由于每台相机的固有特性,这些参数都会不同。
例如每台相机的镜头和图像传感器彼此不同,并且由于相机的硬件结构不同,镜头和图像传感器之间的距离也各不相同。并且在相机制作过程中,镜头和图像传感器必须水平组装,但由于细微的偏差,图像中心(image center)与主点(principal point)会有细微的偏离,且图像传感器的倾度也会略有差异。
校准这些部件的过程称为相机校准(Calibration),目的是查找相机的固有参数。摄像机的校准是非常重要的,ROS提供的是利用OpenCV相机校准的校准功能包,接下来我们按照如下步骤操作即可:
(1)安装相机校准软件包sudo apt install ros-kinetic-camera-calibration
但是在使用该校准软件包时需要启动uvc_camera软件包,这样我们才能使用camera-clibration软件进行校准,最终生成的校准yaml文件是可以在uvc_camera和usb_cam软件包中通用的。
安装uvc_camera的命令如下:
在kinetic中安装命令:sudo apt install ros-kinetic-uvc-camera
(2)查看默认的相机信息
首先启动uvc_camera节点,通过如下命令启动,注意需要先启动roscore节点后再启动该节点:rosrun uvc_camera uvc_camera_node
当启动节点后,查看默认的相机信息,由于目前还没有校准文件的配置信息,因此全部显示为默认值:
(3)准备校准用的棋盘
摄像机的校准是以一个由黑白方块组成的棋盘为基准进行的,如下图所示。可以从本文的附件中下载8×6国际象棋棋盘,并打印出来后将其贴到一个平坦的纸板上。有时也会打印成超过1米的棋盘,但这里用的是A4纸。作为参考,8×6棋盘横向有9个方块,所以有8个交叉点,而竖向有7个方块,有6个交叉点,所以它被称为8×6棋盘。
使用如下命令来进行启动校准节点:rosrun camera_calibration cameracalibrator.py –size 8×6 –square 0.0255 image:=/image_raw
下面对命令中各参数进行简单介绍,–size是上述棋盘的宽度和高度, –square 0.0255是棋盘的一个小方格的实际尺寸。这个小方块是正方形,但是打印出来的尺寸可能会各不相同。由于使用A4纸张打印出来是25.5毫米(我们可以使用尺子测量一下每个格子的宽度即可),所以下面命令中写了0.0255,如果换成A3纸张打印的话,每个方格是36毫米,需要将square参数改为0.036即可,一般由于打印的不同大小我们只需要改动square大小,其他参数基本上不用改动。
校准节点运行后会运行GUI,此时如果用相机对准棋盘,校准将立即开始。在GUI屏幕的右侧,可以看到一个标有X、Y、Size和Skew的条形控件。这是校准的进展状态,都以绿色填满意味着校准完成。在校准过程中需要将棋盘对着相机朝着左/右/上/下/前/后移动,还需要倾斜棋盘,这是个比较无聊的过程,我们需要拿着校准棋盘不断的移动,晃荡个大概5分钟左右就差不多了,看到基本上绿色已经填满了。校准所需的所有图像都记录下来之后,CALIBRATE按钮会被**。点击这个按钮后会进行实际的校准计算,这需要大约3到5分钟。此时就可以将校准板放下了,耐心等待计算完成后,点击SAVE按钮保存校准信息,存储的地址显示在执行校准的终端窗口中,是存储在某一个/tmp目录(如“/tmp/calibrationdata.tar.gz”)中。
接下来将生成的校准文件移动到当前用户的home目录下:
最后只需要打开head_camera.yaml文件修改一下就能保证该校准参数文件正常使用了:
有了校准的配置文件,那以后我们再使用usb_cam打开usb摄像头的话就没有找不到校准文件的警告提示信息了: