Kinect v2相机标定

Kinect2 相机标定

到手kinect v2相机,和已有的ur3双臂组装一体,实现物体识别和物体抓取,在相机使用之前需先进行相机标定,在此记录下相机标定的过程。

为什么要进行相机标定

相机作为实现三维世界到二维图像的转换媒介,现将相机抽象为实现这一变化的函数。不同相机内部参数不同,而且相同型号相机也存在细微差异,再加上相机装配存在误差,因此需要进行相机标定来计算相机内外参数,来使相机工作更为精准。

相机内参标定

标定kinect2相机内参,默认已安装libfreenect,且下载了iai_kinect2包。kinect2内参标定使用iai_kinect2内部的kinect2_calibration包。kinect2相机标定还需使用特定的标定板。标定图像在kinect2_calibration/patterns文件夹内,挑选一种打印并记下标定板的型号。我使用的chess9*11标定板。

  1. 建立文件夹,存储在进行相机标定时所存储的图片以及标定参数。
mkdir calibration_data
cd calibration_data
  1. 启动kinect节点。调整kinect图像节点到2帧每秒。
roscore
         #新开一个终端,执行命令
rosrun kinect2_bridge kinect2_bridge   _fps_limit:=2   #注意空格,_fps_limit作为节点内参数,前有空格

查看节点的发布信息,记录下你的kinect2的Devie serial。

[ INFO] [Kinect2Bridge::initDevice] device serial: 000011570147
  1. 标定彩色摄像头。运行kinect2图片采集节点,节点运行后移动标定板,按空格键采集图像,分别采集各种不同方向以及距离的标定板图像。大概需要采集20余张图片。
  rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 record color  #彩色图像采集节点
  rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 calibrate color  #彩色摄像头标定节点

摄像头标定计算节点运行完毕后会生成彩色摄像头标定参数文件:calib_color.yaml。

  1. 标定红外摄像头。采集图像同上。
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 record ir  #红外图像采集节点
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 calibrate ir  #红外摄像头标定节点

摄像头标定计算节点运行完毕后会生成红外摄像头标定参数文件:calib_ir.yaml。

  1. 摄像头帧同步标定。采集图像同上。
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 record sync #彩色图像、红外图像同步采集节点
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 calibrate sync #帧同步标定节点

帧同步标定节点运行完毕后会产生帧同步参数文件:calib_pose.yaml。

  1. 深度标定。运行节点后会产生深度参数文件:calib_depth.yaml。
 rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 calibrate depth #运行摄像头深度标定节点
  1. 跳转到iai_kinect2/kinect2_bridge/data文件夹。并建立新文件夹并以刚才记录下的device serial为名称。将标定过程中生成的calib_color.yaml、calib_ir.yaml、calib_pose.yaml、calib_depth.yaml四个参数文件移动到新建立的文件夹中。标定过程完毕。

相机外参标定

相机外参标定用来减小相机安装的物理偏差。本次使用中用于标定相机和机械臂之间的相对位置,减少安装时产生的物理偏差。
标定原理以及标定方法不多做介绍,而且我也不懂,在此记录下标定过程。标定使用github开源的easy_handeye包。
在开源包中/easy_handeye/docs/example_launch文件夹中有一个示例launch文件ur5kinect_calibration.launch。按照模板更改launch文件以适配自己的机器人。该launch文件共启动了kinect_bridge节点、robot_bringup部分、ArUco节点、easy_handeye标定节点。

  1. kinect2_bridge节点。
    正常启动kinect_bridge节点。
  2. robot_bringup部分。
    按照自己的设置调用机器人启动文件以及moveIT控制文件,注意ur3机械臂的IP设置。
  3. ArUco节点
    阅读ArUco节点的README.md文件,可知UrAco作为相机的增强标记检测节点。
  
  
    
    
    
    
    
    
    
    
  

launch文件中需要注意几个参数:
camera_info:相机信息节点,参数中的清晰度应和下一个topic参数相匹配。
image:标定过程中需要用到的图像topic,注意,sd图像识别程度过低,近距离无法识别,在ur3机械臂手眼标定时因距离问题无法识别,所以应采用qhd或hd清晰度图片。
reference_frame:未知
camera_frame:未知
marker_frame:相机数据挂载的link名称

  1. easy_handeye节点

    
    
        
        

        
        
        
        

        
        
        
    

该节点主要注意几个参数:
tracking_base_frame:未知
tracking_marker_frame:未知
robot_base_frame:机器人机械臂base_ilnk节点。
robot_effector_frame:机器人末端执行器节点。

手眼标定过程

运行launch文件,分别看到moveIT界面,以及easy_handeye的两个GUI均已启动。
Kinect v2相机标定_第1张图片
Kinect v2相机标定_第2张图片
GUI启动后没有image view图像框,设置在左上角找plugins->visualization->image view,之后点击图像框上方的下拉菜单选择ArUco_tracker/result即可看到图像。小些的GUI显示框里显示的0/8,点击Check starting pose变为0/17即可开始标定。
标定过程:
1> 点击take sample记录初始点的位置。
2> 点击next pose->plan->execute->take sample
3> 重复第二步直到点位全部采集完毕。
4> 点击compute,计算出标定后的位置,点击save保存。
5> 标定保存在路径~/.ros/easy_handeye文件夹下。可以用easy_handeye自带的publish文件发布该变换,也可用改变换手动修改urdf文件。

手眼标定踩坑

can’t connect move_group service

emmm…当时报错时忘记截图了,大概是这个意思吧。。。
正如提示所说,move_group相关服务无法连接。先检查moveIT控制文件是否存在问题,我在单独使用moveIT控制机械臂时可以实现控制,排除文件错误,判断连接超时,即未在规定时间内完成moveIT的启动。
解决方案(假定moveIT控制文件无错误):

  1. 在easy_handeye的launch文件中,注释掉机械臂以及kinect启动部分和moveIT启动部分。
  2. 将机械臂和kinect启动节点写入一个新的launch文件。‘
  3. 运行机械臂和kinect的启动文件,再运行moveIT启动文件,等moveIT完全运行之后再运行easy_handeye。

can’t connect manipulator

额,依然没有截图,大概是这个意思吧。。。
在启动easy_handeye时会报错,大致是找不到manipulator。
报错原因:easy_handeye/launch/calibrate.launch 文件第25行:


easy_handeye默认使用了单个UR机械臂在使用moveIT时官方给出的默认配置组的名称,只需要在调用calibrate.launch前给该参数重新赋值就好了。

多个rviz

因为我在标定时运行了多个launch文件,文件中包含了多个rviz,很乱。所以注释掉了calibrate.launch中的rviz节点。

你可能感兴趣的:(Kinect v2相机标定)