云恒制造:突然发现玩机械臂的小伙伴越来越多了。。。再说说手眼标定那些事~

如果不知道四元数、欧拉角、旋转矩阵是什么的同学建议先看一下台大林沛群老师的机器人学公开课:https://www.bilibili.com/video/av54047883 或者燕山大学公开课,机器人技术。

接下来小鱼来一段段解析代码,手眼标定的输入和输出都很简单,昨天有位同学在群里问,为什么要手眼标定?

其实答案就是不标,不知道相机和机械臂到底啥关系,相机识别到了物品,机械臂不知道到哪里抓。

云恒制造:突然发现玩机械臂的小伙伴越来越多了。。。再说说手眼标定那些事~ 核心算法函数

小鱼将代码进行了二次的封装,将手眼标定变成了一个只有三四十行的函数。

对算法有兴趣的同学,可以关注小鱼公众号,鱼香ROS,后台回复手眼标定即可获得论文原文及算法详解。

import transforms3d as tfs

import numpy as np

import math

def handeyecalib(Hgs,Hcs):

def skew(v):

return np.array([[0,-v[2],v[1]],

[v[2],0,-v[0]],

[-v[1],v[0],0]]) def rot2quat_minimal(m): quat = tfs.quaternions.mat2quat(m[0:3,0:3])return quat[1:]def quatMinimal2rot(q): p = np.dot(q.T,q) w = np.sqrt(np.subtract(1,p[0][0]))return tfs.quaternions.quat2mat([w,q[0],q[1],q[2]])Hgijs,Hcijs=[],[]A,B =[],[]size =0for i in range(len(Hgs)):for j in range(i+1,len(Hgs)): size +=1Hgij= np.dot(np.linalg.inv(Hgs[j]),Hgs[i])Hgijs.append(Hgij)Pgij= np.dot(2,rot2quat_minimal(Hgij))Hcij= np.dot(Hcs[j],np.linalg.inv(Hcs[i]))Hcijs.append(Hcij)Pcij= np.dot(2,rot2quat_minimal(Hcij)) A.append(skew(np.add(Pgij,Pcij))) B.append(np.subtract(Pcij,Pgij))MA = np.asarray(A).reshape(size*3,3)MB = np.asarray(B).reshape(size*3,1)Pcg_= np.dot(np.linalg.pinv(MA),MB)pcg_norm = np.dot(np.conjugate(Pcg_).T,Pcg_)Pcg= np.sqrt(np.add(1,np.dot(Pcg_.T,Pcg_)))Pcg= np.dot(np.dot(2,Pcg_),np.linalg.inv(Pcg))Rcg= quatMinimal2rot(np.divide(Pcg,2)).reshape(3,3)A ,B =[],[]id =0for i in range(len(Hgs)):for j in range(i+1,len(Hgs)):Hgij=Hgijs[id]Hcij=Hcijs[id] A.append(np.subtract(Hgij[0:3,0:3],np.eye(3,3))) B.append(np.subtract(np.dot(Rcg,Hcij[0:3,3:4]),Hgij[0:3,3:4])) id +=1MA = np.asarray(A).reshape(size*3,3)MB = np.asarray(B).reshape(size*3,1)Tcg= np.dot(np.linalg.pinv(MA),MB).reshape(3,)return tfs.affines.compose(Tcg,np.squeeze(Rcg),[1,1,1])
<

可以看到,这个函数有两个输入参数,一个是Hgs,一个是Hcs。

•Hgs是机械臂末端的位姿的齐次矩阵数组

•Hcs相机中标定板的位姿的齐次矩阵数组(也可以使用相机标定时的外参)

不知道什么是齐次矩阵的可以瞅瞅小鱼这篇文章:手眼标定搞定了,手眼矩阵不知道怎么用?快戳!!齐次矩阵就是将旋转矩阵和平移变换合并到了一起。

大家平时用的时候,得到的四元数比较多,所以都会遇到四元数转旋转矩阵再合并平移变换成齐次矩阵的问题,不知道代码怎么写,小鱼这里再推荐一个开源库给你:开源推荐:写机器人算法,你必须掌握的python开源库

数据生产

知道了算法输入是什么,我们就产生数据来投喂吧!因为小鱼使用的机械臂给出的是欧拉角,所以小鱼就使用欧拉角来产生两个矩阵数据。

看看小鱼下面的代码是不是很清晰了,数据通过计算转换成齐次矩阵数组。然后把数组喂给刚刚的上面的函数就完成了手眼标定了

def get_matrix_eular_radu(x,y,z,rx,ry,rz):

rmat = tfs.euler.euler2mat(math.radians(rx),math.radians(ry),math.radians(rz))

