Ana içeriğe geç

FTC Java ve Blockly Programlama Kılavuzu

(Blockly ekran görüntüleri yakında gelecek!)

FTC Programlama Hızlı Başlangıç kılavuzunu okuduğunuzdan emin olun.

Javadoc: [Javadoc Bağlantısı Yakında Gelecek]

Tam Örnekler Deposu: Limelight FTC Örnekler Deposu

Başarı İpuçları

  • Önce basit olanı yapın. FRC'de, en iyi yazılım takımlarının genellikle en basit yaklaşımları kullandığını öğrendik. Örneğin, FRC Takım 2056 2024'te oyun parçalarını izlemek için bir sinir ağı yerine standart 90FPS renk hattı kullandı.

Programlamaya başlarken soracağınız soru türüne bir örnek: Teleop'ta robotunuzun sahadaki konumunu bilmeniz mi gerekiyor, yoksa sadece belirli bir etikete odaklanana kadar yana kaymanız mı gerekiyor (strafeSpeed = result.getTx()*.03)?

Temel Kavramlar

1. Başlatma

Robot kodumuza Limelight3A'yı kurmamız gerekiyor.

import com.qualcomm.hardware.limelightvision.LLResult;
import com.qualcomm.hardware.limelightvision.LLResultTypes;
import com.qualcomm.hardware.limelightvision.LLStatus;
import com.qualcomm.hardware.limelightvision.Limelight3A;
Limelight3A limelight;

@Override
public void init() {
limelight = hardwareMap.get(Limelight3A.class, "limelight");
limelight.setPollRateHz(100); // Bu, Limelight'tan ne sıklıkla veri istediğimizi ayarlar (saniyede 100 kez)
limelight.start(); // Bu, Limelight'a bakmaya başlamasını söyler!
}

2. Hat Yönetimi

Hatlar, Limelight'ın dünyaya nasıl baktığını değiştiren küçük, anında değiştirilebilir programlar gibidir. Limelight web arayüzünde her biri farklı bir görev için 10 farklı hat kurabilirsiniz. İşte aralarında nasıl geçiş yaparsınız:

limelight.pipelineSwitch(0); // 0 numaralı hatta geç

Bu, unut-gitsin türünde bir işlemdir. Limelight hattını milisaniyeler içinde değiştirecektir, ancak kodunuz devam etmeden önce bunun için beklemeyecektir. Mevcut hat dizinini kontrol etmek istiyorsanız, şunu çağırın:

result.getPipelineIndex()

LLResult nesnesini almayı öğrenmek için bir sonraki bölüme bakın.

3. Sonuçları Alma ve Kullanma

LLResult, Limelight'ın gördükleri hakkında bilgi dolu bir kap gibidir. İşte bu bilgiyi nasıl alıp kullanacağımız:

LLResult result = limelight.getLatestResult();
if (result != null && result.isValid()) {
double tx = result.getTx(); // Hedef ne kadar sola veya sağa (derece)
double ty = result.getTy(); // Hedef ne kadar yukarı veya aşağı (derece)
double ta = result.getTa(); // Hedef ne kadar büyük görünüyor (görüntünün %0-%100'ü)

telemetry.addData("Hedef X", tx);
telemetry.addData("Hedef Y", ty);
telemetry.addData("Hedef Alanı", ta);
} else {
telemetry.addData("Limelight", "Hedef Yok");
}

4. Python SnapScripts ile İletişim

Web arayüzünde kendi Python SnapScript hatlarınızı yazabilirsiniz. Kodunuzu yazmanıza yardımcı olması için LLM tabanlı SnapScript oluşturucumuzu kullanın.

İşte Robot Kodundan Python'a sayılar gönderme ve geri alma yöntemi:

// Python'a sayılar gönderme
double[] inputs = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};
limelight.updatePythonInputs(inputs);

