Example #1
0
    def HDFOptimizer(self, P, RN_RSS, RN_ToA, RN_TDoA, RN_TDoA2, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest):
        """
        This applies LS approximation to get position P.
        Return P
        """

        RSSL=RSSLocation(RN_RSS)
        TOAL=ToALocation(RN_ToA)
        TDOAL=TDoALocation(RN_TDoA)


        if RN_RSS==None:
            shRN_TDoA    = shape(RN_TDoA)
            RNnum_TDoA   = shRN_TDoA[1]
            #RN_TDoA2= RN_ToA[:,0:1]*ones((1,RNnum_TDoA))
            fopt=TOAL.ToAOptimizer(P, RN_ToA, ToA, ToAStd) + TDOAL.TDoAOptimizer(P, RN_TDoA, RN_TDoA2, TDoA, TDoAStd)
            return fopt

        elif RN_ToA==None:
            shRN_TDoA    = shape(RN_TDoA)
            RNnum_TDoA   = shRN_TDoA[1]
            #RN_TDoA2= RN_RSS[:,0:1]*ones((1,RNnum_TDoA))
            fopt=RSSL.DRSSOptimizer(P, RN_RSS, PL0, d0, RSS, RSSnp, RSSStd) + TDOAL.TDoAOptimizer(P, RN_TDoA, RN_TDoA2, TDoA, TDoAStd)
            return fopt

        elif RN_TDoA==None:
            fopt=RSSL.DRSSOptimizer(P, RN_RSS, PL0, d0, RSS, RSSnp, RSSStd) + TOAL.ToAOptimizer(P, RN_ToA, ToA, ToAStd)
            return fopt

        else:
            shRN_TDoA    = shape(RN_TDoA)
            RNnum_TDoA   = shRN_TDoA[1]
            #RN_TDoA2= RN_TDoA[:,0:1]*ones((1,RNnum_TDoA))
            fopt=RSSL.DRSSOptimizer(P, RN_RSS, PL0, d0, RSS, RSSnp, RSSStd) + TOAL.ToAOptimizer(P, RN_ToA, ToA, ToAStd) + TDOAL.TDoAOptimizer(P, RN_TDoA, RN_TDoA2, TDoA, TDoAStd)
            return fopt
Example #2
0
File: RSS.py Project: niamiot/RGPA
	def __init__(self,value=40,std=1.0,vcw=3,model={},p=np.array([])):	
		Constraint.__init__(self,'RSS',p)

		self.Id     = copy.copy(self.C_Id)
		Constraint.C_Id = Constraint.C_Id+1   # constraint counter is incremented
		self.value  = value  # attennation (dB)
		if len(model)==0:
			self.model['PL0'] =-34.7
			self.model['d0']  = 1.0 
			self.model['RSSnp'] = 2.64
			self.model['RSSStd'] = 4.34 
			self.model['Rest'] = 'mode'
		else	:
			self.model  = model

		self.LOC = RSSLocation(p)
		self.std  = (self.LOC.getRangeStd(p, self.model['PL0'], self.model['d0'], self.value,self.model['RSSnp'], self.model['RSSStd'], self.model['Rest'])[0])/0.3
		self.range    = self.LOC.getRange(p, self.model['PL0'], self.model['d0'], self.value, self.model['RSSnp'], self.model['RSSStd'], self.model['Rest'])[0]
		self.sstd   = self.std*0.3
		self.rescale(vcw)
		self.runable = True
		self.evaluated = False
		self.annulus_bound()
