6. 内部校准 - wuyaxiezitai/OpenPTrack-notebook GitHub Wiki

这一部分回顾了如何校准 Kinect v1,Kinect v2 或 Mesa SwissRanger。这一个过程可以让OpenPTrack更正制造过程中引入的任何不一样的地方。

强烈建议在继续进行相机网络校准之前,为每个成像器完成此过程以产生最佳的跟踪结果

单个Kinect v1(内部校准)

这一部分描述了如歌校准单个Kinect v1。OpenPTrack主机将使用这些信息来确定Kinect v1的失真情况,应该对网络中每个Kinect v1执行这一步骤。

单个Kinect的摄像机校准将运用ROS中的 camera_calibration 包

校准需要在摄像机前移动坚固的棋盘板,直到GUI显示校准完成为止。棋盘必须向各个方向移动,倾斜直到GUI的块变成绿色。点击Calibrate按钮,内部参数开始计算,点击Commit所有参数将被保存在 ~/.ros/camera_info/ 目录下的 rgb_.yaml 文件中,其中 表示摄像机的序列号。每次从连接到该摄像机的计算机启动OpenNI摄像机驱动程序时都会加载此文件,以便使用估计的内在参数。

N.B.:对于一些Kinect,驱动器不会读取序列号,因此,校准期间会创建 rgb_00000000000000.yaml 文件。

使用示范

加载摄像机驱动后:

roslaunch detection openni.launch

或者(根据驱动用的系统):

roslaunch detection freenect.launch

在分开的终端运行:

rosrun camera_calibration cameracalibrator.py --size 6x5 --square 0.080 image:=/camera/rgb/image_color camera:=/camera/rgb

上面代码中,6x5是两个维度中棋盘的内部顶点数(不是平方数),0.080是正方形的尺寸(以米为单位)。有关计算行数和列数的详细信息,请参考页面底部。

有关内部校准的分布教程,请参阅: camera_calibrationTutorialsMonocularCalibration.

N.B.:为了避免棋盘方向的自动估计出现奇点,请使用一个方向的偶数方块和另一个方向的奇数方块,方块越多,校准效果越好。

将校准文件移动到OpenPTrack文件夹中:

成功校准之后(如果Kinect有序列数),移动校准文件到 opt_calibration/camera_info/rgb_.yaml ,运行:

roslaunch opt_calibration save_camera_info.launch with_serial:="true" serial:=<serial>

如果失败,i.e.,驱动器没有受到序列号,运行:

roslaunch opt_calibration save_camera_info.launch with_serial:="false" camera_id:=<camera_id>

这样校准文件就会被重命名为 rgb_<camera_id>.yaml ,并移动到 opt_calibration/camera_info/ 目录下。

N.B.:<camera_id> 必须是 camera_network.yaml 中的传感器id。

没有全局校准的单个Kinect人体跟踪测试

内部校准后(之前的操作),连接Microsoft Kinect for Xbox 360,运行:

roslaunch tracking detection_and_tracking.launch

将出现一个RGB图像,人员被白色矩形包围,ROS可视化工具显示人员质心的顶视图。

Single SwissRanger (Intrinsic Calibration)被省略了,以后补

单个Kinect v2(内部校准)

这一部分描述了如何校准一个Kinect v2。OpenPTrack主控将会用这些信息去测量Kinect的失真程度,你的OpenPTrack网络长的每一个Kinect v2都必须进行内部校准。

N.B.:你可以通过执行下面的代码去运行Kinect v2的命令(当你运行代码的时候,你会受到一个错误提示,忽视它,不重要):

cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge

sudo ./kinect2_bridge

1. 创建一个临时文件夹去储存校准图像:

mkdir ~/tmp

2. 启动Kinect v2成像器

roslaunch kinect2_bridge kinect2_bridge.launch

3. 捕获彩色图像

rosrun kinect2_calibration kinect2_calibration record color chess6x5x0.12 -color /kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/

N.B.:确定在 chess6x5x0.12 中输入了正确的棋盘参数。前两个数水平和竖直的棋格的交叉点的数量,第三和数是以米为单位棋格的尺寸。这在指南中的所有地方都有效。

4. 移动棋盘

朝着不同的位置,角度和与传感器的距离移动棋盘,确保棋盘能够被正确的检测到。当棋盘图像上覆盖的所有不同颜色的线都亮了,就说明棋盘已经被正确的检测到了。

5. 停止捕获图像

关闭图像校准进程。这个文件将会自动保存在 ~/tmp/ 文件夹中。

6. 校准彩色

rosrun kinect2_calibration kinect2_calibration calibrate color chess6x5x0.12 -color
/kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/

7. 红外图像捕获

rosrun kinect2_calibration kinect2_calibration record ir chess6x5x0.12 -color
/kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/8. 

8. 移动棋盘

朝着不同的位置,角度和与传感器的距离移动棋盘,确保棋盘能够被正确的检测到。当棋盘图像上覆盖的所有不同颜色的线都亮了,就说明棋盘已经被正确的检测到了。

9. 停止红外图像捕获

关闭图像校准进程。这个文件将会自动保存在 ~/tmp/ 文件夹中。

10. 校准近红外

rosrun kinect2_calibration kinect2_calibration calibrate ir chess6x5x0.12 -color /kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/

11. 校准红外和彩色之间的姿势

rosrun kinect2_calibration kinect2_calibration record sync chess6x5x0.12 -color /kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/

12. 移动棋盘

13. 彩色-红外校准

rosrun kinect2_calibration kinect2_calibration calibrate sync chess6x5x0.12 -color /kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/

14. 将校准文件移到正确的位置

创建文件夹来存放Kinect 2校准的数据

roscd kinect2_bridge
mkdir -p data/<serial>

是Kinect 2传感器的序列号,启动了驱动器之后你能在控制台输出中看到它:

roslaunch kinect2_bridge kinect2_bridge.launch

启动时,你会看到和下面代码相似的语句:

[Freenect2Impl] found valid Kinect v2 @4:3 with serial 500258141742

从临时文件夹中复制校准的结果到此文件夹

cp ~/tmp/calib_color.yaml ~/tmp/calib_ir.yaml ~/tmp/calib_pose.yaml ~/workspace/ros/catkin/src/iai_kinect2/kinect2_bridge/data/<serial>/

15. 验证校准结果

rosrun rviz ruiz

现在,在Rviz中改变固定框架:

kinect2_head_rgb_optical_frame

并改变主题:

/kinect2_head/depth_lowres/points

现在,色彩数据和深度点(点云)已经对齐,如果没有,那么说明你的内部校准没有成功,重做吧。

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