Ubuntu 14.04.5系统上OpenPTrack V1版本双Kinect V2简单校准

参照Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)配置安装完成后,是单台机器的方式。

如果场地比较大,则需要部署多个Kinect V2。由于每台Kinect V2看到同一个人的视角不同,因此需要校准,才能进行合并。

下面,我们用两台PC+两个Kinect V2(每台机器上连接一个Kinect V2)来演示一下如何校准的操作。

原文中的校准是比较麻烦的,涉及到先校准单台Kinect V2的操作,来提高精度,实际上操作可以跳过此步,原因在于最新的OpenNI/libfreenect驱动已经不需要这一步骤了,驱动内部已经处理了。

1.准备所需材料

准备校准纸,在源代码中找到docs/checkerboard_5x6.pdf这个文件,由于纸张比较大(差不多是1m*1m的样子),然后去图文店,打印这张校准纸。注意,由于纸张很大,因此打印店是没办法打印的,只能去打印广告之类的图文店才能打印。这个尺寸的纸张打印,差不多是每张10元左右的样子。

泡沫版,泡沫版用来铺放支撑我们上面打印好的校准纸,建议淘宝搜索"高密度泡沫板保温板反光板",大小规格建议是100*100*5厘米的样子,貌似卖家是两张起卖,差不多每张28RMB的样子。

完整的样子(粘帖上校准纸的泡沫板)如下图

准备支撑杆,支撑杆用来架起Kinect V2,建议淘宝搜索"VR支架定位器三角架HTC vive基站支架"。样子如下图所示

最好买加厚加粗的,原因在于架起Kinect V2之后,细小的支撑杆容易发生晃动,导致顶端的Kinect V2也跟着晃动,影响定位精度。每根支撑杆差不多不到100RMB的样子。

PC服务器,要求必须有USB3.0接口,必须有Nvdiva的显卡,必须支持CUDA。(目前是GTX 780)

2.支撑杆的部署位置

支撑杆的顶部安装了Kinect V2,两个设备涉及到部署位置的问题。

部署原则比较重要的一点就是,两个设备看到的校准板的位置应该是相同的

就是说,如果都从左向右看到校准板,那么两个设备看到的棋盘格子是相同的,比如,我们在左上角标注一个数字0,那么两个设备应该都看到左上角才行,不能一个看到是左上角,一个看到是右上角,这样就会导致无法合并数据了。

因此,我们两个Kinect V2是同侧部署,而不是对角线部署。也就是两个设备是可以同时看到同一张校准板的。其实,如果场地够大,也可以对角线部署的,只要满足两个设备可以同时看到校准板即可了。

3.编辑硬件配置文件

$ xdg-open ~/workspace/ros/catkin/src/open_ptrack/opt_calibration/conf

可以找到camera_network.yaml.example这个文件,用记事本打开,里面的内容如下:

# Camera network parameters
# Supported sensor types: 
#  * Kinect 1st version (type: kinect1)
#  * Kinect 2nd version (type: kinect2)
#  * SwissRanger 4500 (type: sr4500)
#  * Custom stereo pair composed of PointGrey (e.g. BlackFly) cameras (type: stereo_pg)
#
#network:
#  - pc: "Cassiopea"
#    sensors:
#      - type: kinect1
#        id: "Kinect_v1_0"
#      - type: kinect2
#        id: "Kinect_v2"
#  - pc: "pc_2"
#    sensors:
#      - type: kinect1
#        id: "Kinect_v1_1"
#        serial: "A00364820345039A"
#      - type: sr4500
#        id: "SwissRanger0"
#        ip: "192.168.1.31"
#      - type: stereo_pg
#        id: "blackfly_stereo"
#        serial_left: "13310958"
#        serial_right: "13310959"

network:
  - pc: "Cassiopea"
    sensors:
      - type: kinect1
        id: "kinect_right"
  - pc: "Phoenix"
    sensors:
      - type: kinect1
        id: "kinect_left"

# Checkerboard parameters
checkerboard:
  rows: 6
  cols: 5
  cell_width: 0.12
  cell_height: 0.12

