点云是空间中的一个数据点集,通常由3D扫描仪或深度摄像机产生,作为3D扫描过程的输出,点云用于多种用途,包括为制造零件创建3D CAD模型,用于计量和质量检查,以及用于多种可视化,动画,渲染和大规模定制应用。
Openni2
采集并显示点云最有名的一个方法也许就是使用openni2(针对kinect v2)库了,使用这个库我们可以通过几行简单的代码实现点云的显示。而且这个库基于ros,可以实时发布注册好的rgb图和depth图,使得利用rviz进行显示成为一件非常简单的事情。而且我们在机器人的开发过程中一般都是使用rviz来进行仿真的,如果我们也能在rviz中显示点云,那么对于我们的开发显然是更加方便的。
其实我们在刚开始安装linux下的kinect v2的开源驱动libfreenect2
的时候就可以顺便安装好openni2
了,这是最后一个可选的操作,具体的内容可以看这里的安装指南的最后一行。
现在我们运行这个交互库:
roslaunch openni2_launch openni2.launch (如果是kinect v1,请使用openni)
在这里我们会发现事情仍然不是那么简单的,因为错误很可能就在某个角落里等着你:
[ INFO] [1464612947.670034045]: No matching device found.... waiting for devices.
如果你使用的不是kinect系列的深度摄像机,那么你应该看看这个;而如果你是kinect v1的用户,那么很有可能你还需要安装一个SensorKinect,不用怕,按照README.md文件的提示装好就好了,可以参考下这里;还有一种情况是我们这些使用kinect v2的人,错误的原因大概就是我在前面所提的安装libfreenect2时没有安装openni2,这个更好解决,回到libfreenect2
的目录下执行一下最后一个命令就好了。
那么现在所有的需要的依赖我们都装好了(luckily),我们需要重新运行上面的那个命令:
roslaunch openni2_launch openni2.launch (如果是kinect v1,请使用openni)
之后我们另外打开一个终端,运行一下这个结点:
rosrun rviz rviz
它将启动rviz来使我们可以查看点云。
我们进去发现rviz是空的,这是因为我们目前还没有订阅任何topic,我们先设置FixedFrame为camera_link
,然后在面板中添加PointCloud2,将它的订阅消息设置为/camera/depth/points
。好,点云出现了!
到这里就大功告成了,可以自己探索一下!但值得吐嘈一下的是,这个点云的质量的刷新速度实在是差强人意,不知道是什么原因,还得有空再研究下!不过没空也没关系,我们还是把时间留给有更好的方法吧!
iai_kinect2
前面使用openni2的点云查看方式实在是令人有点儿想吐,不过不要紧,我在探索的过程中发现了另外一个方法,显示的效果以及速度都令人非常满意。
在这个方法中,我们要使用iai_kinect2这个ros包,它包含一系列和kinect2的操作有关的结点文件,而且结构也更加清晰。主要的部分有:
- 校准工具,用于校准Kinect One的红外传感器到RGB传感器和深度测量;
- 一个用OpenCL支持进行深度注册的库;
-
libfreenect2
和ROS之间的桥梁; - 图像/点云的查看器;
但金无足赤,人无完人,这个包美中不足的是安装过程的困难,我在这里建议将这个包不要放在公共的catkin空间下进行编译,而是单独放在另外一个空间下,这样可以避免很多错误。总之,在linux下安装好了libfreenect2
和iai_kinect2
之后,我们就可以玩转kinect2了!
首先我们来连接kinect V2并打开bridge,这个launch文件会为我们连接硬件并发布一系列要用到的topic。
roslaunch kinect2_bridge kinect2_bridge.launch
然后我们来校准相机,这个过程比较复杂,我们放在另外一篇文章中讲解,现在我们可以直接先跳过这个过程。如果你不打算跳过的话,完成校准后将校准文件添加到该kinect2_bridge/data/<serialnumber>文件夹。我跳过的原因是我将源码所带的示例校准参数拷到了目标文件夹下,发现竟然很好地解决了对齐的问题,所以就没有继续校准的必要了。当然,如果你对点云的精度要求不是那么高的话,默认的参数也是可以用的。
之后,我们运行下面这个命令来查看我们想看的内容:
rosrun kinect2_viewer kinect2_viewer kinect2 sd cloud
这个文件会启动kinect2_viewer
节点,这个节点会接收bridge发布的topic消息来显示我们想看的内容。上面的"cloud"就是我们想看的内容,当然我们也可以订阅其他内容,总共有这些内容可供订阅:
-
image
(RGB图像); -
cloud
(点云); -
both
(同时显示以上两者)。
同时,配合这些内容,我们还有四种查看模式,这些模式涉及我们要查看的内容的分辨率:
-
qhd
(1/4高清:960×540); -
hd
(全高清:1920×1080); -
sd
(标清:< 720p); -
ir
(红外)。
这里是我的身旁的一个点云示例:
但还有一个问题,我们怎样在rviz中显示点云呢?不要急,这是非常简单的一个操作,我们还是先启动kinect2_bridge.launch
文件,之后按照前面的方法打开rviz。
roslaunch kinect2_bridge kinect2_bridge.launch publish_tf:=true
rosrun rviz rviz
然后我们在rviz中将FixedFrame设为kinect2_link
,在显示面板添加PointCloud2,并为它订阅/kinect/sd/points
。
到这里,我们终于实现了在rviz中实时展示高质量的点云。通过两种方法的结果对比,我推荐大家选择iai_kinect2
这个包来实现。