Example #3
0
def plot_cdf_ML_RSS_nTOA_crlb():
        MLrss_vect=[]
        MLrss1toa_vect=[]
        MLrss1toacrlb_vect=[]
        MLrss2toa_vect=[]
        MLrss3toa_vect=[]
        MLrss4toa_vect=[]
        #Ntrial=10
        for i in range(Ntrial):
                print "                                                                            ", Ntrial-i
                P=L*rand(2,1)
                
                shRN_TDOA    = shape(RN_TDOA)                                     
                RNnumTDOA   = shRN_TDOA[1]
                RNTDOAmp=RN_TDOA-P
                RNTDOA2mp=RN_TDOA2-P
                RNTDOAmp2	= (sum(RNTDOAmp*RNTDOAmp,axis=0)).reshape(RNnumTDOA,1)
                RNTDOA2mp2	= (sum(RNTDOA2mp*RNTDOA2mp,axis=0)).reshape(RNnumTDOA,1)
                RDoA=sqrt(RNTDOAmp2)-sqrt(RNTDOA2mp2)
                TDoAStd=(sig1/c)*rand(RNnumTDOA,1)
                TDoA=RDoA/c+TDoAStd*randn(RNnumTDOA,1)
                
                shRN_RSS    = shape(RN_RSS)                                     
                RNnumRSS   = shRN_RSS[1]
                RSSStd =sh*ones((RNnumRSS,1))
                RSSnp= np*ones((RNnumRSS,1))
                d0=1.0
                S2=RSSLocation(RN_RSS)
                PL0=pl0*ones((RNnumRSS,1))
                RSS=S2.getPL(RN_RSS, P, PL0, d0, RSSnp, RSSStd)
                
                shRN_TOA = shape(RN_TOA)
                RNnumTOA   = shRN_TOA[1]
                RNTOAmp=RN_TOA-P
                RNTOAmp2   = (sum(RNTOAmp*RNTOAmp,axis=0)).reshape(RNnumTOA,1)
                RoA=sqrt(RNTOAmp2)
                ToAStd=(sig/c)*rand(RNnumTOA,1)
                ToA=RoA/c+ToAStd*randn(RNnumTOA,1)

                P0=L*rand(2,1)
                S1=HDFLocation(RN_RSS, RN_TOA, RN_TDOA)
                S2=RSSLocation(RN_RSS)
                S3=CRBLocation(RN_RSS)
                CRB_RSS_TOA_fim=[]
                a=(4*rand(1)).astype(int)[0]
                for b in range(4):
                        CRB_RSS_TOA_fim.append(sqrt(S3.CRB_RSS_TOA_fim(P, RN_RSS, RN_TOA[:,b:b+1], RSSnp, RSSStd, ToAStd[b:b+1,:])))
                u=where(CRB_RSS_TOA_fim==min(CRB_RSS_TOA_fim))
                v=where(CRB_RSS_TOA_fim==max(CRB_RSS_TOA_fim))
                b=u[0][0]
                a=v[0][0]
                P4rss1toa=S1.MLHDFLocate(P, P0, RN_RSS, matrix(RN_TOA[:,a:a+1]), None, None, ToA[a:a+1,:], ToAStd[a:a+1,:], TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                MLrss1toa_vect.append(dist(P4rss1toa,P))
                
                
                P4rss1toacrlb=S1.MLHDFLocate(P, P0, RN_RSS, matrix(RN_TOA[:,b:b+1]), None, None, ToA[b:b+1,:], ToAStd[b:b+1,:], TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                MLrss1toacrlb_vect.append(dist(P4rss1toacrlb,P))

                '''P4rss2toa=S1.MLHDFLocate(P, P0, RN_RSS, matrix(RN_TOA[:,0:2]), None, None, ToA[:,0:2], ToAStd[:,0:2], TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                MLrss2toa_vect.append(dist(P4rss2toa,P))

                P4rss3toa=S1.MLHDFLocate(P, P0, RN_RSS, matrix(RN_TOA[:,0:3]), None, None, ToA[:,0:3], ToAStd[:,0:3], TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                MLrss3toa_vect.append(dist(P4rss3toa,P))

                P4rss4toa=S1.MLHDFLocate(P, P0, RN_RSS, matrix(RN_TOA[:,0:4]), None, None, ToA[:,0:4], ToAStd[:,0:4], TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                MLrss4toa_vect.append(dist(P4rss4toa,P))'''


        cdf(MLrss1toa_vect,"b-","RSSI + 1 TOA (Randomly)",2)
        cdf(MLrss1toacrlb_vect,"r-","RSSI + 1 TOA (CRLB Criteria)",2)
        

        plt.legend(loc=4,numpoints=1)
        #plt.axis([0,10,0,1])
        plt.grid('on')
        plt.xlabel("Positioning error (m)")
        plt.ylabel("Cumulative probability")
        plt.savefig("HDF_cdf_ML_RSS_nTOA_crlb.pdf", fromat="pdf")
        plt.close()
Example #4
0
def plot_cdf_ML_RSS_nTOA():
        MLrss_vect=[]
        MLrss1toa_vect=[]
        MLrss2toa_vect=[]
        MLrss3toa_vect=[]
        MLrss4toa_vect=[]
        #Ntrial=10
        for i in range(Ntrial):
                print "                                                                            ", Ntrial-i
                P=L*rand(2,1)
                
                shRN_TDOA    = shape(RN_TDOA)                                     
                RNnumTDOA   = shRN_TDOA[1]
                RNTDOAmp=RN_TDOA-P
                RNTDOA2mp=RN_TDOA2-P
                RNTDOAmp2	= (sum(RNTDOAmp*RNTDOAmp,axis=0)).reshape(RNnumTDOA,1)
                RNTDOA2mp2	= (sum(RNTDOA2mp*RNTDOA2mp,axis=0)).reshape(RNnumTDOA,1)
                RDoA=sqrt(RNTDOAmp2)-sqrt(RNTDOA2mp2)
                TDoAStd=(sig1/c)*rand(RNnumTDOA,1)
                TDoA=RDoA/c+TDoAStd*randn(RNnumTDOA,1)
                
                shRN_RSS    = shape(RN_RSS)                                     
                RNnumRSS   = shRN_RSS[1]
                RSSStd =sh*ones((RNnumRSS,1))
                RSSnp= np*ones((RNnumRSS,1))
                d0=1.0
                S2=RSSLocation(RN_RSS)
                PL0=pl0*ones((RNnumRSS,1))
                RSS=S2.getPL(RN_RSS, P, PL0, d0, RSSnp, RSSStd)
                
                shRN_TOA = shape(RN_TOA)
                RNnumTOA   = shRN_TOA[1]
                RNTOAmp=RN_TOA-P
                RNTOAmp2   = (sum(RNTOAmp*RNTOAmp,axis=0)).reshape(RNnumTOA,1)
                RoA=sqrt(RNTOAmp2)
                ToAStd=(sig/c)*rand(RNnumTOA,1)
                ToA=RoA/c+ToAStd*randn(RNnumTOA,1)

                P0=L*rand(2,1)
                S1=HDFLocation(RN_RSS, RN_TOA, RN_TDOA)
                S2=RSSLocation(RN_RSS)               
                P4rss=S2.MLDRSSLocate(P, P0, RN_RSS, PL0, d0, RSS, RSSnp, RSSStd)
                MLrss_vect.append(dist(P4rss,P))
                
                P4rss1toa=S1.MLHDFLocate(P, P0, RN_RSS, matrix(RN_TOA[:,0:1]), None, None, ToA[0:1,:], ToAStd[0:1,:], TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                MLrss1toa_vect.append(dist(P4rss1toa,P))

                P4rss2toa=S1.MLHDFLocate(P, P0, RN_RSS, matrix(RN_TOA[:,0:2]), None, None, ToA[0:2,:], ToAStd[0:2,:], TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                MLrss2toa_vect.append(dist(P4rss2toa,P))

                P4rss3toa=S1.MLHDFLocate(P, P0, RN_RSS, matrix(RN_TOA[:,0:3]), None, None, ToA[0:3,:], ToAStd[0:3,:], TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                MLrss3toa_vect.append(dist(P4rss3toa,P))

                P4rss4toa=S1.MLHDFLocate(P, P0, RN_RSS, matrix(RN_TOA[:,0:4]), None, None, ToA[0:4,:], ToAStd[0:4,:], TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                MLrss4toa_vect.append(dist(P4rss4toa,P))

         
        
        cdf(MLrss_vect,"k-","RSSI",2)
        cdf(MLrss1toa_vect,"b-","RSSI + 1 TOA",2)
        cdf(MLrss2toa_vect,"r-","RSSI + 2 TOA",2)
        cdf(MLrss3toa_vect,"y-","RSSI + 3 TOA",2)
        cdf(MLrss4toa_vect,"g-","RSSI + 4 TOA",2)

        plt.legend(loc=4,numpoints=1)
        #plt.axis([0,10,0,1])
        plt.grid('on')
        plt.xlabel("Positioning error (m)")
        plt.ylabel("Cumulative probability")
        plt.savefig("HDF_cdf_ML_RSS_nTOA.pdf", fromat="pdf")
        plt.close()

        ntoa=range(5)
        err_moy=[mean(MLrss_vect),mean(MLrss1toa_vect),mean(MLrss2toa_vect),mean(MLrss3toa_vect),mean(MLrss4toa_vect)]
        plt.plot(ntoa, err_moy, "ko-", linewidth=2)
        plt.xlim=5
        plt.grid('on')
        plt.xlabel("Number of Added TOA")
        plt.ylabel("Average Positioning Error")
        plt.savefig("HDF_err_ML_RSS_nTOA.pdf", fromat="pdf")
        plt.close()
Example #5
0
def plot_cdf_SDP_All():
        SDPrss_vect=[]
        SDPrsstoa_vect=[]
        SDPrsstdoa_vect=[]
        SDPrsstoatdoa_vect=[]
        for i in range(Ntrial):
                print "                                                                            ", Ntrial-i
                P=L*rand(2,1)
                
                shRN_TDOA    = shape(RN_TDOA)                                     
                RNnumTDOA   = shRN_TDOA[1]
                RNTDOAmp=RN_TDOA-P
                RNTDOA2mp=RN_TDOA2-P
                RNTDOAmp2	= (sum(RNTDOAmp*RNTDOAmp,axis=0)).reshape(RNnumTDOA,1)
                RNTDOA2mp2	= (sum(RNTDOA2mp*RNTDOA2mp,axis=0)).reshape(RNnumTDOA,1)
                RDoA=sqrt(RNTDOAmp2)-sqrt(RNTDOA2mp2)
                TDoAStd=(sig1/c)*rand(RNnumTDOA,1)
                TDoA=RDoA/c+TDoAStd*randn(RNnumTDOA,1)
                
                shRN_RSS    = shape(RN_RSS)                                     
                RNnumRSS   = shRN_RSS[1]
                RSSStd =sh*ones((RNnumRSS,1))
                RSSnp= np*ones((RNnumRSS,1))
                d0=1.0
                S2=RSSLocation(RN_RSS)
                PL0=pl0*ones((RNnumRSS,1))
                RSS=S2.getPL(RN_RSS, P, PL0, d0, RSSnp, RSSStd)
                
                shRN_TOA = shape(RN_TOA)
                RNnumTOA   = shRN_TOA[1]
                RNTOAmp=RN_TOA-P
                RNTOAmp2   = (sum(RNTOAmp*RNTOAmp,axis=0)).reshape(RNnumTOA,1)
                RoA=sqrt(RNTOAmp2)
                ToAStd=(sig/c)*rand(RNnumTOA,1)
                ToA=RoA/c+ToAStd*randn(RNnumTOA,1)


                S1=HDFLocation(RN_RSS, RN_TOA, RN_TDOA)
                S2=RSSLocation(RN_RSS)               
                P4rss=S2.SDPRSSLocate(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                SDPrss_vect.append(dist(P4rss,P))

                P4rsstoa=S1.SDPHDFLocate(RN_RSS, RN_TOA, None, None, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                SDPrsstoa_vect.append(dist(P4rsstoa,P))

                P4rsstdoa=S1.SDPHDFLocate(RN_RSS, None, RN_TDOA, RN_TDOA2, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                SDPrsstdoa_vect.append(dist(P4rsstdoa,P))

                P4rsstoatdoa=S1.SDPHDFLocate(RN_RSS, RN_TOA, RN_TDOA, RN_TDOA2, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                SDPrsstoatdoa_vect.append(dist(P4rsstoatdoa,P))

         
        
        cdf(SDPrss_vect,"k-","RSSI",2)
        cdf(SDPrsstoa_vect,"b-","RSSI + TOA",2)
        cdf(SDPrsstdoa_vect,"r-","RSSI + TDOA",2)
        cdf(SDPrsstoatdoa_vect,"g-","RSSI + TOA + TDOA",2)

        plt.legend(loc=4,numpoints=1)
        plt.axis([0,10,0,1])
        plt.grid('on')
        plt.xlabel("Positioning error (m)")
        plt.ylabel("Cumulative probability")
        plt.savefig("HDF_cdf_SDP.pdf", fromat="pdf")
        plt.close()
Example #6
0
def plot_cdf_All():
        for i in range(Ntrial):
                print "                                                                            ", Ntrial-i
                P=L*rand(2,1)
                shRN_TDOA    = shape(RN_TDOA)                                     
                RNnumTDOA   = shRN_TDOA[1]
                RNTDOAmp=RN_TDOA-P
                RNTDOA2mp=RN_TDOA2-P
                RNTDOAmp2	= (sum(RNTDOAmp*RNTDOAmp,axis=0)).reshape(RNnumTDOA,1)
                RNTDOA2mp2	= (sum(RNTDOA2mp*RNTDOA2mp,axis=0)).reshape(RNnumTDOA,1)
                RDoA=sqrt(RNTDOAmp2)-sqrt(RNTDOA2mp2)
           #     TDoAStd=(sig1/c)*rand(RNnumTDOA,1)
                TDoAStd=(sig1/c)*ones((RNnumTDOA,1))
                TDoA=RDoA/c+TDoAStd*randn(RNnumTDOA,1)
                
                shRN_RSS    = shape(RN_RSS)                                     
                RNnumRSS   = shRN_RSS[1]
                RSSStd =sh*ones((RNnumRSS,1))
                RSSnp= np*ones((RNnumRSS,1))
                d0=1.0
                S2=RSSLocation(RN_RSS)
                PL0=pl0*ones((RNnumRSS,1))

		print RN_RSS,'\n', P,'\n', PL0,'\n', d0,'\n', RSSnp,'\n', RSSStd
                RSS=S2.getPL(RN_RSS, P, PL0, d0, RSSnp, RSSStd)
                
                shRN_TOA = shape(RN_TOA)
                RNnumTOA   = shRN_TOA[1]
                RNTOAmp=RN_TOA-P
                RNTOAmp2   = (sum(RNTOAmp*RNTOAmp,axis=0)).reshape(RNnumTOA,1)
                RoA=sqrt(RNTOAmp2)
#                ToAStd=(sig/c)*rand(RNnumTOA,1)
                ToAStd=(sig/c)*ones((RNnumTOA,1))

                ToA=RoA/c+ToAStd*randn(RNnumTOA,1)



		print '############### RSS ##################'	
		print 'RNRSS\n',RN_RSS
		print	 'PL0\n',PL0
		print	'd0\n', d0
		print	'RSS\n', RSS
		print	'RSSnp\n', RSSnp
		print	'RSSSTD\n',RSSStd

		print '############### TOA ##################'	
		print 'RNTOA\n', RN_TOA
		print 'ToA\n',ToA
		print	'ToAStd\n', ToAStd

#		print '############### TDOA ##################'	
#		print 'RNTDOA\n', RN_TDOA
#		print 'RNTDOA_ref\n', RN_TDOA2
#		print	'TDOA\n', TDoA*1e-9
#		print	'TDOASTD\n', TDoAStd*1e-9


                S1=HDFLocation(RN_RSS, RN_TOA, RN_TDOA)
                
                '''P1=S1.LSHDFLocate(RN_RSS, RN_TOA, RN_TDOA, RN_TDOA2, ToA, TDoA, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                LS_vect.append(dist(P1,P))

                P1tls=S1.TLSHDFLocate(RN_RSS, RN_TOA, RN_TDOA, RN_TDOA2, ToA, TDoA, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                TLS_vect.append(dist(P1tls,P))
                
                P2=S1.WLSHDFLocate(RN_RSS, RN_TOA, RN_TDOA, RN_TDOA2, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                WLS_vect.append(dist(P2,P))'''

                P2twls=S1.TWLSHDFLocate(RN_RSS, RN_TOA, RN_TDOA, RN_TDOA2, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                TWLS_vect.append(dist(P2twls,P))
                 
                P0=L*rand(2,1)
                P4=S1.MLHDFLocate(P, P0, RN_RSS, RN_TOA, RN_TDOA, RN_TDOA2, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                ML_vect.append(dist(P4,P))

                P5=S1.SDPHDFLocate(RN_RSS, RN_TOA, RN_TDOA, RN_TDOA2, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                SDP_vect.append(dist(P5,P))
                
                
                '''crb=S1.CRBHDFLocate(P, RN_RSS, RN_TOA, RN_TDOA, RN_TDOA2, ToAStd, TDoAStd, PL0, d0, RSSnp, RSSStd, Rest)
                crb_vect.append(sqrt(crb))'''
                
        #cdf(LS_vect,"k-","LS",2)
        #cdf(TLS_vect,"k-","TLS",2)
        #cdf(WLS_vect,"r-","WLS",2)
        
        cdf(ML_vect,"g-","ML",2)
        cdf(SDP_vect,"b--","SDP",2)
        cdf(TWLS_vect,"r-.","TWLS",2)
        #cdf(crb_vect,"g-.","CRLB",2)
        plt.legend(loc=4,numpoints=1)
        plt.axis([0,10,0,1])
        plt.grid('on')
        plt.xlabel("Positioning error (m)")
        plt.ylabel("Cumulative probability")
        plt.savefig("HDF_cdf_RSS_TOA_TDOA.pdf", fromat="pdf")
        plt.close()
Example #7
0
        def run(self):
                """

                run : run simulation of the scenario  

                """

                self.CRB=[]
                Nbn    = len(self.bn)
                Nan    = len(self.an)
                if self.parmsc['save_pe']:
                        self.pe   = []
                        self.p_LS = []
                        self.p_LSci = []
                        self.p_LScr = []
                if self.parmsc['save_CLA']:
                        self.CLA = []

                self.err1    = np.array([])
                #self.err2    = np.array([])
                self.errx    = np.array([])
                self.erry    = np.array([])
                self.errz    = np.array([])
                self.errLS   = np.array([])
                self.errLSci   = np.array([])
                self.errLScr   = np.array([])
                self.errxLS  = np.array([])
                self.erryLS  = np.array([])
                self.errzLS  = np.array([])
                # list for algebraic 
        
                atoabn = []
                astdbn = []
                P      = []
                
                if self.parmsc['Constrain_Type']=='TDOA':
                        lbcl=Nan-1
                else :                          
                        lbcl=Nan

                tdoa_idx = nonzero(np.array(l_connect)=='TDOA')[0]

                if self.parmsc['Constrain_Type']=='hybrid' or self.parmsc['Constrain_Type']=='test':
                        algehyb=1
                else :
                        algehyb=0


                if len(tdoa_idx) != 0:
                        lbcl=Nan-1

                self.rss_idx = nonzero(np.array(l_connect)=='RSS')[0]
                self.toa_idx = nonzero(np.array(l_connect)=='TOA')[0]
                self.tdoa_idx = nonzero(np.array(l_connect)=='TDOA')[0]
                self.ERRSAVE=[]
		self.trgpa=[]
		self.talg=[]
                for ibn in range(Nbn):              # for each blind node

			

                        self.errRSS=zeros((1))
                        self.errTOA=zeros((1))
                        self.errTDOA=zeros((1))
                        self.ibn=ibn
                        errli   = []
                        Constraint.C_Id = 0             # reset constraint Id for each BN
                	
                        print "                                    Blind Node N°",ibn+1,"/",Nbn
                        atv=[]
                        pbn = self.bn[ibn] 
                        #print "Blind Node N° ",ibn,pbn
                        
                        self.tic_ensemblist=time.time()
                        cla = CLA(self.parmsh)
                        cla.bn = self.bn[ibn] 

                        clarss = CLA(self.parmsh)
                        clatoa = CLA(self.parmsh)
                        clatdoa = CLA(self.parmsh)

                

                        if parmsc['exclude_out'] != None :
                                E = Exclude(nodes=parmsc['exclude_out'])        
                                cla.append(E)   


                        for ian in range(lbcl):        # for each AN or couple of AN (TDOA)
                        	TC=0
                                try :
                                        self.parmsc['Constrain_Type'] = self.parmsc['l_connect'][ian]
                                except :
                                        pass
                                

	####################### TOA : Geometric description 
                                if self.parmsc['Constrain_Type']=='TOA':

                                        pan    = self.an[ian] 
                                        # tvalue : true value (ns)
                                        tvalue = np.sqrt(np.dot(pan-pbn,pan-pbn))/3e8
                                        # err (ns)

                                        err    = (self.std_v[ibn,ian]*sp.randn())
                                        while err + tvalue < 0:
                                                err    = (self.std_v[ibn,ian]*sp.randn())
					self.ERRSAVE.append(err)
                                        self.errTOA=np.vstack((self.errTOA,err))
                                        # value (toa : ns )


                                        value  = max(0,tvalue+err)
					TC1=time.time()
                                        C      = TOA(value=value*1e9,
                                                     std=self.std_v[ibn,ian]*1e9,
                                                     vcw=self.parmsc['vcw'],
                                                      p=pan)

                                        cla.append(C)
					TC2=time.time()
                                        clatoa.append(C)


	####################### TDOA : Geometric description 
                                if self.parmsc['Constrain_Type']=='TDOA':


                                        
                                        pan = vstack((self.an[tdoa_idx[0]],self.an[ian+1]))
                                        # dan : delay between 2 AN (ns)
                                        dan = np.sqrt(dot(pan[0]-pan[1],pan[0]-pan[1]))/3e8

                                        minvalue = -dan
                                        maxvalue =  dan
                                        toa1 = np.sqrt(np.dot(pan[0]-pbn,pan[0]-pbn))/3e8
                                        toa2 = np.sqrt(np.dot(pan[1]-pbn,pan[1]-pbn))/3e8
                                        tvalue = toa2-toa1

                                        err    = self.std_v[ibn,ian]*sp.randn()
                                        while ((tvalue + err) < minvalue) or ((tvalue + err) > maxvalue):
                                                err    = self.std_v[ibn,ian]*sp.randn()
      					self.ERRSAVE.append(err)

                                        self.errTDOA=np.vstack((self.errTDOA,err))
                                        # tvalue : true value (ns)

#                                       value  = max(minvalue,tvalue + err)
#                                       value  = min(maxvalue,value)

                                        # value (ns)
                                        value = tvalue+err
					TC1=time.time()

                                        C    = TDOA(value=-value*1e9,
                                                    std=(self.std_v[ibn,ian]*1e9),
                                                    vcw=self.parmsc['vcw'],
                                                    p = pan)
                                        cla.append(C)
					TC2=time.time()
                                        #C    = TDOA(p=pan,value=value,std=2)
                                        clatdoa.append(C)


	####################### RSS : Geometric description 
                                if self.parmsc['Constrain_Type']=='RSS':

                                        pan = self.an[ian] 
                                        d0     =  self.parmsc['d0']
                                        RSSnp  =  vstack((self.parmsc['pn'],self.parmsc['pn']))
                                        PL0= vstack((self.parmsc['rss0'],self.parmsc['rss0']))
                                        RSSStd=  vstack((self.parmsc['sigma_max_RSS'],self.parmsc['sigma_max_RSS']))

                                        PP= vstack((self.bn[ibn],self.bn[ibn]))
                                        PA= vstack((pan,pan))
                                        rssloc = RSSLocation(PP)
                                        value = (rssloc.getPLmean(PA.T, PP.T, PL0, d0, RSSnp))
                                        err = (RSSStd*randn(shape(value)[0],shape(value)[1]))[0][0]
					self.ERRSAVE.append(err)
                                        self.errRSS=np.vstack((self.errRSS,err))
                                
                                        value = value[0] + err
                        
#                                       value  = rssloc.getPL(PA.T, PP.T, PL0, d0, RSSnp, RSSStd)
                                        value  = value


#                                       value = self.parmsc['rss0']-10*self.parmsc['pn']*log10(dr/self.parmsc['d0'])+self.err_v[ibn,ian]

                                        self.Model = {}
                                        self.Model['PL0'] =self.parmsc['rss0']
                                        self.Model['d0']  = self.parmsc['d0'] 
                                        self.Model['RSSnp'] = self.parmsc['pn']
                                        self.Model['RSSStd'] = self.parmsc['sigma_max_RSS']
                                        self.Model['Rest'] = 'mode'
					TC1=time.time()
                                        C   = RSS(value=value,
                                                  std=self.std_v[ibn,ian],
                                                  vcw=self.parmsc['vcw'],
                                                  model=self.Model,
                                                  p=pan )
                                        cla.append(C)
					TC2=time.time()
                                        clarss.append(C)
				TC=TC+(TC2-TC1)
                                if self.parmsc['algebraic']:
                                                atv.append(value)

                        if len(self.rss_idx) != 0:
                                self.errRSS = delete(self.errRSS,0,0)
                        if len(self.toa_idx) != 0:
                                self.errTOA = delete(self.errTOA,0,0)
                        if len(self.tdoa_idx) != 0:
                                self.errTDOA = delete(self.errTDOA,0,0)
                        # version boite recursive       
                        # 
                        ######################### CLA TOTALE
			TR1=time.time()
			cla.merge2()
                        cla.refine(cla.Nc)
                        self.cla = cla
                        ### DoubleListRefine version
                        cla.estpos2()
                        pe1=cla.pe
			TR2=time.time()
			self.trgpa.append((TR2-TR1)+TC)
                        self.pe.append(pe1)
                        errli.append(np.sqrt(np.dot(pe1[:2]-pbn[:2],pe1[:2]-pbn[:2])))
                        err1=min(errli)

                        self.err1  = np.hstack((self.err1,err1))        

                 
                        if self.parmsc['algebraic']:

                                if algehyb==1:
                                        self.parmsc['Constrain_Type']='hybrid'


                                p_LS    = self.algebraic_compute(atv,None)
#                                p_LSci    = self.algebraic_compute(atv,self.pe[-1])
#                                p_LScr    = self.algebraic_compute(atv,self.bn[ibn])

                                if self.parmsc['save_pe']:
                                        self.p_LS.append(p_LS)
#                                        self.p_LSci.append(p_LSci)
#                                        self.p_LScr.append(p_LScr)
                                if self.parmsc['Constrain_Type'] != 'hybrid':
                                        errLS   = np.sqrt(np.dot(p_LS[:2]-pbn[:2],p_LS[:2]-pbn[:2]))
#                                        errLSci   = np.sqrt(np.dot(p_LSci[:2]-pbn[:2],p_LSci[:2]-pbn[:2]))
#                                        errLScr   = np.sqrt(np.dot(p_LScr[:2]-pbn[:2],p_LScr[:2]-pbn[:2]))                

     
        
                                else :
                                        
                                        errLS   = np.sqrt(np.dot(p_LS[:2]-pbn[:2],p_LS[:2]-pbn[:2]))
#                                        errLSci   = np.sqrt(np.dot(p_LSci[:2]-pbn[:2],p_LSci[:2]-pbn[:2]))                        
#                                        errLScr   = np.sqrt(np.dot(p_LScr[:2]-pbn[:2],p_LScr[:2]-pbn[:2]))                        
                                self.errLS  = np.hstack((self.errLS,errLS))     
#                                self.errLSci  = np.hstack((self.errLSci,errLSci))
#                                self.errLScr  = np.hstack((self.errLSci,errLScr))          

				if errli > errLS:
					print 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnn\n',errli,'\n',errLS
Example #8
0
    def algebraic_compute(self, atv):

        rss_idx = self.rss_idx
        toa_idx = self.toa_idx
        tdoa_idx = self.tdoa_idx

        P = []

        #
        #           print 'RSS_idx',rss_idx
        #           print 'TOA_idx',toa_idx
        #           print 'TDOA_idx',tdoa_idx

        ############### RSS ##############
        RN_RSS = zeros(3)
        Rss = zeros(1)
        RSSStd = zeros(1)

        d0 = self.parmsc['d0']
        RSSnp = self.parmsc['pn'] * ones((len(self.an[rss_idx]), 1))
        PL0 = self.parmsc['rss0'] * ones((len(self.an[rss_idx]), 1))
        RSSStd = self.parmsc['sigma_max_RSS'] * ones(
            (len(self.an[rss_idx]), 1))

        if len(rss_idx) != 0:

            for i in rss_idx:

                aa = np.array(self.an[i])
                ss = np.array(atv[i])

                RN_RSS = np.vstack((RN_RSS, aa))
                Rss = np.vstack((Rss, ss))

            RN_RSS = np.delete(RN_RSS, 0, 0).T
            RN_RSS = RN_RSS[:2]
            Rss = np.delete(Rss, 0, 0)

        else:

            RN_RSS = None

        ############### TOA ##############
        RN_TOA = zeros(3)
        ToA = zeros(1)
        ToAStd = zeros(1)

        if len(toa_idx) != 0:

            for i in toa_idx:

                aa = np.array(self.an[i])
                ss = np.array(atv[i])
                tt = np.array(self.std_v[self.ibn, i])

                RN_TOA = np.vstack((RN_TOA, aa))
                ToA = np.vstack((ToA, ss))
                ToAStd = np.vstack((ToAStd, tt))

            RN_TOA = np.delete(RN_TOA, 0, 0).T
            RN_TOA = RN_TOA[:2]
            ToA = np.delete(ToA, 0, 0)
            ToAStd = np.delete(ToAStd, 0, 0)

        else:
            RN_TOA = None

        ############### TDOA ##############
        RN_TDOA = zeros(3)
        RN_TDOA_ref = zeros(3)
        TDoA = zeros(1)
        TDoAStd = zeros(1)

        if len(tdoa_idx) != 0:
            #RN_TDOA=zeros(3)

            #for i in tdoa_idx:

            #       aa=np.array(self.an[i])
            #       RN_TDOA=np.vstack((RN_TDOA,aa))
            RN_TDOA = (self.an[tdoa_idx[1:]]).T
            RN_TDOA_ref = (self.an[tdoa_idx[0]] * ones(np.shape(RN_TDOA))).T

            for i in tdoa_idx[0:-1]:

                ss = np.array(atv[i])
                tt = np.array(self.std_v[self.ibn, i])

                TDoA = np.vstack((TDoA, ss))
                TDoAStd = np.vstack((TDoAStd, tt))
            TDoA = np.delete(TDoA, 0, 0)
            TDoAStd = np.delete(TDoAStd, 0, 0)
            RN_TDOA = RN_TDOA[:2]
            RN_TDOA_ref = RN_TDOA_ref[:2]

        else:

            RN_TDOA = None
            RN_TDOA_ref = None

#           if RN_RSS != None :
#               print '############### RSS ##################'
#               print 'RNRSS\n',RN_RSS
#               print    'PL0\n',PL0
#               print   'd0\n', d0
#               print   'RSS\n', Rss
#               print   'RSSnp\n', RSSnp
#               print   'RSSSTD\n',RSSStd

#           if RN_TOA != None :
#               print '############## TOA ##################'
#               print 'RNTOA\n', RN_TOA
#               print 'ToA\n',ToA
#               print   'ToAStd\n', ToAStd

#           if RN_TDOA != None :
#               print '############### TDOA ##################'
#               print 'RNTDOA\n', RN_TDOA
#               print 'RNTDOA_ref\n', RN_TDOA_ref
#               print   'TDOA\n', TDoA
#               print   'TDOASTD\n', TDoAStd
#
        self.tic_algebric = time.time()
        S1 = HDFLocation(RN_RSS, RN_TOA, RN_TDOA)
        S2 = RSSLocation(RN_RSS)
        S3 = ToALocation(RN_TOA)
        S4 = TDoALocation(RN_TDOA)

        if self.parmsc['Algebraic_method'] == 'LS':
            print 'to be implemented'

        elif self.parmsc['Algebraic_method'] == 'TLS':
            print 'to be implemented'

        elif self.parmsc['Algebraic_method'] == 'WLS':
            print 'to be implemented'

        elif self.parmsc['Algebraic_method'] == 'TWLS':
            if RN_RSS == None and RN_TOA == None:
                P = S4.TWLSTDoALocate(RN_TDOA, RN_TDOA_ref, TDoA, TDoAStd)
            elif RN_RSS == None and RN_TDOA == None:
                P = S3.TWLSToALocate(RN_TOA, ToA, ToAStd)
            elif RN_TOA == None and RN_TDOA == None:
                P = S2.TWLSRSSLocate(RN_RSS, PL0, d0, Rss, RSSnp, RSSStd,
                                     'mode')
            else:
                P = S1.TWLSHDFLocate(RN_RSS, RN_TOA, RN_TDOA, RN_TDOA_ref, ToA,
                                     ToAStd, TDoA, TDoAStd, PL0, d0, Rss,
                                     RSSnp, RSSStd, 'mode')

        elif self.parmsc['Algebraic_method'] == 'ML':

            PP = L * rand(2, 1)  # for 3D replace by L*rand(3,1)
            P0 = L * rand(2, 1)  # for 3D replace by L*rand(3,1)
            #            P0[2]=0.0     # for 3D uncomment
            if RN_RSS == None and RN_TOA == None:
                P = S4.MLTDoALocate(PP, P0, RN_TDOA, RN_TDOA_ref, TDoA,
                                    TDoAStd)
            elif RN_RSS == None and RN_TDOA == None:
                P = S3.MLToALocate(PP, P0, RN_TOA, ToA, ToAStd)
            elif RN_TOA == None and RN_TDOA == None:
                P = S2.MLDRSSLocate(PP, P0, RN_RSS, PL0, d0, Rss, RSSnp,
                                    RSSStd)
            else:
                P = S1.MLHDFLocate(PP, P0, RN_RSS, RN_TOA, RN_TDOA,
                                   RN_TDOA_ref, ToA, ToAStd, TDoA, TDoAStd,
                                   PL0, d0, Rss, RSSnp, RSSStd, 'mode')

        elif self.parmsc['Algebraic_method'] == 'SDP':
            if RN_RSS == None and RN_TOA == None:
                P = S4.SDPTDoALocate(RN_TDOA, RN_TDOA_ref, TDoA, TDoAStd)
            elif RN_RSS == None and RN_TDOA == None:
                P = S3.SDPToALocate(RN_TOA, ToA, ToAStd)
            elif RN_TOA == None and RN_TDOA == None:
                P = S2.SDPRSSLocate(RN_RSS, PL0, d0, -Rss, RSSnp, RSSStd,
                                    'mode')
            else:
                P = S1.SDPHDFLocate(RN_RSS, RN_TOA, RN_TDOA, RN_TDOA_ref, ToA,
                                    ToAStd, TDoA, TDoAStd, PL0, d0, Rss, RSSnp,
                                    RSSStd, 'mode')

        else:
            print "You have to chose the self.parmsc['Algebraic_method'] between those choices :\n LS,TLS,WLS,TWLS,ML,SDP "

        if self.parmsc['CRB']:

            CRBL = CRBLocation(None)

            if len(rss_idx) != 0:
                RSSStdX = self.errRSS  #[rss_idx]#*ones(len(self.an[rss_idx]))

            if len(toa_idx) != 0:
                TOAStdX = self.errTOA  #[toa_idx]#*ones((len(self.an[toa_idx]),1))

            if len(tdoa_idx) != 0:
                TDOAStdX = self.errTDOA  #[tdoa_idx]#*ones((len(self.an[tdoa_idx])-1,1))

            PP = self.bn[self.ibn, :2]

            ###################################### RSS PUR
            if RN_TOA == None and RN_TDOA == None:
                print 'RSS'
                self.CRB.append(
                    sqrt(CRBL.CRB_RSS_fim(PP, RN_RSS, RSSnp, RSSStdX)))
###################################### TOA PUR
            elif RN_RSS == None and RN_TDOA == None:  # TOA
                print 'TOA CRB'

                self.CRB.append(sqrt(CRBL.CRB_TOA_fim(PP, RN_TOA, TOAStdX)))

###################################### TDOA PUR
            elif RN_RSS == None and RN_TOA == None:  # TDOA
                print 'TDOA'
                self.CRB.append(
                    sqrt(CRBL.CRB_TDOA_fim(PP, RN_TDOA, RN_TDOA_ref,
                                           TDOAStdX)))

            elif RN_TOA == None and RN_TDOA != None:
                ###################################### TDOA
                if RN_RSS == None:
                    print 'TDOA2'
                    self.CRB.append(
                        sqrt(CRBL.CRB_TDOA_fim(PP, RN_RSS, PL0, RSSStdX)))
###################################### RSS + TDOA
                else:
                    print 'RSS+TDOA'
                    self.CRB.append(
                        sqrt(
                            CRBL.CRB_RSS_TDOA_fim(PP, RN_RSS, RN_TDOA,
                                                  RN_TDOA_ref, RSSnp, RSSStdX,
                                                  TDOAStdX)))

            elif RN_TOA != None and RN_TDOA == None:
                ##################################### TOA
                if RN_RSS == None:
                    print 'TOA'
                    self.CRB.append(sqrt(CRBL.CRB_TOA_fim(PP, RN_TOA,
                                                          TOAStdX)))
##################################### RSS + TOA
                else:
                    print 'RSS + TOA'
                    self.CRB.append(
                        sqrt(
                            CRBL.CRB_RSS_TOA_fim(PP, RN_RSS, RN_TOA, RSSnp,
                                                 RSSStdX, TOAStdX)))

            elif RN_TOA != None and RN_TDOA != None:
                ##################################### TOA+TDOA
                if RN_RSS == None:
                    print 'TOA + TDOA'
                    self.CRB.append(
                        sqrt(
                            CRBL.CRB_TOA_TDOA_fim(PP, RN_TOA, RN_TDOA,
                                                  RN_TDOA_ref, TOAStdX,
                                                  TDOAStdX)))

##################################### RSS+TOA+TDOA
                else:
                    print 'RSS + TOA + TDOA'
                    self.CRB.append(
                        sqrt(
                            CRBL.CRB_RSS_TOA_TDOA_fim(PP, RN_RSS, RN_TOA,
                                                      RN_TDOA, RN_TDOA_ref,
                                                      RSSnp, RSSStdX, TOAStdX,
                                                      TDOAStdX)))

        P = array(P)
        return P[:, 0]
Example #9
0
    def run(self):
        """

        run : run simulation of the scenario  

        """
        self.time_compute = {}
        self.time_compute['RGPA'] = []
        self.time_compute['algebraic'] = []

        self.CRB = []
        Nbn = len(self.bn)
        Nan = len(self.an)
        if self.parmsc['save_pe']:
            self.pe = []
            self.p_LS = []
        if self.parmsc['save_CLA']:
            self.CLA = []

        self.err1 = np.array([])
        #self.err2    = np.array([])
        self.errx = np.array([])
        self.erry = np.array([])
        self.errz = np.array([])
        self.errLS = np.array([])
        self.errxLS = np.array([])
        self.erryLS = np.array([])
        self.errzLS = np.array([])
        # list for algebraic

        atoabn = []
        astdbn = []
        P = []

        if self.parmsc['Constrain_Type'] == 'TDOA':
            lbcl = Nan - 1
        else:
            lbcl = Nan

        tdoa_idx = nonzero(np.array(l_connect) == 'TDOA')[0]

        if self.parmsc['Constrain_Type'] == 'hybrid' or self.parmsc[
                'Constrain_Type'] == 'test':
            algehyb = 1
        else:
            algehyb = 0

        if len(tdoa_idx) != 0:
            lbcl = Nan - 1
            #self.dan=[]
            #for i in range(len(tdoa_idx)-1):
            #       self.dan.append(vstack((self.an[tdoa_idx[0]],self.an[i+1])))

        self.rss_idx = nonzero(np.array(l_connect) == 'RSS')[0]
        self.toa_idx = nonzero(np.array(l_connect) == 'TOA')[0]
        self.tdoa_idx = nonzero(np.array(l_connect) == 'TDOA')[0]
        self.ERRSAVE = []
        for ibn in range(Nbn):  # for each blind node
            self.errRSS = zeros((1))
            self.errTOA = zeros((1))
            self.errTDOA = zeros((1))
            self.ibn = ibn
            errli = []
            Constraint.C_Id = 0  # reset constraint Id for each BN

            print "                    Blind Node N°", ibn + 1, "/", Nbn
            atv = []
            pbn = self.bn[ibn]
            #print "Blind Node N° ",ibn,pbn

            self.tic_ensemblist = time.time()
            cla = CLA(self.parmsh)
            cla.bn = self.bn[ibn]

            clarss = CLA(self.parmsh)
            clatoa = CLA(self.parmsh)
            clatdoa = CLA(self.parmsh)

            #cla.C_Id=0
            if parmsc['exclude_out'] != None:
                E = Exclude(nodes=parmsc['exclude_out'])
                cla.append(E)

            for ian in range(lbcl):  # for each AN or couple of AN (TDOA)
                #print "Anchor Node N° ",ian

                try:
                    self.parmsc['Constrain_Type'] = self.parmsc['l_connect'][
                        ian]
                except:
                    pass

#                   pdb.set_trace()
                rgpatimea = time.time()
                if self.parmsc['Constrain_Type'] == 'TOA':
                    pan = self.an[ian]
                    # tvalue : true value (ns)
                    tvalue = np.sqrt(np.dot(pan - pbn, pan - pbn)) / 3e8
                    # err (ns)

                    err = (self.std_v[ibn, ian] * sp.randn())
                    while err + tvalue < 0:
                        err = (self.std_v[ibn, ian] * sp.randn())

                    self.errTOA = np.vstack((self.errTOA, err))
                    # value (toa : ns )

                    value = max(0, tvalue + err)

                    C = TOA(value=value * 1e9,
                            std=self.std_v[ibn, ian] * 1e9,
                            vcw=self.parmsc['vcw'],
                            p=pan)

                    cla.append(C)
                    clatoa.append(C)
                if self.parmsc['Constrain_Type'] == 'TDOA':

                    pan = vstack((self.an[tdoa_idx[0]], self.an[ian + 1]))
                    # dan : delay between 2 AN (ns)
                    dan = np.sqrt(dot(pan[0] - pan[1], pan[0] - pan[1])) / 3e8

                    minvalue = -dan
                    maxvalue = dan
                    toa1 = np.sqrt(np.dot(pan[0] - pbn, pan[0] - pbn)) / 3e8
                    toa2 = np.sqrt(np.dot(pan[1] - pbn, pan[1] - pbn)) / 3e8
                    tvalue = toa2 - toa1

                    err = self.std_v[ibn, ian] * sp.randn()
                    while ((tvalue + err) < minvalue) or (
                        (tvalue + err) > maxvalue):
                        err = self.std_v[ibn, ian] * sp.randn()

                    self.errTDOA = np.vstack((self.errTDOA, err))
                    # tvalue : true value (ns)

                    #                       value  = max(minvalue,tvalue + err)
                    #                       value  = min(maxvalue,value)

                    # value (ns)
                    value = tvalue + err

                    C = TDOA(value=-value * 1e9,
                             std=(self.std_v[ibn, ian] * 1e9),
                             vcw=self.parmsc['vcw'],
                             p=pan)
                    cla.append(C)
                    #C    = TDOA(p=pan,value=value,std=2)
                    clatdoa.append(C)
                if self.parmsc['Constrain_Type'] == 'RSS':
                    pan = self.an[ian]
                    ######################################## MODEL RSS NICO
                    #                       dr  = max(0, (np.sqrt(np.dot(pan-pbn,pan-pbn))))
                    #                       M   = Model()
                    #                       err    = (self.std_v[ibn,ian]*1e-9*sp.randn())
                    #                       value = M.OneSlope(max(0,dr + err))
                    #                       value = min(500,value)
                    #                       value = max(-500,value)

                    ######################################## MOHAMED
                    d0 = self.parmsc['d0']
                    RSSnp = vstack((self.parmsc['pn'], self.parmsc['pn']))
                    PL0 = vstack((self.parmsc['rss0'], self.parmsc['rss0']))
                    RSSStd = vstack((self.parmsc['sigma_max_RSS'],
                                     self.parmsc['sigma_max_RSS']))

                    PP = vstack((self.bn[ibn], self.bn[ibn]))
                    PA = vstack((pan, pan))
                    rssloc = RSSLocation(PP)
                    value = (rssloc.getPLmean(PA.T, PP.T, PL0, d0, RSSnp))
                    err = (RSSStd * randn(shape(value)[0],
                                          shape(value)[1]))[0][0]

                    self.errRSS = np.vstack((self.errRSS, err))

                    value = value[0] + err

                    #                       value  = rssloc.getPL(PA.T, PP.T, PL0, d0, RSSnp, RSSStd)
                    value = value

                    #                       value = self.parmsc['rss0']-10*self.parmsc['pn']*log10(dr/self.parmsc['d0'])+self.err_v[ibn,ian]

                    self.Model = {}
                    self.Model['PL0'] = self.parmsc['rss0']
                    self.Model['d0'] = self.parmsc['d0']
                    self.Model['RSSnp'] = self.parmsc['pn']
                    self.Model['RSSStd'] = self.parmsc['sigma_max_RSS']
                    self.Model['Rest'] = 'mode'

                    C = RSS(value=value,
                            std=self.std_v[ibn, ian],
                            vcw=self.parmsc['vcw'],
                            model=self.Model,
                            p=pan)
                    cla.append(C)
                    clarss.append(C)

                if self.parmsc['algebraic']:
                    atv.append(value)

            if len(self.rss_idx) != 0:
                self.errRSS = delete(self.errRSS, 0, 0)
            if len(self.toa_idx) != 0:
                self.errTOA = delete(self.errTOA, 0, 0)
            if len(self.tdoa_idx) != 0:
                self.errTDOA = delete(self.errTDOA, 0, 0)
            # version boite recursive
            #
            ######################### CLA TOTALE
            cla.merge2()
            cla.refine(cla.Nc)
            self.cla = cla
            ### DoubleListRefine version
            cla.estpos2()
            pe1 = cla.pe
            rgpatimeb = time.time()
            self.time_compute['RGPA'].append(rgpatimeb - rgpatimea)

            self.pe.append(pe1)
            errli.append(np.sqrt(np.dot(pe1[:2] - pbn[:2], pe1[:2] - pbn[:2])))

            #print len(parmsc['l_connect'])
            if len(parmsc['l_connect']
                   ) > 4:  # pour ne pas calculer 2fois les cas non hybrides

                if len(nonzero(
                        np.array(parmsc['l_connect']) == 'RSS')[0]) != 0:
                    for i in range(4):
                        clarss.c[i].Id = i
                    clarss.merge2()
                    clarss.refine(clarss.Nc)
                    clarss.estpos2()
                    clarss.bn = bn[ibn]
                    self.clarss = clarss
                    self.perss = clarss.pe
                    errli.append(
                        np.sqrt(
                            np.dot(self.perss[:2] - pbn[:2],
                                   self.perss[:2] - pbn[:2])))

                if len(nonzero(
                        np.array(parmsc['l_connect']) == 'TOA')[0]) != 0:
                    for i in range(4):
                        clatoa.c[i].Id = i
                    clatoa.merge2()
                    clatoa.refine(clatoa.Nc)
                    clatoa.estpos2()
                    clatoa.bn = bn[ibn]
                    self.clatoa = clatoa
                    self.petoa = clatoa.pe
                    errli.append(
                        np.sqrt(
                            np.dot(self.petoa[:2] - pbn[:2],
                                   self.petoa[:2] - pbn[:2])))

                if len(nonzero(
                        np.array(parmsc['l_connect']) == 'TDOA')[0]) != 0:
                    for i in range(3):
                        clatdoa.c[i].Id = i
                    clatdoa.merge2()
                    clatdoa.refine(clatdoa.Nc)
                    clatdoa.estpos2()
                    clatdoa.bn = bn[ibn]
                    self.clatdoa = clatdoa
                    self.petdoa = clatdoa.pe
                    errli.append(
                        np.sqrt(
                            np.dot(self.petdoa[:2] - pbn[:2],
                                   self.petdoa[:2] - pbn[:2])))

            #print errli
            err1 = min(errli)
            #print err1
            self.err1 = np.hstack((self.err1, err1))

            #self.err2  = np.hstack((self.err2,err2))

            #if err >3:
            #       pdb.set_trace()

            if self.parmsc['algebraic']:

                if algehyb == 1:
                    self.parmsc['Constrain_Type'] = 'hybrid'

                algetimea = time.time()
                p_LS = self.algebraic_compute(atv)
                algetimeb = time.time()

                self.time_compute['algebraic'].append(algetimeb - algetimea)

                if self.parmsc['save_pe']:
                    self.p_LS.append(p_LS)
                if self.parmsc['Constrain_Type'] != 'hybrid':
                    errLS = np.sqrt(
                        np.dot(p_LS[:2] - pbn[:2], p_LS[:2] - pbn[:2]))

                #elif self.parmsc['Algebraic_method'] == 'CRB':
                #       errLS = np.sqrt(self.CRB)

                else:

                    errLS = np.sqrt(
                        np.dot(p_LS[:2] - pbn[:2], p_LS[:2] - pbn[:2]))
                self.errLS = np.hstack((self.errLS, errLS))

            if errli > errLS:
                print 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnn\n', errli, '\n', errLS
Example #10
0
    def run(self):
        """

        run : run simulation of the scenario  

        """
        self.time_compute={}
        self.time_compute['RGPA']=[]
        self.time_compute['algebraic']=[]





        self.CRB=[]
        Nbn    = len(self.bn)
        Nan    = len(self.an)
        if self.parmsc['save_pe']:
            self.pe   = []
            self.p_LS = []
        if self.parmsc['save_CLA']:
            self.CLA = []

        self.err1    = np.array([])
        #self.err2    = np.array([])
        self.errx    = np.array([])
        self.erry    = np.array([])
        self.errz    = np.array([])
        self.errLS   = np.array([])
        self.errxLS  = np.array([])
        self.erryLS  = np.array([])
        self.errzLS  = np.array([])
        # list for algebraic 
    
        atoabn = []
        astdbn = []
        P      = []
        
        if self.parmsc['Constrain_Type']=='TDOA':
            lbcl=Nan-1
        else :              
            lbcl=Nan

        tdoa_idx = nonzero(np.array(l_connect)=='TDOA')[0]

        if self.parmsc['Constrain_Type']=='hybrid' or self.parmsc['Constrain_Type']=='test':
            algehyb=1
        else :
            algehyb=0


        if len(tdoa_idx) != 0:
            lbcl=Nan-1
            #self.dan=[]
            #for i in range(len(tdoa_idx)-1):
            #       self.dan.append(vstack((self.an[tdoa_idx[0]],self.an[i+1])))

        self.rss_idx = nonzero(np.array(l_connect)=='RSS')[0]
        self.toa_idx = nonzero(np.array(l_connect)=='TOA')[0]
        self.tdoa_idx = nonzero(np.array(l_connect)=='TDOA')[0]
        self.ERRSAVE=[]
        for ibn in range(Nbn):          # for each blind node
            self.errRSS=zeros((1))
            self.errTOA=zeros((1))
            self.errTDOA=zeros((1))
            self.ibn=ibn
            errli   = []
            Constraint.C_Id = 0         # reset constraint Id for each BN
        
            print "                    Blind Node N°",ibn+1,"/",Nbn
            atv=[]
            pbn = self.bn[ibn] 
            #print "Blind Node N° ",ibn,pbn
            
            self.tic_ensemblist=time.time()
            cla = CLA(self.parmsh)
            cla.bn = self.bn[ibn] 

            clarss = CLA(self.parmsh)
            clatoa = CLA(self.parmsh)
            clatdoa = CLA(self.parmsh)

        
            #cla.C_Id=0         
            if parmsc['exclude_out'] != None :
                E = Exclude(nodes=parmsc['exclude_out'])    
                cla.append(E)   





            for ian in range(lbcl):    # for each AN or couple of AN (TDOA)
                #print "Anchor Node N° ",ian

            
                try :
                    self.parmsc['Constrain_Type'] = self.parmsc['l_connect'][ian]
                except :
                    pass
                
#                   pdb.set_trace()
                rgpatimea=time.time()
                if self.parmsc['Constrain_Type']=='TOA':
                    pan    = self.an[ian] 
                    # tvalue : true value (ns)
                    tvalue = np.sqrt(np.dot(pan-pbn,pan-pbn))/3e8
                    # err (ns)

                    err    = (self.std_v[ibn,ian]*sp.randn())
                    while err + tvalue < 0:
                        err    = (self.std_v[ibn,ian]*sp.randn())

                    self.errTOA=np.vstack((self.errTOA,err))
                    # value (toa : ns )


                    value  = max(0,tvalue+err)

                    C      = TOA(value=value*1e9,
                             std=self.std_v[ibn,ian]*1e9,
                             vcw=self.parmsc['vcw'],
                              p=pan)

                    cla.append(C)
                    clatoa.append(C)
                if self.parmsc['Constrain_Type']=='TDOA':


                    
                    pan = vstack((self.an[tdoa_idx[0]],self.an[ian+1]))
                    # dan : delay between 2 AN (ns)
                    dan = np.sqrt(dot(pan[0]-pan[1],pan[0]-pan[1]))/3e8

                    minvalue = -dan
                    maxvalue =  dan
                    toa1 = np.sqrt(np.dot(pan[0]-pbn,pan[0]-pbn))/3e8
                    toa2 = np.sqrt(np.dot(pan[1]-pbn,pan[1]-pbn))/3e8
                    tvalue = toa2-toa1
                    
                    err    = self.std_v[ibn,ian]*sp.randn()
                    while ((tvalue + err) < minvalue) or ((tvalue + err) > maxvalue):
                        err    = self.std_v[ibn,ian]*sp.randn()
            

                    self.errTDOA=np.vstack((self.errTDOA,err))
                    # tvalue : true value (ns)

#                       value  = max(minvalue,tvalue + err)
#                       value  = min(maxvalue,value)

                    # value (ns)
                    value = tvalue+err

                    C    = TDOA(value=-value*1e9,
                            std=(self.std_v[ibn,ian]*1e9),
                            vcw=self.parmsc['vcw'],
                            p = pan)
                    cla.append(C)
                    #C    = TDOA(p=pan,value=value,std=2)
                    clatdoa.append(C)
                if self.parmsc['Constrain_Type']=='RSS':
                    pan = self.an[ian] 
######################################## MODEL RSS NICO
#                       dr  = max(0, (np.sqrt(np.dot(pan-pbn,pan-pbn))))
#                       M   = Model()
#                       err    = (self.std_v[ibn,ian]*1e-9*sp.randn())
#                       value = M.OneSlope(max(0,dr + err))
#                       value = min(500,value)
#                       value = max(-500,value)

######################################## MOHAMED
                    d0     =  self.parmsc['d0']
                    RSSnp  =  vstack((self.parmsc['pn'],self.parmsc['pn']))
                    PL0= vstack((self.parmsc['rss0'],self.parmsc['rss0']))
                    RSSStd=  vstack((self.parmsc['sigma_max_RSS'],self.parmsc['sigma_max_RSS']))

                    PP= vstack((self.bn[ibn],self.bn[ibn]))
                    PA= vstack((pan,pan))
                    rssloc = RSSLocation(PP)
                    value = (rssloc.getPLmean(PA.T, PP.T, PL0, d0, RSSnp))
                    err = (RSSStd*randn(shape(value)[0],shape(value)[1]))[0][0]

                    self.errRSS=np.vstack((self.errRSS,err))
                
                    value = value[0] + err
            
#                       value  = rssloc.getPL(PA.T, PP.T, PL0, d0, RSSnp, RSSStd)
                    value  = value


#                       value = self.parmsc['rss0']-10*self.parmsc['pn']*log10(dr/self.parmsc['d0'])+self.err_v[ibn,ian]

                    self.Model = {}
                    self.Model['PL0'] =self.parmsc['rss0']
                    self.Model['d0']  = self.parmsc['d0'] 
                    self.Model['RSSnp'] = self.parmsc['pn']
                    self.Model['RSSStd'] = self.parmsc['sigma_max_RSS']
                    self.Model['Rest'] = 'mode'

                    C   = RSS(value=value,
                          std=self.std_v[ibn,ian],
                          vcw=self.parmsc['vcw'],
                          model=self.Model,
                          p=pan )
                    cla.append(C)
                    clarss.append(C)

                if self.parmsc['algebraic']:
                        atv.append(value)

            if len(self.rss_idx) != 0:
                self.errRSS = delete(self.errRSS,0,0)
            if len(self.toa_idx) != 0:
                self.errTOA = delete(self.errTOA,0,0)
            if len(self.tdoa_idx) != 0:
                self.errTDOA = delete(self.errTDOA,0,0)
            # version boite recursive       
            # 
            ######################### CLA TOTALE
            cla.merge2()
            cla.refine(cla.Nc)
            self.cla = cla
            ### DoubleListRefine version
            cla.estpos2()
            pe1=cla.pe
            rgpatimeb=time.time()
            self.time_compute['RGPA'].append(rgpatimeb-rgpatimea)


            self.pe.append(pe1)
            errli.append(np.sqrt(np.dot(pe1[:2]-pbn[:2],pe1[:2]-pbn[:2])))


            #print len(parmsc['l_connect'])
            if len(parmsc['l_connect']) > 4 : # pour ne pas calculer 2fois les cas non hybrides

                if len(nonzero(np.array(parmsc['l_connect'])=='RSS')[0]) != 0:
                    for i in range(4):
                        clarss.c[i].Id=i
                    clarss.merge2()
                    clarss.refine(clarss.Nc)
                    clarss.estpos2()
                    clarss.bn=bn[ibn]
                    self.clarss=clarss
                    self.perss=clarss.pe
                    errli.append(np.sqrt(np.dot(self.perss[:2]-pbn[:2],self.perss[:2]-pbn[:2])))


                if len(nonzero(np.array(parmsc['l_connect'])=='TOA')[0]) != 0:
                    for i in range(4):
                        clatoa.c[i].Id=i
                    clatoa.merge2()
                    clatoa.refine(clatoa.Nc)
                    clatoa.estpos2()
                    clatoa  .bn=bn[ibn]
                    self.clatoa=clatoa
                    self.petoa=clatoa.pe
                    errli.append(np.sqrt(np.dot(self.petoa[:2]-pbn[:2],self.petoa[:2]-pbn[:2])))

            
                if len(nonzero(np.array(parmsc['l_connect'])=='TDOA')[0]) != 0:
                    for i in range(3):
                        clatdoa.c[i].Id=i
                    clatdoa.merge2()
                    clatdoa.refine(clatdoa.Nc)
                    clatdoa.estpos2()
                    clatdoa.bn=bn[ibn]
                    self.clatdoa=clatdoa
                    self.petdoa=clatdoa.pe
                    errli.append(np.sqrt(np.dot(self.petdoa[:2]-pbn[:2],self.petdoa[:2]-pbn[:2])))



            #print errli
            err1=min(errli)
            #print err1
            self.err1  = np.hstack((self.err1,err1))    

            #self.err2  = np.hstack((self.err2,err2))       
            

            #if err >3:
            #       pdb.set_trace()

            if self.parmsc['algebraic']:

                if algehyb==1:
                    self.parmsc['Constrain_Type']='hybrid'

                algetimea=time.time()
                p_LS    = self.algebraic_compute(atv)
                algetimeb=time.time()

                self.time_compute['algebraic'].append(algetimeb-algetimea)


                if self.parmsc['save_pe']:
                    self.p_LS.append(p_LS)
                if self.parmsc['Constrain_Type'] != 'hybrid':
                    errLS   = np.sqrt(np.dot(p_LS[:2]-pbn[:2],p_LS[:2]-pbn[:2]))    

                #elif self.parmsc['Algebraic_method'] == 'CRB': 
                #       errLS = np.sqrt(self.CRB)
    
                else :
                    
                    errLS   = np.sqrt(np.dot(p_LS[:2]-pbn[:2],p_LS[:2]-pbn[:2]))        
                self.errLS  = np.hstack((self.errLS,errLS))     

            if errli > errLS:
                print 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnn\n',errli,'\n',errLS
Example #11
0
    def TWLSHDFLocate(self, RN_RSS, RN_ToA, RN_TDoA, RN_TDoA2, ToA, ToAStd,
                      TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest):
        """
        This applies LS approximation to get position P.
        Return P
        """
        c = 3e08
        RSSL = RSSLocation(RN_RSS)
        if RN_RSS == None:
            # for ToA
            shRN_ToA = shape(RN_ToA)
            RNnum_ToA = shRN_ToA[1]

            RN_ToA2 = (sum(RN_ToA * RN_ToA, axis=0)).reshape(RNnum_ToA, 1)
            RoA = c * ToA
            RoAStd = c * ToAStd
            RoA2 = (RoA * RoA).reshape(RNnum_ToA, 1)
            K_ToA = RN_ToA2[1:RNnum_ToA, :] - RN_ToA2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_ToA, :]

            A_ToA = hstack(
                (RN_ToA[:, 1:RNnum_ToA].T -
                 RN_ToA[:, 0].reshape(1, shRN_ToA[0]), zeros(
                     (RNnum_ToA - 1, 1))))
            C_ToA = RoAStd[1:RNnum_ToA, 0]**2

            # for TDoA
            shRN_TDoA = shape(RN_TDoA)
            RNnum_TDoA = shRN_TDoA[1]
            #RN_TDoA2= RN_ToA[:,0:1]*ones((1,RNnum_TDoA))
            RDoA = c * TDoA
            RDoAStd = c * TDoAStd
            RDoA2 = (RDoA * RDoA).reshape(RNnum_TDoA, 1)
            K_TDoA = (sum(
                (RN_TDoA - RN_TDoA2) *
                (RN_TDoA - RN_TDoA2), axis=0)).reshape(RNnum_TDoA, 1) - RDoA2
            A_TDoA = hstack((RN_TDoA.T - RN_TDoA2.T, 0.5 * RoA[0, 0] * RDoA))
            C_TDoA = RDoAStd[:, 0]**2
            # solution
            K = vstack((K_ToA, K_TDoA))
            A = vstack((A_ToA, A_TDoA))
            C = diag(hstack((C_ToA, C_TDoA)))
            A2 = dot(A.T, dot(linalg.inv(C), A))

            [U, S, V] = svd(A2)
            J = 1 / S
            rA = rank(A)
            m, n = shape(A)
            f = 0

            if log10(cond(A2)) >= max(
                    RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                     Rest)):
                f = f + 1
                for i in range(n - rA):
                    u = where(J == max(J))
                    J[u] = 0

            A2i = dot(dot(V.T, diag(J)), U.T)

            P = 0.5 * dot(A2i, dot(dot(A.T, linalg.inv(C)), K))

            return P[:2, :]

        elif RN_ToA == None:
            # for RSS
            shRN_RSS = shape(RN_RSS)
            RNnum_RSS = shRN_RSS[1]

            RN_RSS2 = (sum(RN_RSS * RN_RSS, axis=0)).reshape(RNnum_RSS, 1)
            RoA = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                Rest)  # RSS based Ranges (meters)
            RoAStd = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                      Rest)
            RoA2 = (RoA * RoA).reshape(RNnum_RSS, 1)
            K_RSS = RN_RSS2[1:RNnum_RSS, :] - RN_RSS2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_RSS, :]

            A_RSS = hstack(
                (RN_RSS[:, 1:RNnum_RSS].T -
                 RN_RSS[:, 0].reshape(1, shRN_RSS[0]), zeros(
                     (RNnum_RSS - 1, 1))))
            C_RSS = RoAStd[1:RNnum_RSS, 0]**2

            # for TDoA
            shRN_TDoA = shape(RN_TDoA)
            RNnum_TDoA = shRN_TDoA[1]
            #RN_TDoA2= RN_RSS[:,0:1]*ones((1,RNnum_TDoA))
            RDoA = c * TDoA
            RDoAStd = c * TDoAStd
            RDoA2 = (RDoA * RDoA).reshape(RNnum_TDoA, 1)
            K_TDoA = (sum(
                (RN_TDoA - RN_TDoA2) *
                (RN_TDoA - RN_TDoA2), axis=0)).reshape(RNnum_TDoA, 1) - RDoA2
            A_TDoA = hstack((RN_TDoA.T - RN_TDoA2.T, 0.5 * RoA[0, 0] * RDoA))
            C_TDoA = RDoAStd[:, 0]**2
            # solution
            K = vstack((K_RSS, K_TDoA))
            A = vstack((A_RSS, A_TDoA))
            C = diag(hstack((C_RSS, C_TDoA)))
            A2 = dot(A.T, dot(linalg.inv(C), A))

            [U, S, V] = svd(A2)
            J = 1 / S
            rA = rank(A)
            m, n = shape(A)
            f = 0

            if log10(cond(A2)) >= max(
                    RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                     Rest)):
                f = f + 1
                for i in range(n - rA):
                    u = where(J == max(J))
                    J[u] = 0

            A2i = dot(dot(V.T, diag(J)), U.T)

            P = 0.5 * dot(A2i, dot(dot(A.T, linalg.inv(C)), K))
            return P[:2, :]

        elif RN_TDoA == None:
            # for RSS
            shRN_RSS = shape(RN_RSS)
            RNnum_RSS = shRN_RSS[1]

            RN_RSS2 = (sum(RN_RSS * RN_RSS, axis=0)).reshape(RNnum_RSS, 1)
            RoA = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                Rest)  # RSS based Ranges (meters)
            RoAStd = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                      Rest)
            RoA2 = (RoA * RoA).reshape(RNnum_RSS, 1)
            K_RSS = RN_RSS2[1:RNnum_RSS, :] - RN_RSS2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_RSS, :]

            A_RSS = hstack(
                (RN_RSS[:, 1:RNnum_RSS].T -
                 RN_RSS[:, 0].reshape(1, shRN_RSS[0]), zeros(
                     (RNnum_RSS - 1, 1))))
            C_RSS = RoAStd[1:RNnum_RSS, 0]**2

            # for ToA
            shRN_ToA = shape(RN_ToA)
            RNnum_ToA = shRN_ToA[1]

            RN_ToA2 = (sum(RN_ToA * RN_ToA, axis=0)).reshape(RNnum_ToA, 1)
            RoA = c * ToA
            RoAStd = c * ToAStd
            RoA2 = (RoA * RoA).reshape(RNnum_ToA, 1)
            K_ToA = RN_ToA2[1:RNnum_ToA, :] - RN_ToA2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_ToA, :]

            A_ToA = hstack(
                (RN_ToA[:, 1:RNnum_ToA].T -
                 RN_ToA[:, 0].reshape(1, shRN_ToA[0]), zeros(
                     (RNnum_ToA - 1, 1))))
            C_ToA = RoAStd[1:RNnum_ToA, 0]**2
            # solution
            K = vstack((K_RSS, K_ToA))
            A = vstack((A_RSS, A_ToA))
            C = diag(hstack((C_RSS, C_ToA)))
            A2 = dot(A.T, dot(linalg.inv(C), A))

            [U, S, V] = svd(A2)
            J = 1 / S
            rA = rank(A)
            m, n = shape(A)
            f = 0

            if log10(cond(A2)) >= max(
                    RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                     Rest)):
                f = f + 1
                for i in range(n - rA):
                    u = where(J == max(J))
                    J[u] = 0

            A2i = dot(dot(V.T, diag(J)), U.T)

            P = 0.5 * dot(A2i, dot(dot(A.T, linalg.inv(C)), K))
            return P[:2, :]

        else:
            # for RSS
            shRN_RSS = shape(RN_RSS)
            RNnum_RSS = shRN_RSS[1]

            RN_RSS2 = (sum(RN_RSS * RN_RSS, axis=0)).reshape(RNnum_RSS, 1)
            RoA = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                Rest)  # RSS based Ranges (meters)
            RoAStd = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                      Rest)
            RoA2 = (RoA * RoA).reshape(RNnum_RSS, 1)
            K_RSS = RN_RSS2[1:RNnum_RSS, :] - RN_RSS2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_RSS, :]

            A_RSS = hstack(
                (RN_RSS[:, 1:RNnum_RSS].T -
                 RN_RSS[:, 0].reshape(1, shRN_RSS[0]), zeros(
                     (RNnum_RSS - 1, 1))))
            C_RSS = RoAStd[1:RNnum_RSS, 0]**2

            # for ToA
            shRN_ToA = shape(RN_ToA)
            RNnum_ToA = shRN_ToA[1]

            RN_ToA2 = (sum(RN_ToA * RN_ToA, axis=0)).reshape(RNnum_ToA, 1)
            RoA = c * ToA
            RoAStd = c * ToAStd
            RoA2 = (RoA * RoA).reshape(RNnum_ToA, 1)
            K_ToA = RN_ToA2[1:RNnum_ToA, :] - RN_ToA2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_ToA, :]

            A_ToA = hstack(
                (RN_ToA[:, 1:RNnum_ToA].T -
                 RN_ToA[:, 0].reshape(1, shRN_ToA[0]), zeros(
                     (RNnum_ToA - 1, 1))))
            C_ToA = RoAStd[1:RNnum_ToA, 0]**2
            # for TDoA
            shRN_TDoA = shape(RN_TDoA)
            RNnum_TDoA = shRN_TDoA[1]
            #RN_TDoA2= RN_TDoA[:,0:1]*ones((1,RNnum_TDoA))
            RDoA = c * TDoA
            RDoAStd = c * TDoAStd
            RDoA2 = (RDoA * RDoA).reshape(RNnum_TDoA, 1)
            K_TDoA = (sum(
                (RN_TDoA - RN_TDoA2) *
                (RN_TDoA - RN_TDoA2), axis=0)).reshape(RNnum_TDoA, 1) - RDoA2
            A_TDoA = hstack((RN_TDoA.T - RN_TDoA2.T, 0.5 * RoA[0, 0] * RDoA))
            C_TDoA = RDoAStd[:, 0]**2
            # solution
            K = vstack((vstack((K_RSS, K_ToA)), K_TDoA))
            A = vstack((vstack((A_RSS, A_ToA)), A_TDoA))
            C = diag(hstack((hstack((C_RSS, C_ToA)), C_TDoA)))
            A2 = dot(A.T, dot(linalg.inv(C), A))

            [U, S, V] = svd(A2)
            J = 1 / S
            rA = rank(A)
            m, n = shape(A)
            f = 0

            if log10(cond(A2)) >= max(
                    RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                     Rest)):
                f = f + 1
                for i in range(n - rA):
                    u = where(J == max(J))
                    J[u] = 0

            A2i = dot(dot(V.T, diag(J)), U.T)

            P = 0.5 * dot(A2i, dot(dot(A.T, linalg.inv(C)), K))
            return P[:2, :]
