呂學義,高 波
(山東科技大學,山東青島 266590)
要想讓假肢抓取到目標,必須要先得到目標物體的位姿矩陣。本文作者提出的定位方法通過兩個姿態傳感器和一個激光測距儀獲取到了目標的位姿矩陣。其中,姿態傳感器用于檢測者頭部的姿態,激光測距儀用于確認目標。
兩個姿態傳感器分別安裝在假肢和使用者的頭部上;激光測距儀安置在左耳處。

圖1 傳感器安裝示意圖
如圖2所示,S坐標系是基礎坐標系;N坐標系是頸部中心坐標系;H坐標系是頭部中心坐標系;E坐標系是測距坐標系;記某坐標系i繞其x軸轉動的角度為αi,繞其y軸轉動的角度記為 βi,繞其z軸轉動的角度記為γi;記H坐標系相對于N坐標系的描述為。

圖2 目標物體位姿矩陣獲取示意圖
N坐標的原點在S坐標系中的描述是(xs,ys,zs)。使用者頭部上下轉動等價于N坐標系繞S坐標系的y軸轉動βs角度。因此,為:

H坐標系的原點在N坐標系中的描述是(0,0,zn),各軸的方位與N坐標系的各軸的方位一致。使用者頭部左右轉動相當于H坐標系繞N坐標系的Z軸旋轉γn。因此,為:

E坐標系的坐標原點在H坐標系里的描述是(0,yn,0),其x軸的方向與激光束的方位重合,其y軸的方向與H坐標的y軸方向重合,其z軸的方位與H坐標系的z軸有個固定的角度βh。因此,為:

激光測距儀測得的距離用d表示,記:M=[d,0,0,1]。
通過下式即可得到目標的位置P:

前文所述定位方法的精度受以下兩個方面的因素影響。首先,定位系統采用的姿態傳感器有漂移累計誤差。另外,地磁場是弱磁場,測量過程中很容易被傳感器周圍的環境所干擾[1],使得姿態傳感器測量的姿態不準確;其次,一些坐標變換的參數都人工測量得到的,必然地存在誤差。為了降低定位方法的誤差,本文作者提出基于BP神經網絡的誤差校正。
BP神經網絡是一種利用誤差反向傳播算法的前饋型網絡,是迄今為止應用最為廣泛的神經網絡。BP神經網絡目前廣泛用于函數逼近、模式識別、數據挖掘、系統辨識與自動控制等領域[2]。
圖3所示的3層網絡為例,具體說明BP網絡學習算法[3]:

圖3 三層BP神經網絡
設訓練樣本的輸入集合為P={P1,P2,P3,…,Pn},輸出集合為T={T1,T2,T3,…,Ty}。其中任意一個訓練樣本 的 輸 入 為Pm={Pm,1,Pm,2,Pm,3,…,Pm,r} ,輸 出 為tm={tm,1,tm,2,tm,3,…,tm,S2}, 對 應 的 網 絡 輸 出 為;輸入層共有r個神經元,隱含層共有S1個神經元,輸出層共有S2個神經元;隱含層第i個神經元對應的激活函數為,輸出層第k個神經元對應的激活函數為。
當網絡進行第t次訓練,輸入為第m個樣本時:
(1)各層的輸出
①隱含層第i個神經元的輸出為:

②輸出層第k個神經元的輸出為:

(2)定義誤差函數為

(3)利用梯度下降法求各層權值的變化
①輸出層第k個神經元和隱含層第i個神經元之間權值的變化量:

同理,輸出層第k個神經元和隱含層第i個神經元之間閥值的變化量為:

②隱含層權值變化
隱含層第j個神經元與輸入層第i個神經元之間權值的變化量為:

同理,隱含層第i個神經元和輸入層第j個神經元之間閥值的變化量為:

因此,隱含層、輸出層的權值和閥值的修正公式如下:

在進行BP網絡設計時,一般應從網絡的層數、每層中的神經元個數、初始值以及學習方法等方面來進行考慮[4]。
(1)網絡的層數
理論上早已證明:具有偏差和至少一個S型隱含層加上一個線性輸出層的網絡,能夠逼近任何有理函數[4]。所以,據此確定網絡的層數為3層,僅有一個隱含層。

表1 S1=2,3,4,5,6,7,…,30時的網絡訓練結果
(2)每層的神經元數
由于輸入、輸出樣本為點的三維坐標,因此輸入層和輸出層的神經元數均為3個。接下來選取多少個隱層節點才能滿足系統精度的要求?這在理論上并沒有一個明確的規定[5]。在具體操作時,通常的做法是對不同神經元數進行訓練對比,確定一個最佳的節點數,然后加上一點余量即可。
采用traingd訓練函數和learngd學習函數。為了節省訓練時間,選擇誤差目標為net.trainParam.goal=0.14。通過改變網絡隱含層的節點數,對比不同節點數下網絡訓練所需的循環次數和訓練時間來確定一個合適的隱層節點數。各節點數的訓練結果如表1所示。 可以看出:當S1=11時較為合適,再加上2個神經元。所以,S1=13。
(3)初始權值的選取
初始權值的選取要合適。威得羅等[6]提出了一種選定初始權值的策略:選擇權值的量級為 S1。對應地,在MATLAB工具箱中,可采用函數nwtan來初始化隱含層權值。但此策略只能用于第一隱含層,除此之外的隱含層的初始值在(-1,1)之間取隨機數。
(4)學習速率的選取
學習速率決定每一次循環訓練中所產生的權值變化量。與初始權值的確定過程一樣,在確定一個神經網絡的學習速率中,要對比幾個不同的學習速率下,網絡訓練過程中誤差平方和∑e2的變化情況。據此,通過對比,將學習速率確定為0.035。但是通常情況下,采取自適應學習速率這種方法來確定學習速率。
(5)期望誤差的選取
在設計網絡的訓練過程中,期望誤差也應當通過對比訓練后確定一個合適的值[7];
期望誤差的選取與隱含層的節點數有關。前文將隱含層的節點數定為13,在MATLAB中,網絡誤差下降到0.001 73時,過好幾分鐘網絡誤差才會繼續下降。因此,將期望誤差選取為0.001 8,但是只針對traingd訓練函數和learngd學習函數。
(6)BP算法的改進方法
能加快訓練速度,避免陷入局部極小值的常用方法有:附加動量法、自適應學習速率法、誤差函數改進法等。在此,采用附加動量和自適應學習速率這兩種方法。
在MATLAB中對所設計的BP神經網絡進行實驗驗證,需要用到神經網絡工具箱,該工具箱是在MATLAB環境下開發出來的[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 校正前定位系統的誤差

圖5 校正后定位系統的誤差
待網絡訓練完成后,將19個驗證點的坐標值輸入訓練后的網絡,得到網絡的輸出值。然后,將輸出值與實際值進行對比,得到誤差。由圖4、圖5可以看出:基于19個驗證點時,校正前系統的最小誤差為304.810 7 mm,最大誤差為422.320 6 mm;校正后系統的最小誤差為0.531 7 mm,最大誤差為2.2147 mm;因此所設計的BP神經網絡能有效地降低所設計的定位系統的誤差。
設計的BP神經網絡,在MATLAB里驗證,驗證結果表明所設計的神經網絡能極大地提高定位方法的精度。