7. 摄像机网络校准 - wuyaxiezitai/OpenPTrack-notebook GitHub Wiki

这部分指南解释了如何校准Microsoft Kinect v1 (Xbox version),Microsoft Kinect v2和Mesa Swiss Rangers (type SR4500)的摄像机网络,和如何在分布式配置情况下执行人员跟踪。

N.B.:对于单个成像器的人员跟踪,请看内部校正页面,同时,多摄像头的检测的操作指南如下。

Xbox的Kinect有两种现有型号:

1414:旧版固件:打开源驱动器就可以看到它的序列号。

1473:新版固件:打开源驱动器无法得到序列号,之后返回一堆0.

N.B.:我们发现,无论在哪一个CPU上,一个CPU最好只连接一个Kinect或者一个SwissRanger可以,此时能够获得最佳性能。

让我们开始吧

整个过程能够总结为下面几个步骤:

  1. 将每一台PC都连上网,并配置好
  2. 分发校准启动文件
  3. 创建多摄像头校准文件
  4. 根据人员检测(可选)执行多传感器校准优化
  5. 执行多传感器人员跟踪

确保每个主机间的时间同步也是很重要的。操作指南

1. 检查时间同步

在校正之前,确定所有的OpenPTrack节点的时间都通过NTP同步了

ntpq -p

ntpq --p

2. 配置摄像机网络和bash shell环境

如果还没有创建/更新 camera_network.yaml 和.bashrc 文件,请根据预校准指南创建/更新,然后再继续下一步,以便 camera_network.yaml 可以分发到所有节点,以便于校准网络。

3. 创建校准启动文件

创建校准所需的启动文件,并在主控上运行下面的代码:

roslaunch opt_calibration calibration_initializer.launch

然后,在所有的PC(包括主控)上运行下面代码:

roslaunch opt_calibration listener.launch

N.B.:主控必须先启动,同时监听端会出现一个错误。

另外,每个传感器会在电脑的 detection/launch 文件夹创建一个叫做 detection_node_<sensor_id>.launch 的启动文件。

现在我们准备好来校准了

4. 执行多传感器校准

校准初始化描述了上述的创建运行在主控上的校准的主要启动文件(opt_calibration_master.launch)和每个传感器启动文件(sensor_<sensor_id>.launch)的过程.传感器启动文件通过 id:"<sensor_id>" 来启动传感器的驱动器。每个机器的 sensor_id 设定在 camera_network.yaml 文件里。

为了执行多传感器校准,在主控上执行下面的代码:

roslaunch opt_calibration opt_calibration_master.launch

然后,在每一台配有传感器的电脑都需要运行:

roslaunch opt_calibration sensor_<sensor_id>.launch

当两台摄像头同时看到棋盘时,估计俩之间的变换。每个传感器都针对另一个传感器进行外部校准,从而组成描述整个网络的变换树。每次争对另一台摄像机校准摄像机时,在Rviz中,两个摄像机之间都会出像一个链接。控制台中提供输出,例如:

/<sensor_id> added to the tree.

开始校准过程,第一步是将棋盘显示给网络中的任意一个成像器。一旦成像器加入变换树,也就是终端中输出 /<sensor_id> added to the tree 的时候,你就可以校准下一个传感器了。棋盘需要展示给事先已经加入变换树的成像器,同时显示给下一个最近的成像器,以便第二个成像器校准。将第二个成像器添加到树中后,以前添加到树中的两个成像器之一可用于校准网络中的剩余成像器。因此,当将成像器添加到树中时,它可用于校准网络中的任何剩余成像器,向校准成像器和任何剩余的未校准成像器显示棋盘。校准最佳实践可在 OpenPTrack 部署指南实践校准页中找到。

当所有摄像头都校准好,会输出:

All cameras added to the tree. Now calibrate the global reference frame and save!

N.B.:当这条信息出现的时候,校准进程将继续捕获图像。所以,OpenPTrack指挥提醒用户它存储好了全局参考系。操作员可以继续收集图像以改善校准或者继续保存全局参考帧。

用户希望能够将棋盘放在地上,通过位置和方向来确定全局参考系以用户人员跟踪。所以,至少要有一个传感器能观察到棋盘。校准数据通过运行下面的代码存储:

rostopic pub /opt_calibration/action std_msgs/String "save" -1

将会有文本声明:

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

这告诉操作人员校准已经被保存,此时移动棋盘不会影响文件。

