相机相当于机器人的眼睛。从相机获得的图像对于识别机器人周围的环境非常有用。 例如,利用相机图像的对象识别和脸部识别;使用两台相机(立体相机)从两个不同图像 之间的差异获得的距离值;利用距离值生成3维地图的Visual-SLAM;单眼相机VisualSLAM;利用从彩色图像获得的颜色信息的颜色识别;跟踪特定对象的对象跟踪。
由于没有外带的USB摄像机,采用的的笔记本自带的!

首先要做的事;查看虚拟机的摄像头是否开启;也就是USB是否连接:

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_笔记本摄像头


然后到虚拟机设置里面,更改usb;如果是USB2.0,就改为USB3.0,如果是USB3.0,就变为USB2.0;

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_uvc camera_02

成功之后,开启虚拟机;会在虚拟机出现如下标志:

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_uvc camera_03

相机连接信息: 打开一个新的终端窗口,并按如下所示使用“lsusb”命令检查连接是否正确;具体名字是USB的名字:

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_uvc camera_04


这里可以查看一下,笔记本自带的摄像头是否正常工作:

cheese

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Image_05


出现图像之后;进行安装uvc camera功能包:

sudo apt-get install ros-kinetic-uvc-camera

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Android UVC摄像头获取录音_06


安装image相关功能包:

sudo apt-get install ros-kinetic-image-* 
sudo apt-get install ros-kinetic-rqt-image-view

运行uvc_camera节点 如果您运行uvc_camera节点,将收到关于相机校准的警告,例如“[WARN][1423194481.257752159]: Camera calibration file /home/xxx/.ros/camera_info/ camera.yamlnot found.”。可以先忽略它:

roscore

打开另外一个终端:

rosrun uvc_camera uvc_camera_node

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Image_07


没有出现问题,在打开另外一个终端;查看话题消息:

rostopic list

使用image_view节点查看图像:

rosrun image_view image_view image:=/image_raw

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_笔记本摄像头_08

我最开始出现问题,忙乎了大半天,也查询了许多资料,当然每个人问题不一样,我就出现问题在于没有,连接好USB,更换USB之后,最好还是在去看看这,是否连接成功了的:

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_uvc camera_09

推介一个链接,解决大部分遇到的问题:

最后成功使用image_view节点查看图像:

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Linux_10


再用rqt_image_view节点检查:

rqt_image_view image:=/image_raw

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Image_11


RViz运行后,先更改“Displays”选项。单击RViz左下方的[Add],在[By display type]选项卡中选择[Image],以此加载图像显示功能,然后将[Image] → [Image Topic]的值更改为“/image_raw”。则会如图8-7所示显示 图像。如果图像看起来很小,则可以用鼠标调整该image视图的边缘,以增加视图尺寸。

rviz

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_笔记本摄像头_12


远程传输图像;只有一台计算机,选择本机:

gedit ~/.bashrc                #打开之后,在文章末尾添加,下面两句
export ROS_MASTER_URI =http://localhost:11311 
export ROS_HOSTNAME =192.168.1.100

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Android UVC摄像头获取录音_13


然后运行roscore,并在另一个终端窗口中运行uvc_camera_node节点;以前的窗口没有关闭,可以直接运行:

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_笔记本摄像头_14


每台相机的镜头和图像传感器彼此不同,并且由于相机的硬件结构不同,镜头 和图像传感器之间的距离也各不相同。并且,在相机制作过程中,镜头和图像传感器必须水平组装,但由于细微的偏差,图像中心(image center)与主点(principalpoint) 会有细微的偏离,且图像传感器的倾度也会略有差异。 校准这些部件的过程称为相机校准(Calibration),目的是查找相机的固有参数。

相机校准;安装相机校准功能包;

sudo apt-get install ros-kinetic-camera-calibration 
rosrun uvc_camera uvc_camera_node

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_笔记本摄像头_15


准备棋盘 摄像机的校准是以一个由黑白方块组成的棋盘为基准进行的,

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Image_16


进行校正:

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/image_raw camera:=/camera

用相机对准棋盘,校准将立即 开始。在GUI屏幕的右侧,可以看到一个标有X、Y、Size和Skew的条形控件。这是校准 的进展状态,都以绿色填满意味着校准完成。在校准过程中需要将棋盘对着相机朝着左/ 右/上/下/前/后移动,还需要倾斜棋盘。

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_uvc camera_17


校准所需的所有图像都记录下来之后,CALIBRATE按钮会被激活。 点击这个按钮后会进行实际的校准计算,这需要大约1到5分钟。计算完成后,点击SAVE 按钮保存校准信息。存储的地址显示在执行校准的终端窗口中,是存储在某一个/tmp目录(如“/tmp/calibrationdata.tar.gz”)中。

创建相机参数文件;解压缩calibrationdata.tar.gz文件以查看图像文件(*.png)和记录了校准中使用 的校准参数的ost.txt文件:

cd /tmp
tar -xvzf calibrationdata.tar.gz

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Linux_18


接下来,将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/

最后再次运行uvc_camera_node节点;这一次,确保 您目前没有出现关于校准文件的警告。

rosrun uvc_camera uvc_camera_node

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Image_19


查看/camera_info话题,则可以看到D、K、R和P参数已被填充:

rostopic echo /camera_info

Android UVC摄像头获取录音 安卓uvc摄像头作为默认_Image_20

到此,也就基本上结束了,结果虽然很简单,但过程中所遇到的问题,以及解决的方法,就是最好的收获!