# ORB-SLAM ALGORİTMASI Robotik ve bilgisayarlı görüde, eş zamanlı yerelleştirme ve haritalama (SLAM), robotların çevrelerinde gezinmelerini ve çevrelerini anlamalarını sağlayan temel bir sorundur. "Yönlendirilmiş hızlı ve Döndürülmüş kısa SLAM" veya kısaca ORB-SLAM, bu alanda öne çıkan bir yöntemdir. Modern görsel SLAM teknolojisi ORB-SLAM, gerçek zamanlı uygulamalardaki doğruluğu, verimliliği ve dayanıklılığıyla tanınmaktadır. Bu da , ORB-SLAM yöntemini ayrıntılı bir şekilde analiz ederek, temel unsurlarını ve sektördeki önemini vurgulamaktadır. ## SLAM nedir ? Eşzamanlı yerelleştirilmiş alan haritalama (SLAM) olarak bilinen bir hesaplama zorluğu, bir sistemin (örneğin bir robot veya cihaz) alışılmadık bir ortamı haritalarken aynı zamanda o ortam içindeki konumunu izlemesini gerektirir. Amaç, ortamı haritalamak ve cihazın konumunu harici konumlandırma sistemlerinden bağımsız olarak gerçek zamanlı olarak belirlemektir. ## ORB-SLAM'in Temelleri ORB-SLAM, gerçek zamanlı uygulamalardaki verimliliği ve doğruluğuyla bilinen, son teknoloji ürünü bir görsel Eşzamanlı Yerelleştirme ve Haritalama (SLAM) algoritmasıdır. ORB-SLAM, temel olarak, özellik tanıma ve tanımlama için Döndürülmüş BRIEF (ORB) ve Yönlendirilmiş FAST gibi önemli özelliklere dayanır. Süreç, FAST algoritmasının giriş fotoğraflarındaki benzersiz özellikleri belirlemesiyle başlar. Bu özellikler daha sonra, yönelim verileriyle zenginleştirilen ikili tanımlayıcı BRIEF tarafından daha da tanımlanır. ORB-SLAM, kameranın konumunu ve 3B yapısını birkaç özellikle tahmin ederek sistemi başlatmada oldukça başarılı bir performans sergiliyor ve bu da daha sonra izleme ve haritalama işlemlerini kolaylaştırıyor. Ardışık karelerdeki özellikleri eşleştirerek, kameranın pozunu sürekli olarak takip ederken çevredeki alanın dinamik bir 3B temsilini oluşturuyor ve iyileştiriyor. Yöntem, yörünge tahminindeki birikmiş hataları düzeltmek için döngü kapanması gibi sorunları özellikle ele alıyor ve bu da onu otonom araçlar, artırılmış gerçeklik ve robotik gibi çeşitli alanlarda esnek bir gerçek zamanlı navigasyon ve haritalama çözümü haline getiriyor. ## ORB-SLAM'in Temel Özellikleri #### Feature detection and description: Giriş görüntülerindeki ORB özelliklerini tanımlamak için FAST algoritması kullanılır ve sağlamlığı artırmak için bunların konumu belirlenir. Daha sonra temel unsurlar, resimdeki tekrar eden örüntüleri tanımlayan ikili bir kodla sonuçlanan BRIEF tanımlayıcısı kullanılarak tanımlanır. #### Initialization: ORB-SLAM, kameranın konumunu ve çevrenin 3 boyutlu yapısını tahmin etmek için sınırlı sayıda özellik kullanır ve bu sayede sistemi başlatır. Başlatma aşaması daha sonraki haritalama ve izleme için temel oluşturur. #### Tracking: ORB-SLAM, ardışık kareler arasında özellik eşleştirmesini kullanarak, takip aşamasında kameranın pozunu sürekli olarak takip eder. Sistem, tıkanıklıklar ve ışık değişimleri gibi engellerle başa çıkmak için güçlü bir izleme yöntemi kullanıyor. #### Maping: ORB-SLAM, gözlenen özellik uyumlarından 3 boyutlu noktaları üçgenleştirerek bir çevre haritası oluşturur ve iyileştirir. Keşif sırasında yeni bilgiler keşfedildiğinde harita dinamik olarak değişir. #### Loop closure ORB-SLAM, yörüngedeki kapalı döngülerin sorununu çözmek için daha önce ziyaret edilen noktaları bulur. Döngünün kapatılması algoritmanın yörünge tahminini iyileştirmesine ve haritayı ince ayar yapmasına olanak tanır. ![image](https://hackmd.io/_uploads/BkpDh-cdgx.png) Tüm bu bilgilerin ardından ORB algoritmasının daha detaylı incelenmesi gerektiğini düşünüyorum ki temel hiyerarşi yerine otursun . #### Neden ORB algoritmasına ihtiyacımız var ? ORB-SLAM algoritmasında ORB, algoritmanın "gözleri" gibidir. Kameranın gördüğü dünyayı anlamsız pikseller yığını olarak değil , üzerinde işlem yapabileceği anlamlı nirengi noktaları olarak görmesini sağlar. ## ORB Nasıl Çalışır ? ### STEP1: Öncelikle özelliklerin kabaca bir seçimini elde etmek için FAST detector'u çalıştırıyoruz. Sonra özelliklerin ardından Harris Corner kullanarak "n" keypointte daraltmak istiyoruz. #### Peki Harris Corner nedir ve nasıl daraltma yapıyor ? Harris Corner Detection algoritması, bir görüntüdeki köşeleri belirlemek için güçlü bir yöntemdir. Ancak, algoritmanın ham çıktısı genellikle tek bir köşe için birden fazla ve birbirine çok yakın pikselleri "köşe" olarak işaretler. Bu durum, istenmeyen bir yoğunluğa ve tekrara yol açar. "Daraltma" veya daha teknik terimlerle eşikleme (thresholding) ve maksimum olmayanları bastırma (non-maximum suppression), bu yoğunluğu azaltarak sadece en belirgin köşeleri seçme işlemidir. #### Harris Corner'ın Matematiği : ![R7UV0](https://hackmd.io/_uploads/SJrzGG9ueg.png) ##### 1) Değişimi Ölçmek: Bir (x,y) pikselinin köşe olup olmadığını anlamak için, bu pikselin etrafına küçük bir "pencere" (patch) yerleştirdiğimizi hayal edelim. Bu pencereyi çok küçük bir miktar (u,v) kadar kaydırdığımızda, pencere içindeki değişim ne kadar büyük olursa, o noktanın köşe olma ihtimali o kadar artar. Bu değişimi ölçmek için Karesel Farklar Toplamı (Sum of Squared Differences - SSD) formülünü kullanırız. Bu formül E(u,v) olarak gösterilir: ![Ekran Görüntüsü - 2025-08-13 16-28-01](https://hackmd.io/_uploads/Bkxxmfc_xe.png) ##### 2) Formülü Basitleştirmek (Taylor Açılımı) Yukarıdaki formülle her (u,v) kayması için hesaplama yapmak çok maliyetlidir. Bu yüzden küçük kaymalar için bir yaklaşıma gideriz. I (x+u,y+v) ifadesini birinci dereceden Taylor serisine açarak basitleştiririz: ![Ekran Görüntüsü - 2025-08-13 16-29-44](https://hackmd.io/_uploads/BkIIXfqOel.png) ##### 3) Harris Matrisini (M) Oluşturmak Yukarıdaki formülü açıp düzenlediğimizde, bunu bir matris formunda ifade edebiliriz: ![Ekran Görüntüsü - 2025-08-13 16-30-37](https://hackmd.io/_uploads/r1st7z9ugg.png) Buradaki M matrisi, Harris Köşe Tespit algoritmasının kalbidir. Bu matris, pencere (W) içindeki gradyan bilgilerini özetler: ![Ekran Görüntüsü - 2025-08-13 16-30-52](https://hackmd.io/_uploads/Hk9jmf5ugx.png) ##### 4) Matrisi Yorumlamak (Özdeğerler - Eigenvalues) M matrisinin bize ne söylediğini anlamak için özdeğerlerine (lambda_1 ve lambda_2) bakarız. Bu özdeğerler, E(u,v) fonksiyonunun temel eğriliklerini temsil eder ve bize gradyanların yapısı hakkında kritik bilgiler verir: 1) Düz Bölge (Flat Region): Pencere düz bir alandaysa, I_x ve I_y gradyanları neredeyse sıfırdır. Bu durumda M matrisinin elemanları çok küçük olur. Sonuç olarak, her iki özdeğer de (lambda_1 ve lambda_2) çok küçüktür. 2) Kenar (Edge): Pencere bir kenar üzerindeyse, kenara dik yönde büyük bir gradyan, kenar boyunca ise küçük bir gradyan olur. Bu durumda özdeğerlerden biri (lambda_1) büyük, diğeri (lambda_2) ise çok küçük olur. 3) Köşe (Corner): Pencere bir köşe üzerindeyse, her yönde büyük gradyanlar mevcuttur. Bu, hem I_x'in hem de I_y'nin önemli değerler aldığı anlamına gelir. Sonuç olarak, her iki özdeğer de (lambda_1 ve lambda_2) büyüktür. ##### 5) Köşe Yanıt Fonksiyonu ("R") Özdeğerleri doğrudan hesaplamak hala biraz maliyetli olabilir. Harris ve Stephens, özdeğerleri hesaplamadan onların doğasını yansıtan daha basit bir "köşesellik" skoru olan R'yi önermişlerdir: ![Ekran Görüntüsü - 2025-08-13 16-36-01](https://hackmd.io/_uploads/Bk0TVzqueg.png) ##### Sonuç: Algoritma,görüntünün her pikseli için bi "R" skorunu hesaplar. Son olarak belirli bir eşik değerinden büyük "R" sahip pikseller köşe adayı olarak belirlenir. Maksimum Olmayanların Bastırılması (Non-maximum Suppression) uygulanarak, bir köşe etrafındaki adaylar arasından en yüksek R skoruna sahip olan tek bir piksel köşe olarak seçilir. ##### Eşikleme (Thresholding) Harris algoritması, her piksel için bir "köşe olasılık puanı" (genellikle R değeri olarak adlandırılır) hesaplar. Bu puan, o pikselin köşe olma olasılığının bir ölçüsüdür. Eşikleme, bu puanları kullanarak zayıf köşe adaylarını elemektir. Basit bir eşikleme yönteminde, önceden belirlenmiş bir eşik değerinin (T) altındaki tüm köşe puanları sıfırlanır. Yani, bir pikselin köşe puanı bu eşik değerinden düşükse, artık bir köşe olarak kabul edilmez. Daha yaygın ve etkili bir yaklaşım ise, en yüksek köşe puanının belirli bir yüzdesini eşik olarak kullanmaktır. Örneğin, görüntüdeki en yüksek R değerinin %1'inden daha düşük puana sahip tüm pikselleri eleyebilirsiniz. Bu, görüntünün genel parlaklık ve kontrastından bağımsız olarak daha tutarlı sonuçlar verir. ![Ekran Görüntüsü - 2025-08-13 16-14-30](https://hackmd.io/_uploads/BJzpkGcdxg.png) ##### Maksimum Olmayanları Bastırma (Non-Maximum Suppression) Eşikleme işleminden sonra bile, birbirine çok yakın komşu piksellerin hepsi hala "köşe" olarak işaretlenmiş olabilir. Maksimum olmayanları bastırma, yerel bir bölgedeki (örneğin 3x3 veya 5x5'lik bir pencere) en güçlü köşe dışındaki tüm diğer köşe adaylarını ortadan kaldırır. Bu işlemi ise 3 adımda tamamlar. Bu adımlar: 1. Köşe puanı (R değeri) eşiğin üzerinde olan her bir piksel için, bu pikselin etrafındaki komşu piksellerin köşe puanları kontrol edilir. 2. Eğer incelenen pikselin köşe puanı, kendi komşuluk alanındaki tüm diğer piksellerin köşe puanlarından daha yüksekse (yani yerel bir maksimum ise), bu piksel bir köşe olarak korunur. 3. Eğer komşuluğunda kendisinden daha yüksek bir köşe puanına sahip başka bir piksel varsa, bu piksel bir köşe olarak kabul edilmez ve elenir. Bu işlem, köşe olarak işaretlenen piksellerin görüntü üzerinde daha seyrek ve belirgin bir şekilde dağılmasını sağlar. Sonuç olarak, her bir köşe bölgesi için yalnızca tek ve en güçlü piksel köşe olarak kalır. ![image-17](https://hackmd.io/_uploads/H1Z6gzqugx.png) ÖRNEK ### STEP 2 Orientation by Intensity Centroid (yoğunluğa göre yönelim) Baktığımız alanın momentlerini hesaplamak , merkez noktalarını bulmak ve o alanın açısını bulmak istiyoruz. ![image](https://hackmd.io/_uploads/ByBFSz9_eg.png) (1) Buradaki anda x,y ile ve X VE Y yönündeki yoğunluk değerlerinin çarpımı ile momenti tanımlanır. (2) Ve ağırlık merkezi sadece hesapladığımız farklı momentlerin oranıdır. (3) m01, m10 bileşenlerinin tanjantı açıyı verir. Atan2 arktanjtanlı arktanjanttır. ### STEP 3 Rotation of BRIEF Buradaki fikir BRIEF'i kullanarak özellik tanımlayıcısını elde etmek. (Feature detection) elde etmek. Yüksek varyansa ve 0.5'e yakın ortalamaya sahip özellikleri bulup benzersiz özellikleri bulmak için GREEDY algoritmasını çalıştırmaktayız. ![image](https://hackmd.io/_uploads/SkmMvGqOee.png) GREEDY algoritması nasıl çalışır ? Huffman ağacındaki en son düğümleri oluşturacak olan bütün semboller frekanslarına göre küçükten büyüğe doğru sıralanırlar. En küçük frekansa sahip olan iki sembol frekansları toplanarak yeni bir düğüm oluşur. Oluşturulan bu yeni düğüm var olan düğümler arasına uygun bir yere yerleştirilir. Bu dağıtım frekansına göre küçüklüğe veya büyüklüğe göredir.(https://emanetemre.medium.com/a%C3%A7g%C3%B6zl%C3%BC-greedy-algoritmalar-97ecd4ebf01e ) ![image](https://hackmd.io/_uploads/SyXiwMqueg.png) Özelliği tanımlayacak X ve Y değerlerine sahip olacak. Olması gereken yere kadar döndürme işlemi devam ettirilir. ### Step 4 Matching En yakın komşu aramasını yaklaşık olarak hesaplamak için LSH kullanırız. Buradaki fikir, benzer öğeleri yüksek olasılıkla aynı kovalarda, benzer olmayan öğeler için ise aynı kovalarda gruplandırmaktır. ![image](https://hackmd.io/_uploads/SJTyOM5uxg.png) ![image](https://hackmd.io/_uploads/H18euf5dle.png) Hamming Distance ayrıca iki tanımlayıcı arasındaki, özellikle iki ikili tanımlayıcı arasındaki uzaklığı karşılaştrımak için de kullanılır. ![image](https://hackmd.io/_uploads/B1Sfdzquge.png) (Binary) Bu noktaya kadar ORB'un çalışma mantığını inceledik. Peki ORB-SLAM ne yapıyor, nasıl çalışıyor ? Buna bakalım. ## ORB-SLAM Algoritması Nasıl Çalışır ? Daha önceki yazılarımızda ORB'un nasıl çalıştığından bahsetmiştik. Şimdi ise sırada ORB-SLAM algoritmasında neler oluyor ORB ne yapıyor bunlara değinecek ve kafamızda en ufak bile soru işareti kalmadan kapsamlı inceleyeceğiz. ORB = Oriented FAST + Rotated BRIEF Adım adım inceleyelim: ### Özelliklerin Tespiti (Feature Detection-FAST) FAST (Features from Accelerated Segment Test), bir görüntüdeki "köşeleri" çok hızlı bir şekilde bulan bir algoritmadır. Bir pikselin köşe olup olmadığını anlamak için etrafındaki 16 piksellik bir çemberi inceler. Eğer bu çember üzerinde belirli bir sayıda ardışık piksel, merkez pikselden anlamlı derecede daha parlak veya daha karanlıksa(yoğunluk), orayı bir köşe adayı olarak işaretler. Adından da anlaşılacağı gibi, son derece hızlıdır. Sorun: FAST, köşeyi bulur ama köşenin "yönünü" (orientation) bilmez. Yani bir L şeklindeki köşe ile aynı köşe 90 derece dönmüş hali arasında ayrım yapamaz. ![image](https://hackmd.io/_uploads/SJkNqfqulx.png) ### Özellik Tanımlama (Feature Description) - BRIEF: BRIEF (Binary Robust Independent Elementary Features), tespit edilen bir özelliğin etrafındaki bir görüntü parçasını (patch) alıp onu benzersiz bir "parmak izine" dönüştürür. Bunu, o parça içindeki rastgele seçilmiş piksel çiftlerinin parlaklıklarını(yoğunluklarını) karşılaştırarak yapar. Örneğin, "1. çiftte A pikseli B'den parlak mı? (Evet -> 1)", "2. çiftte C pikseli D'den parlak mı? (Hayır -> 0)" gibi sorular sorar. Bu soruların cevaplarından oluşan 256 veya 512 bitlik bir binary (0 ve 1'lerden oluşan) dizi oluşturur. Bu dizi, o özelliğin "tanımlayıcısı" (descriptor) olur. Sorun: BRIEF de rotasyona karşı hassastır. Kamera biraz döndüğünde, tanımlayıcı tamamen değişir ve algoritma aynı noktayı tanıyamaz. ![image](https://hackmd.io/_uploads/B1tGm4jdlg.png) Merkezdeki nokta, FAST SIFT veya SURF gibi bir özellik tespit algoritması tarafından görüntüde bulunan keypoint'in kendisidir. BRIEF, özellikleri tespit etmez daha önceden tespit edilmiş özellikler için bir tanımlayıcı oluşturur. Dairesel alan bu keypointlerin etrafındaki image patch'dir. BRIEF, tnaımlayıcıyı bu patch içerisindeki pikselleri kullanarak hesaplar. Mavi nokta çiftleri; bunlar görüntü yaması içinde önceden belirlenmiş veya rastgele seçilmiş piksel çiftleridir. BRIEF algoritmasının temel çalışma prensibi bu çiftlere dayanır. ![image](https://hackmd.io/_uploads/SkcGSNjOgl.png) Yukarıdaki uydu görüntüsünün keypointleri tespit edilmiş ve mavi kara ile gösterilmiştir. Bu mavi karadeki pikseller büyütülerek Grid (ızgara) halinde gösteriliyor. İçindeki sayılar, her bir pikselin parlaklık değeridir. (0-255 arası). Ortadaki kırmızı kare ise bu bölgenin merkezindeki "keypointler" i temsil eder. Amaç, bu kırmızı nokta ile temsil edilen bölge için onun diğerlerinden ayırt edecek benzersiz bir kod, yani "dijital parmak izi" (buna da descriptor denir) oluşturmaktır.Ayrıca yukarıdaki BRIEF'ler için bir parantez açıcak olursak; #### Orginal BRIEF: Bu en temel yöntemdir. Izgara içinden tamamen rastgele bir şekilde piksel çiftleri seçer. Daha sonra bu çiftlerin parlaklık değerlerini karşılaştırır. 1 pikseli, A2 pikselinden daha mı parlak?". Eğer cevap "evet" ise 1, "hayır" ise 0 olarak bir bit üretir. Bu işlemi yüzlerce farklı rastgele çift için tekrarlayarak 1011001... gibi uzun bir ikili (binary) kod dizisi oluşturur. İşte bu dizi, o noktanın "parmak izi" yani tanımlayıcısıdır. Sorun ise piksel çiftlerinin tamamen rastgele seçilmesi, her zaman en iyi sonucu vermez. Özellikle gürültüye ve görüntüdeki dönmelere karşı hassas olabilir. #### BRIEF improved in ORB (ORB Algoritmasında Geliştirilmiş BRIEF) ORB (Oriented FAST and Rotated BRIEF), Orijinal BRIEF'i geliştiren çok popüler bir algoritmadır. ORB, piksel çiftlerini tamamen rastgele seçmek yerine, makine öğrenmesi kullanarak "iyi" sonuç veren belirli bir piksel çifti desenei (pattern) öğrenir. Bu pattern, genellikle merkeze daha yakın ve birbiriyle daha az ilişkili noktalardan oluşur. Yukarıdaki görselde A ve B çiftlerinin merkeze daha yakın kümelendiğini görmekteyiz. #### BRIEF improved in our method Yazarlar, piksel çiftlerini (C1-C2 gibi) seçmek için ne rastgele ne de ORB'deki gibi sabit bir desene bağlı kalıyorlar. Bunun yerine, görselde de görüldüğü gibi, merkeze farklı uzaklıklarda ve farklı yönlerde, daha sistematik ve yapılandırılmış bir şekilde çiftler seçiyorlar. İddiaları: Bu yeni seçim stratejisinin, hem yakın mesafedeki ince detayları hem de uzak mesafedeki genel yapıyı daha iyi yakaladığını iddia ediyorlar. Bu sayede, kendi yöntemleriyle oluşturulan "parmak izinin" hem ORB'den hem de Orijinal BRIEF'ten daha ayırt edici ve güvenilir olduğunu öne sürüyorlar. ### ORB'un Çözümü (Oriented FAST + Rotated BRIEF) FAST ve BRIEF'in problemlerinden bahsetmiştik. Şimdi ise sıra ORB'un bize çözüm yolu olarak sunduğu imkanlar. ORB, bu iki yöntemin en iyi yanlarını birleştirir ve zayıflıklarını giderir. Peki bunu nasıl yapıyor ? 1. Önce FAST ile hızlıca potansiyel köşeleri bulur . 2. Sonra her köşe için bir yön (orientation) hesaplar.Bu hesabı, köşenin görüntü parçasının "yoğunluk merkezini" (intensity centroid) bularak yapar. Köşenin merkezinden bu yoğunluk merkezine çizilen vektör, özelliğin ana yönünü verir. 3. Son olarak, BRIEF tanımlayıcısını oluştururken kullandığı piksel çifti desenini, az önce hesapladığı yöne göre döndürür. Sonuç: Bu sayede kamera döndüğünde bile, özellik yönü de döner, BRIEF deseni de onunla birlikte döner ve sonuçta ortaya çıkan binary tanımlayıcı (parmak izi) büyük ölçüde aynı kalır. Bu, ORB'yi rotasyona karşı dayanıklı (rotation-invariant) ve çok verimli hale getirir. ## ORB-SLAM'in Mimarisi - Üç Paralel İş Parçacığı Bu bölümde daha önce ORB-SLAM'in temelleri başlığı altında değindiklerimizi temel yapı taşlarına kadar ineceğiz. Bazı noktalar tekrar edecek olsa da burada artık kafamızda soru işareti kalmayacak şekilde her noktaya değineceğiz. ORB-SLAM'in en parlak yanlarından biri, tüm süreci üç ana iş parçacığına (thread) ayırmasıdır. Bu iş parçacıkları eş zamanlı olarak çalışarak sistemi çok verimli ve gerçek zamanlı hale getirir. ![applsci-12-07780-g001](https://hackmd.io/_uploads/SJxjrBjule.png) ### 1.Takip (Tracking): Bu, sistemin "ön cephesidir" ve her yeni kamera karesi için çalışır. Görevi, kameranın anlık pozunu (Tw,c​ - dünyadaki konumu ve yönelimi) tahmin etmektir. #### 1.1 ORB Özelliklerini Çıkar: Gelen yeni görüntü karesinden ORB özellikleri (noktalar ve tanımlayıcıları) çıkarır. #### 1.2 Poz Tahmini: Bir önceki karedeki harita noktalarıyla yeni karedeki ORB özellikleri eşleştirilir. Bu eşleşmeler kullanılarak kameranın bir önceki kareye göre ne kadar hareket ettiği (rotasyon ve öteleme) hesaplanır. Bu hesaplama için genellikle "Motion-only Bundle Adjustment" veya PnP (Perspective-n-Point) gibi optimizasyon teknikleri kullanılır. #### Motion-only Bundle Adjustment Nedir? En basit tanımıyla Motion-only Bundle Adjustment (Sadece Harekete Yönelik Demet Ayarlaması), 3D haritası sabit kabul edilen bir ortamda, yalnızca kameranın pozisyonunu ve yönünü (yani hareketini) en iyi şekilde optimize etme işlemidir. Bu işlemler iki ana temele dayanır. ![unnamed](https://hackmd.io/_uploads/r1W8iHjOll.png) ##### Bundle Adjustment: Normalde bu işlem, bir sahnenin hem 3D harita noktalarını (örneğin odadaki köşeler, masanın kenarları) hem de bu noktaları gören kameranın tüm geçmiş pozisyonlarını aynı anda hassas bir şekilde ayarlayarak genel hatayı en aza indirir. Bu, çok maliyetli ama çok doğru sonuç veren bir işlemdir. ##### Motion-only (Sadece Hareket) : Bazen, özellikle gerçek zamanlı sistemlerde, elimizde zaten oldukça iyi bir 3D harita vardır ve bu haritanın doğru olduğunu varsayarız. Bu durumda, haritanın tamamını yeniden hesaplamak yerine, sadece yeni gelen görüntüye bakarak "Şu anki kameram bu haritaya göre tam olarak nerede duruyor?" sorusunu cevaplamak isteriz. İşte Motion-only BA tam burada devreye girer ve 3D harita noktalarını sabit tutar ve sadece kameranın o anki pozisyonunu ve yönünü, görüntüdeki noktalarla haritadaki noktalar arasındaki "yeniden izdüşüm hatasını" (reprojection error) minimize edecek şekilde optimize eder. Bu, tam bir Bundle Adjustment'a göre çok daha hızlıdır. Kısaca özetleyecek olursak linizdeki bir şehir haritasına (sabit 3D harita) bakarak kendi konumunuzu (kamera pozisyonu) GPS sinyallerine göre en hassas şekilde belirlemeye benzer. Haritayı değiştirmezsiniz, sadece harita üzerindeki yerinizi güncellersiniz. ORB ile ilişkisinde ise ORB görüntüler arasında eşleştirme yapabilmek için "neyi" takip edeceğimizi söyler, Motion-only Bundle Adjustment ise ORB'un sağladığı bu eşleşmeleri kullanarak kameranın "nerede" olduğunu en hassas şekilde hesaplar. Yani, ORB olmadan Motion-only BA'nın optimize edeceği bir eşleşme verisi olmazdı. Motion-only BA olmadan da ORB ile bulunan eşleşmelerden elde edilen kamera pozisyonu yeterince hassas olmazdı. Biri veri üretir, diğeri o veriyi kullanarak iyileştirme yapar. #### PnP (Perspective-n-Point) Nedir? Bu kavram, bir önceki sorudaki Motion-only Bundle Adjustment'ın hemen öncesinde yer alan çok önemli bir adımdır. ![pnp](https://hackmd.io/_uploads/ryoForsOge.jpg) Kısaca PnP, 3 boyutlu uzaydaki koordinatlarını bildiğimiz n tane noktanın, bir kameranın 2 boyutlu görüntüsündeki izdüşümlerine bakarak o kameranın 3D uzaydaki pozisyonunu ve yönünü (duruşunu/pozunu) hesaplama problemidir. Bu kavramı için bir analoji yapacak olursak: Kendinizi bir odada düşünün. Odadaki üç farklı nesnenin (örn. priz, kapı kolu, avize) tam koordinatlarını bir kağıda yazdınız. Sonra elinizdeki telefonla odanın bir fotoğrafını çektiniz. İşte PnP, bu üç nesnenin fotoğrafta göründüğü yerlere bakarak, sizin fotoğrafı çekerken odanın tam olarak neresinde durduğunuzu ve telefonu ne yöne çevirdiğinizi matematiksel olarak hesaplar. ORB ile ilişkisi ise çok doğrudandır. ORB, PnP algoritmasının çalışması için gereken temel veriyi sağlar. PnP'nin girdilerinden olan "3D dünya noktaları" ile "karşılık gelen 2D görüntü noktaları" arasındaki eşleşmeyi ORB sayesinde yaparız. Özetle ORB "Kim Kimdir ?" sorusunu cevaplar. Yani, görüntüdeki piksellerin haritadaki hangi 3D noktalara ait olduğunu eşleştirir.PnP; ORB'un yaptığı eşleştirmeyi kullanarak ,"Peki ben neredeyim ? " sorusunu cevaplar. Yani bu eşleşmelere dayanarak kameranın pozisyonunu hesaplar. #### 1.3 KeyFrame Kararı : Algoritma her kareyi haritaya eklemez. Çünkü bunun çok verimsiz olacağı aşikar. Sadece "önemli" kareleri, yani KeyFrames'leri seçer. Bir karenin KeyFrame olup olmadığına nasıl karar verir ? Bu sorunun cevabı ise: - Son KeyFrame'den bu yana yeterince mesafe katedildi mi ? (Paralaks etkisi) ![C0463481-Parallax_measurement_of_distance,_illustration](https://hackmd.io/_uploads/Sk7Aprj_lx.jpg) - Takip edilen nokta sayısı belirli bir eşiğin altına düştü mü ? - Haritalama iş parçacığı meşgul değil mi ? #### 1.4 KeyFrame'i Gönder: Eğer mevcut kare bir KeyFrame olarak seçilirse, tüm bilgileriyle (poz, ORB özellikleri vb.) Haritalama (Local Mapping) iş parçacığına gönderilir. ### 2.Yerel Haritalama (Local Mapping) Bu iş parçacığı, takip modülünden gelen Anahtar Kareleri işleyerek haritayı oluşturur ve iyileştirir. Bu işlemleri ise 4 adımda tamamlar. #### 2.1 KeyFrame'i Ekle: Gelen yeni KeyFrame'leri haritaya ekler. Bu KeyFrame'lerin gördüğü noktları (MapPoints) ve diğer KeyFramelere olan bağlantılarını günceller. #### 2.2 Yeni Harita Noktaları Oluştur: Komşu KeyFrame'de eşleşen ORB özelliklerini kullanarak yeni 3D harita noktalarını oluşturur. (üçgenleme- triangulation)![sensors-24-05964-g002-550](https://hackmd.io/_uploads/H13zm8iOgx.jpg) #### 2.3 Yerel Paket Ayarlanması (Local Bundle Adjustment- BA): Bu adımdan aslında detaylıca bahsetmiştik.Ama yinede konu bütünlüğü bakımından burada tekrar yer vermek istedim.Bu adım haritalamanın en kritik adımıdır. Algoritma yeni eklenen KeyFrame'leri ve onunla ortak noktalara sahip komşu KeyFrame'leri bir "pencere" içine alır. Bu pencere KeyFrame'lerin pozlarını ve 3D harita noktalarının konumlarını, yeniden izdüşüm hatasını (reprojection error) minimize edecek şekilde optimize eder. ##### Yeniden İzdüşüm Hatası (Reprojection Error) Nedir ? Bir 3D harita noktasının, bir Anahtar Karenin pozuna göre 2D görüntü düzleminde olması beklenen yer ile gerçekte tespit edildiği yer arasındaki piksel cinsinden mesafedir. BA, bu hataların toplamını en aza indirmeye çalışarak hem 3D nokta konumlarını hem de kamera pozlarını daha tutarlı hale getirir. ![indir](https://hackmd.io/_uploads/H1kMLIsdxg.png) #### Gereksizleri Ayıkla (Culling): Haritanın verimli kalması için, yetersiz gözlemlenen veya hatalı olduğu düşünülen 3D noktaları ve gereksiz hale gelen KeyFrame'leri siler. ![Three-types-of-visibility-culling-techniques-1-View-Frustum-Culling-2-back-face](https://hackmd.io/_uploads/H1lDBIUidxx.png) ## ORB-SLAM Versiyonları: ORB-SLAM (2015): Sadece tek kamera (monocular) ile çalışır. ORB-SLAM2 (2017): Monocular, stereo ve RGB-D kameraları destekleyerek ölçek belirsizliği sorununu büyük ölçüde çözer ve daha hassas haritalar oluşturur. ORB-SLAM3 (2021): En güncel versiyondur. Önceki versiyonların yeteneklerine ek olarak, ataletsel ölçüm birimlerinden (IMU - ivmeölçer ve jiroskop) gelen verileri de kullanarak çok daha zorlu senaryolarda (hızlı hareket, dokusuz yüzeyler) bile çok daha sağlam çalışır. Buna Visual-Inertial SLAM denir. ## Özet ve Sonuç: ### ORB-SLAM'in Başarısının Sırları: 1- Yüksek Verimlilik: Çok hızlı olan ORB özelliklerini kullanır. 2- Gerçek Zamanlı Performans: İşlemleri üç paralel iş parçacığına bölerek, yoğun hesaplama gerektiren haritalama ve optimizasyon adımlarını, anlık kamera takibini engellemeden arka planda yürütür. 3- Sağlam Döngü Kapatma: Bag of Words ve geometrik doğrulama ile uzun süreli çalışmalarda biriken hataları mükemmel bir şekilde düzeltir. 4- Açık Kaynak ve Popülerlik: Kodunun açık kaynak olması, geniş bir topluluk tarafından kullanılmasına, test edilmesine ve geliştirilmesine olanak tanımıştır. ### ORB-SLAM'in Zayıf Yönleri: 1- Dokuya Bağımlılık: Görsel bir SLAM olduğu için, beyaz duvarlar veya desensiz zeminler gibi dokusuz ortamlarda özellik bulmakta zorlanır ve performansı düşer. 2- Aydınlatma Değişimleri: Ani ve şiddetli aydınlatma değişiklikleri, ORB tanımlayıcılarının tutarlılığını bozabilir. 3- Dinamik Ortamlar: Haritanın statik (hareketsiz) olduğu varsayımına dayanır. Ortamdaki hareketli insanlar veya nesneler, algoritma için gürültü oluşturur. ## Kapanış Umarım ki bu detaylı anlatım, ORB-SLAM'in teorik temellerinin ve pratik işleyişini anlamanıza yardımcı olmuştur. Pek çok konudaki Türkçe kaynak yetersizliği maalesef bu konuda da benzer bir yaklaşım sergilediği için bu anlatımı sizlere sunmak istedim. Bu, robotik ve arttırılmış gerçeklik gibi birçok modern teknolojinin temelini oluşturan büyüleyici algoritmayı size anlatmak benim için çok keyifliydi. Saygılarımla ... Ömer Meriç TUNCA