Robotikte İleri ve Ters Kinematik: Neden Biri Kolay, Diğeri Zor?

robotikte-ileri-ve-49

Bir robot koluna eklem açılarını verdiğinizde elinin nereye gideceğini bulmak genellikle düzenli bir hesap işidir. Ancak elin ulaşmasını istediğiniz noktayı verip gerekli eklem açılarını sorduğunuzda işler bir anda matematiksel bir bulmacaya dönüşür. İleri kinematik ile ters kinematik arasındaki temel zorluk farkı, aynı hareket zincirine iki farklı yönden bakmalarından kaynaklanır.

Devamı...

Robotikte Açık Döngü ve Kapalı Döngü Kontrol: Geri Besleme Neyi Değiştirir?

Bir robota “motoru iki saniye çalıştır” demek ile “hedef konuma ulaşana kadar motoru çalıştır” demek aynı şey değildir. İlk komutta robot yalnızca verilen talimatı uygular; ikinci komutta ise bulunduğu konumu ölçerek davranışını sürekli düzeltir. Açık döngü ve kapalı döngü kontrol arasındaki temel ayrım, sistemin kendi sonucundan haberdar olup olmamasıdır.

robotikte-acik-dongu-55

Devamı...

Python’da `is` ve `==`: Küçük Tam Sayı Önbelleğinin Kurduğu Tuzak

pythonda-is-ve-17

Python öğrenirken is ve == bazen aynı sonucu veriyormuş gibi görünür. Özellikle küçük tam sayılarla yapılan denemelerde iki operatörün de True döndürmesi, aralarında gerçek bir fark olmadığı yanılgısını doğurabilir. Oysa biri değerleri, diğeri nesnelerin kimliğini karşılaştırır; küçük tam sayı önbelleklemesi ise bu farkı geçici olarak gizleyen küçük bir illüzyondur.

Devamı...

Java İstisna Yönetimi: try, catch ve finally ile Güvenli Kod

Bir uygulamada her şey planlandığı gibi gitmez: Dosya bulunamaz, kullanıcı sayı yerine metin girer veya ağ bağlantısı aniden kesilir. Java istisna yönetimi, bu beklenmeyen durumları kontrollü biçimde karşılayarak programın dramatik bir şekilde sahneden düşmesini engeller. Amaç hataları gizlemek değil; onları anlamlı, izlenebilir ve güvenli bir akış içinde yönetmektir.

Devamı...

grep, sed ve awk: Metin İşlerken Doğru Aleti Seçme Rehberi

Komut satırında her metin problemi bir çivi gibi görünüyorsa, elimizdeki ilk komutu çekiç olarak kullanmak cazip gelir. Böylece grep ile hesap yapmaya, sed ile sütun toplamaya veya awk ile yalnızca bir kelime aramaya çalışırız. Sonuç bazen çalışır; fakat okunabilirlik, taşınabilirlik ve bakım kolaylığı sessizce pencereden kaçar.

grep-sed-ve-18

Devamı...

C++’ta Sanal Fonksiyonlar ve Varsayılan Parametreler: İki Farklı Karar Mekanizması

C++’ta sanal fonksiyonlar çalışma zamanlı polimorfizmin yıldızıdır; varsayılan parametreler ise çağrıları kısaltan kullanışlı yardımcılardır. Ancak bu iki özellik aynı fonksiyonda buluştuğunda küçük bir sürpriz ortaya çıkar: Çalıştırılan fonksiyon türetilmiş sınıfa aitken kullanılan varsayılan değer temel sınıftan gelebilir. İlk bakışta çelişkili görünse de sebep, C++ derleyicisinin iki kararı farklı zamanlarda vermesidir.

Devamı...

C++’ta İstisna Fırlatan Kurucular ve Yarım Kalan Nesnelerde Kaynak Sızıntısı

Bir C++ kurucusu çalışırken istisna fırlatırsa nesne hiçbir zaman tamamen oluşmuş sayılmaz. Bu nedenle nesnenin kendi yıkıcısı çağrılmaz. Kurucu içinde elle edinilmiş bellek, dosya veya kilit gibi kaynaklar varsa bu davranış kolayca sızıntıya dönüşebilir. Neyse ki C++’ın üye yıkım kuralları ve RAII yaklaşımı, doğru kullanıldığında yarım kalan inşaatı güvenli biçimde temizler.

Devamı...

C++ Template Tür Çıkarımı: Beklenmedik Instantiation Hatalarını Anlamak

C++ şablonları, aynı algoritmayı farklı türlerle kullanmayı sağlayan güçlü bir mekanizmadır. Fakat derleyicinin bir türü başarıyla çıkarması, ilgili şablonun sorunsuz biçimde üretileceği anlamına gelmez. Bazen masum görünen bir fonksiyon çağrısı, derleyiciyi henüz hazır olmayan bir gövdeyi örneklemeye zorlar ve ekranı uzun, hiyeroglif benzeri hata mesajlarıyla doldurur.

Devamı...

C++ STL’de Iterator Geçersizliği: erase Tuzağından Güvenle Kaçış

Bir STL konteynerinde dolaşırken eleman silmek, ilk bakışta son derece masum görünür. Ancak yanlış kullanılan tek bir erase, yineleyiciyi geçersiz hâle getirerek tanımsız davranışa, atlanan elemanlara veya yalnızca cuma akşamları ortaya çıkan gizemli çökmelere neden olabilir. Bu tuzağın kaynağı, her konteynerin elemanlarını bellekte farklı biçimde saklamasıdır.

Devamı...

C++ Sanal Fonksiyonlar ve Çok Biçimlilik: Tek Arayüz, Farklı Davranışlar

