Bir robot kolunun sinir ağıyla kusursuz biçimde bardak taşıdığını düşünün. Etkileyici, değil mi? Peki kol daha ağır bir bardakla, eğitilmediği bir açıyla veya gürültülü sensörlerle karşılaşırsa ne olur? Yapay sinir ağı tabanlı kontrolcüler yüksek performans gösterebilse de klasik kontrol teorisinin sevdiği türden matematiksel kararlılık garantilerini çoğu zaman beraberinde getirmez.
Devamı...

Bir robot kolunun elektrik kesildikten sonra eklemlerinin nerede olduğunu hâlâ bilmesi sihir değildir; doğru enkoder seçimidir. Motor milinin veya mekanik bir eksenin açısal konumunu ölçen enkoderler, hareket kontrol sistemlerinin gözü gibidir. Ancak mutlak (absolute) ve artımlı (incremental) enkoderler konumu aynı biçimde anlatmaz: biri doğrudan adres verirken diğeri atılan adımları sayar.
Devamı...
Bir robot kolu hareketsiz görünürken bile motorları pek dinlenmez. Eklemler, kolun ve taşıdığı yükün aşağı düşmesini önlemek için sürekli tork üretir. Yer çekimi telafisi, bu zorunlu yükü yazılımsal kontrol, yaylar, karşı ağırlıklar veya başka mekanik düzeneklerle dengeleyerek enerji tüketimini azaltmayı amaçlar. Kısacası robot, kendi kolunu taşımak yerine asıl görevine odaklanır.
Devamı...
Python’da nesne yönelimli programlama yaparken sınıf değişkenleri ile örnek değişkenleri arasındaki küçük görünen fark, beklenmedik sonuçlara yol açabilir. Özellikle liste veya sözlük gibi değiştirilebilir bir nesne sınıf değişkeni olarak tanımlandığında, bir örnekte yapılan değişiklik diğer örneklerde de ortaya çıkar. Böylece birbirinden bağımsız olması beklenen nesneler, farkında olmadan aynı veriyi paylaşmaya başlar.

Devamı...
Python dekoratörleri, bir fonksiyonun davranışını kaynak kodunu değiştirmeden genişletmenin zarif bir yoludur. Ancak dekoratörümüzü dikkatsizce yazarsak orijinal fonksiyonun adı, docstring’i ve diğer metadata bilgileri ortadan kaybolabilir. Fonksiyon çalışmaya devam eder ama sahneye başka birinin kimliğiyle çıkar. Neyse ki functools.wraps, bu küçük kimlik krizini çözmek için standart kütüphanede bizi bekler.
Devamı...
Python’da çoklu kalıtım ilk bakışta oldukça masum görünür: Bir sınıf, birden fazla sınıftan özellik kazanır ve herkes mutlu olur. Ancak aynı isimli metotlar, elmas biçimli kalıtım zincirleri ve super() çağrıları devreye girdiğinde Python’ın hangi metodu çalıştırdığı şaşırtıcı olabilir. Bu karar rastgele verilmez; arka planda Method Resolution Order, yani MRO adı verilen kesin bir sıralama bulunur.
Devamı...
Bir mobil robot ne kadar akıllı olursa olsun, bataryası tükendiğinde pahalı bir dekorasyona dönüşür. Haritalama, engelden kaçınma ve yapay zekâ gibi yetenekler robotun görev başarısını belirlerken enerji verimliliği, bu yeteneklerin ne kadar süre kullanılabileceğini belirler. Dolayısıyla otonomi yalnızca yazılımsal bağımsızlık değil, aynı zamanda robotun şarj istasyonuna ihtiyaç duymadan çalışabildiği süredir.
Devamı...

İki bacak üzerinde yürümek insanlar için sıradan, robotlar için ise sürekli çözülmesi gereken bir denge problemidir. Robotun kütle merkezi destek alanının dışına çıktığında yer çekimi hemen devreye girer ve pahalı metal kahramanımız yere doğru dramatik bir yolculuğa başlar. Ters sarkaç modeli, bu karmaşık gövde ve eklem sistemini daha anlaşılır bir fizik problemine dönüştürerek denge denetleyicilerinin tasarlanmasını kolaylaştırır.
Devamı...
İnsansı bir robotun yürümesi, uzaktan bakıldığında sırayla sağ ve sol ayağı öne atmaktan ibaret görünebilir. Oysa robot açısından her adım; temas kuvvetleri, gövde momentumu, eklem açıları ve zamanlamanın birlikte yönetildiği dinamik bir denge problemidir. Faz analizi, robotun bu karmaşık hareketin neresinde bulunduğunu ve küçük bir bozucudan sonra güvenli döngüsüne dönüp dönemeyeceğini anlamamızı sağlar.
Devamı...
Linux sunucunuz “Disk doldu!” diye alarm verirken du ile yaptığınız kontrolde hâlâ bolca yer görünmesi kafa karıştırıcı olabilir. Aslında df ve du aynı şeyi hatalı biçimde ölçmez; disk kullanımına farklı katmanlardan bakar. Biri dosya sisteminin muhasebe kayıtlarını, diğeri erişilebilen dosya ve dizinleri inceler.
Devamı...
C++’ta bir fonksiyon çağrısının hangi gövdeye gideceği her zaman göründüğü kadar basit değildir. Derleyici bazen kararı derleme zamanında verir, bazen de çalışma zamanındaki gerçek nesne türüne bakar. Statik ve dinamik bağlamayı aynı tasarım içinde bilinçsizce karıştırmak; yanlış fonksiyonların çağrılmasına, kaynak sızıntılarına ve “Ama bu sınıfı ezmiştim!” şaşkınlığına yol açabilir.

