Huawei AR Engine ile Vücut Hareket Takibi

Kadirtas
Huawei Developers - Türkiye
7 min readNov 20, 2020

Giriş

Artırılmış Gerçeklik (AR) kullanımı, alışverişten oyunlara, tasarımdan eğitime ve daha pek çok alanda her geçen gün artmaktadır. Artırılmış gerçekliğin ne olduğunu sorarsak, wikipedia’dan tam olarak aşağıdaki gibi bir cevap alacağız.

AR nedir?

Artırılmış gerçeklik (AR), gerçek dünyada bulunan nesnelerin bazen görsel, işitsel, haptik, somatosensori ve koku alma dahil olmak üzere birden fazla duyusal modalitede bilgisayar tarafından oluşturulan algısal bilgilerle zenginleştirildiği gerçek dünya ortamının etkileşimli bir deneyimidir.

Ancak bugün bu klasik tanımdan ziyade HUAWEI tarafından sunulan artırılmış gerçeklik SDK’sı olan AR Engine’in avantajlarından bahsedeceğiz. HUAWEI tarafından sunulan benzer ama farklı görünen ML Kit ile farklardan bahsedecek ve HUAWEI AR Motorunu kullanarak bir demo uygulama geliştireceğiz. Ve bu şekilde, HUAWEI AR Engine’i kullanarak artırılmış gerçekliği uygulamamıza kolayca entegre etmeyi öğreneceğiz.

HUAWEI AR Engine nedir?

HUAWEI AR Engine, Android akıllı telefonlarda artırılmış gerçeklik (AR) uygulamaları oluşturmak için bir platformdur. HiSilicon tabanlıdır. HUAWEI AR Engine hareket izleme, ortam izleme, vücut izleme ve yüz izleme gibi temel AR yeteneklerini sağlamak için AR çekirdek algoritmalarını entegre ederek, uygulamamızın sanal dünyayı gerçek dünya ile yepyeni bir görsel olarak köprülemesine olanak tanır. AR Engine, uygulamalarımız için sanal ve fiziksel yakınsama yeteneklerini doğru bir şekilde anlar ve sağlar.

AR Engine Avantajları

Normalde, artırılmış gerçeklik özelliklerini uygulamamıza entegre etmek çok karmaşık ve zahmetli bir iştir. Ancak şirketler bu karmaşık işi kolaylaştırmak için SDK’lar sundular. Apple AR Kit, Google AR Core ve bugün uygulama geliştirirken kullanacağımız ve yazıda ana konumuz olan HUAWEI AR Engine, bu SDK’lara örneklerdir. Ancak, bu SDK’lar arasında performans, yetenek ve desteklenen cihazlar gibi farklılıklar vardır.

Örneğin, Google AR Core insan vücudu takibini desteklemezken, AR Engine ve AR Kit bunu destekler. Ayrıca, AR Engine ve AR Kit el hareketlerini desteklerken, AR Core desteklemez.

HUAWEI AR Engine’in bir diğer avantajı ise, cihazınızın insanların nasıl hareket ettiğini anlamasını sağlar. HUAWEI AR Engine, el konumlarını belirleyerek ve belirli hareketleri tanıyarak sanal bir nesnenin yerleştirilmesine veya bir ele özel efekt uygulanmasına yardımcı olabilir. Derinlik bileşeni ile hareket izleme özelliği, hassas etkileşimli kontroller ve özel efekt katmanları uygulamak için 21 el iskelet noktasını izleyebilir. Body Recognition özelliği ile insan duruşunu gerçek zamanlı olarak tespit etmek için belirli isimlerle (Sol El vb.) 23 vücut iskelet noktasını takip edebilir. AR Engine, üçüncü taraf uygulamalar ve Depth Api ile kullanımı destekler. Tüm bunlara ek olarak HUAWEI AR Engine, bu özellikleri hem ön hem de arka kameralar için desteklemektedir. Ayrıca ilerleyen günlerde belirli lokasyonlar için yol tarifi verme özelliği eklenmesi planlanmaktadır.

AR Engine ile HUAWEI cep telefonları, temel hareket izleme ve ortam izleme özelliklerine ek olarak yüz, işaret ve vücut tanıma gibi etkileşim yetenekleri ve 240'tan fazla API sağlar.

ML Kit ile Farklılıkları

HUAWEI AR Engine’in Body Tracking özelliği ve ML Kit’in body skeleton recognition özelliği aynı görünebilir. Ancak aralarında oldukça fark vardır. ML Kit, AR senaryosunda iskelet bilgilerini izlerken bazı genel amaçlı yetenekler sağlar. AR Engine’de Skeleton Tracking ve Motion Tracking etkindir. Dolayısıyla, AR Engine’in koordinat sisteminden çeşitli bilgileri vardır. Ancak ML Kitindeki servis aynı şeyi yapamaz. Çünkü farklı amaçlara hizmet ederler.

