N nokta için trilatrasyon algoritması


27

T1, T2, T3, T4, T5, .., Tn'nin R ve kesişen noktaların merkezcilden kesiştiği şekilden, A sentroidini (yani ağırlık merkezi, geometrik merkez, kütle merkezi) hesaplayabilen bir algoritma bulmalıyım . bu rakamın en uzak köşesi

Aşağıdaki bilgiler verilmiştir:

  • T1 Enlem = 56.999883 Boylam = 24.144473 Yarıçap = 943
  • T2 Enlem = 57.005352 Boylam = 24.151168 Yarıçap = 857
  • T3 Enlem = 57.005352 Boylam = 24.163356 Yarıçap = 714
  • T4 Enlem = 56.999042 Boylam = 24.168506 Yarıçap = 714
  • T5 Enlem = 56.994226 Boylam = 24.15709 Yarıçap = 771

Sonuç şöyle görünmeli: A Enlem = XX.divenX Boylam = XX.divenX Yarıçapı = XX

görüntü tanımını buraya girin

Muhtemelen zaten düşündüğünüz gibi, en yakın Wifi Erişim Noktaları veya Mobil Baz istasyonları ile cihazın yerini bulabilen bir yazılım üzerinde çalışıyorum, erişim noktalarının veya baz istasyonlarının sayısı değişebileceğinden, belirsiz puan miktarına uyum sağlayabilecek bir algoritmaya ihtiyacım var .

Burada ve burada benzer bazı sorular var , ancak hiçbiri sorumu tam olarak cevaplamıyor.


hangi dilde çalışıyorsun
WolfOdrade

Çoğunlukla PHP, biraz JavaScript. Sanırım bunu daha önce söylemeliydim ama bir web geliştiricisiyim ve Whuber'in cevabını anlamak için bir matematikçi bulmam gerekecek.
Kerlis Baumanis

Yarıçaplar göreceli sinyal güçlerinden kaynaklanıyor mu?
Kirk Kuykendall

Evet! Aslında yarıçaplar dBm
Kārlis Baumanis

1
@Reddox, kısmen - Sunucu tarafında matica kullanarak php_exec () ile hesaplamayı başardım.
Kerlis Baumanis

Yanıtlar:


29

Yarıçap ölçümleri kesinlikle bir hataya maruz kalır. Hata miktarının yarıçapın kendisiyle orantılı olmasını beklerdim. Ölçümlerin aksi takdirde tarafsız olduğunu varsayalım. Makul bir çözüm daha sonra , kare yarıçap ile ters orantılı ağırlıklar ile, ağırlıksız doğrusal olmayan en küçük kareler kullanır .

Bu, (diğer şeylerin yanı sıra) Python R, Mathematica ve pek çok tam özellikli istatistik paketinde bulunan standart şeylerdir , bu yüzden onu açıklayacağım. Burada, cihaz konumunu çevreleyen beş rastgele erişim noktasına göreceli olarak% 10 hatayla mesafeleri ölçerek elde edilen bazı veriler:

Veri tablosu

Mathematica, sadece bir kod satırına ihtiyaç duyar ve uygunluğu hesaplamak için ölçülebilir bir CPU zamanı gerektirmez:

fit = NonlinearModelFit[data, Norm[{x, y} - {x0, y0}], {x0, y0}, {x, y}, Weights -> 1/observations^2]

Düzenle--

Daha büyük çaplar için, daha kesin (küresel veya elipsoidal) çözeltiler, yalnızca Öklid mesafesini Norm[{x, y} - {x0, y0}]küresel veya elipsoidal mesafeyi hesaplayan bir fonksiyonla değiştirerek bulunabilir . In Mathematica bu yapılabilir, örneğin , üzeri

fit = NonlinearModelFit[data, GeoDistance[{x, y}, {x0, y0}], {x0, y0}, {x, y}, 
        Weights -> 1/observations^2]

- düzenleme sonu

Bunun gibi bir istatistiksel tekniği kullanmanın bir avantajı, parametreler (cihazın koordinatları olan) ve hatta cihaz konumu için eşzamanlı bir güven elipsi için güven aralıkları üretebilmesidir.

ellipsoid = fit["ParameterConfidenceRegion", ConfidenceLevel -> 0.95];
fit["ParameterConfidenceIntervalTable", ConfidenceLevel -> 0.95]

Güven aralığı tablosu

Verileri ve çözümü çizmek öğreticidir:

