5.28. رموز QR وعلامات AprilTags

الكواشف التي تناولناها حتى الآن -- الكتل والخطوط والدوائر والمستطيلات -- تعثر على ميزات هندسية: مواضع ومخططات يفسّرها مرحلة لاحقة. أما الكواشف المتبقية فتعثر على ميزات رمزية: أنماط مطبوعة وُجدت بنيتها البصرية تحديدًا لترميز حمولة. تحدد الكاميرا موقعها، ويقرأ فك التشفير البتات، وما يعود ليس موضعًا بل سلسلة نصية (أو مُعرّف) اختاره طابع الرمز عن قصد.

تهيمن عائلتان من هذا النوع على تطبيقات الكاميرات الصغيرة. تحمل رموز QR نصًا اعتباطيًا أو عناوين URL أو بطاقات تعريف أو حمولات ثنائية -- وهي رموز ثنائية الأبعاد موجّهة للمستهلك تظهر على الملصقات والتغليف وبطاقات الصعود إلى الطائرة. وتحمل علامات AprilTags مُعرّفًا رقميًا واحدًا من مجموعة ثابتة صغيرة، وتُفك بسرعة حتى من مسافة بعيدة، و(عند توفير الخصائص الداخلية للعدسة) تُبلّغ عن وضعية بستة درجات حرية في إطار الكاميرا -- وهي رموز ثنائية الأبعاد موجّهة للروبوتات تُعلّم بها الطائرات المسيّرة وأهداف المعايرة والعلامات المرجعية. يعيد كلا الكاشفين كائنات نتائج بنفس مفردات مربع الإحاطة التي يستخدمها كاشفا الكتل والمستطيلات، لكن الحمولة تجعلهما مختلفين حقًا عن أي شيء غطيناه حتى الآن.

5.28.1. رموز QR

تمسح الدالة find_qrcodes() الإطار بحثًا عن رموز QR وتعيد قائمة من كائنات النتائج QRCode:

codes = img.find_qrcodes()

for c in codes:
    img.draw_rectangle(c.rect, color=(0, 255, 0))
    for corner in c.corners:
        img.draw_circle((corner[0], corner[1], 4),
                        color=(0, 255, 0))
    print(c.payload)

يأخذ الكاشف وسيطًا اختياريًا واحدًا roi لتقييد البحث. ويحتاج إلى مدخلات بتدرج الرمادي -- إذ يُحوّل الإطار الملوّن داخليًا قبل فك التشفير.

يحمل كل كشف مربع الإحاطة (x وy وw وh وrect)، والزوايا الأربع المكتشفة (corners، وهي الشكل الرباعي الإسقاطي الذي ترسمه أنماط تحديد المواقع في رمز QR)، والحمولة المفكوكة كسلسلة نصية. والزوايا هي الشيء الصحيح للرسم عند التعليق على الكشف -- إذ إن رمز QR المرئي من زاوية مائلة ليس محاذيًا للمحاور ويمنح مربع الإحاطة مخططًا فضفاضًا فقط.

تغطي البيانات الوصفية لفك التشفير كل ما تعلّمه فاكّ رمز QR على طول الطريق. version هو إصدار رمز QR، من 1 إلى 40، والذي يحدد حجم شبكة الوحدات (رمز الإصدار 1 بعرض 21 وحدة، ورمز الإصدار 40 بعرض 177). وecc_level هو مستوى تصحيح الأخطاء (من 0 إلى 3 لـ L / M / Q / H)؛ تحجز المستويات الأعلى مزيدًا من كلمات الترميز لتصحيح الأخطاء وتتحمل مزيدًا من التلف على حساب مساحة حمولة أقل. وmask هو نمط القناع (من 0 إلى 7) الذي اختاره المُرمّز لتقليل التباس فاكّ التشفير. وdata_type هو الترميز الذي أبلغ عنه فاكّ التشفير -- رقمي أو أبجدي رقمي أو ثنائي أو كانجي -- وتُظهر الأعلام is_numeric / is_alphanumeric / is_binary / is_kanji القيمة نفسها كقيم منطقية أكثر سهولة.

eci هي قيمة تفسير القناة الموسّع، التي تحدد ترميز النص الذي توجد فيه البتات (UTF-8 وISO-8859-1 وما إلى ذلك). قد لا يكون رمز QR من مادة مطبوعة اعتباطية مضمونًا أنه UTF-8؛ والتطبيق الذي يحتاج إلى فك تشفير البتات بشكل صحيح يفحص eci ويفك التشفير وفقًا لذلك. وحالة كانجي على وجه الخصوص: لا تحلّل MicroPython ترميز كانجي، لذا يجب التعامل مع حمولة is_kanji كمصفوفة بايتات وفكّ تشفيرها بواسطة التطبيق.