// Python'dan sayılar alma
double[] pythonOutputs = result.getPythonOutput();
if (pythonOutputs != null && pythonOutputs.length > 0) {
double firstOutput = pythonOutputs[0];
telemetry.addData("Python çıktısı:", firstOutput);
}

5. Robotum Nerede? (MegaTag 1)

Limelight, AprilTag'leri kullanarak robotunuzun sahada nerede olduğunu anlamanıza yardımcı olabilir. Limelight'ınız mevcut oyun için önceden yüklenmiş bir AprilTag Haritası ile gelir, ancak 3D Harita Oluşturucumuzu kullanarak kendi haritalarınızı tasarlayıp yükleyebilirsiniz.

Robotunuzun konumunu almaya çalışmadan önce şunları yapın:

  1. Web arayüzündeki AprilTag hattınızın "Gelişmiş" sekmesinde "Tam 3D"yi etkinleştirin.
  2. Kameranızı robotunuzun ayak izinin merkezine göre konumlandırmak için web arayüzünü kullanın.

botPose için koordinat sistemi, standart FTC koordinat sistemine uygundur.

  • (0,0,0) saha zemininin merkezidir
  • Elmas olmayan konfigürasyonlar için, 0 derece Yaw, mavi ittifakın robotunuzun sol tarafında ve kırmızı ittifakın sağ tarafında olduğu anlamına gelir.
if (result != null && result.isValid()) {
Pose3D botpose = result.getBotpose();
if (botpose != null) {
double x = botpose.getX();
double y = botpose.getY();
telemetry.addData("MT1 Konumu", "(" + x + ", " + y + ")");
}
}

6. Robotum Nerede? (MegaTag 2)

MegaTag 2, MegaTag 1'e benzer, ancak artan doğruluk için IMU verilerinizi birleştirir:

// Önce, Limelight'a robotunuzun hangi yöne baktığını söyleyin
double robotYaw = imu.getAngularOrientation().firstAngle;
limelight.updateRobotOrientation(robotYaw);
if (result != null && result.isValid()) {
Pose3D botpose_mt2 = result.getBotpose_MT2();
if (botpose_mt2 != null) {
double x = botpose_mt2.getX();
double y = botpose_mt2.getY();
telemetry.addData("MT2 Konumu:", "(" + x + ", " + y + ")");
}
}

7. İç Sonuç Türleri

Hatlarınızı nasıl yapılandırdığınıza bağlı olarak, ana LLResults Nesnesi içinde farklı türde ayrıntılı Sonuç Listelerine erişiminiz olacaktır.

Muhtemelen bu Sonuç Listelerini kullanmanız gerekmeyecektir. Mümkün olduğunca temel getTx(), getTy() kullanmanızı öneririz.

7.1 Renk Sonuçları

Renk sonuçları renkli hedefleri bulmaya yardımcı olur:

List<ColorResult> colorTargets = result.getColorResults();
for (ColorResult colorTarget : colorTargets) {
double x = detection.getTargetXDegrees(); // Nerede (sol-sağ)
double y = detection.getTargetYDegrees(); // Nerede (yukarı-aşağı)
double area = colorTarget.getTargetArea(); // boyut (0-100)
telemetry.addData("Renk Hedefi", "görüntünün %" + area + "'sini kaplıyor");
}

7.2 Fiducial/AprilTag Sonuçları

