6. 内部校准 - wuyaxiezitai/OpenPTrack-notebook GitHub Wiki
这一部分回顾了如何校准 Kinect v1,Kinect v2 或 Mesa SwissRanger。这一个过程可以让OpenPTrack更正制造过程中引入的任何不一样的地方。
强烈建议在继续进行相机网络校准之前,为每个成像器完成此过程以产生最佳的跟踪结果
这一部分描述了如歌校准单个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.:为了避免棋盘方向的自动估计出现奇点,请使用一个方向的偶数方块和另一个方向的奇数方块,方块越多,校准效果越好。
成功校准之后(如果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。
内部校准后(之前的操作),连接Microsoft Kinect for Xbox 360,运行:
roslaunch tracking detection_and_tracking.launch
将出现一个RGB图像,人员被白色矩形包围,ROS可视化工具显示人员质心的顶视图。
Single SwissRanger (Intrinsic Calibration)被省略了,以后补
这一部分描述了如何校准一个Kinect v2。OpenPTrack主控将会用这些信息去测量Kinect的失真程度,你的OpenPTrack网络长的每一个Kinect v2都必须进行内部校准。
N.B.:你可以通过执行下面的代码去运行Kinect v2的命令(当你运行代码的时候,你会受到一个错误提示,忽视它,不重要):
cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge
sudo ./kinect2_bridge
mkdir ~/tmp
roslaunch kinect2_bridge kinect2_bridge.launch
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 中输入了正确的棋盘参数。前两个数水平和竖直的棋格的交叉点的数量,第三和数是以米为单位棋格的尺寸。这在指南中的所有地方都有效。
朝着不同的位置,角度和与传感器的距离移动棋盘,确保棋盘能够被正确的检测到。当棋盘图像上覆盖的所有不同颜色的线都亮了,就说明棋盘已经被正确的检测到了。
关闭图像校准进程。这个文件将会自动保存在 ~/tmp/ 文件夹中。
rosrun kinect2_calibration kinect2_calibration calibrate color chess6x5x0.12 -color
/kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/
rosrun kinect2_calibration kinect2_calibration record ir chess6x5x0.12 -color
/kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/8.
朝着不同的位置,角度和与传感器的距离移动棋盘,确保棋盘能够被正确的检测到。当棋盘图像上覆盖的所有不同颜色的线都亮了,就说明棋盘已经被正确的检测到了。
关闭图像校准进程。这个文件将会自动保存在 ~/tmp/ 文件夹中。
rosrun kinect2_calibration kinect2_calibration calibrate ir chess6x5x0.12 -color /kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/
rosrun kinect2_calibration kinect2_calibration record sync chess6x5x0.12 -color /kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/
rosrun kinect2_calibration kinect2_calibration calibrate sync chess6x5x0.12 -color /kinect2_head/mono/image -ir /kinect2_head/ir/image -interval 1 ~/tmp/
创建文件夹来存放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>/
rosrun rviz ruiz
现在,在Rviz中改变固定框架:
kinect2_head_rgb_optical_frame
并改变主题:
/kinect2_head/depth_lowres/points
现在,色彩数据和深度点(点云)已经对齐,如果没有,那么说明你的内部校准没有成功,重做吧。