Example #12
0
    def WLSHDFLocate(self, RN_RSS, RN_ToA, RN_TDoA, RN_TDoA2, ToA, ToAStd,
                     TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest):
        """
        This applies LS approximation to get position P.
        Return P
        """
        c = 3e08
        RSSL = RSSLocation(RN_RSS)
        if RN_RSS == None:
            # for ToA
            shRN_ToA = shape(RN_ToA)
            RNnum_ToA = shRN_ToA[1]

            RN_ToA2 = (sum(RN_ToA * RN_ToA, axis=0)).reshape(RNnum_ToA, 1)
            RoA = c * ToA
            RoAStd = c * ToAStd
            RoA2 = (RoA * RoA).reshape(RNnum_ToA, 1)
            K_ToA = RN_ToA2[1:RNnum_ToA, :] - RN_ToA2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_ToA, :]

            A_ToA = hstack(
                (RN_ToA[:, 1:RNnum_ToA].T -
                 RN_ToA[:, 0].reshape(1, shRN_ToA[0]), zeros(
                     (RNnum_ToA - 1, 1))))
            C_ToA = RoAStd[1:RNnum_ToA, 0]**2
            # for TDoA
            shRN_TDoA = shape(RN_TDoA)
            RNnum_TDoA = shRN_TDoA[1]
            #RN_TDoA2= RN_ToA[:,0:1]*ones((1,RNnum_TDoA))
            RDoA = c * TDoA
            RDoAStd = c * TDoAStd
            RDoA2 = (RDoA * RDoA).reshape(RNnum_TDoA, 1)
            K_TDoA = (sum(
                (RN_TDoA - RN_TDoA2) *
                (RN_TDoA - RN_TDoA2), axis=0)).reshape(RNnum_TDoA, 1) - RDoA2
            A_TDoA = hstack((RN_TDoA.T - RN_TDoA2.T, 0.5 * RoA[0, 0] * RDoA))
            C_TDoA = RDoAStd[:, 0]**2
            # solution
            K = vstack((K_ToA, K_TDoA))
            A = vstack((A_ToA, A_TDoA))
            C = diag(hstack((C_ToA, C_TDoA)))
            P = 0.5 * dot(linalg.inv(dot(A.T, dot(linalg.inv(C), A))),
                          dot(dot(A.T, linalg.inv(C)), K))
            return P[:2, :]

        elif RN_ToA == None:
            # for RSS
            shRN_RSS = shape(RN_RSS)
            RNnum_RSS = shRN_RSS[1]

            RN_RSS2 = (sum(RN_RSS * RN_RSS, axis=0)).reshape(RNnum_RSS, 1)
            RoA = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                Rest)  # RSS based Ranges (meters)
            RoAStd = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                      Rest)
            RoA2 = (RoA * RoA).reshape(RNnum_RSS, 1)
            K_RSS = RN_RSS2[1:RNnum_RSS, :] - RN_RSS2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_RSS, :]

            A_RSS = hstack(
                (RN_RSS[:, 1:RNnum_RSS].T -
                 RN_RSS[:, 0].reshape(1, shRN_RSS[0]), zeros(
                     (RNnum_RSS - 1, 1))))
            C_RSS = RoAStd[1:RNnum_RSS, 0]**2
            # for TDoA
            shRN_TDoA = shape(RN_TDoA)
            RNnum_TDoA = shRN_TDoA[1]
            #RN_TDoA2= RN_RSS[:,0:1]*ones((1,RNnum_TDoA))
            RDoA = c * TDoA
            RDoAStd = c * TDoAStd
            RDoA2 = (RDoA * RDoA).reshape(RNnum_TDoA, 1)
            K_TDoA = (sum(
                (RN_TDoA - RN_TDoA2) *
                (RN_TDoA - RN_TDoA2), axis=0)).reshape(RNnum_TDoA, 1) - RDoA2
            A_TDoA = hstack((RN_TDoA.T - RN_TDoA2.T, 0.5 * RoA[0, 0] * RDoA))
            C_TDoA = RDoAStd[:, 0]**2
            # solution
            K = vstack((K_RSS, K_TDoA))
            A = vstack((A_RSS, A_TDoA))
            C = diag(hstack((C_RSS, C_TDoA)))
            P = 0.5 * dot(linalg.inv(dot(A.T, dot(linalg.inv(C), A))),
                          dot(dot(A.T, linalg.inv(C)), K))
            return P[:2, :]

        elif RN_TDoA == None:
            # for RSS
            shRN_RSS = shape(RN_RSS)
            RNnum_RSS = shRN_RSS[1]

            RN_RSS2 = (sum(RN_RSS * RN_RSS, axis=0)).reshape(RNnum_RSS, 1)
            RoA = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                Rest)  # RSS based Ranges (meters)
            RoAStd = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                      Rest)
            RoA2 = (RoA * RoA).reshape(RNnum_RSS, 1)
            K_RSS = RN_RSS2[1:RNnum_RSS, :] - RN_RSS2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_RSS, :]

            A_RSS = hstack(
                (RN_RSS[:, 1:RNnum_RSS].T -
                 RN_RSS[:, 0].reshape(1, shRN_RSS[0]), zeros(
                     (RNnum_RSS - 1, 1))))
            C_RSS = RoAStd[1:RNnum_RSS, 0]**2

            # for ToA
            shRN_ToA = shape(RN_ToA)
            RNnum_ToA = shRN_ToA[1]

            RN_ToA2 = (sum(RN_ToA * RN_ToA, axis=0)).reshape(RNnum_ToA, 1)
            RoA = c * ToA
            RoAStd = c * ToAStd
            RoA2 = (RoA * RoA).reshape(RNnum_ToA, 1)
            K_ToA = RN_ToA2[1:RNnum_ToA, :] - RN_ToA2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_ToA, :]

            A_ToA = hstack(
                (RN_ToA[:, 1:RNnum_ToA].T -
                 RN_ToA[:, 0].reshape(1, shRN_ToA[0]), zeros(
                     (RNnum_ToA - 1, 1))))
            C_ToA = RoAStd[1:RNnum_ToA, 0]**2
            # solution
            K = vstack((K_RSS, K_ToA))
            A = vstack((A_RSS, A_ToA))
            C = diag(hstack((C_RSS, C_ToA)))
            P = 0.5 * dot(linalg.inv(dot(A.T, dot(linalg.inv(C), A))),
                          dot(dot(A.T, linalg.inv(C)), K))
            return P

        else:
            # for RSS
            shRN_RSS = shape(RN_RSS)
            RNnum_RSS = shRN_RSS[1]

            RN_RSS2 = (sum(RN_RSS * RN_RSS, axis=0)).reshape(RNnum_RSS, 1)
            RoA = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                Rest)  # RSS based Ranges (meters)
            RoAStd = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd,
                                      Rest)
            RoA2 = (RoA * RoA).reshape(RNnum_RSS, 1)
            K_RSS = RN_RSS2[1:RNnum_RSS, :] - RN_RSS2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_RSS, :]

            A_RSS = hstack(
                (RN_RSS[:, 1:RNnum_RSS].T -
                 RN_RSS[:, 0].reshape(1, shRN_RSS[0]), zeros(
                     (RNnum_RSS - 1, 1))))
            C_RSS = RoAStd[1:RNnum_RSS, 0]**2

            # for ToA
            shRN_ToA = shape(RN_ToA)
            RNnum_ToA = shRN_ToA[1]

            RN_ToA2 = (sum(RN_ToA * RN_ToA, axis=0)).reshape(RNnum_ToA, 1)
            RoA = c * ToA
            RoAStd = c * ToAStd
            RoA2 = (RoA * RoA).reshape(RNnum_ToA, 1)
            K_ToA = RN_ToA2[1:RNnum_ToA, :] - RN_ToA2[0, 0] + RoA2[
                0, 0] - RoA2[1:RNnum_ToA, :]

            A_ToA = hstack(
                (RN_ToA[:, 1:RNnum_ToA].T -
                 RN_ToA[:, 0].reshape(1, shRN_ToA[0]), zeros(
                     (RNnum_ToA - 1, 1))))
            C_ToA = RoAStd[1:RNnum_ToA, 0]**2

            # for TDoA
            shRN_TDoA = shape(RN_TDoA)
            RNnum_TDoA = shRN_TDoA[1]
            #RN_TDoA2= RN_TDoA[:,0:1]*ones((1,RNnum_TDoA))
            RDoA = c * TDoA
            RDoAStd = c * TDoAStd
            RDoA2 = (RDoA * RDoA).reshape(RNnum_TDoA, 1)
            K_TDoA = (sum(
                (RN_TDoA - RN_TDoA2) *
                (RN_TDoA - RN_TDoA2), axis=0)).reshape(RNnum_TDoA, 1) - RDoA2
            A_TDoA = hstack((RN_TDoA.T - RN_TDoA2.T, 0.5 * RoA[0, 0] * RDoA))
            C_TDoA = RDoAStd[:, 0]**2
            # solution
            K = vstack((vstack((K_RSS, K_ToA)), K_TDoA))
            A = vstack((vstack((A_RSS, A_ToA)), A_TDoA))
            C = diag(hstack((hstack((C_RSS, C_ToA)), C_TDoA)))
            P = 0.5 * dot(linalg.inv(dot(A.T, dot(linalg.inv(C), A))),
                          dot(dot(A.T, linalg.inv(C)), K))
            return P[:2, :]
