呂學(xué)義,高 波
(山東科技大學(xué),山東青島 266590)
要想讓假肢抓取到目標(biāo),必須要先得到目標(biāo)物體的位姿矩陣。本文作者提出的定位方法通過兩個(gè)姿態(tài)傳感器和一個(gè)激光測(cè)距儀獲取到了目標(biāo)的位姿矩陣。其中,姿態(tài)傳感器用于檢測(cè)者頭部的姿態(tài),激光測(cè)距儀用于確認(rèn)目標(biāo)。
兩個(gè)姿態(tài)傳感器分別安裝在假肢和使用者的頭部上;激光測(cè)距儀安置在左耳處。
圖1 傳感器安裝示意圖
如圖2所示,S坐標(biāo)系是基礎(chǔ)坐標(biāo)系;N坐標(biāo)系是頸部中心坐標(biāo)系;H坐標(biāo)系是頭部中心坐標(biāo)系;E坐標(biāo)系是測(cè)距坐標(biāo)系;記某坐標(biāo)系i繞其x軸轉(zhuǎn)動(dòng)的角度為αi,繞其y軸轉(zhuǎn)動(dòng)的角度記為 βi,繞其z軸轉(zhuǎn)動(dòng)的角度記為γi;記H坐標(biāo)系相對(duì)于N坐標(biāo)系的描述為。
圖2 目標(biāo)物體位姿矩陣獲取示意圖
N坐標(biāo)的原點(diǎn)在S坐標(biāo)系中的描述是(xs,ys,zs)。使用者頭部上下轉(zhuǎn)動(dòng)等價(jià)于N坐標(biāo)系繞S坐標(biāo)系的y軸轉(zhuǎn)動(dòng)βs角度。因此,為:
H坐標(biāo)系的原點(diǎn)在N坐標(biāo)系中的描述是(0,0,zn),各軸的方位與N坐標(biāo)系的各軸的方位一致。使用者頭部左右轉(zhuǎn)動(dòng)相當(dāng)于H坐標(biāo)系繞N坐標(biāo)系的Z軸旋轉(zhuǎn)γn。因此,為:
E坐標(biāo)系的坐標(biāo)原點(diǎn)在H坐標(biāo)系里的描述是(0,yn,0),其x軸的方向與激光束的方位重合,其y軸的方向與H坐標(biāo)的y軸方向重合,其z軸的方位與H坐標(biāo)系的z軸有個(gè)固定的角度βh。因此,為:
激光測(cè)距儀測(cè)得的距離用d表示,記:M=[d,0,0,1]。
通過下式即可得到目標(biāo)的位置P:
前文所述定位方法的精度受以下兩個(gè)方面的因素影響。首先,定位系統(tǒng)采用的姿態(tài)傳感器有漂移累計(jì)誤差。另外,地磁場(chǎng)是弱磁場(chǎng),測(cè)量過程中很容易被傳感器周圍的環(huán)境所干擾[1],使得姿態(tài)傳感器測(cè)量的姿態(tài)不準(zhǔn)確;其次,一些坐標(biāo)變換的參數(shù)都人工測(cè)量得到的,必然地存在誤差。為了降低定位方法的誤差,本文作者提出基于BP神經(jīng)網(wǎng)絡(luò)的誤差校正。
BP神經(jīng)網(wǎng)絡(luò)是一種利用誤差反向傳播算法的前饋型網(wǎng)絡(luò),是迄今為止應(yīng)用最為廣泛的神經(jīng)網(wǎng)絡(luò)。BP神經(jīng)網(wǎng)絡(luò)目前廣泛用于函數(shù)逼近、模式識(shí)別、數(shù)據(jù)挖掘、系統(tǒng)辨識(shí)與自動(dòng)控制等領(lǐng)域[2]。
圖3所示的3層網(wǎng)絡(luò)為例,具體說明BP網(wǎng)絡(luò)學(xué)習(xí)算法[3]:
圖3 三層BP神經(jīng)網(wǎng)絡(luò)
設(shè)訓(xùn)練樣本的輸入集合為P={P1,P2,P3,…,Pn},輸出集合為T={T1,T2,T3,…,Ty}。其中任意一個(gè)訓(xùn)練樣本 的 輸 入 為Pm={Pm,1,Pm,2,Pm,3,…,Pm,r} ,輸 出 為tm={tm,1,tm,2,tm,3,…,tm,S2}, 對(duì) 應(yīng) 的 網(wǎng) 絡(luò) 輸 出 為;輸入層共有r個(gè)神經(jīng)元,隱含層共有S1個(gè)神經(jīng)元,輸出層共有S2個(gè)神經(jīng)元;隱含層第i個(gè)神經(jīng)元對(duì)應(yīng)的激活函數(shù)為,輸出層第k個(gè)神經(jīng)元對(duì)應(yīng)的激活函數(shù)為。
當(dāng)網(wǎng)絡(luò)進(jìn)行第t次訓(xùn)練,輸入為第m個(gè)樣本時(shí):
(1)各層的輸出
①隱含層第i個(gè)神經(jīng)元的輸出為:
②輸出層第k個(gè)神經(jīng)元的輸出為:
(2)定義誤差函數(shù)為
(3)利用梯度下降法求各層權(quán)值的變化
①輸出層第k個(gè)神經(jīng)元和隱含層第i個(gè)神經(jīng)元之間權(quán)值的變化量:
同理,輸出層第k個(gè)神經(jīng)元和隱含層第i個(gè)神經(jīng)元之間閥值的變化量為:
②隱含層權(quán)值變化
隱含層第j個(gè)神經(jīng)元與輸入層第i個(gè)神經(jīng)元之間權(quán)值的變化量為:
同理,隱含層第i個(gè)神經(jīng)元和輸入層第j個(gè)神經(jīng)元之間閥值的變化量為:
因此,隱含層、輸出層的權(quán)值和閥值的修正公式如下:
在進(jìn)行BP網(wǎng)絡(luò)設(shè)計(jì)時(shí),一般應(yīng)從網(wǎng)絡(luò)的層數(shù)、每層中的神經(jīng)元個(gè)數(shù)、初始值以及學(xué)習(xí)方法等方面來進(jìn)行考慮[4]。
(1)網(wǎng)絡(luò)的層數(shù)
理論上早已證明:具有偏差和至少一個(gè)S型隱含層加上一個(gè)線性輸出層的網(wǎng)絡(luò),能夠逼近任何有理函數(shù)[4]。所以,據(jù)此確定網(wǎng)絡(luò)的層數(shù)為3層,僅有一個(gè)隱含層。
表1 S1=2,3,4,5,6,7,…,30時(shí)的網(wǎng)絡(luò)訓(xùn)練結(jié)果
(2)每層的神經(jīng)元數(shù)
由于輸入、輸出樣本為點(diǎn)的三維坐標(biāo),因此輸入層和輸出層的神經(jīng)元數(shù)均為3個(gè)。接下來選取多少個(gè)隱層節(jié)點(diǎn)才能滿足系統(tǒng)精度的要求?這在理論上并沒有一個(gè)明確的規(guī)定[5]。在具體操作時(shí),通常的做法是對(duì)不同神經(jīng)元數(shù)進(jìn)行訓(xùn)練對(duì)比,確定一個(gè)最佳的節(jié)點(diǎn)數(shù),然后加上一點(diǎn)余量即可。
采用traingd訓(xùn)練函數(shù)和learngd學(xué)習(xí)函數(shù)。為了節(jié)省訓(xùn)練時(shí)間,選擇誤差目標(biāo)為net.trainParam.goal=0.14。通過改變網(wǎng)絡(luò)隱含層的節(jié)點(diǎn)數(shù),對(duì)比不同節(jié)點(diǎn)數(shù)下網(wǎng)絡(luò)訓(xùn)練所需的循環(huán)次數(shù)和訓(xùn)練時(shí)間來確定一個(gè)合適的隱層節(jié)點(diǎn)數(shù)。各節(jié)點(diǎn)數(shù)的訓(xùn)練結(jié)果如表1所示。 可以看出:當(dāng)S1=11時(shí)較為合適,再加上2個(gè)神經(jīng)元。所以,S1=13。
(3)初始權(quán)值的選取
初始權(quán)值的選取要合適。威得羅等[6]提出了一種選定初始權(quán)值的策略:選擇權(quán)值的量級(jí)為 S1。對(duì)應(yīng)地,在MATLAB工具箱中,可采用函數(shù)nwtan來初始化隱含層權(quán)值。但此策略只能用于第一隱含層,除此之外的隱含層的初始值在(-1,1)之間取隨機(jī)數(shù)。
(4)學(xué)習(xí)速率的選取
學(xué)習(xí)速率決定每一次循環(huán)訓(xùn)練中所產(chǎn)生的權(quán)值變化量。與初始權(quán)值的確定過程一樣,在確定一個(gè)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)速率中,要對(duì)比幾個(gè)不同的學(xué)習(xí)速率下,網(wǎng)絡(luò)訓(xùn)練過程中誤差平方和∑e2的變化情況。據(jù)此,通過對(duì)比,將學(xué)習(xí)速率確定為0.035。但是通常情況下,采取自適應(yīng)學(xué)習(xí)速率這種方法來確定學(xué)習(xí)速率。
(5)期望誤差的選取
在設(shè)計(jì)網(wǎng)絡(luò)的訓(xùn)練過程中,期望誤差也應(yīng)當(dāng)通過對(duì)比訓(xùn)練后確定一個(gè)合適的值[7];
期望誤差的選取與隱含層的節(jié)點(diǎn)數(shù)有關(guān)。前文將隱含層的節(jié)點(diǎn)數(shù)定為13,在MATLAB中,網(wǎng)絡(luò)誤差下降到0.001 73時(shí),過好幾分鐘網(wǎng)絡(luò)誤差才會(huì)繼續(xù)下降。因此,將期望誤差選取為0.001 8,但是只針對(duì)traingd訓(xùn)練函數(shù)和learngd學(xué)習(xí)函數(shù)。
(6)BP算法的改進(jìn)方法
能加快訓(xùn)練速度,避免陷入局部極小值的常用方法有:附加動(dòng)量法、自適應(yīng)學(xué)習(xí)速率法、誤差函數(shù)改進(jìn)法等。在此,采用附加動(dòng)量和自適應(yīng)學(xué)習(xí)速率這兩種方法。
在MATLAB中對(duì)所設(shè)計(jì)的BP神經(jīng)網(wǎng)絡(luò)進(jìn)行實(shí)驗(yàn)驗(yàn)證,需要用到神經(jīng)網(wǎng)絡(luò)工具箱,該工具箱是在MATLAB環(huán)境下開發(fā)出來的[8]。
clear all;
clc;
Fop=fopen(′P.txt′,′rb′);
[P,countp]=fscanf(Fop,′%f′,[3 inf]);Fot=fopen(′T.txt′,′rb′);
[T,countt]=fscanf(Fot,′%f′,[3 inf]);Fotc=fopen(′C.txt′,′rb′);[C,counttc]=fscanf(Fotc,′%f′,[3,inf]);
fclose(′all′);
P=P*1000;
T=T*1000;
C=C*1000;
[P,psp]=mapminmax(P);
[T,pst]=mapminmax(T);
C=mapminmax(′apply′,C,psp);
net=newff([-1 1;-1 1;-1 1;],[13,3],{′tansig′,′pure?lin′},′traingd′,′learngd′,′mse′);
net.layers{1}.initFcn=′initnw′;
net.inputWeights{1,1}.initFcn= ′nwtan′;
net.biases{1,1}.initFcn= ′nwtan′;
net.layers{2}.initFcn=′initwb′;
net.inputWeights{2,1}.initFcn= ′rands′;
net.biases{2,1}.initFcn= ′rands′;
net=init(net);
net.trainParam.goal=0.000150;
net.trainParam.epochs=200000;
net.trainParam.show=25;
net.trainParam.showWindow=1;
net.trainParam.lr=0.035;
net.trainParam.mc=0.95;
Cyz=sim(net,C);
Cyz=mapminmax(′reverse′,Cyz,pst);
Cyz=Cyz/1000;
Fotc1=fopen(′C1.txt′, ′rb′); [C1, countt2] =fs?canf(Fotc1,′%f′,[3,inf]);
C1=C1*1000;
x=0;y=0;z=0;
for i=1:19
x=x+(Cyz(1,i)-C1(1,i))^2;
y=y+(Cyz(2,i)-C1(2,i))^2;
z=z+(Cyz(3,i)-C1(3,i))^2;
end
plot(wc);
圖4 校正前定位系統(tǒng)的誤差
圖5 校正后定位系統(tǒng)的誤差
待網(wǎng)絡(luò)訓(xùn)練完成后,將19個(gè)驗(yàn)證點(diǎn)的坐標(biāo)值輸入訓(xùn)練后的網(wǎng)絡(luò),得到網(wǎng)絡(luò)的輸出值。然后,將輸出值與實(shí)際值進(jìn)行對(duì)比,得到誤差。由圖4、圖5可以看出:基于19個(gè)驗(yàn)證點(diǎn)時(shí),校正前系統(tǒng)的最小誤差為304.810 7 mm,最大誤差為422.320 6 mm;校正后系統(tǒng)的最小誤差為0.531 7 mm,最大誤差為2.2147 mm;因此所設(shè)計(jì)的BP神經(jīng)網(wǎng)絡(luò)能有效地降低所設(shè)計(jì)的定位系統(tǒng)的誤差。
設(shè)計(jì)的BP神經(jīng)網(wǎng)絡(luò),在MATLAB里驗(yàn)證,驗(yàn)證結(jié)果表明所設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò)能極大地提高定位方法的精度。