في بعض الأحيان يحتاج الروبوت إلى الاستيلاء على شيء ما. هذا الروبوت بدون عيون كما لو كان بلا يدين. بالمعنى الحرفي. بعد كل شيء ، ومع عدم معرفة أين تقع لذيذ ، لن يكون الروبوت قادرًا على الوصول إليه بأذرعه الآلية. أو غيرها من المتلاعبين.
في هذه المقالة سنكتشف كيفية معايرة الروبوت حتى نتمكن من التبديل بين نظام تنسيق الروبوت والكاميرا ثلاثية الأبعاد.
الخطوة 1. خذ الروبوتسيكون لدينا عناصر الخطوة Dobot الساحر. شاهد كيف سينتقل الكائنات - Intel Realsense D435. وسيكون كائن المعايرة كرة حمراء.
هذه هي الطريقة التي ننظر معا.

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

بالنسبة لصور الكرة ، لم يتم حساب إحداثياتها بعد. سوف نستخدم كائنًا تم اختياره جيدًا للمعايرة. نقوم بإعادة صياغة مهمة العثور على كرة كـ "العثور على أكبر منطقة حمراء" ، والتي تبدو على python + opencv مثل:
def get_center(image):
دعنا نلقي نظرة فاحصة.
بعد التحويل إلى مساحة HSV ، تبدو الصورة كما يلي:

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

الآن تحتاج إلى العثور على إحداثيات مركز الكرة. هناك طرق مختلفة ، على سبيل المثال ، يمكنك تخصيص النموذج ثلاثي الأبعاد للكرة إلى سحابة نقطة. ومع ذلك ، بالنسبة إلى realsense D435 ، فإن قيم العمق عند حدود الكائنات تكون صاخبة تمامًا ، لذلك سنذهب بطريقة مختلفة.
نحن نفترض أن الكرة هنا هي أكبر منطقة متصلة. ثم نجد مركزها ونكتشف عمق هذه النقطة على سطح الكرة من عمق القناة. ومع القليل من المساعدة من القياس الجزيئي ، دعنا ننتقل من النقطة المرئية على سطح الكرة إلى مركزها.
للعثور على مركز الكرة ، نستخدم المعرفة بأن الإسقاط يجب أن يكون دائرة ، ونريد الحصول على تقدير غير متحيز للمركز (لكن كوب الشفط في الروبوت يحاول منعنا). يكفي هنا العثور على دائرة من الحد الأدنى للمساحة التي تصف هذه المنطقة ، وقد تم تحديد ذلك بالفعل في opencv -
minEnclosingCircle .
بعد تلقي الإحداثيين 2 من النقطة u ، v بالبكسل والعمق بالملليمتر ، نترجمها إلى إحداثيات فعلية في الكاميرا SK:
def get_world_coords(u, v, depth, camera_matrix): f = np.linalg.inv(camera_matrix) l = np.array([u,v,1]) * depth return np.dot(f,l)
camera_matrix - مصفوفة المعلمات الداخلية للكاميرا ، وفقا
للصيغة .
الخطوة 4. أداء المعايرةفي الوقت الحالي ، تلقينا مجموعتين من النقاط لمواقع مختلفة في الفضاء: إحداثيات الجزء العلوي من الكرة - النقطة التي تمتص بها الكرة الروبوت في SK الروبوت ، وإحداثيات مركز الكرة المرئي - نقطة الكرة الأقرب إلى الكاميرا في SK. لمقارنتها ، تحتاج أولاً إلى إحضارها إلى نقطة جسدية واحدة من الكرة.
وأسهل طريقة هي ترجمة هذه النقاط إلى مركز الكرة. نقيس نصف قطرها ص = 24MM. ثم أصبح من الواضح كيفية الحصول على إحداثيات مركز الكرة
O من نقطة الظلال
K - اللمسة دائمًا أعلى نصف قطرها 1 على طول المحور
Z.يبقى ترجمة إحداثيات مركز
V للمنطقة المرئية إلى إحداثيات مركز الكرة
O. لشرح كيفية القيام بذلك ، استخدم الشكل:

اتضح أن المركز الحقيقي للكرة
O هو دائمًا نصف قطر أعمق من النقطة المرئية
V. هذا يعني أنه يجب تمديد متجه نصف القطر الموجود بمقدار 24 مم.
لا يزال قليلاً - وجود مجموعتين من الإحداثيات ثلاثية الأبعاد المقابلة للنقاط المادية نفسها ، ابحث عن تحول المجموعة الأولى إلى الثانية. سوف نستخدم الدالة opencv cv2.estimateAffine3D لهذا الغرض. بالنسبة للإحداثيات التي يتم العثور عليها بشكل مثالي ، فإن عملية التحول الخاص بالمحولات هي بالطبع تعداد ، من أجل وصف تحول النقاط ، يكون الدوران والتشريد كافيين ، وسيكون التمدد غير ضروري. ومع ذلك ، يتيح لك استخدام التحويل المحول إلى التعويض عن عدم الدقة بمصفوفة غير محسوبة بشكل جيد لمعلمات الكاميرا الداخلية. أكثر من ذلك ، فهو يتيح لك الحصول على معايرة دون معرفة ذلك على الإطلاق.
transformation = cv2.estimateAffine3D(camera_coords, robot_coords)
الإخراج هو مصفوفة تحويل 3 × 4 ، والمكونات 3 × 3 الأولى هي مصفوفة دوران جنبا إلى جنب مع تمديد على طول المحاور. مع معايرة الكاميرا الصحيحة وبيانات الإدخال الجيدة ، يجب أن تحصل على مصفوفة قريبة من مصفوفة الدوران. الأرقام الثلاثة المتبقية هي ناقل الإزاحة بين الكاميرا والروبوت.
الخطوة 5. نستخدم المعايرةمن أجل استخدام المعايرة التي تم الحصول عليها ، من الضروري تكرار التحولات المشار إليها. نأتي بهم إلى خوارزمية واحدة.
- نجد على صورة RGBD إحداثيات النقطة u ، v ، عمق الاهتمام بالنسبة لنا
- نترجمها إلى إحداثيات فعلية x ، y ، z في الكاميرا SK باستخدام مصفوفة المعلمات الداخلية
- في حالة وجود الكرة ، فإن النقطة التي تهمنا هي في عمق الكرة
- نحن نطبق تحول التحول الموجود ، والذي نشير إليه في المصفوفة T
- حصلنا على إحداثيات مركز الكرة في روبوت SK. حتى لا يحاول الروبوت اختراق الكرة ، نرسل نصف نقطة أعلى للتحكم
دقة المعايرةحسبنا المعايرة في 9 وظائف. في مجموعة تحقق من 6 مواقع أخرى ، تم الحصول على دقة 2.5 ملم مع مساحة عمل تبلغ 16 × 30 × 5. للقيام بذلك ، طبقنا التحويل الموجود على الصور المتبقية وحساب متوسط طول ناقل الخطأ.
الخطوة 6. نستخدمها في المهام المطبقةبعد الانتهاء من المعايرة ، يمكنك البدء في حل المشاكل الحقيقية. على سبيل المثال ، قمنا بتوصيل خوذة VR بوحدات التحكم وتمكنا من التحكم في الروبوت ونقل المكعبات في الواقع الافتراضي.
لكن طريقة المعايرة هذه عامة جدًا. لا يهم الكاميرا والروبوت المستخدمة ، فالطريقة الموضحة تجعل من السهل حساب العلاقة بين أنظمة الإحداثيات للروبوت والكاميرا. علاوة على ذلك ، في ظل التغييرات الطفيفة ، تكون الطريقة مستقلة بحيث يمكن للروبوت إجراء المعايرة تلقائيًا ، حيث ستتحرك الكاميرا بمرور الوقت بالنسبة للروبوت.
أنا و
Vasyutka و
ZlodeiBaal أخطط لمواصلة الحديث عن عالم الروبوتات ، VR والتعلم الآلي ، إذا كان ذلك مثيراً للاهتمام. ويمكن الاطلاع على مصادر المعايرة في بلدي
جيت .