rmat = tfs.affines.compose(np.squeeze(np.asarray((x,y,z))), rmat, [1, 1, 1])

return rmat

hand = [1.1988093940033604, -0.42405585264804424, 0.18828251788562061, 151.3390418721659, -18.612399542280507, 153.05074895025035,

1.1684831621733476, -0.183273375514656, 0.12744868246620855, -161.57083804238462, 9.07159838346732, 89.1641128844487,

1.1508343174145468, -0.22694301453461405, 0.26625166858469146, 177.8815855486261, 0.8991159570568988, 77.67286224959672]

camera = [-0.16249272227287292, -0.047310635447502136, 0.4077761471271515, -56.98037030812389, -6.16739631361851, -115.84333735802369,

0.03955405578017235, -0.013497642241418362, 0.33975949883461, -100.87129330834215, -17.192685528625265, -173.07354634882094,

-0.08517949283123016, 0.00957852229475975, 0.46546608209609985, -90.85270962096058, 0.9315977976503153, 175.2059707654342]

Hgs,Hcs = [],[]

for i in range(0,len(hand),6):

Hgs.append(get_matrix_eular_radu(hand[i],hand[i+1],hand[i+2],hand[i+3],hand[i+4],hand[i+5]))

运行

直接调用刚刚的函数,即可完成标定。

云恒制造:突然发现玩机械臂的小伙伴越来越多了。。。再说说手眼标定那些事~手眼标定对数据的要求比较高,一定要标定好相机内参,去掉畸变后的数据来获取外参。

京云律所-东台站 京云律所-兴安站 京云律所-龙岩站 京云律所-原平站 京云律所-泉州站 京云律所-五常站 京云律所-冷水江站 京云律所-怀化站 京云律所-牡丹江站 京云律所-赣州站 京云律所-海东站 京云律所-深圳站 京云律所-黔西南布依族站 京云律所-唐山站 京云律所-海宁站 京云律所-辛集站 京云律所-临江站 京云律所-林芝站 京云律所-霍林郭勒站 京云律所-射洪站 京云律所-高碑店站 京云律所-阿坝站 京云律所-恩施站 京云律所-开原站 京云律所-阆中站 京云律所-临清站 京云律所-瑞昌站 京云律所-康定站 京云律所-平度站 京云律所-龙港站 京云律所-临沂站 京云律所-阿图什站 京云律所-宁德站 京云律所-柳州站 京云律所-宜城站 京云律所-邛崃站 京云律所-临夏站 京云律所-雷州站 京云律所-龙南站 京云律所-永安站 京云律所-安陆站 京云律所-孝义站 京云律所-石狮站 京云律所-乌兰察布站 京云律所-吉首站 京云律所-克孜勒苏站 京云律所-津市站 京云律所-文山壮族站 京云律所-台山站 京云律所-永城站 京云律所-新密站 京云律所-贵港站 京云律所-青州站 京云律所-乌苏站 京云律所-连云港站 京云律所-高邮站 京云律所-卫辉站 京云律所-绥化站 京云律所-扬州站 京云律所-营口站 京云律所-呼和浩特站 京云律所-清远站 京云律所-凤城站 京云律所-崇左站 京云律所-资兴站 京云律所-太仓站 京云律所-荆州站 京云律所-肥城站 京云律所-池州站 京云律所-鹰潭站 京云律所-晋城站 京云律所-随州站 京云律所-虎林站 京云律所-玉树站 京云律所-邯郸站 京云律所-广德站 京云律所-济南站 京云律所-长治站 京云律所-广安站 京云律所-武夷山站 京云律所-淄博站 京云律所-任丘站 京云律所-大同站 京云律所-丹江口站 京云律所-沙河站 京云律所-黄南站 京云律所-新泰站 京云律所-张家口站 京云律所-平果站 京云律所-绥芬河站 京云律所-利川站 京云律所-湘潭站 京云律所-错那站 京云律所-英德站 京云律所-敦化站 京云律所-武穴站 京云律所-驻马店站 京云律所-简阳站 京云律所-嫩江站 京云律所-湖州站

免责声明:文章内容来自互联网,本站仅提供信息存储空间服务,真实性请自行鉴别,本站不承担任何责任,如有侵权等情况,请与本站联系删除。

(0)
上一篇 2023-05-03 17:59:01
云恒制造:二维相机能得到三维信息?机器人感知部分之Aruco标定板的使用
下一篇 2023-05-03 18:01:41

联系我们

在线咨询: QQ交谈

邮件:362039258#qq.com(把#换成@)

工作时间:周一至周五,10:30-16:30,节假日休息。