Tüm yazılar

ORK / R&D

rust-mavlink’te Frame Okumayı Nasıl 3 Kattan Fazla Hızlandırdık?

rust-mavlink 0.19.0’da frame okuma kodunu yeniden yazdık. Veriyi toplu okuma ve SIMD destekli marker arama sayesinde elde ettiğimiz hız artışının hikayesi.

Bir robotun komutu uygulayabilmesi için yazılımının önce o komutu alması, tanıması ve çözümlemesi gerekir. Robotun diğer işleri devam ederken bu süreç de hiç durmaz.

Uçuş kontrol mimarimizin tamamında MAVLink kullanıyoruz. Uçuş beynimiz Cerebrum, PX4, ArduPilot ve Kaptan ile MAVLink üzerinden haberleşiyor. Bare-metal robotik yazılımımız Kaptan da dışarıdan gelen kontrol komutları ve haberleşme için MAVLink kullanıyor.

İki sistemin de sınırlı işlem gücü ve bellekle yüksek performans göstermesi gerekiyor. Üstelik her iki tarafta da saniyede yüzlerce okuma yapıyoruz. Her okumada yapılan küçük bir ek işlem bile bu sıklıkta ciddi bir yüke dönüşüyor. İşlem gücünü algılama, navigasyon ve kontrole ayırmak istiyoruz.

Bu yüzden çalışmalarımız kendi ürünlerimizle sınırlı kalmıyor. Kullandığımız açık kaynak projelerine de katkıda bulunuyor, geliştiricileri ve topluluklarıyla birlikte çalışıyoruz.

Kısa süre önce, topluluğun katkılarıyla birçok iyileştirme ve yeni özellik içeren rust-mavlink 0.19.0 sürümünü yayımladık. Bu sürümde kütüphanenin temel işlerinden birine odaklandık: frame okuma kodunu yeniden yazdık. Benchmark sonuçlarına göre frame okuma 2,73–3,85 kat hızlandı.

Eski okuyucu, başlangıç marker’ı, header ve frame’in geri kalanı için ayrı ayrı okuma isteği yapıyordu. Buffer kullanmasına rağmen veriyi bu küçük adımlarla alıyordu.

Yeni okuyucu ise veriyi toplu okuyup aynı buffer’da tutuyor. Tek okumada birden fazla frame geldiğinde, sıradaki frame’ler bellekte hazır bekliyor. İmzasız mesajlarda payload da başka bir yere kopyalanmadan doğrudan bu buffer üzerinden işleniyor.

Frame okuma

MarkerHeaderPayloadCRC
Önce 30/30frame
Şimdi 30/30frame

Sahada elektromanyetik girişim veya hatalı kablolama yüzünden seri haberleşmede veri bozulabiliyor. Alıcı, aktarımın ortasında yeniden bağlandığında ise okumaya bir frame’in ortasından başlayabiliyor. Böyle durumlarda okuyucunun bozuk ya da eksik veriyi geçip sıradaki frame’in başlangıç marker’ını bulması gerekiyor.

Eski okuyucu marker’ı bayt bayt arıyordu. Yeni okuyucu önce bulunduğu konumu kontrol ediyor. Marker orada değilse, destekleyen işlemcilerde SIMD ile birden fazla baytı aynı anda karşılaştırıyor. Özellikle gürültülü veride sıradaki frame’i aramak artık daha az işlem gerektiriyor.

Marker arama

Önce · scalar
Şimdi · SIMD

Bu çalışma Cerebrum ve Kaptan’ın ihtiyaçlarıyla başladı. Bu iyileştirmelerden artık rust-mavlink kullanan herkes yararlanabiliyor. Kendi sistemlerimizi geliştirirken kullandığımız açık kaynak projelerine de katkıda bulunmaya devam edeceğiz.