Bir oyun geliştirdiğimizi ve ekranda savaşçı, büyücü, okçu gibi farklı karakterlerin bulunduğunu düşünelim. Her karakter saldırır, ancak saldırma biçimleri birbirinden farklıdır. C++ çok biçimliliği, bu nesneleri tek bir ortak arayüz üzerinden yönetirken doğru davranışın çalışma zamanında seçilmesini sağlar. Böylece uzun if-else zincirleri yerine genişletilebilir ve bakımı kolay bir tasarım elde ederiz.

c-sanal-fonksiyonlar-84

Devamı...

C++ RTTI ve Güvenli Tür Dönüşümleri: Nesnenin Gerçek Kimliğini Bulmak

c-rtti-ve-63

C++ dünyasında bir nesne her zaman göründüğü şey olmayabilir. Elinizde Karakter* türünde bir işaretçi bulunurken, işaret edilen gerçek nesne bir Buyucu veya Savasci olabilir. Çalışma Zamanı Tür Bilgisi, yani RTTI (Run-Time Type Information), program çalışırken bu gerçek kimliği öğrenmemizi ve kalıtım hiyerarşilerinde güvenli dönüşümler yapmamızı sağlar.

Devamı...

C# ile Multithreading: TPL, Task ve async/await Rehberi

Bir uygulamanın aynı anda birden fazla iş yapabilmesi kulağa sihir gibi gelebilir; ancak C# dünyasında bu sihrin arkasında iş parçacıkları, görevler ve dikkatli bir zamanlama mekanizması bulunur. Task Parallel Library (TPL) CPU ağırlıklı işleri paralelleştirirken async/await, özellikle dosya, ağ ve veritabanı gibi beklemeli işlemlerde iş parçacıklarını gereksiz yere meşgul etmeden ölçeklenebilir uygulamalar kurmamızı sağlar.

Devamı...

C Dosya İşlemleri: Stream’lerle Kalıcı Veri Okuma ve Yazma

Bir C programı çalışırken değişkenler çoğunlukla RAM’de yaşar ve program sonlandığında sahneden sessizce çekilir. Oysa kullanıcı kayıtları, ayarlar veya ölçüm sonuçları gibi verilerin yeniden kullanılabilmesi için diske yazılması gerekir. C’nin File I/O araçları, geçici bellek ile kalıcı depolama arasında bir köprü kurar.

Devamı...

Arduino ve Raspberry Pi ile Robotik Eğitimi Herkes İçin Erişilebilir

Bir zamanlar robot geliştirmek; pahalı laboratuvarlara, özel üretim devrelere ve kalın mühendislik kitaplarına erişmeyi gerektiriyordu. Arduino ve Raspberry Pi gibi açık kaynaklı donanım platformları ise bu tabloyu önemli ölçüde değiştirdi. Öğrenciler artık birkaç sensör, motor ve internetten erişilebilen örneklerle çalışan bir robot geliştirebiliyor. Böylece robotik eğitimi, yalnızca uzmanların bulunduğu laboratuvarlardan çıkarak sınıflara, atölyelere ve hatta mutfak masalarına kadar ulaşıyor.

Devamı...

Teleoperasyonda Görünmez Engel: Zaman Gecikmesi Operatör Performansını Nasıl Etkiler?

teleoperasyonda-gorunmez-engel-89

Bir robotu kilometrelerce uzaktan yönetmek, ekrandaki görüntüye bakarak oyun oynamaya benzeyebilir. Ancak komut ile hareket arasındaki gecikme büyüdüğünde oyun kumandası hissi kaybolur; robot adeta geçmişten gelen talimatlarla hareket etmeye başlar. Özellikle cerrahi, afet müdahalesi, uzay araştırmaları ve tehlikeli madde operasyonlarında birkaç yüz milisaniyelik gecikme bile operatörün hızını, doğruluğunu ve güvenini ciddi biçimde etkileyebilir.

Devamı...

Shell Komut İkamesi: $(...) ve Backtick Arasındaki Farklar

Shell betiklerinde bir komutun çıktısını başka bir komutun argümanı yapmak oldukça yaygındır. Bunun için modern $(...) söz dizimini veya eski backtick biçimini kullanabiliriz. İkisi basit örneklerde aynı sonucu üretse de iç içe komutlar, kaçış karakterleri ve bakım kolaylığı devreye girdiğinde aralarında ciddi farklar ortaya çıkar.

shell-komut-ikamesi-95

Devamı...

Shell find: -exec ve xargs Arasında Performans ve Güvenlik Düellosu

shell-find-exec-69

find ile binlerce dosyayı aradıktan sonra üzerlerinde işlem yapmak istediğimizde iki popüler seçenek karşımıza çıkar: -exec ve xargs. İkisi de bulunan yolları başka bir komuta aktarır; ancak süreç oluşturma maliyeti, özel karakter içeren dosya adları ve güvenilmeyen dizinlerle çalışma konusunda davranışları aynı değildir. Yanlış seçim betiği yalnızca yavaşlatmaz, beklenmedik dosyaların işlenmesine de yol açabilir.

Devamı...

Python’da *args ve **kwargs: Esneklik Okunabilirliğe Karşı

pythonda-args-ve-31

Python’daki *args ve **kwargs, fonksiyonlara değişken sayıda argüman gönderme özgürlüğü sağlar. Ancak bu özgürlük kontrolsüz kullanıldığında fonksiyon imzası, ne beklediğini söylemeyen gizemli bir kapıya dönüşebilir. Fonksiyon çalışır, testler geçer; fakat onu ilk kez gören geliştirici kendini “Buraya ne göndermem gerekiyor?” diye sorarken bulur.

Devamı...