初始的全局(/world)参考系设在右上角的矩形交点处。/world 参考系用于跟踪,x坐标轴指向左边,y坐标轴指向下面。棋盘的“顶部”可以通过计算棋盘每边黑色的的棋格来确定。黑色方格最多的边是棋盘的“顶部”,原点(0,0)是最右端的两个黑棋格和两个白棋格的交点。

所有的外部校准数据被保存在 opt_calibration/launch 文件夹的 opt_calibration_results.launch 文件中。记录每个传感器摄像机姿势(camera_poses.txt)的文件和启动文件(detection_node_<sensor_id>.launch)创建在主控的 detection/launch 文件夹中。detection_node 文件移动到大爱有<sensor_id> 名称的计算机的 detection/launch 文件夹后能直接用户启动分布式的人员检测。

N.B.:校准已经重新完成。

5. 创建多传感器人员跟踪文件

如果还没有完成,执行:

  • 使用 Ctrl-c 来停止 roslaunch opt_calibration detection_initializer.launch *使用 Ctrl-c来停止所有主机上的 roslaunch opt_calibration listener.launch

复制每个计算机上的 detection/launch/camera_poses.txt 文件到 detection/launch 文件夹,在主控上运行下面的命令:

roslaunch opt_calibration detection_initializer.launch

在每台电脑(包括主机)上运行:

roslaunch opt_calibration listener.launch

6. 执行多成像器校准优化 - 可选

虽然这一步是选做的,但是我们发现在具有5个或者更多成像器的OpenPTrack网络中,需要解决单个轨道的拆分问题。

在上述的通过棋盘执行多成像器校准步骤之后,可以通过开拓检测节点的输出来执行校准优化。

这个过程需要一个人在跟踪执行期间一直在区域里移动。

另外,在每个配备了传感器的电脑上,应该运行临时存储的启动文件 detection_node_<sensor_id>.launch:

roslaunch detection detection_node_<sensor_id>.launch

然后,在主控上运行:

roslaunch opt_calibration opt_calibration_refinement.launch

此时,请求一个人(只有一人!)在整个跟踪区域移动,执行不同的轨迹。人员检测应出现在可视化工具中。

N.B.:如果看不到人员检测,尝试缩小可视化工具。

当整个区域都被覆盖(不止一次),开始校准优化运算:

rostopic pub /opt_calibration/action std_msgs/String "save" -1

优化将开始,优化矩阵将保存在opt_calibration/conf 文件夹中的registration_<sensor_id>.txt 文件中。此外,应显示显示优化过程前后人员检测的可视化工具。

为了在跟踪时使用此优化,请确保跟踪/conf/tracker_multicamera.yaml 文件中calibration_refinement标志设置为 true。

7. 维护地面 - 可选

执行新的校准,维护先前估计的地板。

执行多传感器校准后,可以执行新的校准,将先前估计的地板作为世界参考框架。(无需再次将棋盘放在地板上。要在保持先前估计的底板时执行校准,请勿运行:

roslaunch opt_calibration opt_calibration_master.launch

除此之外,在主控上执行:

roslaunch opt_calibration opt_calibration_master.launch lock_world_frame:=true fixed_sensor_id:=<sensor_id>

此处lock_world_frame:\true 通知校准过程读取以前估计的摄像机姿势,而fixed_sensor_id:<sensor_id>定义自上次校准以来未移动的传感器。

N.B.:fixed_sensor_id,必须至少固定一个传感器。可以移动或删除所有其他传感器,并添加新传感器。

8. 为跟踪定义一个新的坐标系

当实行OpenPTrack网络校准时,跟踪坐标系(全局)时基于看到棋盘的最后的位置建立的。如果你想要在校准之后指定一个其他的坐标系,你需要启动所有的传感器:

roslaunch opt_calibration sensor_<sensor_id>.launch

然后,在主控节点:

roslaunch opt_calibration opt_define_reference_frame.launch

一个GUI(图像)出现你需要选择两个参考点,并提供它们在新坐标系中的坐标。你可以跟着控制台输出中的指南行动。

详情如下:

  • left click:选择一个参考点(然后你需要在控制台输入x,y坐标[每次输入后按ENTER键])
  • right click:改变图像(你能够改变图像直到你找到想要插入的参考点的图像)
  • middle click: 计算新的坐标系并保存。只有在你输入两个(或更多)参考点后才能使用这个。无需选择同一张图像上的参考点。

之后,你需要(一般情况下)运行 detection_initializer.launch,具体描述在这里。然后你就能够在新的坐标系里实现跟踪操作了。

N.B.: 用户自定义坐标系必须保持z轴向上的习惯。因此,小心选择x和y轴的朝向,确保z轴是向上的[右手系]。

⚠️ **GitHub.com Fallback** ⚠️