استخدام نموذجي: تقرأ كاميرا رموز QR على ناقل وتُبلّغ المضيف بالحمولة المفكوكة. تشغّل الكاميرا find_qrcodes() مرة واحدة لكل إطار، وتتكرر على القائمة المُعادة، وتنتقي الرموز التي يطابق data_type الخاص بها ما يتوقعه التطبيق، وتُمرّر c.payload عبر UART أو USB. أما بيانات مربع الإحاطة والزوايا فمفيدة لمعاينة OpenMV IDE لكنها ليست ما يهتم به المضيف.

5.28.2. علامات AprilTags

تمسح الدالة find_apriltags() الإطار بحثًا عن علامات AprilTags وتعيد قائمة من كائنات النتائج AprilTag:

tags = img.find_apriltags(families=image.TAG36H11)

for t in tags:
    img.draw_rectangle(t.rect, color=(0, 255, 0))
    img.draw_cross(t.cx, t.cy, color=(0, 255, 0))
    print(t.id, t.decision_margin)

تختلف علامات AprilTags عن رموز QR في أهداف تصميمها. فرمز QR مبني لترميز بيانات اعتباطية في رمز واحد كثيف يقرؤه المستخدم مرة واحدة من مسافة قريبة. أما علامة AprilTag فمبنية لترميز مُعرّف صغير في رمز متناثر تقرؤه الكاميرا باستمرار من مسافة بعيدة، بأكبر قدر من تحمل الأخطاء يسمح به رمز هامينغ لعائلتها. وتظهر المفاضلة في الاتجاهين: يمكن لرمز QR حمل مئات البايتات لكنه يحتاج إلى قراءته من قرب؛ بينما تحمل علامة AprilTag بضع مئات فقط من المُعرّفات الفريدة لكنها تُقرأ بموثوقية من أمتار بعيدة.

تأخذ الكلمة المفتاحية families قناعًا بتّيًا لعائلات العلامات المراد فكها. العائلات المتاحة هي image.TAG16H5 وimage.TAG25H9 وimage.TAG36H10 وimage.TAG36H11 وimage.TAGCIRCLE21H7 وimage.TAGCIRCLE49H12 وimage.TAGCUSTOM48H12 وimage.TAGSTANDARD41H12 وimage.TAGSTANDARD52H13. تفاضل كل عائلة بين عدد المُعرّفات والمتانة. الرقم H في الاسم هو أدنى مسافة هامينغ بين أي رمزين في العائلة -- أي كم بتًا يجب أن ينقلب قبل أن يتحول رمز صالح إلى آخر -- إذ يملك TAG16H5 عدد 30 مُعرّفًا عند المسافة 5، وTAG25H9 عدد 35 مُعرّفًا عند المسافة 9، وTAG36H11 (الافتراضي والأكثر شيوعًا) عدد 587 مُعرّفًا عند المسافة 11. يصحح الكاشف ما يصل إلى خطأين بتّيين بغض النظر عن العائلة، لذا تحدد المسافة مدى خطورة ذلك التصحيح: فالنمط العشوائي في إطار مشوّش لا يحتاج إلا أن يقع ضمن بتّين من رمز صالح ليُفك ككشف خاطئ، والعائلات ذات المسافة الأعلى تنشر رموزها بتناثر أكبر بكثير بحيث تصبح مثل هذه التصادمات نادرة -- وهو السبب في كون TAG36H11 الخيار الموصى به. يتناسب زمن الكشف مع عدد العائلات المُفعّلة، لذا يُفعّل التطبيق فقط ما يطبعه فعليًا. والقناع البتّي هو عملية OR البتّية على ثوابت العائلات عند الحاجة إلى عدة عائلات في استدعاء واحد.

يحمل كل كشف مفردات مربع الإحاطة -- x وy وw وh وrect وarea ومراكز ثقل صحيحة ودون البكسلية (cx وcy وcxf وcyf) -- والزوايا الأربع المكتشفة (corners). ثم تأتي حقول التعريف: id هو المُعرّف الرقمي ضمن العائلة (من 0 إلى 586 لـ TAG36H11)، وfamily هو ثابت العائلة الرقمي، وname هو اسم العائلة كسلسلة نصية.