拷贝一份这个文件

$ cp ~/workspace/ros/catkin/src/open_ptrack/opt_calibration/conf/camera_network.yaml.example ~/workspace/ros/catkin/src/open_ptrack/opt_calibration/conf/camera_network.yaml

然后修改其中的内容为如下:

# Camera network parameters
# Supported sensor types: 
#  * Kinect 1st version (type: kinect1)
#  * Kinect 2nd version (type: kinect2)
#  * SwissRanger 4500 (type: sr4500)
#  * Custom stereo pair composed of PointGrey (e.g. BlackFly) cameras (type: stereo_pg)
#
#network:
#  - pc: "Cassiopea"
#    sensors:
#      - type: kinect1
#        id: "Kinect_v1_0"
#      - type: kinect2
#        id: "Kinect_v2"
#  - pc: "pc_2"
#    sensors:
#      - type: kinect1
#        id: "Kinect_v1_1"
#        serial: "A00364820345039A"
#      - type: sr4500
#        id: "SwissRanger0"
#        ip: "192.168.1.31"
#      - type: stereo_pg
#        id: "blackfly_stereo"
#        serial_left: "13310958"
#        serial_right: "13310959"

network:
  - pc: "PC1-Master"
    sensors:
      - type: kinect2
        id: "master"
  - pc: "PC2-Slave"
    sensors:
      - type: kinect2
        id: "slave"

# Checkerboard parameters
checkerboard:
  rows: 6
  cols: 5
  cell_width: 0.12
  cell_height: 0.12

注意"id"字段,这个名字我们会在后面用到,取名的时候,要尽可能的简单。

上面的配置文件需要拷贝到每一台机器的相同位置~/workspace/ros/catkin/src/open_ptrack/opt_calibration/conf/camera_network.yaml

