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可以,此时能够获得最佳性能。
让我们开始吧!
整个过程能够总结为下面几个步骤:
- 将每一台PC都连上网,并配置好
- 分发校准启动文件
- 创建多摄像头校准文件
- 根据人员检测(可选)执行多传感器校准优化
- 执行多传感器人员跟踪
确保每个主机间的时间同步也是很重要的。操作指南
在校正之前,确定所有的OpenPTrack节点的时间都通过NTP同步了
ntpq -p
或
ntpq --p
如果还没有创建/更新 camera_network.yaml 和.bashrc 文件,请根据预校准指南创建/更新,然后再继续下一步,以便 camera_network.yaml 可以分发到所有节点,以便于校准网络。
创建校准所需的启动文件,并在主控上运行下面的代码:
roslaunch opt_calibration calibration_initializer.launch
然后,在所有的PC(包括主控)上运行下面代码:
roslaunch opt_calibration listener.launch
N.B.:主控必须先启动,同时监听端会出现一个错误。
另外,每个传感器会在电脑的 detection/launch 文件夹创建一个叫做 detection_node_<sensor_id>.launch 的启动文件。
现在我们准备好来校准了
校准初始化描述了上述的创建运行在主控上的校准的主要启动文件(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.:校准已经重新完成。
如果还没有完成,执行:
- 使用 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
虽然这一步是选做的,但是我们发现在具有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。
执行新的校准,维护先前估计的地板。
执行多传感器校准后,可以执行新的校准,将先前估计的地板作为世界参考框架。(无需再次将棋盘放在地板上。要在保持先前估计的底板时执行校准,请勿运行:
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,必须至少固定一个传感器。可以移动或删除所有其他传感器,并添加新传感器。
当实行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轴是向上的[右手系]。