Fiducial'lar, Limelight'ın nerede olduğunu anlamasına yardımcı olan özel işaretlerdir (AprilTag'ler gibi):

List<FiducialResult> fiducials = result.getFiducialResults();
for (FiducialResult fiducial : fiducials) {
int id = fiducial.getFiducialId(); // Fiducial'ın ID numarası
double x = detection.getTargetXDegrees(); // Nerede (sol-sağ)
double y = detection.getTargetYDegrees(); // Nerede (yukarı-aşağı)
double StrafeDistance_3D = fiducial.getRobotPoseTargetSpace().getY();
telemetry.addData("Fiducial " + id, distance + " metre uzakta");
}

Her FiducialResult içindeki 3D poz bilgisini kullanmak istiyorsanız, aşağıdaki yöntemleri kullanabilirsiniz:

fiducial.getRobotPoseTargetSpace(); // AprilTag Koordinat Sistemine göre robot pozu (En Kullanışlı)
fiducial.getCameraPoseTargetSpace(); // AprilTag'e göre kamera pozu (kullanışlı)
fiducial.getRobotPoseFieldSpace(); // Sadece bu etikete dayalı olarak saha koordinat sistemindeki robot pozu (kullanışlı)
fiducial.getTargetPoseCameraSpace(); // Kameranın koordinat sistemindeki AprilTag pozu (çok kullanışlı değil)
fiducial.getTargetPoseRobotSpace(); // Robotun koordinat sistemindeki AprilTag pozu (çok kullanışlı değil)

7.3 Barkod Sonuçları

Limelight'ın barkod hattı QR Kodlarını tespit etmekte ve izlemekte iyidir.

List<BarcodeResult> barcodes = result.getBarcodeResults();
for (BarcodeResult barcode : barcodes) {
String data = barcode.getData(); // Barkodun söylediği
String family = barcode.getFamily(); // Ne tür bir barkod olduğu
telemetry.addData("Barkod", data + " (" + family + ")");
}

7.4 Sınıflandırıcı Sonuçları

Sinir Sınıflandırıcıları, Limelight'ın "Bunun ... görüntüsü olduğunu düşünüyorum" demesine olanak tanır.

List<ClassifierResult> classifications = result.getClassifierResults();
for (ClassifierResult classification : classifications) {
String className = classification.getClassName(); // Limelight'ın ne gördüğünü düşündüğü
double confidence = classification.getConfidence(); // Güven Puanı
telemetry.addData("Şunu görüyorum", className + " (%" + confidence + ")");
}

7.5 Dedektör Sonuçları

Dedektörler belirli nesneleri bulur ve nerede olduklarını söyler:

List<DetectorResult> detections = result.getDetectorResults();
for (DetectorResult detection : detections) {
String className = detection.getClassName(); // Ne tespit edildi
double x = detection.getTargetXDegrees(); // Nerede (sol-sağ)
double y = detection.getTargetYDegrees(); // Nerede (yukarı-aşağı)
telemetry.addData(className, "(" + x + ", " + y + ") derecede");
}

8. Veri Taze mi?

Bazen, sonuç verilerimizin yaşını (milisaniye cinsinden) bilmek isteriz.

long staleness = result.getStaleness();
if (staleness < 100) { // 100 milisaniyeden daha az eski
telemetry.addData("Veri", "İyi");
} else {
telemetry.addData("Veri", "Eski (" + staleness + " ms)");
}

9. Özel Saha Haritaları

Limelight'a özel saha düzeniniz hakkında bilgi verebilirsiniz:

LLFieldMap fieldMap = new LLFieldMap(); // Bunu saha verileriyle doldurmanız gerekecek
boolean success = limelight.uploadFieldmap(fieldMap, null); // null, varsayılan yuvayı kullan anlamına gelir
if (success) {
telemetry.addData("Saha Haritası", "Başarıyla yüklendi!");
} else {
telemetry.addData("Saha Haritası", "Hata, yükleme başarısız oldu");
}

10. Anlık Görüntü Alma:

Limelight, saha dışında hatları hata ayıklamanıza yardımcı olmak için anlık görüntüler alabilir:

limelight.captureSnapshot("auto_pov_10s");

Web arayüzünün Giriş Sekmesinde, hatlarınızı kontrol etmek/ayarlamak için bu anlık görüntüyü "görüntü kaynağı" olarak seçebilirsiniz.

Eski anlık görüntüleri temizlemek için:

limelight.deleteSnapshots();
telemetry.addData("Anlık Görüntüler", "Hepsi temizlendi!");