Ana içeriğe geç

Ek Teori

Görüş Hedefleri

FRC oyun tasarımcıları genellikle sahada stratejik konumlara yansıtıcı "görüş hedefleri" yerleştirir. Bu görüş hedefleri genellikle retro-yansıtıcı banttan yapılmıştır. Önemli skor elementlerinin genellikle otomatik nişan almak için kullanılabilecek görüş hedefleri vardır. Aşağıda 2016 ve 2017 FRC oyunlarından görüş hedeflerine iki örnek görebilirsiniz.

Görüş Hedefi Örnekleri

Bu retro-yansıtıcı görüş hedeflerinin çok kullanışlı bir özelliği vardır: üzerlerine ışık tutulduğunda, ışığı doğrudan kaynağına geri yansıtırlar. Bu yüzden Limelight'ın kamera lensinin etrafında parlak yeşil LED'ler bulunur. Hedefe parlak yeşil ışık yayarken kamera pozlamasını çok düşük tutarak, çoğunlukla siyah ve parlak yeşil görüş hedefinden oluşan bir görüntü elde edebiliriz. Bu, hedefi yakalamayı göreceli olarak kolaylaştırır.

Burada ideal görüntünün bir örneğini görebilirsiniz. Düşük pozlama ayarı nedeniyle görüntüdeki neredeyse tüm detayların kaybolduğunu, ancak retro-yansıtıcı bandın parlak bir şekilde öne çıktığını fark edin.

Görüş Hedefi Örneği 2


Eşikleme

Eşikleme, çoğu FRC görüş takip algoritmasının bir sonraki kritik bileşenidir. Bir görüntü alıp belirli bir renk aralığında olmayan pikselleri atmak anlamına gelir. Eşiklemenin sonucu genellikle bir pikselin "açık" veya "kapalı" olduğu tek boyutlu bir görüntüdür. Eşikleme, yukarıdaki strateji kullanılarak yakalanan görüntülerde (düşük pozlama, çok karanlık görüntü ve parlak aydınlatılmış görüş hedefi) çok iyi çalışır.

Limelight, eşiklemeyi HSV (Ton-Doygunluk-Değer) renk uzayında yapar. Renkleri RGB (Kırmızı-Yeşil-Mavi) renk uzayında düşünmeye alışkın olabilirsiniz. HSV, kartezyen koordinatlar veya kutupsal koordinatların konumları tanımlamak için kullanılabilmesi gibi, rengi temsil etmenin başka bir yoludur. HSV renk uzayını kullanmamızın nedeni, Ton'un Limelight'ın LED'lerinin çıkardığı yeşil rengi çok hassas bir şekilde seçmek için kullanılabilmesidir.

HSV Görüntüsü

Görüntüden mümkün olduğunca çok şeyi elemek için eşikleme ayarlarınızı düzenlemeniz çok önemlidir. En iyi sonuçları, görüş hattınızın her aşamasını bir sonraki aşamaya geçmeden önce optimize ederseniz alırsınız. Aşağıdaki görüntü, uygun olmayan ve uygun eşikleme arasındaki farkı göstermektedir:

Eşikleme Örneği

Bazen arena tavan ışıkları veya pencereler gibi şeyleri eşikleme kullanarak görüntüden çıkarmak zor olabilir, bu da bizi bir sonraki aşamaya getirir.


Kontur Filtreleme

Eşiklemeden sonra, Limelight'ın görüş hattı görüntü için bir dizi kontur oluşturur. Kontur, bitişik piksel kümesini çevreleyen bir eğridir. Bazen tavan ışıkları, arena skor panoları, pencereler ve diğer şeyler eşikleme adımını geçebilir. İşte burada kontur filtreleme işe yarar. Amaç, ilgilendiğimiz hedef olmadığını bildiğimiz konturları elemektir.

İlk ve en kolay kontur filtresi, görüş hedefimizin skor mesafesinden göründüğünden daha küçük olan konturları görmezden gelmektir. Bu boyuttan daha küçük olan her şey açıkça daha uzaktaki bir şeydir ve görmezden gelinmelidir. Buna alan filtreleme denir.

FRC görüş hedefleri genellikle konturları filtrelemek için kullanılabilecek geometrik bir özelliğe sahiptir. Örneğin, görüş hedefi geniş bir en-boy oranına sahipse, geniş olmayan konturları filtreleyebiliriz:

Hedef

Ancak, kameranızın hedefe garip bir açıdan bakıyor olabileceğini unutmayın. Bu, konturunun en-boy oranını önemli ölçüde etkileyebilir. Çok agresif filtreleme yapmadığınızdan ve görüş hedefini görmezden gelmediğinizden emin olmak için ayarlarınızı çeşitli açılardan test ettiğinizden emin olun!