4.配置两台主机(PC

两台PC通过有线连接到同一个千兆路由器下面(比如WS832),保证两台机器可以相互ping通,并使用静态地址分配的方式,手工分配两台机器的IP地址。选择其中的一台作为主机,一台作为从机。一般选取性能较强一些的机器作为主服务器。

我们假定主服务器的IP地址为192.168.3.227,从服务器的IP地址为192.168.3.241

然后我们在主服务器上编辑bash启动脚本:

$ vim ~/.bashrc

在其中增加如下内容:

export ROS_MASTER_URI=http://192.168.3.227:11311/
export ROS_IP=192.168.3.227
export ROS_PC_NAME=PC1-Master

请注意,这里面的ROS_PC_NAME为我们在~/workspace/ros/catkin/src/open_ptrack/opt_calibration/conf/camera_network.yaml中指定的pc字段中指定的名字,ROS_IP为本机IP地址。ROS_MASTER_URI为指定的主服务器的地址,注意端口必须是11311

接着,在从服务器上编辑启动脚本

$ vim ~/.bashrc

在其中增加如下内容:

export ROS_MASTER_URI=http://192.168.3.227:11311/
export ROS_IP=192.168.3.241
export ROS_PC_NAME=PC2-Slave

5.校准系统时间

系统时间的同步是非常关键的,精度越高越好,当然,一般的网络对时,也是满足目前的需求的,因此,请务必确保系统可以正确的网络对时。

6.校准流程

(1)主服务器执行:
$ roslaunch opt_calibration calibration_initializer.launch
(2)所有服务器都执行:
$ roslaunch opt_calibration listener.launch
(3)主服务器执行:
$ roslaunch opt_calibration opt_calibration_master.launch
(4)主服务器执行:
#roslaunch opt_calibration sensor_<sensor_id>.launch

$ roslaunch opt_calibration sensor_master.launch

注意这里的

sensor_<sensor_id>

部分,是我们在~/workspace/ros/catkin/src/open_ptrack/opt_calibration/conf/camera_network.yaml里面配置的id字段的替换。比如,我们定义

  - pc: "PC1-Master"
    sensors:
      - type: kinect2
        id: "master"

则我们的主服务器就执行

$ roslaunch opt_calibration sensor_master.launch
(5)从服务器执行:
#roslaunch opt_calibration sensor_<sensor_id>.launch 

$ roslaunch opt_calibration sensor_slave.launch

具体的参考上面关于主服务器的解释。

(4),(5)步骤上需要注意的问题

注意,有时候执行上面的命令之后,Kinect V2中间的红外补光&结构光灯并没有亮起来,如下图的圈中的部分

则一般是USB接触不良导致的,需要重新插拔一下Kinect V2与电脑连接的USB线,然后重试上面的命令。

另外,现在发现某些Kinect V2的初始化时间偏长,要耗费差不多是30-60S才能初始化完成,整个过程就是反复对焦,调焦。这个要注意。可以用

$ roslaunch tracking detection_and_tracking_kinect2.launch

来观察,可以在弹出的Detections窗口中观察到反复的明暗变化,直到几十秒后才稳定输出。因此导致后续的工作就绪,需要多等待几十秒的时间。

此处,必须出现如下图左下角所示的Calibration Status窗口才算是正式进入了校准流程

接下来就是人拿着校准板,到处移动了。

当设备看到校准板的时候,会出现如下图所示的情况:

注意,移动校准板的时候,要用身体挡住校准板,也就是在移动过程中不要让设备看到校准板,原因在于移动过程中会造成不必要的误差,当到达合适位置,并且稳定后,身体从校准板前面离开,让设备看到稳定的校准图片。

当差不多出现下图的,校准板差不多在图像中散列成片出现,而不是单独的一张的时候,差不多可以结束校准了,当然,校准的图片越多,误差越小。

(6)主服务器执行:
$ rostopic pub /opt_calibration/action std_msgs/String "save" -1

$ roslaunch opt_calibration opt_calibration_master.launch

上面的脚本执行后会在上面的一堆Shell中的某个里面输出一句

~/open_ptrack/opt_calibration/conf/camera_poses.yaml created!

生成的~/open_ptrack/opt_calibration/conf/camera_poses.yaml就是我们需要的相机位置配置文件。这个文件需要手工拷贝到从服务器上面的相同位置,如果Kinect还在运行的情况下,系统可能无法识别U盘,因此这一步之后,可以关闭Kinect运行的Shell,然后再进行文件拷贝操作,到这一步,需要采集的数据已经全部采集完成了

(7)所有服务器执行:

先退出所有服务器上执行

$ roslaunch opt_calibration listener.launch

Shell

然后主服务器执行

$ roslaunch opt_calibration detection_initializer.launch

在所有服务器上都执行

$ roslaunch opt_calibration listener.launch

7.测试效果

关闭所有服务器上执行的Shell窗口。
在主服务器上执行(WiKi上建议执行这个命令的为一台独立的服务器,不需要连接任何设备,只进行数据的合成计算,我们也可以简单的放到主服务器上执行

$ roslaunch tracking tracking_node.launch

主服务器执行

$ roslaunch detection detection_node_master.launch

从服务器执行

$ roslaunch detection detection_node_slave.launch

然后可以在主服务器上看到追踪效果。

附上Kinect V2主要模块图

参考链接


Camera Network Calibration

发布者

《Ubuntu 14.04.5系统上OpenPTrack V1版本双Kinect V2简单校准》上有2条评论

  1. 你试过tx2和openPtrack v2结合应用么?我测试的时候,大部分都正常,主要遇到了两个问题。
    1. 当我用单摄像头启动跟踪的时候,可以获取TF,但当我尝试调取摄像头画面时,就无法显示。
    2. 当我用多摄像头启动校准时,可以获取摄像头画面,但是Master提示warning
    : not all messages received, waiting...,然后就一直停留了,无法进行校准。

    1. 我这边没有跟进openPtrack v2的,因为最新的都已经是pose跟踪算法了,尤其是openPtrack v2比预期晚了好长一段时间才发布出来。当时POSE跟踪效果已经很惊艳了,已经能识别关节动作信息了。

回复 默默 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注