本发明涉及一种机器人视觉方法,尤其涉及一种基于ros的相机和机器人的手眼标定方法。
背景技术:
随着计算机技术的发展,计算机视觉作为人工智能的一个重要研究领域,已经广泛地应用于各行各业。将计算机视觉技术与机器人技术相结合,也使得智能机器人领域得到大力发展。对于机械臂抓取,传统地采用人工示教的方式,如手掰机械臂,使机械臂到某个固定位置进行抓取,这种方式比较低效并且由于机械臂对周围环境毫无感知能力,如果机械臂位置或是物体位置发生变化,机械臂则抓不到物体。
将计算机视觉应用到机器人领域,通常是结合模式识别和图像处理的方法分析处理图像数据,获得目标物体的空间位置和姿态,有了目标物体的位姿,机器人便可以自主地进行路径规划。
而将物体在相机坐标系下的坐标转换到机械臂坐标系下,就称作相机和机器人的手眼标定,这是利用计算机视觉进行机械臂抓取的重要前提和基础。根据相机安装位置的不同,一般分为两种:安装在机械臂上,相机随机械臂而动,称作眼在手上(eyeinhand),安装在机械臂外,相机不随着机械臂运动,称作眼在手外(eyetohand)。而一般手眼标定过程繁杂,需要人工干预,或取标志点,或人工记录数据,不方便使用,而视觉实验中用到手眼标定的时候很多,无论是相机位置或机械臂位置发生变化,相机类型或机械臂类型发生变化时,都要重新进行手眼标定,而传统的手眼标定耗时较长,大大拉长了视觉实验的周期。
技术实现要素:
本发明的目的在于提供一种基于ros的相机和机器人的手眼标定方法。
实现本发明目的的技术方案为:一种基于ros的相机和机器人的手眼标定方法,包括以下步骤:
步骤1、搭建视觉系统,使机械臂及其操作对象在相机视野范围内;
步骤2、分别建立相机与ros、机械臂与ros的通信机制;
步骤3、实现机械臂的运动控制,同时获取相机图像和机械臂状态;
步骤4、重复步骤3,当获取m次相机图像和机械臂状态时,执行步骤5,否则执行步骤3;
步骤5、根据获得的相机图像进行相机的内参和外参标定,获得相机参数;
步骤6、根据相机安装方式进行相机和机械臂的手眼标定,获得手眼标定矩阵。
本发明提供的基于ros的相机和机器人的手眼标定方法,显著优点为:不限制相机类型以及数量,不限制机械臂类型,扩展性强,标定过程只需要打印一张a4的棋盘格纸,不需要作任何标记,方便实用,整个标定过程只需要调用两次终端命令,不需要其他人工干预,自主程度高。
下面结合附图对本发明作进一步详细描述。
附图说明
图1为本发明基于ros的相机和机器人的手眼标定方法流程图。
图2为搭建的视觉系统示意图。
图3为坐标系之间的关系示意图。
图4为应用手眼矩阵转换相机坐标系下的点云到机械臂坐标系下点云的示意图。
具体实施方式
以下结合附图对本发明基于ros的相机和机器人的手眼标定方法的具体实施方式进行说明:
基于ros的相机和机器人的手眼标定方法流程图如图1所示,包括以下步骤:
步骤1、搭建视觉系统,使机械臂及其操作对象在相机视野范围内;具体步骤如下:
步骤1-1、一般用于辅助机器人运动的相机为双目相机和深度相机,若是相机安装在机械臂外,可根据相机本身的参数,尤其是水平视角、垂直视角以及测距范围选择安装相机的位置;
步骤1-2、打印一张标定板(棋盘格或是圆点图),贴在一块平坦的硬纸板上。如果进行眼在手上的手眼标定,则将硬纸板固定在离机械臂一定距离外的位置;如果进行眼在手外的手眼标定,则将硬纸板固定在机械臂末端;
步骤2、分别建立相机与ros、机械臂与ros的通信机制;具体步骤如下:
步骤2-1、安装相机在ros下的驱动包,建立相机与ros的通信,将图像数据发布到ros的话题topic1上;
步骤2-2、安装机械臂在ros下的驱动包,建立机械臂与ros的通信,将机械臂末端姿态发布到话题topic2上,机械臂关节状态发布到话题topic3上,并提供机械臂的控制接口topic4;
步骤3、实现机械臂的运动控制,同时获取相机图像和机械臂状态;具体步骤如下:
步骤3-1、订阅topic3获取机械臂当前的关节状态joint_states,将当前的关节状态叠加小范围内产生的随机增量δjoint_states作为目标关节位置,即joint_states_target,发送关节指令到topic4,控制机械臂运动;涉及到的变量具体为:
joint_states=[joint1,joint2,…,jointn]
δjoint_states=[δjoint1,δjoint2,…,δjointn]
joint_states_target=joint_states+δjoint_states
其中,jointi(i=1,2,...n)表示第i个关节当前的状态,δjointi(i=1,2,...n)表示第i个关节需要叠加的随机增量,n表示机械臂的关节数;
步骤3-2、当机械臂运动到指定位置后,保存当前相机发布在topic1上的rgb图像,保存当前发布在topic2上的机械臂末端在机械臂基座坐标系下的位姿信息
其中,
步骤4、当获取m次相机图像和机械臂状态时,执行步骤5,否则执行步骤3;
步骤5、根据获得的相机图像进行相机的内参和外参标定,获得相机参数;具体步骤如下:
步骤5-1、对m张由步骤3-2保存的rgb图像分别进行角点检测;
步骤5-2、进行相机的内参和外参标定;得到内参矩阵cameramatrix,畸变系数
distcoeffs,以及每一张rgb图像中标定板相对于相机坐标系的位姿[rc|tc];
其中,内参矩阵
步骤6、根据相机安装方式进行相机和机械臂的手眼标定,获得手眼标定矩阵;具体步骤如下:
步骤6-1、整理机械臂末端的m次位姿信息以及标定板相对于相机的m次位姿信息,具体为:
grab2b=[[rc|tc]1,[rc|tc]2,...[rc|tc]m]
其中,grab2b表示的是机械臂末端的一系列位姿信息,grid2c表示的是标定板相对于相机的一系列位姿信息;
步骤6-2、采用两步法进行手眼标定获得手眼标定矩阵x,即解ax=xb的问题;
其中,x是最后要求解的手眼矩阵,a和b取决于相机的安装方式,具体表示如下:
相机安装在机械臂上:
a=[grab2b[1]-1·grab2b[0],grab2b[2]-1·grab2b[1],...,grab2b[m-1]-1·grab2b[m-2]]
b=[grid2c[1]·grid2c[0]-1,grid2c[2]·grid2c[1]-1,...,grid2c[m-1]·grid2c[m-2]-1]
相机安装在机械臂外:
a=[grab2b[1]·grab2b[0]-1,grab2b[2]·grab2b[1]-1,...,grab2b[m-1]·grab2b[m-2]-1]
b=[grid2c[1]·grid2c[0]-1,grid2c[2]·grid2c[1]-1,...,grid2c[m-1]·grid2c[m-2]-1]
下面结合实施例对本发明做进一步详细的描述。
实施例
采用ur3机械臂和kinect2深度相机构建视觉系统,其中ur3有6个自由度(关节),kinect2集成了rgb摄像头和depth摄像头,kinect2安装在机械臂外的固定位置,考虑到kinect2的视野范围及测距范围,kinect2和ur3机械臂的安装位置示意图如图2所示,并且标记出了kinect2的rgb摄像头坐标系oc、ur3机械臂底座坐标系or,其中红绿蓝分别表示x、y、z轴。
用a4纸打印标定板,标定板的规格选择chess5x7x0.03,如图2所示。
整个标定过程中用到的坐标系之间的关系如图3所示,一共涉及4个坐标系:机械臂底座坐标系obase、机械臂末端坐标系ograbber、标定板坐标系ogrid以及相机坐标系oc,图4中的
安装kinect2在ros下的驱动包,将图像数据发送到话题/kinect2/hd/image_color;安装ur3在ros下的驱动包,将ur3机械臂末端坐标系到基座坐标系的坐标系变换矩阵数据实时发布到/ur3/grabber_states,将6个关节角度状态发布到话题/ur3/joint_states,设置ur3的运动控制接口/ur_script。
假设机械臂关节初始状态为:[1.9515,-1.0125,-1.8513,-0.1229,1.6139,0.0290],每个关节角度叠加一个[-0.2,0.2]范围内的随机增量作为下一次机械臂目标关节角度,将6个目标关节角度发送到话题/ur_script控制机械臂末端到达指定位姿。假设标定过程中控制机械臂末端运动到8个不同的位姿,每一次末端到达指定位姿后,通过订阅话题/ur3/grabber_states获取当前ur3机械臂末端相对于基座坐标系的位姿,订阅话题/ur3/joint_states获取当前ur3当前各个关节状态,订阅话题/kinect2/hd/image_color获取当前rgb图像。
上述过程为标定数据的采集过程,机械臂8次运动后,保存的数据包括:8张rgb图像和8次机械臂末端位姿(相对于机械臂基座坐标系)。
对8张rgb图像采用张正友棋盘格标定法,包括角点检测和内外参标定,得到内参矩阵和畸变系数如下:
distcoeffs=[5.627e-02-7.420e-021.425e-03-1.695e-032.411e-02]
外参为[rc|tc]i(i=1,2,...8),其中rc表示标定板相对于kinect2的rgb摄像头的旋转变换,tc表示标定板相对于kinect2的rgb摄像头的平移变换。
通过/ur3/grabber_states获取的机械臂末端相对于机械臂基座的位姿为
因此,整理数据得到grab2b和grid2c分别如下:
grab2b=[[rc|tc]1,[rc|tc]2,...[rc|tc]8]
可以看出,grab2b和grid2c表示的是1x8的矩阵.
由于kinect2安装在ur3机械臂外的固定位置,所以a和b分别表示为:
a=[grab2b[1]·grab2b[0]-1,grab2b[2]·grab2b[1]-1,...,grab2b[7]·grab2b[6]-1]
b=[grid2c[1]·grid2c[0]-1,grid2c[2]·grid2c[1]-1,...,grid2c[7]·grid2c[6]-1]
采用tasi两步法解方程ax=xb,结果x如下:
应用手眼矩阵将kinect2视角下的点云转换到机械臂坐标系,显示结果如图4所示。
需要说明的是只要确定好相机安装方式,设置好表1中列出的话题,程序自动进行以上实施例.
表1
由上述实施例,可以表明本发明所提的手眼标定方法可扩展行强,不同类型的机械臂以及不同类型的视觉设备都可以使用,并且标定过程自主程度高,不需要人工干预,降低了传统手眼标定的繁杂性,大大加快了视觉实验的进展。