حقول جودة المطابقة هي ما يستخدمه التطبيق لتصفية الكشوف. decision_margin هو درجة ثقة من 0.0 إلى 1.0؛ الأعلى أفضل، وتصفية الكشوف الواقعة دون decision_margin > 0.1 تنظّف معظم النتائج الزائفة دون أي تكلفة. وhamming يَعُدّ الأخطاء البتّية التي قبلها فاكّ التشفير لهذه العلامة -- الأقل أفضل، حيث 0 يعني فكًا مثاليًا. وgoodness هو مقياس تاريخي لجودة الصورة لم يعد فاكّ التشفير الحالي يحسبه؛ فهو دائمًا 0.0 ويمكن تجاهله.

5.28.3. الوضعية من الخصائص الداخلية

السمة التحويلية للدالة find_apriltags()، تلك التي تبرر اعتماد علامات AprilTags كعلامة مرجعية مختارة في الروبوتات، هي أن الدالة تستطيع استرجاع وضعية العلامة بستة درجات حرية في إطار الكاميرا مباشرة من الزوايا المكتشفة ومجموعة صغيرة من خصائص المعايرة الداخلية. هذه الخصائص الداخلية هي البُعدان البؤريان للكاميرا على المحورين X وY بالبكسل (fx وfy) والمركز البصري بالبكسل (cx وcy)، وكلها الأربعة يقيسها التطبيق مرة واحدة بإجراء معايرة ثم يضمّنها بقيم ثابتة بعد ذلك.

عند توفير الخصائص الداخلية، تملأ النتيجة AprilTag المُعادة حقولها x_translation وy_translation وz_translation بموضع العلامة بالنسبة إلى الكاميرا، وحقولها x_rotation وy_rotation وz_rotation (والحقل المكرر rotation للتناظر) باتجاه العلامة. ومن دون الخصائص الداخلية، تكون الحقول الستة جميعها 0.0 ويتحمل التطبيق مسؤولية أي تقدير وضعية يحتاجه.

تُبلّغ حقول الإزاحة بوحدات عرض العلامة: إذ يعامل فاكّ التشفير العلامة كأنها بعرض وحدة واحدة، لذا يضرب التطبيق كل إزاحة في العرض الفيزيائي للعلامة المطبوعة للحصول على مسافات مترية. فعلامة مطبوعة بعرض 100 مم وتُبلّغ بـ z_translation = 8.3 تبعد 830 مم عن الكاميرا؛ والعلامة نفسها مطبوعة بعرض 50 مم على المسافة نفسها ستُبلّغ بـ z_translation = 16.6. أما حقول الدوران فبالراديان ولا تحتاج إلى أي قياس.

تقدير الوضعية هو الأساس لطيف واسع من تطبيقات الروبوتات: إرساء روبوت بمحطة شحن معلّمة بعلامة، وتتبع مسار نقاط مرجعية مطبوعة، واسترجاع الكاميرا لوضعيتها الخاصة من عدة علامات معروفة في البيئة. فالكاميرا التي تعرف الخصائص الداخلية، وترى علامة، ولديها موضع حقيقي للعلامة، يكون لديها بالحساب نفسه موضع حقيقي لنفسها.

5.28.4. متى تختار أيًا منهما

تحل رموز QR وعلامات AprilTags مشكلات مختلفة. ويعود الاختيار بينهما إلى ما يحمله الرمز المطبوع.

عندما يحتاج التطبيق إلى حمل بيانات اعتباطية عبر الرمز المطبوع -- عنوان URL أو سلسلة رقم تسلسلي أو سجل تعريف -- يكون رمز QR هو الخيار الصحيح. إذ تتسع مئات البايتات في رمز بحجم متواضع، والترميز عام ومدعوم على كل هاتف ذكي، ويتعامل فاكّ التشفير مع الدوران والتلف المعتدل والزوايا المائلة.

وعندما يحتاج التطبيق إلى مُعرّف صغير يُقرأ باستمرار من مسافة مع وضعية اختيارية -- علامة مرجعية على روبوت متحرك، أو هدف معايرة في غرفة، أو علامة إرساء على محطة شحن -- تكون علامة AprilTag هي الخيار الصحيح. فمئات المُعرّفات كافية تمامًا لحالة الاستخدام، ويتعافى رمز هامينغ من الأخطاء البتّية التي قد تهزم رمز QR، وتقدير الوضعية مجاني بمجرد معايرة الخصائص الداخلية.

تستخدم بعض التطبيقات كليهما: تعلّم علامة AprilTag موقعًا معروفًا ويحمل رمز QR مرتبط (مطبوع بجانبها) البيانات الوصفية حول ما يعنيه ذلك الموقع. يعمل الكاشفان بشكل مستقل على الإطار نفسه ويربط التطبيق بين مربعي إحاطتهما لمطابقة كل علامة برمزها المرافق.