Example #13
0
File: RSS.py Project: niamiot/RGPA
class RSS(Constraint):	
	"""	RSS Constraint

	Description and evaluation of TOA constraints

	:Parameters:
		value	: float
			Constraint value in dB. Default = 40
		std	: float
			Value standard deviation in dB. default = 1.0
		vcw	: float
			scale factor. Default = 1.0
		model	: dictionnary
			keys:	self.model['PL0'] =-34.7
				self.model['d0']  = 1.0 
				self.model['RSSnp'] = 2.64	
				self.model['RSSStd'] = 4.34 
				self.model['Rest'] = 'mode'
		p	: np.array 1 x ndim
			constraint center
		
	:Attributes:

		range	: distance conversion from time self.value.
		sstd	: distance conversion from time self.std
		runable	: True NOT USED
		evaluated :False NOT USED		
		self.Id	: Constraint ID

		from annulus bound:
		min	: minimum value of observable
		max	: maximum value of observable
		mean	: mean value of observable


	:Methods:
		annulus_bound(self)	: Compute the minimum and maximum distance of the enclosing annulus of the constraint 
		rescale(self,vcw)	: rescale contraint boundary with a given scale factor 'vcw'
		inclusive(self,b)	: Is constraint center is inside a box ?
		valid(self,b)		: Test if Lbox is compatible with the constraint
		valid_v(self,lv)	: Test if a liste of a vertexes from a box is compatible with the constraint. vertexes are obtained thanks to LBoxN.bd2coordinates()
		estvol(self)		: Constraint Volume estimation 

	"""

	def __init__(self,value=40,std=1.0,vcw=3,model={},p=np.array([])):	
		Constraint.__init__(self,'RSS',p)

		self.Id     = copy.copy(self.C_Id)
		Constraint.C_Id = Constraint.C_Id+1   # constraint counter is incremented
		self.value  = value  # attennation (dB)
		if len(model)==0:
			self.model['PL0'] =-34.7
			self.model['d0']  = 1.0 
			self.model['RSSnp'] = 2.64
			self.model['RSSStd'] = 4.34 
			self.model['Rest'] = 'mode'
		else	:
			self.model  = model

		self.LOC = RSSLocation(p)
		self.std  = (self.LOC.getRangeStd(p, self.model['PL0'], self.model['d0'], self.value,self.model['RSSnp'], self.model['RSSStd'], self.model['Rest'])[0])/0.3
		self.range    = self.LOC.getRange(p, self.model['PL0'], self.model['d0'], self.value, self.model['RSSnp'], self.model['RSSStd'], self.model['Rest'])[0]
		self.sstd   = self.std*0.3
		self.rescale(vcw)
		self.runable = True
		self.evaluated = False
		self.annulus_bound()
		
	def annulus_bound(self):
		"""
		annulus_bound():
		Compute the minimum and maximum distance of the enclosing annulus of the constraint

		:Returns:
			Nothing but update cmin, cmax 
		"""
		self.cmin = max(0,self.range - self.vcw*self.sstd	)
		self.cmax = self.range + self.vcw*self.sstd	

  	def rescale(self,vcw):
		"""rescale bounds of the constraint with vcw factor
	
		:Parameters:
			vcw : float
				scale factor
		
		"""
		self.vcw = vcw
		dx          = self.range+(self.vcw*self.std)*0.3*np.ones(len(self.p))
		box         = BoxN(np.array([self.p-dx,self.p+dx]),ndim=len(self.p))

		self.lbox   = LBoxN([box])
		self.estvol()

	def inclusive(self,b):
		""" Is constraint center is inside a box ?
		:Parameters:
			b	: LBoxN

		:Returns:
			Boolean

		"""
		if b.inbox(self.p):
			return True
		else:
			return False

	

	def valid(self,b):
		"""check if a box is valid for the given constraint 

		:Parameters:
			b	: LBoxN

		:Return:
			True	: if box is enclosed
			False	: if the box is ambiguous
			'Out'	: if the box is out
		
		"""
		p0 = self.p
		v  = self.bd2coord(b)
		P  = np.outer(np.ones(len(v)),p0)
		D  = P-v
		DD = np.sqrt(np.sum(D*D,axis=1))

	        DDcmin = sum(DD>=cmin)
		DDcmax = sum(DD<=cmax)
	
		if DDcmin+DDcmax > 15:
			return(True)
		elif (DDcmin <1) | (DDcmax <1) :#(bmax<cmin)|(bmin>cmax): 

			return('out')			
		else :
			return(False)


	def valid_v(self,v):
		"""
		.. todo:
			update as TOA valid_v !!
		
		valid_v(v) : check if vertex are valid for the given constraint 
		
		A box is valid if it not not valid

		A box is not valid if all distances are greater than rangemax
			           or all distances are less than rangemin				
		"""
		p0 = self.p
		P  = np.outer(np.ones(len(v)),p0)
		D  = P-v
		DD = np.sqrt(np.sum(D*D,axis=1))
		DD2 = (DD>=self.cmin) & (DD<=self.cmax)
	        
		return DD2
	def estvol(self):
		""" Constraint Volume estimation 

		"""
		R2 = self.range+self.vcw*self.sstd
		R1 = self.range-self.vcw*self.sstd
		V2 = (4.*np.pi*R2**3)/3
		V1 = (4.*np.pi*R1**3)/3
		self.estvlm = V2-V1