Graphics[{Opacity[0.2], EdgeForm[Opacity[0.75]], White, Disk[Most[#], Last[#]] & /@ data, 
  Opacity[1], Red, ellipsoid, 
  PointSize[0.0125], Blue, Point[source], Red, Point[solution],
  PointSize[0.0083], White, Point @ points}, 
  Background -> Black, ImageSize -> 600]

harita

  • Beyaz noktalar (bilinen) erişim noktası konumlarıdır.

  • Büyük mavi nokta gerçek cihaz konumudur.

  • Gri daireler ölçülen yarıçapları temsil eder. İdeal olarak, hepsi gerçek cihazın bulunduğu yerde kesişiyorlardı - ama açıkçası, ölçüm hatası nedeniyle yoklar.

  • Büyük kırmızı nokta, tahmini cihaz konumudur.

  • Kırmızı elips cihazın yeri için% 95 güven bölgesini sınırlar.

Bu durumda elipsin şekli ilgi çekicidir: konumsal belirsizlik NW-SE hattı boyunca en fazladır. Burada, üç erişim noktasına (NE ve SW'ye) olan mesafeler çok az değişiyor ve diğer iki erişim noktasına (kuzey ve güneydoğuya) olan mesafeler arasında hatalar çıkıyor.

(Bazı fonksiyonlarda olabilirlik fonksiyonunun konturu olarak daha kesin bir güven bölgesi elde edilebilir; bu elips böyle bir kontura yalnızca ikinci dereceden bir yaklaşımdır.)

Yarıçaplar hatasız olarak ölçüldüğünde, tüm daireler en az bir karşılıklı kavşak noktasına sahip olacak ve - eğer bu nokta benzersizse - bu benzersiz bir çözüm olacaktır.

Bu yöntem iki veya daha fazla erişim noktasıyla çalışır. Güven aralıklarını elde etmek için üç veya daha fazla gereklidir. Sadece ikisi mevcut olduğunda, kesişme noktalarından birini bulur (eğer varsa); aksi takdirde, iki erişim noktası arasında uygun bir yer seçer.


3
Aferin Bill!

1
@Reddox Prensip olarak, evet: herhangi bir turing-komple dil tam anlamıyla herhangi bir hesaplama yapabilir. Ancak PHP, herhangi birinin hedef dil olarak seçtiği listeden çok daha düşük bir seviyede olacaktır. PHP kılavuzu bile şöyle itiraf ediyor: "PHP, grafiksel bir kullanıcı arayüzüne sahip bir masaüstü uygulaması oluşturmak için muhtemelen en iyi dil değildir, ancak PHP'yi çok iyi tanıyorsanız ve müşteri tarafında bazı gelişmiş PHP özelliklerini kullanmak istiyorsanız uygulamaları bu tür programlar yazmak için PHP-GTK da kullanabilirsiniz. "
whuber

1
@Reddox Bağlantı için teşekkür ederiz. Geometri hesaplamalarını nasıl sağladığını görüyorum. Bu durumda, bunlara gerçekten ihtiyaç duyulmuyor: bu tür tek hesaplama, Pisagor teoreminin karelerin kök toplamları (mesafelerdeki Normkodlar) olarak mesafeler elde etmek için uygulanmasıdır . Tüm çalışmalar ağırlıklı doğrusal olmayan en küçük karelere uyuyor, ancak GEOS kütüphanesinin bu yeteneği sağladığını sanmıyorum. Muhtemelen GEOS, doğru elipsoidal mesafelere ihtiyaç duyulduğunda biraz yardımcı olabilir.
whuber

2
Bunu doğru okuyorsam, @BenR, bu kare yarıçapları ile orantılı olarak veri ağırlıklandırma ziyade gibi görünüyor ters onlara orantılı. Eğer ne olur bölmek tarafından square(data[2])onun tarafından çarpılarak yerine?
whuber


1

Bu durumda, her daire diğer tüm daireleri keser ve böylece kesişme noktalarını şu şekilde belirleyebiliriz:

İlk önce tüm n * (n-1) kavşak noktalarını belirleyin. Bu kesişme noktası kümesini I olarak adlandırın . En içteki noktaları içeren T noktalarının bir listesini yapın . Daha sonra, her bir nokta için p de I olmadığını kontrol s , her daire içinde yer almaktadır. Eğer p her dairenin içindeyse, bu en içteki kesişme noktasındadır. Böyle bir noktaya T listesine ekleyin .

Şimdi istediğiniz kesişme koordinatlarına sahipsiniz. Konumu tahmin etmenin en az iki yolunu düşünebilirim:

  1. Sadece T'nin oluşturduğu poligonun centroidini (ağırlık olarak kullanma mesafesi?) Hesaplayın ve centroid istenen konumdur.
  2. Her T noktasını içeren minimum daireyi hesaplayın . Sonra bu dairenin merkezi istenen konumdur. Bundan sonra R'nin hesaplanması basit olmalıdır.

Başka bir not: önce boş alan yolu modelini (veya varyasyonlarını) kullanarak sinyal gücünü mesafeye dönüştürün. Benim almam: herhangi bir eğitim veri setine sahipseniz, sabit değer olarak n = 2 veya n = 2.2 kullanmak yerine bazı öğrenme tekniklerini kullanarak yol kaybı üssünü bulmaya çalışmalısınız.


T ... "en içteki noktalar" - 5 düğümüm varsa .. kaç tane "en içteki nokta" kontrol etmeliyim?
ewizard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.