Devamı...

C++ Standart Şablon Kütüphanesi (STL), verileri saklayan konteynerlerle bu veriler üzerinde işlem yapan algoritmaları birbirinden ayırır. Bu iki dünyayı birbirine bağlayan kahramanlar ise yineleyicilerdir. Böylece aynı arama, kopyalama veya sıralama algoritması farklı veri yapılarıyla çalışabilir; her konteyner için yeniden tekerlek icat etmemiz gerekmez.
Devamı...
C++’ta operatör aşırı yükleme, kullanıcı tanımlı türlerin yerleşik türler gibi doğal görünmesini sağlar. Ancak doğal görünen her davranış doğal olmayabilir! Özellikle == ile != farklı mantıklarla uygulanırsa veya operand sırası sonucu değiştirirse, kod derlenmesine rağmen kullanıcıyı sessizce yanıltan bir API ortaya çıkar.

Devamı...

C++ ile nesne yönelimli programlama yaparken kurucu içinde sanal bir fonksiyon çağırmak ilk bakışta gayet mantıklı görünebilir. Sonuçta fonksiyon virtual olarak tanımlanmıştır; nesne türetilmiş sınıfa aitse onun sürümü çalışmalıdır, değil mi? Ne yazık ki C++ burada bilinçli biçimde farklı davranır. Kurucu çalışırken sanal çağrı, o anda kurulmakta olan sınıfın uygulamasına bağlanır; henüz hazır olmayan türetilmiş sınıfa gönderilmez.
Devamı...
Bir uygulamanın hiç hata üretmemesi neredeyse imkânsızdır; önemli olan, hata ortaya çıktığında sistemin nasıl davrandığıdır. C# istisna yönetimi, beklenmeyen durumları ana program akışından ayırarak uygulamanın kontrollü biçimde tepki vermesini sağlar. Dosya bulunamaması, ağ bağlantısının kesilmesi veya geçersiz kullanıcı girdisi artık birer felaket değil, yönetilebilir senaryolardır.
Devamı...
Yapay potansiyel alan yöntemi, mobil robotların hedefe ilerlerken engellerden kaçınmasını sağlayan zarif ve hesaplama açısından hafif bir yaklaşımdır. Hedef robotu çeken bir mıknatıs, engeller ise onu iten görünmez kuvvet kaynakları gibi modellenir. Ne var ki bu sade fikir, robotun hedefe ulaşmadan durduğu meşhur yerel minimum problemiyle karşılaşabilir.
Devamı...
Shell’de değişken tanımlamak ilk bakışta son derece kolaydır: bir isim, = işareti ve bir değer yazarsınız. Ancak kullanici = ali gibi okunaklı görünen masum bir satır, Bash tarafından değişken ataması değil komut çalıştırma girişimi olarak yorumlanır. Sonuçta terminal, kullanici: command not found diyerek bizi şaşırtır. Suçlu = değil; onun etrafına yerleştirdiğimiz boşluklardır.
Devamı...
Bir betik çalıştırıyorsunuz; parola, URL veya mesaj içinde sıradan bir ! karakteri var. Birden terminal event not found diye bağırıyor ya da komutunuz beklenmedik biçimde değişiyor. Suçlu çoğu zaman Bash’in history expansion özelliğidir. Ünlem işareti kabuk için yalnızca heyecan belirtmez; geçmiş komutlara açılan gizli bir kapı da olabilir.

Devamı...
Bir robotun harita üzerinde boş bir nokta bulması, o noktaya gerçekten ulaşabileceği anlamına gelmez. Satranç taşları gibi robotların da hareket kuralları vardır: Holonomik robotlar yana kayabilirken non-holonomik robotlar çoğunlukla önce yönelmek, sonra ilerlemek zorundadır. Yol planlayıcı bu fiziksel gerçeği hesaba katmazsa kusursuz görünen rota, gerçek dünyada duvara sürtünen pahalı bir hayale dönüşebilir.
Devamı...
Bir robotun dengesini koruması, doğru yöne dönmesi veya eğimli bir zeminde hareket etmesi için uzaydaki yönelimini bilmesi gerekir. Fakat tek bir sensöre güvenmek çoğu zaman yeterli değildir: Jiroskop zamanla sürüklenirken ivmeölçer titreşimlerden etkilenir. Sensör füzyonu, bu iki huysuz sensörü birlikte çalıştırarak daha güvenilir bir yönelim tahmini üretir.
Devamı...