![66093bfcd4913c65caf9333ab126ff9b.png](https://i-blog.csdnimg.cn/blog_migrate/2b2e373ab7e65cc289f5c4af5ea387be.jpeg)
在室内机器人一般使用基于主动红外测距原理的RGB-D相机(比如kinect)获取深度图像,RGB-D相机由于其测量范围和原理导致它主要适用于室内环境中。在室外环境中由于环境光线很强,主动红外光容易受到太阳等光线强烈干扰,因此通常我们不使用主动红外光而是直接使用双目相机计算深度图。
双目摄像头是应用非常广泛的摄像头。目前看到有两种,其中一种是插到计算机上以后会出现两个摄像头,程序分别从两个摄像头读取图像数据;另外一种是插到计算机以后只出现一个摄像头,两个镜头的数据被拼接到同一个图像上同时被读取出来。考虑到两个镜头的同步问题,目前买到的双目摄像头通常是后者。
数据预处理
ROS系统中双目摄像头感知框架是分别读取左右两个镜头数据,遗憾的是目前官方没有为上面讲到的第二种摄像头提供一个通用的包。可以使用gitee中的这个包来讲拼接图像拆开:
傻傻的吹/stereo_cameragitee.com这个包订阅/imageraw的图像将其拆分/left/imageraw和/right/image_raw,并且读取摄像头矫正标定数据camerainfo发送给ROS的后端。
摄像头的校准标定数据根据每个摄像头基线宽度、光学镜头、焦距等等决定,可以自己通过下名命令得到
rosrun camera_calibration cameracalibrator.py --approximate 0.1 --size 8x6 --square 0.108 right:=/my/right/image_raw left:=/my/left/image_raw right_camera:=/my/right left_camera:=/my/left
其中size指的是校准棋盘格格点数量,--square指的是每个棋盘的边长。校准成功以后,数据会被自动写到系统配置文件中。
双目相机校准以后,生成生成两个相机的校准矩阵。其中左摄像头的校准聚准与双目相机基本相同,而右摄像头的矩阵中就包含了第二个摄像头相对与第一个摄像头的平移与旋转参数。这些参数在后续深度估计时就会用得到
点云生成
ROS系统的点云生成框架数据很稀疏,推荐使用elas包生成相对稠密的点云数据。elas包可以从gitee下载。
如果我们的工作空间是catkin,那么我们进入到src目录,从github上把elas-ros拉下来
cd catkin/src
git clone https://gitee.com/rivercloud/elas-ros.git
拉取完成代码后,进入到catkin目录执行
catkin_make
编译成功后,可以得到elas_ros包。我们可以通过编写launch文件,加入相关节点来启动它
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<include file="$(find elas_ros)/launch/elas.launch" >
<arg name="stereo" value="my" />
<arg name="elas_ns" value="elas" />
</include>
<node pkg="test_package" type="camera.py" name="splitter"/>
<node pkg="tf" type="static_transform_publisher" name="camera_tf" args="0 0 0 0 0 0 1 base_link head_camera 100" />
<node pkg="tf" type="static_transform_publisher" name="base_tf" args="0 0 0 0 0 0 1 map base_link 100" />
</launch>
故障诊断
elas输出的点云数据发布在point_cloud话题,同时还输出了视差图disparity,可以通过rviz的image类型来查看视差图。
如果视差图雪花很多,点云数据就会大量的噪声甚至没法输出准确点云,通常就是校准没做好,或者是摄像头不够稳定。所以要么重新校准,要么换个摄像头