到手kinect v2相机,和已有的ur3双臂组装一体,实现物体识别和物体抓取,在相机使用之前需先进行相机标定,在此记录下相机标定的过程。
相机作为实现三维世界到二维图像的转换媒介,现将相机抽象为实现这一变化的函数。不同相机内部参数不同,而且相同型号相机也存在细微差异,再加上相机装配存在误差,因此需要进行相机标定来计算相机内外参数,来使相机工作更为精准。
标定kinect2相机内参,默认已安装libfreenect,且下载了iai_kinect2包。kinect2内参标定使用iai_kinect2内部的kinect2_calibration包。kinect2相机标定还需使用特定的标定板。标定图像在kinect2_calibration/patterns文件夹内,挑选一种打印并记下标定板的型号。我使用的chess9*11标定板。
mkdir calibration_data
cd calibration_data
roscore
#新开一个终端,执行命令
rosrun kinect2_bridge kinect2_bridge _fps_limit:=2 #注意空格,_fps_limit作为节点内参数,前有空格
查看节点的发布信息,记录下你的kinect2的Devie serial。
[ INFO] [Kinect2Bridge::initDevice] device serial: 000011570147
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 record color #彩色图像采集节点
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 calibrate color #彩色摄像头标定节点
摄像头标定计算节点运行完毕后会生成彩色摄像头标定参数文件:calib_color.yaml。
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 record ir #红外图像采集节点
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 calibrate ir #红外摄像头标定节点
摄像头标定计算节点运行完毕后会生成红外摄像头标定参数文件:calib_ir.yaml。
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 record sync #彩色图像、红外图像同步采集节点
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 calibrate sync #帧同步标定节点
帧同步标定节点运行完毕后会产生帧同步参数文件:calib_pose.yaml。
rosrun kinect2_calibration kinect2_calibration chess9x11x0.02 calibrate depth #运行摄像头深度标定节点
相机外参标定用来减小相机安装的物理偏差。本次使用中用于标定相机和机械臂之间的相对位置,减少安装时产生的物理偏差。
标定原理以及标定方法不多做介绍,而且我也不懂,在此记录下标定过程。标定使用github开源的easy_handeye包。
在开源包中/easy_handeye/docs/example_launch文件夹中有一个示例launch文件ur5kinect_calibration.launch。按照模板更改launch文件以适配自己的机器人。该launch文件共启动了kinect_bridge节点、robot_bringup部分、ArUco节点、easy_handeye标定节点。
launch文件中需要注意几个参数:
camera_info:相机信息节点,参数中的清晰度应和下一个topic参数相匹配。
image:标定过程中需要用到的图像topic,注意,sd图像识别程度过低,近距离无法识别,在ur3机械臂手眼标定时因距离问题无法识别,所以应采用qhd或hd清晰度图片。
reference_frame:未知
camera_frame:未知
marker_frame:相机数据挂载的link名称
该节点主要注意几个参数:
tracking_base_frame:未知
tracking_marker_frame:未知
robot_base_frame:机器人机械臂base_ilnk节点。
robot_effector_frame:机器人末端执行器节点。
运行launch文件,分别看到moveIT界面,以及easy_handeye的两个GUI均已启动。
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文件。
emmm…当时报错时忘记截图了,大概是这个意思吧。。。
正如提示所说,move_group相关服务无法连接。先检查moveIT控制文件是否存在问题,我在单独使用moveIT控制机械臂时可以实现控制,排除文件错误,判断连接超时,即未在规定时间内完成moveIT的启动。
解决方案(假定moveIT控制文件无错误):
额,依然没有截图,大概是这个意思吧。。。
在启动easy_handeye时会报错,大致是找不到manipulator。
报错原因:easy_handeye/launch/calibrate.launch 文件第25行:
easy_handeye默认使用了单个UR机械臂在使用moveIT时官方给出的默认配置组的名称,只需要在调用calibrate.launch前给该参数重新赋值就好了。
因为我在标定时运行了多个launch文件,文件中包含了多个rviz,很乱。所以注释掉了calibrate.launch中的rviz节点。