Example #14
0
        def TWLSHDFLocate(self, RN_RSS, RN_ToA, RN_TDoA, RN_TDoA2, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest):
                """
                This applies LS approximation to get position P.
                Return P
                """
                c       = 3e08
                RSSL=RSSLocation(RN_RSS)
                if RN_RSS==None:
                        # for ToA
                        shRN_ToA    = shape(RN_ToA)
                        RNnum_ToA   = shRN_ToA[1]


                        RN_ToA2     = (sum(RN_ToA*RN_ToA,axis=0)).reshape(RNnum_ToA,1)
                        RoA     = c*ToA
                        RoAStd     = c*ToAStd
                        RoA2    = (RoA*RoA).reshape(RNnum_ToA,1)
                        K_ToA       = RN_ToA2[1:RNnum_ToA,:]-RN_ToA2[0,0] + RoA2[0,0]-RoA2[1:RNnum_ToA,:]

                        A_ToA       = hstack((RN_ToA[:,1:RNnum_ToA].T - RN_ToA[:,0].reshape(1,shRN_ToA[0]), zeros((RNnum_ToA-1,1))))
                        C_ToA       = RoAStd[1:RNnum_ToA,0]**2

                        # for TDoA
                        shRN_TDoA    = shape(RN_TDoA)
                        RNnum_TDoA   = shRN_TDoA[1]
                        #RN_TDoA2= RN_ToA[:,0:1]*ones((1,RNnum_TDoA))
                        RDoA    = c*TDoA
                        RDoAStd    = c*TDoAStd
                        RDoA2   = (RDoA*RDoA).reshape(RNnum_TDoA,1)
                        K_TDoA       = (sum((RN_TDoA-RN_TDoA2)*(RN_TDoA-RN_TDoA2),axis=0)).reshape(RNnum_TDoA,1)-RDoA2
                        A_TDoA       = hstack((RN_TDoA.T - RN_TDoA2.T,0.5*RoA[0,0]*RDoA))
                        C_TDoA       = RDoAStd[:,0]**2
                        # solution
                        K=vstack((K_ToA, K_TDoA))
                        A=vstack((A_ToA, A_TDoA))
                        C=diag(hstack((C_ToA, C_TDoA)))
                        A2   = dot(A.T,dot(linalg.inv(C),A))

                        [U,S,V]=svd(A2)
                        J = 1/S
                        rA=rank(A)
                        m,n=shape(A)
                        f=0

                        if log10(cond(A2))>=max(RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)):
                                f=f+1
                                for i in range(n-rA):
                                        u = where(J==max(J))
                                        J[u] = 0

                        A2i = dot(dot(V.T,diag(J)),U.T)

                        P       = 0.5*dot(A2i,dot(dot(A.T,linalg.inv(C)),K))

                        return P[:2,:]

                elif RN_ToA==None:
                        # for RSS
                        shRN_RSS    = shape(RN_RSS)
                        RNnum_RSS   = shRN_RSS[1]


                        RN_RSS2     = (sum(RN_RSS*RN_RSS,axis=0)).reshape(RNnum_RSS,1)
                        RoA         = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)        # RSS based Ranges (meters)
                        RoAStd      = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                        RoA2        = (RoA*RoA).reshape(RNnum_RSS,1)
                        K_RSS       = RN_RSS2[1:RNnum_RSS,:]-RN_RSS2[0,0] + RoA2[0,0]-RoA2[1:RNnum_RSS,:]

                        A_RSS       = hstack((RN_RSS[:,1:RNnum_RSS].T - RN_RSS[:,0].reshape(1,shRN_RSS[0]), zeros((RNnum_RSS-1,1))))
                        C_RSS       = RoAStd[1:RNnum_RSS,0]**2

                        # for TDoA
                        shRN_TDoA    = shape(RN_TDoA)
                        RNnum_TDoA   = shRN_TDoA[1]
                        #RN_TDoA2= RN_RSS[:,0:1]*ones((1,RNnum_TDoA))
                        RDoA    = c*TDoA
                        RDoAStd    = c*TDoAStd
                        RDoA2   = (RDoA*RDoA).reshape(RNnum_TDoA,1)
                        K_TDoA       = (sum((RN_TDoA-RN_TDoA2)*(RN_TDoA-RN_TDoA2),axis=0)).reshape(RNnum_TDoA,1)-RDoA2
                        A_TDoA       = hstack((RN_TDoA.T - RN_TDoA2.T,0.5*RoA[0,0]*RDoA))
                        C_TDoA       = RDoAStd[:,0]**2
                        # solution
                        K=vstack((K_RSS, K_TDoA))
                        A=vstack((A_RSS, A_TDoA))
                        C=diag(hstack((C_RSS, C_TDoA)))
                        A2   = dot(A.T,dot(linalg.inv(C),A))

                        [U,S,V]=svd(A2)
                        J = 1/S
                        rA=rank(A)
                        m,n=shape(A)
                        f=0

                        if log10(cond(A2))>=max(RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)):
                                f=f+1
                                for i in range(n-rA):
                                        u = where(J==max(J))
                                        J[u] = 0

                        A2i = dot(dot(V.T,diag(J)),U.T)

                        P       = 0.5*dot(A2i,dot(dot(A.T,linalg.inv(C)),K))
                        return P[:2,:]

                elif RN_TDoA==None:
                        # for RSS
                        shRN_RSS    = shape(RN_RSS)
                        RNnum_RSS   = shRN_RSS[1]


                        RN_RSS2     = (sum(RN_RSS*RN_RSS,axis=0)).reshape(RNnum_RSS,1)
                        RoA         = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)        # RSS based Ranges (meters)
                        RoAStd      = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                        RoA2        = (RoA*RoA).reshape(RNnum_RSS,1)
                        K_RSS       = RN_RSS2[1:RNnum_RSS,:]-RN_RSS2[0,0] + RoA2[0,0]-RoA2[1:RNnum_RSS,:]

                        A_RSS       = hstack((RN_RSS[:,1:RNnum_RSS].T - RN_RSS[:,0].reshape(1,shRN_RSS[0]), zeros((RNnum_RSS-1,1))))
                        C_RSS       = RoAStd[1:RNnum_RSS,0]**2

                        # for ToA
                        shRN_ToA    = shape(RN_ToA)
                        RNnum_ToA   = shRN_ToA[1]


                        RN_ToA2     = (sum(RN_ToA*RN_ToA,axis=0)).reshape(RNnum_ToA,1)
                        RoA     = c*ToA
                        RoAStd     = c*ToAStd
                        RoA2    = (RoA*RoA).reshape(RNnum_ToA,1)
                        K_ToA       = RN_ToA2[1:RNnum_ToA,:]-RN_ToA2[0,0] + RoA2[0,0]-RoA2[1:RNnum_ToA,:]

                        A_ToA       = hstack((RN_ToA[:,1:RNnum_ToA].T - RN_ToA[:,0].reshape(1,shRN_ToA[0]), zeros((RNnum_ToA-1,1))))
                        C_ToA       = RoAStd[1:RNnum_ToA,0]**2
                        # solution
                        K=vstack((K_RSS, K_ToA))
                        A=vstack((A_RSS, A_ToA))
                        C=diag(hstack((C_RSS, C_ToA)))
                        A2   = dot(A.T,dot(linalg.inv(C),A))

                        [U,S,V]=svd(A2)
                        J = 1/S
                        rA=rank(A)
                        m,n=shape(A)
                        f=0

                        if log10(cond(A2))>=max(RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)):
                                f=f+1
                                for i in range(n-rA):
                                        u = where(J==max(J))
                                        J[u] = 0

                        A2i = dot(dot(V.T,diag(J)),U.T)

                        P       = 0.5*dot(A2i,dot(dot(A.T,linalg.inv(C)),K))
                        return P[:2,:]

                else:
                        # for RSS
                        shRN_RSS    = shape(RN_RSS)
                        RNnum_RSS   = shRN_RSS[1]


                        RN_RSS2     = (sum(RN_RSS*RN_RSS,axis=0)).reshape(RNnum_RSS,1)
                        RoA         = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)        # RSS based Ranges (meters)
                        RoAStd      = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                        RoA2        = (RoA*RoA).reshape(RNnum_RSS,1)
                        K_RSS       = RN_RSS2[1:RNnum_RSS,:]-RN_RSS2[0,0] + RoA2[0,0]-RoA2[1:RNnum_RSS,:]

                        A_RSS       = hstack((RN_RSS[:,1:RNnum_RSS].T - RN_RSS[:,0].reshape(1,shRN_RSS[0]), zeros((RNnum_RSS-1,1))))
                        C_RSS       = RoAStd[1:RNnum_RSS,0]**2

                        # for ToA
                        shRN_ToA    = shape(RN_ToA)
                        RNnum_ToA   = shRN_ToA[1]


                        RN_ToA2     = (sum(RN_ToA*RN_ToA,axis=0)).reshape(RNnum_ToA,1)
                        RoA     = c*ToA
                        RoAStd     = c*ToAStd
                        RoA2    = (RoA*RoA).reshape(RNnum_ToA,1)
                        K_ToA       = RN_ToA2[1:RNnum_ToA,:]-RN_ToA2[0,0] + RoA2[0,0]-RoA2[1:RNnum_ToA,:]

                        A_ToA       = hstack((RN_ToA[:,1:RNnum_ToA].T - RN_ToA[:,0].reshape(1,shRN_ToA[0]), zeros((RNnum_ToA-1,1))))
                        C_ToA       = RoAStd[1:RNnum_ToA,0]**2
                        # for TDoA
                        shRN_TDoA    = shape(RN_TDoA)
                        RNnum_TDoA   = shRN_TDoA[1]
                        #RN_TDoA2= RN_TDoA[:,0:1]*ones((1,RNnum_TDoA))
                        RDoA    = c*TDoA
                        RDoAStd    = c*TDoAStd
                        RDoA2   = (RDoA*RDoA).reshape(RNnum_TDoA,1)
                        K_TDoA       = (sum((RN_TDoA-RN_TDoA2)*(RN_TDoA-RN_TDoA2),axis=0)).reshape(RNnum_TDoA,1)-RDoA2
                        A_TDoA       = hstack((RN_TDoA.T - RN_TDoA2.T,0.5*RoA[0,0]*RDoA))
                        C_TDoA       = RDoAStd[:,0]**2
                        # solution
                        K=vstack((vstack((K_RSS,K_ToA)), K_TDoA))
                        A=vstack((vstack((A_RSS,A_ToA)), A_TDoA))
                        C=diag(hstack((hstack((C_RSS,C_ToA)), C_TDoA)))
                        A2   = dot(A.T,dot(linalg.inv(C),A))

                        [U,S,V]=svd(A2)
                        J = 1/S
                        rA=rank(A)
                        m,n=shape(A)
                        f=0

                        if log10(cond(A2))>=max(RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)):
                                f=f+1
                                for i in range(n-rA):
                                        u = where(J==max(J))
                                        J[u] = 0

                        A2i = dot(dot(V.T,diag(J)),U.T)

                        P       = 0.5*dot(A2i,dot(dot(A.T,linalg.inv(C)),K))
                        return P[:2,:]
