Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

7. ünite / 10 · 4 saat

ArmScript II: yordam, sensör, hata ayıklama ve yalıtım

Yordamlarla yeniden kullanım, parçaları sayan ve konumunu okuyan sensör işlevleri, print ile hata ayıklama ve programın neden tarayıcıda, sınırlı çalıştığı.

Bu ünitenin sonunda

  • proc ve call ile parametreli yordam yazmak ve yerel kapsamı kullanmak
  • items(), item_x(i), here() ve holding() ile sensör verisini okumak
  • Hata ayıklamayı print ve satır numaralı hatalarla yapmak
  • Yorumlayıcının sınırlarını ve kullanıcı kodunun sunucuda neden çalışmadığını açıklamak

Ders notları

Yordamlar

Tekrarlanan işi bir yordam yap: proc al(x, y) ... end ve call al(0.55, -0.32). Yordamlar programın en üst düzeyinde tanımlanır, çağrıdan sonra da yazılabilir ve parametre alır. Yordamın var ile tanımladığı değişkenler yereldir; genel bir değişkeni yordam içinde değiştirebilirsin, ama aynı adlı parametre onu gölgeler. Yordam değer döndürmez; sonucu genel bir değişkene yazar.

Sensör işlevleri

  • holding(): tutucuda parça var mı.
  • items(): hücredeki parça sayısı; item_x(i), item_y(i), item_z(i): i. parçanın konumu (1'den başlar; tutulan parçada TCP konumu).
  • here(): TCP'nin şu anki duruşu. x_of(p), y_of(p), z_of(p), offset(p, dx, dy, dz), dist(a, b): hedef işlevleri.

İstif örneği bunları birleştirir: for i = 1 to items() döngüsü her parçanın konumunu okur, al yordamıyla alır, koy yordamıyla üst üste dizer ve üç parçanın merkezi 30, 90, 150 mm'ye oturur.

Hata ayıklama

Üç araç: print ile ara değerleri yaz; hata iletisindeki satır numarasına git; programı küçük parçalara bölüp tek tek çalıştır. Hata anına kadar süren hareket sahnede kaldığından kolun nerede durduğu görülür.

Sınırlar ve yalıtım

Yorumlayıcı saf TypeScript'tir ve tarayıcıda, bu sayfanın içinde çalışır. Dilde dosya, ağ ya da JavaScript'e çıkış yoktur: programın çağırabileceği işlevler sabit bir listedir ve kaynak kodda eval ya da Function yoktur (bu bir testle denetlenir). Kullanıcı kodu sunucuda çalışmaz. Sonsuz döngüye karşı sınırlar vardır: en çok 20000 adım, 12 çağrı derinliği, 200 çıktı satırı, 600 saniye benzetim süresi, 6000 karakter ve 300 satır. Bir sınır aşılınca program hata ile durur.

Simülasyon

Öğretim modeli: sanal kol bu dersin kendi modelidir. Uzuv ölçüleri, eklem sınırları, hız ve ivme değerleri ve güvenlik eşikleri bu sayfadaki kodda tanımlı ders sabitleridir; hiçbir robot üreticisinin ürünü, dili ya da eğitim içeriği değildir ve ders resmî bir üretici eğitimi değildir. Gerçek bir hücrede ölçüler üreticinin belgelerinden, güvenlik değerleri risk değerlendirmesinden gelir.

ArmScript: yaz, çalıştır, 3B sahnede izle

Platformun kendi robot dili. Örnek seç ya da kendi programını yaz, Çalıştır'a bas: yorumlayıcı programı tarayıcıda, sınırlı adımla koşturur, konsola çıktıyı ve hatayı satır numarasıyla yazar, sonucu 3B sahnede oynatır. Sunucuda hiçbir şey çalışmaz.

Kendin dene

ArmScript simülasyonunda "istif" örneğini çalıştır; konsoldaki üç satırı ve sahnede üç parçanın üst üste oturduğunu gör. Sonra "hata: sonsuz döngü" örneğini çalıştır: kaç adımda durdu ve süre neden kısa? Son olarak istif örneğinde koy yordamının z hesabını 0,06'dan 0,05'e çevir ve parçaların nasıl yerleştiğine, düşürme sayısına bak.

Kod

ArmScript bloklarını ArmScript simülasyonuna yapıştırıp tarayıcında çalıştırabilirsin. Python blokları yalnızca standart kütüphane kullanır; kendi bilgisayarında çalıştır.

ArmScript: üç parçayı alıp üst üste dizmek
# üç parçayı sırayla alıp B'de üst üste diz
proc al(x, y)
  open
  ptp pose(x, y, 0.25)
  lin pose(x, y, 0.03)
  close
  lin pose(x, y, 0.25)
end
proc koy(x, y, z)
  ptp pose(x, y, z + 0.22)
  lin pose(x, y, z)
  open
  lin pose(x, y, z + 0.22)
end
for i = 1 to items()
  call al(item_x(i), item_y(i))
  call koy(0.55, 0.32, 0.03 + 0.06 * (i - 1))
  print "parça", i, "yerleşti"
end
TypeScript: ArmScript'i tarayıcıda çalıştırmak
import { describeError, runProgram } from '@/lib/robot-kolu/armscript'
import { defaultCell } from '@/lib/robot-kolu/cell'
const src = 'ptp pose(0.5, 0.2, 0.3)\nprint here()'
const r = runProgram(src, { cell: defaultCell(false) })   // saf işlev: ağ yok, eval yok
if (!r.ok) console.log(describeError(r.error!, 'tr'))   // satır numaralı hata
else console.log(r.output, r.duration.toFixed(2), 's')       // çıktı ve benzetim süresi
ArmScript: hata: sonsuz döngü
# YANLIŞ: bitmeyen döngü, yorumlayıcı adım sınırında durdurur
var n = 0
while true
  n = n + 1
end

Sık yapılan hatalar

  • Yordamda genel değişken yerine aynı adlı parametre kullanıp değişikliğin dışarı çıkmasını beklemek: parametre yereldir.
  • Parça sırasını sabit varsaymak: i. parçanın konumunu her seferinde item_x(i) ile oku, bir parça alındığında konumu değişir.
  • Sonsuz döngüyü "program donmuş" sanmak: sınır yalnızca hata verir, bu yüzden sınırı tasarımın bir parçası say.
  • Yalıtımı gizlilik sanmak: programlar yalnızca tarayıcıda çalışır, ama kullanıcı kendi programını görür; sır koyma.

Yazılım mühendisliği bağlantısı

Kullanıcının yazdığı kodu çalıştırmak güvenlik riskidir. Bu ders üç önlem alır: dil JavaScript'e açılmaz, çalışma sınırlıdır ve her şey kullanıcının kendi sekmesinde olur.

  • Kaynak koda "yasak çağrı yok" testi eklendi: eval, Function, fetch, window geçmez.
  • Adım, derinlik, çıktı ve süre sınırları testle sınanır; sonsuz döngü iki saniyeden kısa sürede biter.

Kendini sına

  1. Yordam içinde "var y = 1" ile tanımlanan değişken nerede görünür?

  2. item_x(2) neyi okur?

  3. Kullanıcı programı neden sunucuda çalıştırılmaz?

  4. Adım sınırı (20000) neden vardır?

Bu üniteden sonra bitirme projesinde

  • Yordamlı program: Üç parçayı yordamlarla ve döngüyle taşıyan, hata iletileri denenmiş program.

Macademia'da ilgili

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç