ARKit: BodyTracking ile Hareket Algılama
ARKit kullanarak kendi robot klonunuzu yaratın!
Evet doğru duydunuz. Bugünkü makalemizde ARKit kullanarak kendimizi taklit eden bir robot yapacağız. 🤖
Apple, ilk olarak “ARBodyTrackingConfiguration” özelliğini ARKit 3'ü ile birlikte WWDC19'da duyurdu. Bununla birlikte de ARKit’te insanları ve hareketlerini algılama olayını yapılabileceğini göstermiş oldu.
Bu makale, ARKit’i derinlemesinden incelemektedir. Bu nedenle yeni başlayanlar için tavsiye edilmez. ARKit’e yeniyseniz ARKit’in temellerini anlattığımız makaleyi okumanızı tavsiye ederiz! 😊
ARBodyTrackingConfiguration: İnsan vücutları algılamak için kullanılır. Apple, bu özelliği aslında tüm nesnelere kullanmak üzere çıkarmıştır ancak bu makalede, ARBodyTrackingConfiguration
özelliğinin insan vücudu algılamasını baz alacağız.
ARBodyTrackingConfiguration
, insanların hareketlerini algılamakta kullanılır. Belirli bir anatomik yapılanma vardır ve kameradan algılanan insana göre bu anatomik yapıyı uyarlar. Yazılımın belirlediği eklem yerleri, kameradan görülen insanın eklem yerleri ile eşleştirilir. Böylece insanın hareketi algılanılabilir.
Bilmeniz gereken özellikler:
1. ARBodyTrackingConfiguration tek bir insan üzerinde işlem yapar. 💃
2. Arkada çalışan yazılım makine öğrenmesi ile çalışır ve iskelet ve pozisyonu barındırır.
3. Yazılım her frame’de kendini günceller. Yani sürekli çalışır ve dış dünyadan durmadan veri alır. Bu şekilde saniye farkıyla hareket tespitleri yapılabilir.
ARBodyTrackingConfiguration ile Uygulama Geliştirme
Xcode’dan yeni bir AR uygulaması oluşturalım. Uygulamanızı kodlamaya başlamadan önce tüm kütüphanelerin “import” edildiğinden emin olun.
import UIKit
import RealityKit
import ARKit
import Combine
Uygulamanızın yapması gereken üç tane temel olay vardır:
- İnsanı algılamak. 🏄♀️
- Yanına bir robot eklemek. 🤖
- Robotu insanın hareketleri ile senkronize etmek. 🦾
Teker teker tüm olayları kodlamanız gerekir. Öncelikle uygulamanızda kullanmak istediğiniz robotu tanımlamanız gerekecektir. Bunu “ViewController” sınıfınızın içine aşağıdaki kodu yazarak yapabilirsiniz.
var character: BodyTrackedEntity?
Şuan karakteriniz tam olarak nerede scene’inizin tam ortasında duracaktır. Ancak taklit edilecek insanı kapatmaması için biraz daha yanında durması gerekir. Bunu aşağıdaki kodu yazarak yapabilirsiniz.
let characterOffset: SIMD3<Float> = [-1.0, 0, 0]
Son olarak da robotu scene’e bir obje olarak ekleyebilmek için anchor’ını yaratmanız gerekecektir. 👾
let characterAnchor = AnchorEntity()
Not: Anchor’un ne olduğunu daha iyi anlayabilmek için bu konu hakkındaki makalemize göz atabilirsiniz:
Şimdi ise karakterinizi sizin hareketlerinizle senkronize edecek şekilde scene’inize eklemeniz gerekecektir. Bunu yapmak için öncellikle karakterinizi olduğu dosyadan çıkartıp koda eklemeniz gerekir. 🦿
var cancellable: AnyCancellable? = nil
cancellable = Entity.loadBodyTrackedAsync(named: "character/robot").sink(
receiveCompletion: { completion in
if case let .failure(error) = completion {
print("Error: Model yüklenemedi: \(error.localizedDescription)")
}
cancellable?.cancel() //*****
}, receiveValue: { (character: Entity) in
if let character = character as? BodyTrackedEntity {
character.scale = [1.0, 1.0, 1.0]
self.character = character
cancellable?.cancel()
} else {
print("Error: Model BodyTrackEntity olarak yüklenemedi")
}
})
Bu kod uygulamadaki en karışık kodlardan bir olabilir. Baştan açıklamak gerekirse, herhangi bir uygulamayı durdurma işlemi gerçekleşip gerçekleşmediğini kontrol edebilmek için cancellable diye bir değişken tanımlamanız gerekir. Eğer durdurma işlemi gerçekleşmezse nil değerini alır ve character/robot dosyalarının içindeki robot modelini scene’e ekler. Yukarıdaki //***** sembollerine kadar olan tüm kısım kısaca error tespit etmek ve uygulamayı error bulunduğunda durdurma kısımlarıdır. Apple ne yazık ki bu noktada bir kısaltmaya varmadığında bunu karmaşık gibi gözüken bir kodla ifade etmek gerekir.
receiveValue: { (character: Entity) in
if let character = character as? BodyTrackedEntity {
character.scale = [1.0, 1.0, 1.0]
self.character = character
cancellable?.cancel()
} else {
print("Error: Model BodyTrackEntity olarak yüklenemedi")
}
Yukarıda gördüğünüz kod parçası, asıl ilgilenmeniz gereken kısımdır. Bu noktada eğer robot dosyadan hatasız çekilebildiyse, robotu scene’inize yerleştirirsiniz 🤖. Öncelikle “character” diye bir değişken yaratmanız gerekir. Bu değişkeni yaratmanızın nedeni robotun boyutunu kolayca ayarlayabilmektir. “character.scale” kodunda yapılan da tam olarak eklenilen robotun boyutlarını insan boyutlarına eşitlemektir. Sonradan bu yarattığınız karakteri ayarladığınız boyutlarla scene’inize yerleştirebilmek için “character” değişkenine eşitlemeniz gerekir. Geriye kalan kodlar da aynı şekilde “error handling” dediğimiz olası errorlarda uygulamayı durdurmak için vardır.
Son olarak robotunuzu scene’inize eklemeyi unutmayın!
arView.scene.addAnchor(characterAnchor)
Buraya kadar geldiyseniz kodlarda “Entity” diye çok tanıdık gelmeyen bir özellik görmüş olabilirsiniz. Bu özellik, robotun animasyonları için gereklidir. Robot, sizin hareketini algılayıp hareket edeceğinden animasyonlara ihtiyacı vardır. BodyTrackedEntity
kullanarak bu animasyonlar kullanıcının vücut hareketleri senkronize edilebilir. 🚶♀️
İkinci ve üçüncü kısma geçmek için öncelikle uygulamanıza ARBodyTrackingConfiguration eklemeniz gerekecektir. Bu, uygulamanıza insanları algılaması gerektiğini komutlayacaktır.
let configuration = ARBodyTrackingConfiguration()
arView.session.run(configuration)
Not: Configuration’ın ne olduğunu merak ediyorsanız bu konu hakkında yazdığımız makaleyi inceleyebilirsiniz.
Kullanıcının hareketini algılamak ve robotun bu hareketleri yapması, saniyeler süren bir işlemdir. Bu nedenle kullanıcının hareketi algılandığı an bu hareketlerin robotun animasyon özellikleri ile iletişime geçtiğinden emin olmanız gerekir.
Bunu anchor kullanarak yapabilirsiniz. Uygulamanız kullanıcınızın vücudunu bir anchor olarak algılarsa bu anchor’un yaptığı hareketleri ve pozisyonunu algılayabilir ve aynısını robotun anchor’una yaptırabilir. 🧚♀️
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
for anchor in anchors {
guard let bodyAnchor = anchor as? ARBodyAnchor else {continue}
let bodyPosition = simd_make_float3(bodyAnchor.transform.columns.3)
characterAnchor.position = bodyPosition + characterOffset
characterAnchor.orientation = Transform(matrix: bodyAnchor.transform).rotation if let character = character, character.parent == nil {
characterAnchor.addChild(character)
}
}
}
Öncelikle bodyAnchor diye bir anchor tanımlamak gerekir. Bu, kullanıcının anchor’udur. Kullanıcının pozisyonunu alabilmek için bodyPosition tanımlanır ve gerçek dünyadaki pozisyonu sanal ortama entegre edilir. 🌍
guard let bodyAnchor = anchor as? ARBodyAnchor else { continue }
let bodyPosition = simd_make_float3(bodyAnchor.transform.columns.3)
Bunu yaptıktan sonra robotunuzun anchor’unu (characterAnchor), kullanıcınızın anchor’undan (bodyAnchor) başta tanımladığınız “offset” değeri kadar sola kaydırmanız gerekir. Robotunuzu tamamen doğru bir şekilde yerleştirmek için kullanıcının nereye dönük olduğunu bilmeniz gerekir. Bunu elde edebilmek için robotunuzun oryantasyonunu kullanıcınızın (bodyAnchor) rotasyon açısına eşitlemeniz gerekir.
characterAnchor.position = bodyPosition + characterOffset
characterAnchor.orientation = Transform(matrix: bodyAnchor.transform).rotation
En sonda, robotunuzun herhangi bir parent’ı olup olmadığını kontrol etmeniz gerekir. Eğer bir parent node’u yoksa, robotunuzu, onun için oluşturduğunuz anchor’a eklemeniz gerekir.
if let character = character, character.parent == nil {
characterAnchor.addChild(character)
}
Son olarak uygulamanızın hangi cihazlarla çalıştığını anlayabilmek ve uygun olamayan cihazlardan çalıştırmamak için aşağıdaki kodu yazmanız gerekir:
guard ARBodyTrackingConfiguration.isSupported else {
fatalError("This feature is only supported on devices with an A12 chip")
}
Sonuç
Artık projemizi çalıştırmak için hazırız. Bu yaptığımız uygulama bir AR uygulaması olduğu için bilgisayarın içerisindeki simülatörü kullanamayacağız. iPhone’unuzu veya iPad’inizi bilgisayarınıza bağlayarak uygulamanızı orada test edebilirisiniz.
Oldukça havalı, öyle değil mi? 🤓
Burada yaptığımız projeye erişmek için aşağıdaki linke tıklayabilirsiniz!
Bir ARKit makalesinin daha sonuna geldik. 🥳 Bu makalede ARKit ile insanların vücut hareketlerini algılamayı ve bunlara göre bir robot oluşturmayı öğrendik. Sonraki ARKit makalelerinde görüşmek üzere!🖖