AR Engine’deki servis bir AR uygulaması oluşturmak için kullanılırken, ML Kitindeki servis yalnızca akıllı telefon koordinat sistemindeki görüntüdeki iskeleti izleyebilir. Bu iki hizmeti uygulamanın farklı yollarıdır. Ayrıca modeller de farklıdır.

Demo Uygulama Geliştirme

HUAWEI AR Engine’in Vücut izleme özelliğini kullanarak basit bir demo uygulaması geliştireceğiz. Bu demo uygulamasında kamera ile görüntülenen insan vücudundaki vücut iskeletini temsil eden çizgiler çizmeye çalışacağız. Ancak geliştirmeye başlamadan önce yazılım ve donanım gereksinimlerini sağlamamız gerekmektedir.

Donanım Gereksinimleri

HUAWEI AR Engine’in mevcut sürümü yalnızca HUAWEI cihazları desteklemektedir. Bu nedenle, HUAWEI AR Engine’i destekleyen, USB kablosuyla bir bilgisayara bağlanabilen ve kamerası düzgün çalışan bir HUAWEI telefona ihtiyacınız var. (Desteklenen cihazları aşağıdaki tabloda görebilirsiniz)

Yazılım Gereksinimleri

  • Java JDK (1.8 veya üstü).
  • Android Studio (3.1 veya üstü).
  • HUAWEI Developers sayfasında bulunan en son HUAWEI AR Engine SDK’sı.
  • HUAWEI AppGallery’de bulunan ve telefona yüklenmiş olan en son HUAWEI AR Engine APK’sı.

Gereksinimleri sağladıktan sonra, HUAWEI AR Engine SDK’yı ve grafik renderlama işleminde kullanacağımız OpenGL kütüphanesini uygulamamıza eklemek için aşağıdaki bağımlılıkları app level build.gradle dosyamıza ekliyoruz.

dependencies{
//HUAWEI AR Engine SDK dependency
implementation ‘com.huawei.hms:arenginesdk:2.12.0.1’
//opengl graphics library dependency
implementation ‘de.javagl:obj:0.3.0’
}

Kamerayı kullanmak için AndroidManifest.xml dosyamıza kamera izni eklememiz gerekir.

<uses-permission android:name="android.permission.CAMERA" />

Artık uygulamamızın geliştirilmesine hazırız. Geliştirmeye başlamadan önce HUAWEI AR Engine SDK’nın genel kullanım sürecini bilmeliyiz. Demo uygulamamız AR Engine sürecimiz fotoğraftaki adımları takip etmelidir.

Not: Fotoğraftaki adımların, bu yazının anlatım akışıyla ilgisi yoktur. Sadece genel Huawei AR Engine kullanım süreçleri fotoğraftaki adımları izlemelidir.

Şimdi AR Engine’in genel süreçlerine baktıysanız, geliştirmeye devam edebiliriz.

Not: Unutmayın, bu süreçlerde kafanız karışırsa, geliştirme tamamlandıktan sonra bu resme tekrar bakıarsanız HUAWEI AR Engine SDK’nın genel kullanım süreçlerini tam olarak anlayacaksınız.

Öncelikle, renderlama için shader util sınıfını oluşturalım. Bu yardımcı sınıfı, vücut renderlama için vertex ve fragment shaderlarını oluşturmada kullanacağız. (Shaderları oluşturmak için OpenGL grafik kütüphanesi fonksiyonlarından yararlanacağız)

Şimdi oluşturacağımız iskeletin bağlantı noktalarının ve iskelet çizgilerinin çizimini bir döngüde yapabilmek için interface oluşturacağız. Bu interface i display sınıflarında implement edeceğiz. Ardından, bu arayüzü implemente eden sınıfların override edilen fonksiyonlarını, Activity’mizin onCreate fonksiyonunda oluşturulacak olan BodyRenderManager sınıfından çağıracağız. Interface kullanıyoruz çünkü isteğe göre ayrı bir şey renderlamak istediğimizde bunun nasıl yapılacağını görmenizi istiyorum. Yani siz de farklı bir şey renderlamak isterseniz, farklı bir display sınıfı oluşturup bu interface’i implement ederek, sadece manager sınıfında oluşturacağımız diziye bunu eklemeniz yeterli olacaktır. Hepsinden ileride ayrıca bahsedeceğiz…