Example #15
0
        def WLSHDFLocate(self, RN_RSS, RN_ToA, RN_TDoA, RN_TDoA2, ToA, ToAStd, TDoA, TDoAStd, PL0, d0, RSS, RSSnp, RSSStd, Rest):
                """
                This applies LS approximation to get position P.
                Return P
                """
                c       = 3e08
                RSSL=RSSLocation(RN_RSS)
                if RN_RSS==None:
                        # for ToA
                        shRN_ToA    = shape(RN_ToA)
                        RNnum_ToA   = shRN_ToA[1]


                        RN_ToA2     = (sum(RN_ToA*RN_ToA,axis=0)).reshape(RNnum_ToA,1)
                        RoA     = c*ToA
                        RoAStd     = c*ToAStd
                        RoA2    = (RoA*RoA).reshape(RNnum_ToA,1)
                        K_ToA       = RN_ToA2[1:RNnum_ToA,:]-RN_ToA2[0,0] + RoA2[0,0]-RoA2[1:RNnum_ToA,:]

                        A_ToA       = hstack((RN_ToA[:,1:RNnum_ToA].T - RN_ToA[:,0].reshape(1,shRN_ToA[0]), zeros((RNnum_ToA-1,1))))
                        C_ToA       = RoAStd[1:RNnum_ToA,0]**2
                        # for TDoA
                        shRN_TDoA    = shape(RN_TDoA)
                        RNnum_TDoA   = shRN_TDoA[1]
                        #RN_TDoA2= RN_ToA[:,0:1]*ones((1,RNnum_TDoA))
                        RDoA    = c*TDoA
                        RDoAStd    = c*TDoAStd
                        RDoA2   = (RDoA*RDoA).reshape(RNnum_TDoA,1)
                        K_TDoA       = (sum((RN_TDoA-RN_TDoA2)*(RN_TDoA-RN_TDoA2),axis=0)).reshape(RNnum_TDoA,1)-RDoA2
                        A_TDoA       = hstack((RN_TDoA.T - RN_TDoA2.T,0.5*RoA[0,0]*RDoA))
                        C_TDoA       = RDoAStd[:,0]**2
                        # solution
                        K=vstack((K_ToA, K_TDoA))
                        A=vstack((A_ToA, A_TDoA))
                        C=diag(hstack((C_ToA, C_TDoA)))
                        P       = 0.5*dot(linalg.inv(dot(A.T,dot(linalg.inv(C),A))),dot(dot(A.T,linalg.inv(C)),K))
                        return P[:2,:]

                elif RN_ToA==None:
                        # for RSS
                        shRN_RSS    = shape(RN_RSS)
                        RNnum_RSS   = shRN_RSS[1]


                        RN_RSS2     = (sum(RN_RSS*RN_RSS,axis=0)).reshape(RNnum_RSS,1)
                        RoA         = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)        # RSS based Ranges (meters)
                        RoAStd      = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                        RoA2        = (RoA*RoA).reshape(RNnum_RSS,1)
                        K_RSS       = RN_RSS2[1:RNnum_RSS,:]-RN_RSS2[0,0] + RoA2[0,0]-RoA2[1:RNnum_RSS,:]

                        A_RSS       = hstack((RN_RSS[:,1:RNnum_RSS].T - RN_RSS[:,0].reshape(1,shRN_RSS[0]), zeros((RNnum_RSS-1,1))))
                        C_RSS       = RoAStd[1:RNnum_RSS,0]**2
                        # for TDoA
                        shRN_TDoA    = shape(RN_TDoA)
                        RNnum_TDoA   = shRN_TDoA[1]
                        #RN_TDoA2= RN_RSS[:,0:1]*ones((1,RNnum_TDoA))
                        RDoA    = c*TDoA
                        RDoAStd    = c*TDoAStd
                        RDoA2   = (RDoA*RDoA).reshape(RNnum_TDoA,1)
                        K_TDoA       = (sum((RN_TDoA-RN_TDoA2)*(RN_TDoA-RN_TDoA2),axis=0)).reshape(RNnum_TDoA,1)-RDoA2
                        A_TDoA       = hstack((RN_TDoA.T - RN_TDoA2.T,0.5*RoA[0,0]*RDoA))
                        C_TDoA       = RDoAStd[:,0]**2
                        # solution
                        K=vstack((K_RSS, K_TDoA))
                        A=vstack((A_RSS, A_TDoA))
                        C=diag(hstack((C_RSS, C_TDoA)))
                        P       = 0.5*dot(linalg.inv(dot(A.T,dot(linalg.inv(C),A))),dot(dot(A.T,linalg.inv(C)),K))
                        return P[:2,:]

                elif RN_TDoA==None:
                        # for RSS
                        shRN_RSS    = shape(RN_RSS)
                        RNnum_RSS   = shRN_RSS[1]


                        RN_RSS2     = (sum(RN_RSS*RN_RSS,axis=0)).reshape(RNnum_RSS,1)
                        RoA         = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)        # RSS based Ranges (meters)
                        RoAStd      = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                        RoA2        = (RoA*RoA).reshape(RNnum_RSS,1)
                        K_RSS       = RN_RSS2[1:RNnum_RSS,:]-RN_RSS2[0,0] + RoA2[0,0]-RoA2[1:RNnum_RSS,:]

                        A_RSS       = hstack((RN_RSS[:,1:RNnum_RSS].T - RN_RSS[:,0].reshape(1,shRN_RSS[0]), zeros((RNnum_RSS-1,1))))
                        C_RSS       = RoAStd[1:RNnum_RSS,0]**2

                        # for ToA
                        shRN_ToA    = shape(RN_ToA)
                        RNnum_ToA   = shRN_ToA[1]


                        RN_ToA2     = (sum(RN_ToA*RN_ToA,axis=0)).reshape(RNnum_ToA,1)
                        RoA     = c*ToA
                        RoAStd     = c*ToAStd
                        RoA2    = (RoA*RoA).reshape(RNnum_ToA,1)
                        K_ToA       = RN_ToA2[1:RNnum_ToA,:]-RN_ToA2[0,0] + RoA2[0,0]-RoA2[1:RNnum_ToA,:]

                        A_ToA       = hstack((RN_ToA[:,1:RNnum_ToA].T - RN_ToA[:,0].reshape(1,shRN_ToA[0]), zeros((RNnum_ToA-1,1))))
                        C_ToA       = RoAStd[1:RNnum_ToA,0]**2
                        # solution
                        K=vstack((K_RSS, K_ToA))
                        A=vstack((A_RSS, A_ToA))
                        C=diag(hstack((C_RSS, C_ToA)))
                        P       = 0.5*dot(linalg.inv(dot(A.T,dot(linalg.inv(C),A))),dot(dot(A.T,linalg.inv(C)),K))
                        return P

                else:
                        # for RSS
                        shRN_RSS    = shape(RN_RSS)
                        RNnum_RSS   = shRN_RSS[1]


                        RN_RSS2     = (sum(RN_RSS*RN_RSS,axis=0)).reshape(RNnum_RSS,1)
                        RoA         = RSSL.getRange(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)        # RSS based Ranges (meters)
                        RoAStd      = RSSL.getRangeStd(RN_RSS, PL0, d0, RSS, RSSnp, RSSStd, Rest)
                        RoA2        = (RoA*RoA).reshape(RNnum_RSS,1)
                        K_RSS       = RN_RSS2[1:RNnum_RSS,:]-RN_RSS2[0,0] + RoA2[0,0]-RoA2[1:RNnum_RSS,:]

                        A_RSS       = hstack((RN_RSS[:,1:RNnum_RSS].T - RN_RSS[:,0].reshape(1,shRN_RSS[0]), zeros((RNnum_RSS-1,1))))
                        C_RSS       = RoAStd[1:RNnum_RSS,0]**2

                        # for ToA
                        shRN_ToA    = shape(RN_ToA)
                        RNnum_ToA   = shRN_ToA[1]


                        RN_ToA2     = (sum(RN_ToA*RN_ToA,axis=0)).reshape(RNnum_ToA,1)
                        RoA         = c*ToA
                        RoAStd     = c*ToAStd
                        RoA2    = (RoA*RoA).reshape(RNnum_ToA,1)
                        K_ToA       = RN_ToA2[1:RNnum_ToA,:]-RN_ToA2[0,0] + RoA2[0,0]-RoA2[1:RNnum_ToA,:]

                        A_ToA       = hstack((RN_ToA[:,1:RNnum_ToA].T - RN_ToA[:,0].reshape(1,shRN_ToA[0]), zeros((RNnum_ToA-1,1))))
                        C_ToA       = RoAStd[1:RNnum_ToA,0]**2

                        # for TDoA
                        shRN_TDoA    = shape(RN_TDoA)
                        RNnum_TDoA   = shRN_TDoA[1]
                        #RN_TDoA2= RN_TDoA[:,0:1]*ones((1,RNnum_TDoA))
                        RDoA    = c*TDoA
                        RDoAStd    = c*TDoAStd
                        RDoA2   = (RDoA*RDoA).reshape(RNnum_TDoA,1)
                        K_TDoA       = (sum((RN_TDoA-RN_TDoA2)*(RN_TDoA-RN_TDoA2),axis=0)).reshape(RNnum_TDoA,1)-RDoA2
                        A_TDoA       = hstack((RN_TDoA.T - RN_TDoA2.T,0.5*RoA[0,0]*RDoA))
                        C_TDoA       = RDoAStd[:,0]**2
                        # solution
                        K=vstack((vstack((K_RSS,K_ToA)), K_TDoA))
                        A=vstack((vstack((A_RSS,A_ToA)), A_TDoA))
                        C=diag(hstack((hstack((C_RSS,C_ToA)), C_TDoA)))
                        P       = 0.5*dot(linalg.inv(dot(A.T,dot(linalg.inv(C),A))),dot(dot(A.T,linalg.inv(C)),K))
                        return P[:2,:]