דלג לתוכן הראשי

מדריך תכנות FTC Java & Blockly

(תמונות Blockly יגיעו בקרוב!)

ודאו שקראתם את מדריך התחלה מהירה לתכנות FTC.

Javadoc: [קישור ל-Javadoc יגיע בקרוב]

מאגר דוגמאות מלא: מאגר דוגמאות Limelight FTC

טיפים להצלחה

  • עשו את הדבר הפשוט תחילה. ב-FRC, למדנו שצוותי התוכנה הטובים ביותר משתמשים לעתים קרובות בגישות הפשוטות ביותר. לדוגמה, קבוצת FRC 2056 בשנת 2024 השתמשה בצינור צבע סטנדרטי של 90FPS במקום ברשת נוירונים כדי לעקוב אחר חלקי המשחק.

הנה דוגמה לסוג השאלה שיש לשאול כשאתם מתחילים לתכנת: בטלאופ, האם אתם צריכים לדעת את מיקום הרובוט שלכם בשדה, או שאתם פשוט צריכים להסיט עד שהכוונת שלכם ממורכזת על תג ספציפי (strafeSpeed = result.getTx()*.03)?

מושגי מפתח

1. אתחול

אנחנו צריכים להגדיר את Limelight3A בקוד הרובוט שלנו.

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); // זה קובע כמה פעמים אנחנו מבקשים מידע מ-Limelight (100 פעמים בשנייה)
limelight.start(); // זה אומר ל-Limelight להתחיל להסתכל!
}

2. ניהול צינורות

צינורות הם כמו תוכניות קטנות, הניתנות להחלפה מיידית, המשנות את האופן שבו Limelight מסתכל על העולם. אתם יכולים להגדיר 10 צינורות שונים בממשק האינטרנט של Limelight, כל אחד למשימה שונה. הנה כיצד עוברים ביניהם:

limelight.pipelineSwitch(0); // עבור לצינור מספר 0

זוהי פעולת "שגר ושכח". Limelight ישנה את הצינור שלו תוך אלפיות שנייה, אך הקוד שלכם לא ימתין לכך לפני שימשיך. אם ברצונכם לבדוק את אינדקס הצינור הנוכחי, קראו ל-

result.getPipelineIndex()

ראו את הסעיף הבא כדי ללמוד על קבלת אובייקט LLResult.

3. קבלת ושימוש בתוצאות

LLResult הוא כמו מיכל מלא מידע על מה ש-Limelight רואה. הנה כיצד אנו משיגים ומשתמשים במידע זה:

LLResult result = limelight.getLatestResult();
if (result != null && result.isValid()) {
double tx = result.getTx(); // כמה רחוק שמאלה או ימינה המטרה (במעלות)
double ty = result.getTy(); // כמה רחוק למעלה או למטה המטרה (במעלות)
double ta = result.getTa(); // כמה גדולה המטרה נראית (0%-100% מהתמונה)

telemetry.addData("מטרה X", tx);
telemetry.addData("מטרה Y", ty);
telemetry.addData("שטח מטרה", ta);
} else {
telemetry.addData("Limelight", "אין מטרות");
}

4. תקשורת עם Python SnapScripts

אתם יכולים לכתוב צינורות Python SnapScript משלכם בממשק האינטרנט. השתמשו במחולל SnapScript מבוסס LLM שלנו כדי לעזור לכם לכתוב את הקוד שלכם.

הנה כיצד אתם שולחים מספרים מקוד הרובוט ל-Python ומקבלים מספרים בחזרה:

// שליחת מספרים ל-Python
double[] inputs = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};
limelight.updatePythonInputs(inputs);

// קבלת מספרים מ-Python
double[] pythonOutputs = result.getPythonOutput();
if (pythonOutputs != null && pythonOutputs.length > 0) {
double firstOutput = pythonOutputs[0];
telemetry.addData("פלט Python:", firstOutput);
}

5. איפה הרובוט שלי? (MegaTag 1)

Limelight יכול לעזור לגלות איפה הרובוט שלכם נמצא בשדה באמצעות AprilTags. ה-Limelight שלכם מגיע עם מפת AprilTag מותקנת מראש עבור המשחק הנוכחי, אך אתם יכולים לעצב ולהעלות מפות משלכם באמצעות בונה המפות התלת-ממדי שלנו.

לפני שתנסו לקבל את מיקום הרובוט שלכם, בצעו את הפעולות הבאות:

  1. הפעילו "Full 3D" בכרטיסיית "Advanced" של צינור AprilTag בממשק האינטרנט.
  2. השתמשו בממשק האינטרנט כדי למקם את המצלמה שלכם ביחס למרכז טביעת הרגל של הרובוט שלכם.

