机器人手眼标定详解
手眼標(biāo)定詳解
研究現(xiàn)狀
所謂手眼標(biāo)定是統(tǒng)一視覺系統(tǒng)和機(jī)器人的坐標(biāo)系,從而可以使視覺系統(tǒng)所確定的物體位姿可以轉(zhuǎn)換到機(jī)器人坐標(biāo)系下,由機(jī)械臂完成對物體的作業(yè)。
最常見的手眼系統(tǒng)包括Eye-to-Hand和Eye-in-Hand兩種。在Eye-to-Hand手眼系統(tǒng)中,攝像機(jī)與機(jī)器人基座的位置是相對固定的,手眼關(guān)系式求解攝像機(jī)坐標(biāo)系與機(jī)器人基座坐標(biāo)系之間的轉(zhuǎn)換關(guān)系。在Eye-in-Hand手眼系統(tǒng)中,攝像機(jī)由于固定在機(jī)械臂末端,手眼關(guān)系求解的是攝像機(jī)坐標(biāo)系與機(jī)械臂末端坐標(biāo)系之間的轉(zhuǎn)換關(guān)系。在機(jī)器人處于不同的位置和姿態(tài)的情況下,獲取“眼”相對于標(biāo)定物的關(guān)系。然后結(jié)合機(jī)器人的位姿(可以從機(jī)器人控制器上讀出),就能建立標(biāo)定方程AX=XBAX=XBAX=XB,求解方程就能得到手眼關(guān)系矩陣。 在求解標(biāo)定方程AX=XBAX=XBAX=XB時(shí),由于方程求解的非線性和不穩(wěn)定,如何求得一個(gè)誤差小而且有意義的解是手眼標(biāo)定的重要問題。關(guān)于如何求解的問題,就有了許多不同的手眼標(biāo)定方法。 對手眼換矩陣的求解主要有兩類方法。
一類方法利用旋轉(zhuǎn)矩陣的性質(zhì)把非線性化的問題線性化。這類方法均包含兩個(gè)階段:首先通過線性化的方法求解手眼變換矩陣的旋轉(zhuǎn)部分,然后將旋轉(zhuǎn)部分的求解結(jié)果代入手眼方程,求解手眼矩降的平移部分,這類方法可以推導(dǎo)出簡單且求解方便的線性求解方程,但是由于是分兩步束解,旋轉(zhuǎn)矩陣參數(shù)的估計(jì)誤差會傳遞到平移向量中,因此對觀測數(shù)據(jù)中的噪聲敏感。這類方法可以得出唯一解的充分條件是至少有兩次機(jī)械臂運(yùn)動的旋轉(zhuǎn)軸是非平行的。這類方法中Shui的方法是通過兩次移動機(jī)械臂來計(jì)算手眼變換矩陣。Tsai將問題分解成兩部分,即將旋轉(zhuǎn)平移矩陣分解成旋轉(zhuǎn)和平移兩部分進(jìn)行求解,先求解旋轉(zhuǎn)矩陣,再將旋轉(zhuǎn)矩陣代入求解平移向量。在后來的研究中l(wèi)ee給出了簡化求解方程的方法,Strobl對此問題做了優(yōu)化。Daniilidis采用對偶四元數(shù)來表示空間的運(yùn)動。Chou和Kamel提出的方法基于奇異值分解SVD。對于在線手眼標(biāo)定,Andreff提出的方法給出了一種新的手眼關(guān)系的線性化方程,以實(shí)現(xiàn)數(shù)學(xué)上的高效計(jì)算,滿足在線標(biāo)定對實(shí)時(shí)性的需求。
另一類是采用優(yōu)化的方法求解非線性問題。這類方法需要束解復(fù)雜的非線性優(yōu)化問題,通常計(jì)算量相對較大,求解耗時(shí),不能滿足在線實(shí)時(shí)計(jì)算的需求。而且非線性優(yōu)化的結(jié)果依賴于初值的選擇,選擇不當(dāng)?shù)某踔?#xff0c;會陷入局部最優(yōu),無法得到全局最優(yōu)解。在這類方法中,zhuang將機(jī)器人手眼系統(tǒng)與機(jī)器人執(zhí)行器作為一個(gè)整體進(jìn)行建模,并應(yīng)用非線性優(yōu)化的方法求解旋轉(zhuǎn)矩陣和平移向量,以最小化手眼變換矩陣誤差的Frobenius范數(shù)作為優(yōu)化目標(biāo)。wei提出了一種方法,這種方法無需借助標(biāo)定工具,且可以同時(shí)完成手眼標(biāo)定和攝像機(jī)標(biāo)定。Ilonen采用了標(biāo)記點(diǎn)定位的方法,但需要已知攝像機(jī)內(nèi)參。
通過調(diào)研,決定使用Chou和Kamel方法,該方法能實(shí)現(xiàn)所需功能,且實(shí)現(xiàn)過程相對簡潔,方便程序?qū)崿F(xiàn)和維護(hù)。
問題描述
問題描述:本題目中的手眼系統(tǒng)為Eye-to-Hand。在eye to hand手眼系統(tǒng)中 ,采集了機(jī)器人N組位姿下, 末端坐標(biāo)系{tool}在基坐標(biāo)系{base}下位置及姿態(tài)T_b_t, 標(biāo)定板坐標(biāo)系{cal}在相機(jī)坐標(biāo)系{cam}下的位置及姿態(tài)T_c_cal。求基坐標(biāo)系的到相機(jī)坐標(biāo)系齊次坐標(biāo)變換basHcam^{bas}H_{cam}basHcam?。
求解說明
任意運(yùn)動中,機(jī)器人末端到標(biāo)定板的位姿關(guān)系toolHcal^{tool}H_{cal}toolHcal?保持不變,基坐標(biāo)系到相機(jī)坐標(biāo)系的位姿關(guān)系保持不變baseHcam^{base}H_{cam}baseHcam?,則有
toolHcal=toolHbasei?baseHcami?camHcali=toolHbasej?baseHcamj?camHcalj,i≠j^{tool}H_{cal}=^{tool}H_{base}^i*^{base}H_{cam}^i*^{cam}H_{cal}^i=^{tool}H_{base}^j*^{base}H_{cam}^j*^{cam}H_{cal}^j,i\neq j toolHcal?=toolHbasei??baseHcami??camHcali?=toolHbasej??baseHcamj??camHcalj?,i?=j
其中iii, jjj分別表示第iii ,jjj次運(yùn)動。由于baseHcami=baseHcamj^{base}H_{cam}^i=^{base}H_{cam}^jbaseHcami?=baseHcamj?,且始終不變,上式整理可得
(toolHbasej)?1?toolHbasei?baseHcam=baseHcam?camHcalj?(camHcali)?1,i≠j(^{tool}H_{base}^j)^{-1}*^{tool}H_{base}^i*^{base}H_{cam}=^{base}H_{cam}*^{cam}H_{cal}^j*(^{cam}H_{cal}^i)^{-1},i\neq j (toolHbasej?)?1?toolHbasei??baseHcam?=baseHcam??camHcalj??(camHcali?)?1,i?=j
因此有
AX=XBAX=XB AX=XB
A=toolHbasei?(toolHbasej)?1,B=camHcalj?(camHcali)?1,X=baseHcamA=^{tool}H_{base}^i*(^{tool}H_{base}^j)^{-1}, \\ B=^{cam}H_{cal}^j*(^{cam}H_{cal}^i)^{-1}, \\ X=^{base}H_{cam} A=toolHbasei??(toolHbasej?)?1,B=camHcalj??(camHcali?)?1,X=baseHcam?
因此問題變?yōu)榍蠼怅P(guān)于X的矩陣方程AX=XB。
求解AX=XB
求解AX=XB該問題使用Chou和Kamel方法提出的方法[1,2]。旋轉(zhuǎn)部分使用四元數(shù)表示
RARX=RXRB?qA?qX=qX?qBR_AR_X=R_XR_B\Leftrightarrow q_A*q_X=q_X*q_B RA?RX?=RX?RB??qA??qX?=qX??qB?
使用四元數(shù)乘法表示旋轉(zhuǎn)變換,重新構(gòu)造線性系統(tǒng)
qA?qX?qX?qB=qA?qX?qB ̄?qX=(qA?qB ̄)?qXq_A*q_X-q_X*q_B=q_A*q_X-\overline{q_B}*q_X=(q_A-\overline{q_B})*q_X qA??qX??qX??qB?=qA??qX??qB???qX?=(qA??qB??)?qX?
因此有
qX?qB=(x0?xTX(x0I+Sk(x))b)(b0b)q_X*q_B=\left(\begin{matrix} x_0 & -\mathbf{x}^T \\ \mathbf{X} & ( x_0\mathbf{I}+\text{S} k(\mathbf{x}) )\mathbf \end{matrix}\right) \left(\begin{matrix} b0\\ \mathbf \end{matrix}\right) \\ qX??qB?=(x0?X??xT(x0?I+Sk(x))b?)(b0b?)
=(x0b0?xTbXb0+(x0I+Sk(x))b)=\left(\begin{matrix} x_0b_0 -\mathbf{x}^T\mathbf \\ \mathbf{X}b_0 + ( x_0\mathbf{I}+\text{S} k(\mathbf{x}) )\mathbf \end{matrix}\right)\\ =(x0?b0??xTbXb0?+(x0?I+Sk(x))b?)
=(b0x0?bTxbx0+(b0I?Sk(b))x)=\left(\begin{matrix} b_0x_0 -\mathbf^T\mathbf{x} \\ \mathbfx_0 + ( b_0\mathbf{I}-\text{S} k(\mathbf) )\mathbf{x} \end{matrix}\right)\\ =(b0?x0??bTxbx0?+(b0?I?Sk(b))x?)
=(b0?bTb(b0I?Sk(b)))(x0x)=qB ̄?qX=\left(\begin{matrix} b_0 & -\mathbf^T \\ \mathbf & ( b_0\mathbf{I}-\text{S} k(\mathbf)) \end{matrix}\right) \left(\begin{matrix} x_0\\ \mathbf{x} \end{matrix}\right)\\ =\overline{q_B}*q_X =(b0?b??bT(b0?I?Sk(b))?)(x0?x?)=qB???qX?
然后使用奇異值分解求解線性方程組,SVD分解實(shí)現(xiàn)參考第三版《Numerical Recipes》。
構(gòu)建A,B矩陣時(shí),任意兩個(gè)不同位置姿矩陣,可以構(gòu)造一個(gè)方程,因此輸入數(shù)據(jù)的數(shù)量n與可構(gòu)建方程數(shù)m的關(guān)系可以通過排列組合確定m=Cn2=n(n?1)/2m=C^2_n=n(n-1)/2m=Cn2?=n(n?1)/2??筛鶕?jù)此關(guān)系及標(biāo)定系統(tǒng)能處理的最大矩陣維數(shù),設(shè)計(jì)標(biāo)定功能需要考慮系統(tǒng)能處理的最大輸入數(shù)據(jù)量。
假設(shè)系統(tǒng)處理的最大矩陣維數(shù)為l,則有
l=4?m=4?Cn2l=4*m=4*C^2_n l=4?m=4?Cn2?
可得
n=(2+(4+8l))/4n=(2+\sqrt{(4+8l)})/4 n=(2+(4+8l)?)/4
若輸入數(shù)據(jù)量過大,可以考慮另一種方法構(gòu)造A,B矩陣,使用相鄰的兩個(gè)位姿構(gòu)建A,B矩陣。則方程數(shù)m=n?1m=n-1m=n?1,A,B矩陣的較大的維數(shù)是4?m=4n?44*m=4n-44?m=4n?4。
仿真驗(yàn)證
進(jìn)行C++算法開發(fā)前,首先使用matlab可以較快實(shí)現(xiàn),驗(yàn)證選定方法及推導(dǎo)過程的正確性。使用matlab建立隨意建立一個(gè)機(jī)器人,設(shè)定好相機(jī)坐標(biāo)系和標(biāo)定板坐標(biāo)系。然后采集不同位姿下,機(jī)器人末端在基坐標(biāo)的位姿T_b_t,標(biāo)定板坐標(biāo)系在相機(jī)坐標(biāo)系下的位姿T_c_cal。主程序如下,完整程序還包括solve_hand_eye_equation()子程序,該子程序是Chou和Kamel的方法的實(shí)現(xiàn)。除此外還有tsai, shiu, park, park, lu8, liang等人的方法對應(yīng)的子程序tsai(), shiu(), park(), park(), lu8(), liang(),可以到這里下載【下載鏈接】。
%% %eye to hand 手眼標(biāo)定驗(yàn)證程序,以仿真驗(yàn)證代替物理機(jī)器驗(yàn)證。 %libing,2020.4.23 %% %建立機(jī)器人模型,獲得試驗(yàn)數(shù)據(jù),%驗(yàn)證算法理論的正確性,再用于驗(yàn)證C++程序的正確性。 clc clear clc; close('all'); %隨意建立一個(gè)機(jī)器人 PM_PI=3.1415926; deg=PM_PI/180; % theta d a alpha sigma ML1 = Link([ 0, 0.4967, 0, 0, 0], 'modified'); ML2 = Link([ 0, -0.18804, 0.2, 3*PM_PI/2, 0], 'modified'); ML3 = Link([ 0, 0.17248, 0.79876, 0 , 0], 'modified'); ML4 = Link([ 0, 0.98557, 0.25126, 3*PM_PI/2, 0], 'modified'); ML5 = Link([ 0, 0, 0, PM_PI/2 , 0], 'modified'); ML6 = Link([ 0, 0, 0, PM_PI/2 , 0], 'modified'); robot = SerialLink([ML1 ML2 ML3 ML4 ML5 ML6],'name','test\_robot'); robot.teach(); %可以自由拖動的關(guān)節(jié)角度 hold on; %基坐標(biāo)系 H_base=transl(0,0,0); trplot(H_base,'frame','b','color','b'); hold on; %axis([-2,2,-2,2,-1,3]); %末端坐標(biāo)系 T_b_t=zeros(4,4); theta=[0,0,0,0,0,0]; T_b_t(:,1:4)=robot.fkine(theta); fig_tool=trplot(T_b_t,'frame','t','color','b'); %設(shè)置相機(jī)坐標(biāo)系(隨意設(shè)置,與標(biāo)定結(jié)果對比) H_b_c=zeros(4,4); t=transl(1,1.5,2); H_b_c=t*trotx(15)*troty(30)*trotz(45); fprintf("設(shè)置相機(jī)位姿為\n"); disp(H_b_c); trplot(H_b_c,'frame','cam','color','g'); %設(shè)置機(jī)器人末端坐標(biāo)系到標(biāo)定板坐標(biāo)系的變換(隨意設(shè)置) H_t_cal=zeros(4,4); t=transl(0.1,0.2,0.1); H_t_cal=t*trotx(15)*troty(30)*trotz(45); T_b_cal=T_b_t*H_t_cal; fig_cal=trplot(T_b_cal,'frame','cal','color','g');%采集手眼標(biāo)定所需的數(shù)據(jù)數(shù)據(jù)(10個(gè)位姿) fp1=fopen('testq_T_b_t.txt','w'); fp2=fopen('testq_T_c_cal.txt','w'); for i=1:10J1=-6*i*deg;J2=-4.5*i*deg;J3=-4.5*i*deg;J4=3.0*i*deg;J5=4.5*i*deg;J6=3.0*i*deg;theta=[J1,J2,J3,J4,J5,J6];%采集手眼標(biāo)定數(shù)據(jù)數(shù)據(jù)T_b_t(:,4*i-3:4*i)=robot.fkine(theta); %基座坐標(biāo)系到機(jī)器人末端坐標(biāo)系的變換T_b_cal=T_b_t(:,4*i-3:4*i)*H_t_cal; %由T_b_cal=T_b_c*T_c_cal導(dǎo)出T_c_calT_c_cal(:,4*i-3:4*i)=inv(H_b_c)*T_b_cal;%相機(jī)坐標(biāo)系到標(biāo)定板坐標(biāo)系的變換 q1(1:3)= T_b_t(1:3,4*i);%寫入,用于C++程序測試q1(4:7)=rot2q(T_b_t(1:3,4*i-3:4*i-1));q2(1:3)= T_c_cal(1:3,4*i);%寫入,用于C++程序測試q2(4:7)=rot2q(T_c_cal(1:3,4*i-3:4*i-1));fprintf(fp1,'%.6f %.6f %.6f %.6f %.6f %.6f %.6f\n',...q1(1),q1(2),q1(3),q1(4),q1(5),q1(6),q1(7));fprintf(fp2,'%.6f %.6f %.6f %.6f %.6f %.6f %.6f\n',...q2(1),q2(2),q2(3),q2(4),q2(5),q2(6),q2(7));pause(0.2);delete(fig_tool);delete(fig_cal);fig_tool=trplot(T_b_t(:,4*i-3:4*i),'frame','t','color','r');%繪制末端坐標(biāo)系fig_cal=trplot(T_b_cal,'frame','cal','color','g');%繪制標(biāo)定板坐標(biāo)系robot.plot(theta); end fclose(fp1); fclose(fp2); %利用采集的數(shù)據(jù)構(gòu)造方程的系數(shù)矩陣A,B H_b_t=T_b_t; H_c_cal=T_c_cal; [m,n]=size(H_b_t); m=n/4; fp1=fopen('testA.txt','w'); fp2=fopen('testB.txt','w'); n=1; for i=1:m-1 j=i+1;A(:,4*i-3:4*i)=H_b_t(:,4*j-3:4*j)*inv(H_b_t(:,4*i-3:4*i));B(:,4*i-3:4*i)=H_c_cal(:,4*j-3:4*j)*inv(H_c_cal(:,4*i-3:4*i));testA(4*i-3:4*i,:)=A(:,4*i-3:4*i);%用于C++程序測試testB(4*i-3:4*i,:)=B(:,4*i-3:4*i);%用于C++程序測試for k=1:4fprintf(fp1,'%.6f %.6f %.6f %.6f\n',...testA(4*i-4+k,1),testA(4*i-4+k,2),...testA(4*i-4+k,3),testA(4*i-4+k,4));fprintf(fp2,'%.6f %.6f %.6f %.6f\n',...testB(4*i-4+k,1),testB(4*i-4+k,2),...testB(4*i-4+k,3),testB(4*i-4+k,4)); end end fclose(fp1); fclose(fp2); %求AX=XB解方程 fprintf("標(biāo)定結(jié)果\n"); X1=solve_hand_eye_equation(A,B); %文獻(xiàn)的其他方法 X2=tsai(A,B) X3=shiu(A,B) X4=park(A,B) X5=lu8(A,B) X6=liang(A,B)建立的機(jī)器人如下圖所示
matlab設(shè)置相機(jī)坐標(biāo)系的相對于基坐標(biāo)系位姿為
H_b_c=zeros(4,4); t=transl(1,1.5,2); H_b_c=t*trotx(15)*troty(30)*trotz(45);計(jì)算得到對應(yīng)的位姿為如下,這將與算法計(jì)算的結(jié)果進(jìn)行對比。
H_b_c = 0.6124 -0.6124 0.5000 1.0000 0.7745 0.5915 -0.2241 1.5000 -0.1585 0.5245 0.8365 2.0000 0 0 0 1.0000采集10組位姿數(shù)據(jù),測試算法。計(jì)算結(jié)果如下,與設(shè)置的數(shù)據(jù)一致,驗(yàn)證了算法的正確性。
設(shè)置相機(jī)位姿為0.6124 -0.6124 0.5000 1.00000.7745 0.5915 -0.2241 1.5000-0.1585 0.5245 0.8365 2.00000 0 0 1.0000 標(biāo)定結(jié)果 X2 =0.6124 -0.6124 0.5000 1.00000.7745 0.5915 -0.2241 1.5000-0.1585 0.5245 0.8365 2.00000 0 0 1.0000 X3 =0.6124 -0.6124 0.5000 1.00000.7745 0.5915 -0.2241 1.5000-0.1585 0.5245 0.8365 2.00000 0 0 1.0000 X4 =0.6124 -0.6124 0.5000 1.00000.7745 0.5915 -0.2241 1.5000-0.1585 0.5245 0.8365 2.00000 0 0 1.0000 X5 =0.6124 -0.6124 0.5000 1.00000.7745 0.5915 -0.2241 1.5000-0.1585 0.5245 0.8365 2.00000 0 0 1.0000 X6 =0.6124 -0.6124 0.5000 1.00000.7745 0.5915 -0.2241 1.5000-0.1585 0.5245 0.8365 2.00000 0 0 1.0000同時(shí)采集T_b_t,T_c_cal,testA,testB的數(shù)據(jù),用于C++程序調(diào)試和驗(yàn)證。
matlab程序參見solve_hand_eye_equation.m,test_robot.m。
C++程序開發(fā)
首先實(shí)現(xiàn)公用接口solve_hand_eye_equation(),求解AX=XB,該接口與機(jī)器人無關(guān),作為一個(gè)通用函數(shù)。
使用matlab采集testA,testB的數(shù)據(jù)驗(yàn)證。運(yùn)行該功能的測試用例函數(shù)test_solve_hand_eye_equation(),結(jié)果如下
其次構(gòu)造一個(gè)robot類,僅包含手眼標(biāo)定功能,獲取相機(jī)坐標(biāo)系功能,以及相機(jī)坐標(biāo)系參數(shù)。
class robot { public:robot() = default;//默認(rèn)構(gòu)造函數(shù)robot(const robot& newRobot);//復(fù)制構(gòu)造函數(shù),方便創(chuàng)建新機(jī)器人int hand_eye_calibarate(int num, double T_b_t[][7], double T_c_cal[][7]);void get_hand_eye_param(double T[4][4]); private:double H_b_c[4][4] = { {0} };//基坐標(biāo)系到相機(jī)固定坐標(biāo)系的齊次變換//double DHparam[6][5];機(jī)器人DH參數(shù) protected: };最后實(shí)現(xiàn)手眼標(biāo)定接口,接口主要實(shí)現(xiàn)把輸入數(shù)據(jù)的四元數(shù)形式轉(zhuǎn)換為旋轉(zhuǎn)矩陣,構(gòu)造A,B矩陣,最后調(diào)用solve_hand_eye_equation()求解方程AX=XB。運(yùn)行該功能的測試用例函數(shù)hand_eye_calibarate() 結(jié)果如下,與matlab仿真驗(yàn)證的結(jié)果一致(使用matlab機(jī)器人模型采集的數(shù)據(jù)),算法驗(yàn)證完成。
T_b_t: 1.389353 -0.161673 -0.374760 -0.000012 -0.039367 -0.052134 0.997864 1.495724 -0.333834 -0.238036 -0.000190 -0.079298 -0.102923 0.991523 1.562537 -0.524060 -0.080913 -0.000948 -0.120277 -0.151058 0.981180 1.585289 -0.722849 0.093874 -0.002944 -0.162627 -0.195301 0.967161 1.561916 -0.919740 0.283137 -0.007023 -0.206449 -0.234523 0.949910 1.492980 -1.103947 0.483300 -0.014154 -0.251564 -0.267729 0.929966 1.381702 -1.265028 0.690486 -0.025352 -0.297486 -0.294087 0.907949 1.233814 -1.393543 0.900604 -0.041587 -0.343405 -0.312952 0.884537 1.057254 -1.481657 1.109443 -0.063695 -0.388197 -0.323880 0.860435 0.861714 -1.523652 1.312769 -0.092296 -0.430459 -0.326641 0.836356 T_c_cal: -0.474389 -2.366986 -1.315044 -0.022235 -0.050624 -0.034793 0.997864 -0.569053 -2.470300 -1.093639 -0.045221 -0.100774 -0.068418 0.991523 -0.707189 -2.547185 -0.871851 -0.069796 -0.149797 -0.099877 0.981180 -0.883184 -2.590179 -0.657082 -0.096807 -0.196832 -0.128393 0.967161 -1.088846 -2.593220 -0.456094 -0.127029 -0.240827 -0.153420 0.949910 -1.313870 -2.552169 -0.274656 -0.161076 -0.280563 -0.174650 0.929966 -1.546457 -2.465225 -0.117259 -0.199323 -0.314694 -0.192005 0.907949 -1.774056 -2.333193 0.013063 -0.241839 -0.341809 -0.205610 0.884537 -1.984178 -2.159575 0.114821 -0.288338 -0.360497 -0.215766 0.860435 -2.165222 -1.950474 0.188031 -0.338148 -0.369429 -0.222904 0.836356 ------------------標(biāo)定前Tcam:---------------- 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ------------------標(biāo)定后Tcam:---------------- 0.612370 -0.612373 0.500003 0.999996 0.774521 0.591504 -0.224143 1.499992 -0.158495 0.524521 0.836515 1.999987 0.000000 0.000000 0.000000 1.000000小結(jié)
(1)不管是eye-to-hand系統(tǒng),還是eye-in-hand系統(tǒng),問題的關(guān)鍵都是轉(zhuǎn)化為求解方程AX=XB。
(2)本文的所述方法不適用于scara機(jī)器人,這類方法可以得出唯一解的充分條件是至少有兩次機(jī)械臂運(yùn)動的旋轉(zhuǎn)軸是非平行的。
(3)這里的仿真數(shù)據(jù)沒有加入噪聲,所以各種方法的計(jì)算結(jié)果都是一樣的。實(shí)際應(yīng)用中各種方法的結(jié)果應(yīng)該是有一定差異的。
參考資料
[1]Shah, R. D. Eastman, T. Hong, An Overview of Robot-Sensor Calibration Methods for Evaluation of Perception Systems, Performance Metrics for Intelligent Systems, (2012).
[2]J. C. K. Chou, M. Kamel Finding the Position and Orientation of a Sensor on a Robot Manipulator Using Quaternions. In The International Journal of Robotics Research, 10(3): 240-254, 1991.
[3]R. Tsai, R. Lenz A New Technique for Fully Autonomous and Efficient 3D Robotics Hand/Eye Calibration. In IEEE Transactions on Robotics and Automation, 5(3):345-358, 1989.
[4]程玉立. 面向工業(yè)應(yīng)用的機(jī)器人手眼標(biāo)定與物體定位[D].浙江大學(xué),2016.
[5]張?jiān)浦? 工業(yè)機(jī)器人手眼標(biāo)定技術(shù)研究[D].哈爾濱工程大學(xué),2010.
r on a Robot Manipulator Using Quaternions. In The International Journal of Robotics Research, 10(3): 240-254, 1991.
[3]R. Tsai, R. Lenz A New Technique for Fully Autonomous and Efficient 3D Robotics Hand/Eye Calibration. In IEEE Transactions on Robotics and Automation, 5(3):345-358, 1989.
[4]程玉立. 面向工業(yè)應(yīng)用的機(jī)器人手眼標(biāo)定與物體定位[D].浙江大學(xué),2016.
[5]張?jiān)浦? 工業(yè)機(jī)器人手眼標(biāo)定技術(shù)研究[D].哈爾濱工程大學(xué),2010.
[6]William H. Press, Saul A. Teukolsky. Numerical Recipes: The Art of Scientific Computing (3rd Edition)
總結(jié)
- 上一篇: PHP实现国密SM3算法
- 下一篇: 嵌入式工具 | 嵌入式开发常用几款的代码