Hedef

Bu sonraki görüş hedefi çok ilginç. FRC'deki en iyi tasarlanmış görüş hedeflerinden biridir (bizim görüşümüze göre). Limelight otomatik olarak bir konturun doluluk değerini hesaplar. Doluluk, konturun piksel alanının dışbükey alanına oranıdır. Bu özel şeklin çok düşük bir doluluğu vardır ve neredeyse hiçbir tavan ışığında, pencerede vb. bu kadar düşük doluluk görmezsiniz. Bu nedenle, görüş hedefiniz buna benziyorsa istenmeyen konturları çok etkili bir şekilde filtreleyebilirsiniz.

Hedef

Limelight'ın konturları filtrelemek için birçok seçeneği vardır. Bu seçenekleri, takip etmeye çalıştığınız belirli görüş hedefinin geometrik özellikleri hakkında bildiklerinizle birlikte kullanabilirsiniz.

Şu anda, birden fazla kontur filtreleme seçeneklerinizden geçerse, en büyük kontur seçilir. Ek olarak, hat histerezis kullanarak konturlara "kilitlenmeyi" tercih eder. Bu, benzer hedefler arasında titreşimi önlemeye yardımcı olan bir özelliktir.

Piksellerden Açılara

Görüş hattının son sonucu, görüntüdeki en iyi konturun piksel konumudur. Çoğu oyun için, konturun merkezine nişan almamız yeterlidir. Bazen üst-merkeze veya başka bir noktaya nişan almak da faydalı olabilir, ancak temel olarak nişan almak istediğimiz yerin piksel koordinatına sahibiz. Bu hedefe olan açıları hesaplamak için biraz trigonometri kullanmamız gerekiyor.

İlk olarak mükemmel bir "iğne deliği" kameraya sahip olduğumuzu varsayıyoruz. Pratikte bu gerçekten çok uzak olabilir ancak limelight'ın kamerası buna çok yakındır. (Balık gözü lens, karşı örnek olarak bu idealden çok uzak olurdu.)

Limelight kamerasının 54 derecelik yatay görüş alanı ve 41 derecelik dikey görüş alanı vardır. Görüntüleri 320x240 çözünürlükte yakalar. Görüntünün merkezinin kameranın optik ekseni olduğunu varsayıyoruz (yani bu konum için x ve y açıları 0,0'dır). Bu bilinen değerleri kullanarak, görüntüdeki herhangi bir piksel için açıları hesaplamak için biraz trigonometri kullanabiliriz.

Aşağıdaki diyagram, açıları hesaplamak istediğimiz örnek bir hedef noktasını göstermektedir. Piksel koordinatları görüntünün sol üst köşesinden başlar ve sağa ve aşağı doğru pozitiftir.

Piksellerden Açılara

İlk adımımız, piksel koordinatlarını 0,0'ın görüntünün merkezi olduğu ve 1.0 olan normalize edilmiş 2D koordinatlara dönüştürmek olacaktır:

(px, py) = piksel koordinatları, 0,0 sol üstte, aşağı ve sağa doğru pozitif

(nx, ny) = normalize edilmiş piksel koordinatları, 0,0 merkezde, sağa ve yukarı pozitif

nx = (1/160) * (px - 159.5)

ny = (1/120) * (119.5 - py)

Sonra hayali bir görüş düzlemi tanımlayıp boyutunu hesaplıyoruz. Basitlik için, bu düzlemi kamera konumunun 1.0 birim önüne yerleştirmeyi seçebiliriz. İşte kameraya yukarıdan bakan bir görünüm. Amacımız, daha sonra açıları hesaplamak için kullanılacak olan görüş düzlemi genişliğini ve yüksekliğini hesaplamaktır:

Piksellerden Açı Normalize Koordinatları

1.0 birimlik bir mesafe ve bilinen yatay ve dikey görüş alanı verildiğinde, görüş düzlemi dikdörtgeninin boyutunu aşağıdaki formüllerle hesaplayabiliriz:

vpw = 2.0*tan(horizontal_fov/2)

vph = 2.0*tan(vertical_fov/2)

Bu iki değeri kullanarak, basit bir çarpma ile normalize edilmiş piksel koordinatları ile görüş düzlemi koordinatları arasında dönüşüm yapabiliriz.

x = vpw/2 * nx;

y = vph/2 * ny;

Görüş düzlemimizi 1.0 mesafede konumlandırmayı seçtiğimizi unutmayın. Şimdi hedef noktaya olan açıları hesaplamak için ihtiyacımız olan her şeye sahibiz.

Piksellerden Açı Hesaplama

tan(ax) = x / 1

tan(ay) = y / 1

ax = atan2(x, 1)

ay = atan2(y, 1)