机器人~kinect2显示点云

点云是空间中的一个数据点集,通常由3D扫描仪或深度摄像机产生,作为3D扫描过程的输出,点云用于多种用途,包括为制造零件创建3D CAD模型,用于计量和质量检查,以及用于多种可视化,动画,渲染和大规模定制应用。

机器人~kinect2显示点云_第1张图片
点的集合

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。好,点云出现了!

机器人~kinect2显示点云_第2张图片
openni2的点云

到这里就大功告成了,可以自己探索一下!但值得吐嘈一下的是,这个点云的质量的刷新速度实在是差强人意,不知道是什么原因,还得有空再研究下!不过没空也没关系,我们还是把时间留给有更好的方法吧!


iai_kinect2

前面使用openni2的点云查看方式实在是令人有点儿想吐,不过不要紧,我在探索的过程中发现了另外一个方法,显示的效果以及速度都令人非常满意。

在这个方法中,我们要使用iai_kinect2这个ros包,它包含一系列和kinect2的操作有关的结点文件,而且结构也更加清晰。主要的部分有:

  1. 校准工具,用于校准Kinect One的红外传感器到RGB传感器和深度测量;
  2. 一个用OpenCL支持进行深度注册的库;
  3. libfreenect2和ROS之间的桥梁;
  4. 图像/点云的查看器;

但金无足赤,人无完人,这个包美中不足的是安装过程的困难,我在这里建议将这个包不要放在公共的catkin空间下进行编译,而是单独放在另外一个空间下,这样可以避免很多错误。总之,在linux下安装好了libfreenect2iai_kinect2之后,我们就可以玩转kinect2了!

首先我们来连接kinect V2并打开bridge,这个launch文件会为我们连接硬件并发布一系列要用到的topic。

roslaunch kinect2_bridge kinect2_bridge.launch

然后我们来校准相机,这个过程比较复杂,我们放在另外一篇文章中讲解,现在我们可以直接先跳过这个过程。如果你不打算跳过的话,完成校准后将校准文件添加到该kinect2_bridge/data/文件夹。我跳过的原因是我将源码所带的示例校准参数拷到了目标文件夹下,发现竟然很好地解决了对齐的问题,所以就没有继续校准的必要了。当然,如果你对点云的精度要求不是那么高的话,默认的参数也是可以用的。

之后,我们运行下面这个命令来查看我们想看的内容:

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(红外)。

这里是我的身旁的一个点云示例:


机器人~kinect2显示点云_第3张图片
iai_kinect2点云示例

还有一个问题,我们怎样在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

机器人~kinect2显示点云_第4张图片
iai_kinect2点云示例-rviz

到这里,我们终于实现了在rviz中实时展示高质量的点云。通过两种方法的结果对比,我推荐大家选择iai_kinect2这个包来实现。

你可能感兴趣的:(机器人~kinect2显示点云)