ARBody type Collection’ı onDrawFrame yöntemine geçirdiğimizi görebilirsiniz. Bunun iki nedeni var. İlk neden, HUAWEI AR Motorunun aynı anda iki insan vücudunu varsayılan olarak tanımlayabilmesi ve her zaman iki vücut nesnesi döndürmesidir. İkinci neden, vücut iskeletini override edilmiş onDrawFrame yöntemlerinde çizeceğiz. HUAWEI ARBody sınıfını kullanıyoruz çünkü çizimde kullanılacak vücut iskeleti verileri dahil olmak üzere vücut iskeleti takibi sırasında takip sonucunu döndürüyor.

Şimdi verileri OpenGL ES’ye iletmek için display sınıfları oluşturmamız gerekiyor.

BodySkeletonDisplay sınıfı:

(Bu sınıfı, oluşturulacak ve ekranda görüntülenecek iskelet verilerini OpenGL ES’ye geçirmek için kullanacağız)

BodySkeletonLineDisplay sınıfı:

(Bu sınıf ise iskelet noktası bağlantılarını ekranda renderlamak için bu verileri OpenGL’e geçmak için kullanılacaktır)

Bir diğer display sınıfımız, TextureDisplay sınıfıdır. Ekranda kamera görüntülerini görüntülemek için kullanabileceğimiz kamera dokuları çizmek için kullanacağımız sınıftır. Bu sınıfın yöntemlerinin kullanımını anlamak için koddaki yorumlara da göz atabilirsiniz.

Daha sonra, OpenGL’nin jenerik renderer arayüzü olan GLSurfaceView.Renderer’ı uygulayan bir sınıf oluşturmamız gerekiyor. GLSurfaceView.Renderer, override etmemiz gereken 3 yönteme sahiptir. Bunlar onSurfaceCreated, onSurfaceChanged ve onDrawFrame’dir. GL iş parçacığında bir gövde iskeleti gölgelendiricisi oluşturmak için bu sınıfın geçersiz kılınan onSurfaceCreated yönteminde yukarıdaki görüntüleme sınıflarının init () yöntemini çağıracağız. Bu sınıfın yöntemlerini ayrıca açıklayacağım. Öncelikle onSurfaceCreated yöntemini açıklayacağım. Çünkü bu yöntem render işleminin başında denilmektedir.

Ama önce bu sınıfın kurucusunu görmeliyiz.

GLSurfaceView.Renderer sınıfının onSurfaceCreated yöntemi, renderlamanın başlangıcında ve ayrıca EGL bağlamı her kaybolduğunda çağrıldığından, bu yöntem, renderlama başladığında oluşturulması gereken kaynakları oluşturmak için kod koymak için uygun bir yerdir. . Bu nedenle, burada görüntülenen nesneleri başlatmak için yukarıdaki görüntüleme sınıflarının init () yöntemini çağırmalıyız.

Şimdi demo için cihaz rotasyonlarına uyum sağlayacak bir sınıf oluşturmamız gerekiyor. Bu sınıf, cihaz rotasyon yöneticisi olarak kullanılacaktır. Ve Android’in DisplayListener arayüzünü uygulamalıdır. Her yöntemin açıklamasını kodda bulabilirsiniz.

BodyRenderManager sınıfının onDrawFrame yöntemi, geçerli çerçeveyi çizmek için çağrılır. Bu yöntem, geçerli çerçevenin çizilmesinden sorumludur. Bu önemli bir yöntem ve bu yöntemi satır satır açıklayacağım.
Öncelikle sürücüye önceki karenin piksellerini yüklememesini bildirmek için ekranı temizlememiz gerekiyor.
Not: Açıklamadan sonra tüm BodyRenderManager sınıfını ekleyeceğim.

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

Ayrıca, ARSession’ın boş olup olmadığını kontrol etmeliyiz. Boş ise o zaman çizim sürecine devam edemeyiz.

if (mSession == null) {
return;
}

ARSession boş değilse, mevcut cihazın döndürülüp döndürülmediğini kontrol etmeliyiz. Cihaz döndürülürse, DisplayManager sınıfının updateArSessionDisplayGeometry’sini kullanarak mevcut ARSession’ın cihaz penceresini güncellemeliyiz.

if (mDisplayRotationManager.getDeviceRotation()) {
mDisplayRotationManager.updateArSessionDisplayGeometry(mSession);
}

Kamera önizleme akış verilerini depolamak için kullanılan openGL textureId öğesini ayarlayın.
Doku kimliğini ayarladıktan sonra, HUAWEI AR Engine’in kamera önizlemesini doku kimliğine güncellemesi için mSession.update () ‘i çağırmamız gerekir.

mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());
ARFrame frame = mSession.update();

