参照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
厘米的样子,貌似卖家是两张起卖,差不多每张28
元RMB
的样子。
完整的样子(粘帖上校准纸的泡沫板)如下图
准备支撑杆,支撑杆用来架起Kinect V2
,建议淘宝搜索"VR支架定位器三角架HTC vive基站支架"。样子如下图所示
最好买加厚加粗的,原因在于架起Kinect V2
之后,细小的支撑杆容易发生晃动,导致顶端的Kinect V2
也跟着晃动,影响定位精度。每根支撑杆差不多不到100
元RMB
的样子。
PC服务器,要求必须有USB3.0
接口,必须有Nvdiva
的显卡,必须支持CUDA
。(目前是GTX 780
)
2.支撑杆的部署位置
支撑杆的顶部安装了Kinect V2
,两个设备涉及到部署位置的问题。
部署原则比较重要的一点就是,两个设备看到的校准板的位置应该是相同的。
就是说,如果都从左向右看到校准板,那么两个设备看到的棋盘格子是相同的,比如,我们在左上角标注一个数字0
,那么两个设备应该都看到左上角才行,不能一个看到是左上角,一个看到是右上角,这样就会导致无法合并数据了。
因此,我们两个Kinect V2
是同侧部署,而不是对角线部署。也就是两个设备是可以同时看到同一张校准板的。其实,如果场地够大,也可以对角线部署的,只要满足两个设备可以同时看到校准板即可了。
3.编辑硬件配置文件
1 |
$ xdg-open ~/workspace/ros/catkin/src/open_ptrack/opt_calibration/conf |
可以找到camera_network.yaml.example
这个文件,用记事本打开,里面的内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# 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 |
拷贝一份这个文件
1 |
$ 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 |
然后修改其中的内容为如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# 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
启动脚本:
1 |
$ vim ~/.bashrc |
在其中增加如下内容:
1 2 3 |
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
。
接着,在从服务器上编辑启动脚本
1 |
$ vim ~/.bashrc |
在其中增加如下内容:
1 2 3 |
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)主服务器执行:
1 |
$ roslaunch opt_calibration calibration_initializer.launch |
(2)所有服务器都执行:
1 |
$ roslaunch opt_calibration listener.launch |
(3)主服务器执行:
1 |
$ roslaunch opt_calibration opt_calibration_master.launch |
(4)主服务器执行:
1 2 3 |
#roslaunch opt_calibration sensor_<sensor_id>.launch $ roslaunch opt_calibration sensor_master.launch |
注意这里的
1 |
sensor_<sensor_id> |
部分,是我们在~/workspace/ros/catkin/src/open_ptrack/opt_calibration/conf/camera_network.yaml
里面配置的id
字段的替换。比如,我们定义
1 2 3 4 |
- pc: "PC1-Master" sensors: - type: kinect2 id: "master" |
则我们的主服务器就执行
1 |
$ roslaunch opt_calibration sensor_master.launch |
(5)从服务器执行:
1 2 3 |
#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
才能初始化完成,整个过程就是反复对焦,调焦。这个要注意。可以用
1 |
$ roslaunch tracking detection_and_tracking_kinect2.launch |
来观察,可以在弹出的Detections
窗口中观察到反复的明暗变化,直到几十秒后才稳定输出。因此导致后续的工作就绪,需要多等待几十秒的时间。
此处,必须出现如下图左下角所示的Calibration Status
窗口才算是正式进入了校准流程
接下来就是人拿着校准板,到处移动了。
当设备看到校准板的时候,会出现如下图所示的情况:
注意,移动校准板的时候,要用身体挡住校准板,也就是在移动过程中不要让设备看到校准板,原因在于移动过程中会造成不必要的误差,当到达合适位置,并且稳定后,身体从校准板前面离开,让设备看到稳定的校准图片。
当差不多出现下图的,校准板差不多在图像中散列成片出现,而不是单独的一张的时候,差不多可以结束校准了,当然,校准的图片越多,误差越小。
(6)主服务器执行:
1 2 3 |
$ rostopic pub /opt_calibration/action std_msgs/String "save" -1 $ roslaunch opt_calibration opt_calibration_master.launch |
上面的脚本执行后会在上面的一堆Shell
中的某个里面输出一句
1 |
~/open_ptrack/opt_calibration/conf/camera_poses.yaml created! |
生成的~/open_ptrack/opt_calibration/conf/camera_poses.yaml
就是我们需要的相机位置配置文件。这个文件需要手工拷贝到从服务器上面的相同位置,如果Kinect还在运行的情况下,系统可能无法识别U盘,因此这一步之后,可以关闭Kinect运行的Shell,然后再进行文件拷贝操作,到这一步,需要采集的数据已经全部采集完成了。
(7)所有服务器执行:
先退出所有服务器上执行
1 |
$ roslaunch opt_calibration listener.launch |
的Shell
。
然后主服务器执行
1 |
$ roslaunch opt_calibration detection_initializer.launch |
在所有服务器上都执行
1 |
$ roslaunch opt_calibration listener.launch |
7.测试效果
关闭所有服务器上执行的Shell
窗口。
在主服务器上执行(WiKi上建议执行这个命令的为一台独立的服务器,不需要连接任何设备,只进行数据的合成计算,我们也可以简单的放到主服务器上执行)
1 |
$ roslaunch tracking tracking_node.launch |
主服务器执行
1 |
$ roslaunch detection detection_node_master.launch |
从服务器执行
1 |
$ roslaunch detection detection_node_slave.launch |
然后可以在主服务器上看到追踪效果。
附上Kinect V2
主要模块图
你试过tx2和openPtrack v2结合应用么?我测试的时候,大部分都正常,主要遇到了两个问题。
1. 当我用单摄像头启动跟踪的时候,可以获取TF,但当我尝试调取摄像头画面时,就无法显示。
2. 当我用多摄像头启动校准时,可以获取摄像头画面,但是Master提示warning
: not all messages received, waiting...,然后就一直停留了,无法进行校准。
我这边没有跟进openPtrack v2的,因为最新的都已经是pose跟踪算法了,尤其是openPtrack v2比预期晚了好长一段时间才发布出来。当时POSE跟踪效果已经很惊艳了,已经能识别关节动作信息了。