מערכת הקואורדינטות עבור botPose תואמת למערכת הקואורדינטות הסטנדרטית של FTC.

  • (0,0,0) הוא מרכז רצפת השדה
  • עבור תצורות שאינן יהלום, 0 מעלות Yaw פירושו שהברית הכחולה נמצאת בצד השמאלי של הרובוט שלכם, והברית האדומה נמצאת בצד הימני של הרובוט שלכם.
if (result != null && result.isValid()) {
Pose3D botpose = result.getBotpose();
if (botpose != null) {
double x = botpose.getX();
double y = botpose.getY();
telemetry.addData("מיקום MT1", "(" + x + ", " + y + ")");
}
}

6. איפה הרובוט שלי? (MegaTag 2)

MegaTag 2 הוא כמו MegaTag 1, אבל הוא משלב את נתוני ה-IMU שלכם לדיוק מוגבר:

// ראשית, ספרו ל-Limelight לאיזה כיוון הרובוט שלכם פונה
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:", "(" + x + ", " + y + ")");
}
}

7. סוגי תוצאות פנימיות

בהתאם לאופן שבו הגדרתם את הצינורות שלכם, תהיה לכם גישה לסוגים שונים של רשימות תוצאות מפורטות בתוך אובייקט ה-LLResults ההורה.

כנראה שלא תצטרכו להשתמש ברשימות תוצאות אלה. אנו ממליצים להשתמש ב-getTx(), getTy() הבסיסיים בכל פעם שאתם יכולים.

7.1 תוצאות צבע

תוצאות צבע עוזרות למצוא מטרות צבעוניות:

List<ColorResult> colorTargets = result.getColorResults();
for (ColorResult colorTarget : colorTargets) {
double x = detection.getTargetXDegrees(); // איפה זה (שמאל-ימין)
double y = detection.getTargetYDegrees(); // איפה זה (למעלה-למטה)
double area = colorTarget.getTargetArea(); // גודל (0-100)
telemetry.addData("מטרת צבע", "תופסת " + area + "% מהתמונה");
}

7.2 תוצאות Fiducial/AprilTag

Fiducials הם סמנים מיוחדים (כמו AprilTags) שעוזרים ל-Limelight להבין איפה הוא נמצא:

List<FiducialResult> fiducials = result.getFiducialResults();
for (FiducialResult fiducial : fiducials) {
int id = fiducial.getFiducialId(); // מספר הזיהוי של ה-fiducial
double x = detection.getTargetXDegrees(); // איפה זה (שמאל-ימין)
double y = detection.getTargetYDegrees(); // איפה זה (למעלה-למטה)
double StrafeDistance_3D = fiducial.getRobotPoseTargetSpace().getY();
telemetry.addData("Fiducial " + id, "נמצא " + distance + " מטרים רחוק");
}

אם ברצונכם להשתמש במידע התנוחה התלת-ממדית בתוך כל FiducialResult, תוכלו להשתמש בשיטות הבאות:

fiducial.getRobotPoseTargetSpace(); // תנוחת הרובוט ביחס למערכת הקואורדינטות של AprilTag (השימושי ביותר)
fiducial.getCameraPoseTargetSpace(); // תנוחת המצלמה ביחס ל-AprilTag (שימושי)
fiducial.getRobotPoseFieldSpace(); // תנוחת הרובוט במערכת הקואורדינטות של השדה בהתבסס על תג זה בלבד (שימושי)
fiducial.getTargetPoseCameraSpace(); // תנוחת AprilTag במערכת הקואורדינטות של המצלמה (לא מאוד שימושי)
fiducial.getTargetPoseRobotSpace(); // תנוחת AprilTag במערכת הקואורדינטות של הרובוט (לא מאוד שימושי)

7.3 תוצאות ברקוד

צינור הברקוד של Limelight טוב בזיהוי ומעקב אחר קודי QR.

List<BarcodeResult> barcodes = result.getBarcodeResults();
for (BarcodeResult barcode : barcodes) {
String data = barcode.getData(); // מה שהברקוד אומר
String family = barcode.getFamily(); // איזה סוג של ברקוד זה
telemetry.addData("ברקוד", data + " (" + family + ")");
}

7.4 תוצאות מסווג

מסווגים נוירונים מאפשרים ל-Limelight לומר "אני חושב שזו תמונה של...".

List<ClassifierResult> classifications = result.getClassifierResults();
for (ClassifierResult classification : classifications) {
String className = classification.getClassName(); // מה ש-Limelight חושב שהוא רואה
double confidence = classification.getConfidence(); // ציון ביטחון
telemetry.addData("אני רואה", className + " (" + confidence + "%)");
}

7.5 תוצאות גלאי

גלאים מוצאים אובייקטים ספציפיים ואומרים לנו איפה הם:

List<DetectorResult> detections = result.getDetectorResults();
for (DetectorResult detection : detections) {
String className = detection.getClassName(); // מה זוהה
double x