En son ARFrame’i mSession.update () ile kamera tarafından elde ettik. Şimdi projeksiyon matrisini elde etme zamanı. Önce diziyi oluşturun ve frame.getCamera () kullanarak geçerli çerçevenin (ARCamera) kamera özelliklerini alın. Bundan sonra ARCamera.getProjectionMatrix () kullanarak projeksiyon matrisi elde edebiliyoruz.
Not: getProjectionMatrix yönteminin her parametresinin açıklamasını burada görebilirsiniz.

// The size of the projection matrix is 4 * 4.
float[] projectionMatrix = new float[16];
ARCamera camera = frame.getCamera();
// Obtain the projection matrix of ARCamera.
camera.getProjectionMatrix(projectionMatrix, PROJECTION_MATRIX_OFFSET, PROJECTION_MATRIX_NEAR,
PROJECTION_MATRIX_FAR);

Şimdi her çerçeveyi renderlayabiliriz.

mTextureDisplay.onDrawFrame(frame);

Dokuyu işledik. Şimdi vücudu renderlayacağız. ARSession’da izlenebilir ARBody nesneleri elde etmek için mSession.getAllTrackables (ARBody.class) kullanabiliriz. Gövdeleri aldıktan sonra, gövdeleri çizmek için gövdeleri ve projectionMatrix’i görüntüleme sınıflarının onDrawFrame’ine geçireceğiz.

Collection<ARBody> bodies = mSession.getAllTrackables(ARBody.class);for (BodyRelatedDisplay bodyRelatedDisplay : mBodyRelatedDisplays) {
bodyRelatedDisplay.onDrawFrame(bodies, projectionMatrix);
}

BodyRenderManager sınıfının tamamını görebilirsiniz

Ve yüzey değiştiğinde doku projeksiyon matrisini ve görünüm alanı dönüşünü güncellemeliyiz. Bu nedenle, BodyRenderManager sınıfının onSurfaceChanged yönteminde DisplayRotationManager ve TextureDisplay sınıflarının yöntemlerini kullanmalıyız.

Ve geliştirmenin son adımına geldik. Son adımda, aktivitemizden BodyRenderManager sınıfını kullanacağız. Öncelikle, activity nin layout dosyasına bir android.opengl.GLSurfaceView ekleyin.

Ve etkinliğimizin onCreate yöntemi. Gördüğünüz gibi DisplayRotationManager gibi yardımcı sınıflar oluşturduk ve bazı openGL konfigürasyonları yaptık. OnCreate yönteminin sonunda mevcut cihazda HUAWEI AR Engine sunucusunun (com.huawei.arengine.service) kurulu olup olmadığını kontrol etmeliyiz. Activity sınıfının tamamını ekleyeceğim ve arEngineAbilityCheck metodunun içeriğini görebilirsiniz.

OnResume yönteminde ARSession oluşturduk. Bu, AR Engine işleminin onResume yönteminden başladığı anlamına gelir. OnResume yöntemine bir göz atalım.

Gördüğünüz gibi ARSession nesnesini oluşturduk ve onu BodyRenderManager sınıfının setARSession metoduna geçirdik. Kontrol edebilirsiniz, bu yöntemde yeni bir ARSession oluşturuyoruz ve işlem başlıyor. Ancak ARSession’ı BodyRenderManager’a geçmeden önce, ARBodyTrackingConfig nesnesi oluşturuyoruz. Bu sınıf ayrıca HUAWEI AR Engine SDK tarafından sağlanmaktadır. ARBodyTrackingConfig türü nesneyi ARSession.configure() ‘a ilettiğimizde HUAWEI AR Engine, kamera vizöründeki gövdeyi gerçek zamanlı olarak algılar. Bundan sonra ARBodyTrackingConfig.setEnableItem () yöntemini kullanarak DEPTH ve MASK yeteneklerini etkinleştirdik. Ayrıca, birden fazla veya ikiden fazla yeteneği etkinleştirmek için OR bitsel operatörü ile birden fazla parametre geçirebiliriz.

Not: BodyActivity’de olduğu gibi ilgili yöntemlerde duraklatma, durdurma ve kaydı iptal etmeyi unutmayın.

Ayrıca BodyActivity sınıfının tamamını da görebilirsiniz.

Şimdi geliştirme adımlarını yaptık. Projeyi test etmek için Huawei AR Engine destekleyen cihazınızda çalıştırabilirsiniz. Tüm bölümleri başarıyla tamamladıysanız aşağıdaki görsellerde uygulamayı görmelisiniz.

Bu yazıda HUAWEI AR Engine’in uygulamalarınıza nasıl entegre edileceğini açıklamaya çalıştım. Ve araştırmama dayanarak AR Engine avantajları hakkında konuşmaya çalıştım. Şimdiye kadar okuduğunuz için teşekkürler. Umarım bu blog AR uygulamaları geliştirmenize yardımcı olur.

Sonraki bloglarda görüşmek üzere…

Referanslar:

--

--