نحن نعمل مع cobot Dobot M1

منذ عام مضى على Habré ، تم استعراض روبوت سطح المكتب Dobot Magician. في هذه المقالة ، أقترح تقييم أخيه الأكبر Dobot M1 أثناء العمل. سأحاول أيضًا شرح سبب اختيار هذا النموذج الخاص لمشروعي ، وسأصف عملية تطوير العرض التوضيحي في Qt / c ++ ، وكذلك بعض اللحظات غير السارة التي واجهتها أثناء عملية التطوير.

مقدمة


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

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

تجدر الإشارة إلى أننا قررنا أن نبدأ في تجميع الألواح الصغيرة بشكل أبسط وتجميعها. اللوحة الصغيرة هي أي لوحة شمسية أصغر من المعيار. ونحن نفعل هذا للعمل على العمليات التكنولوجية. أولاً ، تم إرشادي بلوحة بحجم خلية شمسية قياسية واحدة مع خطط تحجيم للوحة بحجم 2 × 2. حجم الجانب لخلية شمسية واحدة هو 16 سم ، وبناءً على ذلك ، كانت هناك حاجة إلى الروبوتات مع مجال وصول يبلغ 32 × 32 سم ، وكنت أرغب في دقة أكثر دقة وكان السعر أرخص . لذلك ، مسلحين بشريط البحث ، بدأت بدراسة الجمل. قررت أنه ليست هناك حاجة إلى 6 محاور للمشروع ، 4 كافية ، لذلك تم تضييق الخيار على الروبوتات مثل ندبة. لقد اكتشفت أن شراء الروبوتات الصناعية مصحوب بنفقات إضافية ، مثل تصميم مساحة عمل آمنة وترك مهندس التطبيق في موقع التثبيت ، الذي يقوم ببرمجة الروبوت لمهمتك. الروبوتات الصناعية الجيدة غالية الثمن من حيث المبدأ ، وخدمات المهندسين ستزيد من سعرها أكثر من ذلك ، علاوة على ذلك ، كان من المثير للاهتمام تنفيذ المشروع بنفسك. لذلك ، تقلص الاختيار إلى cobots ، والروبوتات التعاونية ، مع انخفاض متطلبات الأمان وأكثر ودية للنماذج الذاتية. لذلك ، وجدت شركة Dobot بسرعة. أسقطت على الفور الساحر Dobot بسبب الحجم والدقة ، وهو 100 ميكرون. لقد كتبت إليهم طلبًا لإعطاء المواصفات و أخبرني عن مكان الشراء. لقد اكتشفت أنه مع واجهات برمجة التطبيقات هناك واجهات برمجة التطبيقات ويمكن برمجتها في C ++. إنها مناسبة لي ، لكني لم أتمكن من شرائها مباشرةً. لحسن الحظ ، وجدت موردًا واحدًا في هولندا ، باع لي قطعتين مقابل 8700 يورو مع ضريبة القيمة المضافة ، مع خدمة التوصيل من الصين ، وفي نفس الوقت استولت على جميع عمليات التخليص الجمركي.

ملامح اللطف




تم وضع Dobot M1 كرجل آلي ذو 4 محاور وبأسعار معقولة. يمكن أن يتحمل ما يصل إلى 1.5 كجم من الحمل (لم يتم اختباره) ، ويصل مداها إلى 400 مم (وليس في كل مكان) ودقة تصل إلى 20 ميكرون (محددًا). يظهر مساحة العمل اللطف في الشكل أدناه. ليس من الصعب ملاحظة أنه نظرًا لميزات التصميم ، توجد منطقة عمياء يبلغ قطر نصف قطرها أقل قليلاً من 15 سم. علاوة على ذلك ، فإن خريطة الفضاء هذه لا تأخذ في الاعتبار اتجاه اليد. يمكن أن يكون Dotot إما أعسرًا أو يمينًا ، ما زلت لم أحسب كيف يمكن تشغيل هذا الأمر دون معايرة إضافية. بشكل افتراضي ، يتم Dobot باليد اليمنى ، مما يعني أن المنطقة اليمنى مقيدة بمساحة الوصول للمفصل الثاني ، عندما يتم توجيه المفصل الأول إلى اليمين. وبالتالي فإن المساحة الحقيقية لمساحة العمل هي حوالي 2/3 مما يظهر في الرسم الرسمي.



يحتوي Goodness على منافذ الإدخال / الإخراج: المدخلات والمخرجات الرقمية مع مستويات 24 فولت (المستويات الافتراضية عالية) ، وكذلك المدخلات التناظرية. أي نوع من ADC هناك ، لا أعرف. تتوفر المنافذ على اللوحة الخلفية في الحامل وعلى اليد نفسها للعمل مع الفتحات. لقد نسيت تصوير الموصل على الذراع نفسه ، لكنه نوع من الجهاز المركزي للمحاسبات. هناك أيضًا واجهة توسع يمكنك من خلالها شراء رسوم إضافية. يتصل Dobot بكمبيوتر شخصي عبر RS-232 أو عبر شبكة.



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

لاختبار جودة اللطف ، استخدمت برنامج M1Studio لنظام التشغيل Windows ، والذي تم تنزيله من موقع الشركة على الويب. لكن هذا كل شيء. علاوة على ذلك ، كنت مسلحًا بـ api و Qt ومحطة عمل مع دبابير أولية ، جلست لأكتب عرضًا تجريبيًا للعمل مع العديد من الصعود والهبوط.

نكتب التجريبي


في الواقع ، فإن العرض التوضيحي متاح بالفعل على جيثب . يمكن تنزيل وثائق واجهة برمجة التطبيقات وبروتوكول الاتصال من موقع الشركة المصنعة.

بادئ ذي بدء ، استخدمنا طريقة SearchDobot () من api ، والتي لم تظهر أي شيء في نظام Linux ، وعملت فقط في النوافذ إذا كانت dobot متصلة عبر RS-232. إنه أمر غريب ، لأن M1Studiya يعرّف dobotov بشكل مثالي عبر الشبكة. باستخدام عناوين IP المعروفة ، تعمل طريقة ConnectDobot () على ما يرام. أعتقد أنه على ما يرام ، سوف أقوم بإعداد جهاز التوجيه والسماح بإدخال عنوان IP على الخشخاش. في اليوم التالي فوجئت بحقيقة أن الشفقة لا تتفاعل. اتضح أنه عند تشغيله ، لدى dobot عنوان عشوائي للخشخاش. هذه إحدى ميزات البرنامج الثابت ، والتي تم إصلاحها في الإصدار الجديد في شهر مايو ، لكنني كنت أخشى تثبيتها.

مسلحة ببرنامج لتحليل حزم الشبكة ، اكتشفت أن Dobot يستجيب لطلب UDP للمنفذ 6000 بنص "WhoisDobotM1" استجابة UDP مع نص يحتوي على رقم Dobot للطراز. بناءً على ذلك ، تمت كتابة طريقة مخصصة ترسل الطلبات عبر الشبكة الفرعية بالكامل ، وفي حالة الاستجابة ، يتم تهيئة اللطف.

void MainWindow::on_buttonSearch_clicked() { QHostAddress host; QList<QHostAddress> list = QNetworkInterface::allAddresses(); for (int i=0; i<list.count(); i++) { if ((!list.at(i).isLoopback()) && (list.at(i).protocol() == QAbstractSocket::IPv4Protocol)) host = list.at(i); } QString subnet = host.toString().section('.',0,2) + "."; QByteArray data = "WhoisDobotM1"; QUdpSocket udpSocketSend; udpSocketSend.writeDatagram(data);//need tocall it otherwise in Win get socket doesn't open udpSocketSend.bind(host, 54321, QAbstractSocket::ShareAddress); udpSocketGet.bind(host, udpSocketSend.localPort(), QAbstractSocket::ShareAddress); connect(&udpSocketGet, &QUdpSocket::readyRead, this, &MainWindow::readUdpData); for (int i=1; i<255; i++) udpSocketSend.writeDatagram(data, 32, QHostAddress(subnet + QString::number(i)), 6000); } 

 void MainWindow::readUdpData() { while (udpSocketGet.hasPendingDatagrams()) { QNetworkDatagram data = udpSocketGet.receiveDatagram(); QByteArray ip = data.senderAddress().toString().toUtf8(); QString name = QString(data.data()).section('_',0,0); // cuts "dobotM1" from "dobotM1_Dobot M1_0033\x00" if (name == "dobotM1") { MyDobot* a = new MyDobot(); dobot->push_back(a); dobot->last()->initDobot(ip); ui->listDobots->addItem(ip); on_listDobots_activated(ui->listDobots->currentIndex()); } } } 

واجهة العرض التوضيحي بسيطة للغاية ويتم عرضها في الصورة أدناه.



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

 class MyDobot : public QObject { Q_OBJECT public: explicit MyDobot(QObject *parent = nullptr); ~MyDobot(); void initDobot(QByteArray IPaddress); Pose getCurrentPosition(); void goHomeSafe(); void goHome(); void goSafe(); void goPosition(float x, float y, float z, float r); void goPositionStraight(float x, float y, float z, float r); void goJog(int index); void setAirPump(int status, int direction); //status 1 off 0 on; direction 0 suck 1 push void setOutput(uint8_t address, uint8_t level); void setMotor(int velocity, int acceleration); alarmState getAlarms(); void clearAlarms(); void clearQueue(); QString getName(); public slots: private: char deviceSN[64]; char deviceName[64]; QByteArray thisDobotIP; Pose currentPosition, futurePosition; }; 

قررت استخدام ناقل مع عناصر من صفي للتحكم في dobot عندما يزيد عددهم عن 1. يحتوي كل عنصر من عناصر المتجه على متغير يقوم بتخزين عنوان IP للدوبوت. لأن المكتبة واحدة ، وهناك العديد من dobotov ، ثم في كل طريقة من طرق الفصل يجب عليك أولاً استدعاء طريقة الاتصال بـ dobot محددة. قد تبدو ملتوية ، لكن كل شيء تحت الغطاء ، ثم العمل مع هذه الفئة مريح للغاية.

 void MyDobot::setAirPump(int status, int direction) { ConnectDobot(thisDobotIP, 115200, nullptr, nullptr); ... 

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



يتم تطبيق مراقبة موضع Dobot باستخدام فئة Qtimer ، التي ترتبط إشارة Qtimer :: timeout الخاصة بي بطريقتي MainWindow :: on_getPoseTimer. يجب أن أعترف ، أن هذا هو الحل ، لأن التشغيل المتجاوب للتطبيق مع عمليات ups لا يكون ممكنًا إلا إذا قمت بتعيين مهلة قدرها 1000 مللي ثانية. مع توقيت أقصر ، تبدأ الهزات في الإحساس عند إدارة عمليات التشغيل. لقد لاحظت أنه في بعض الأحيان يمكن أن يكون dobot غبيًا لبعض الوقت عند تلقي أمر ، وإذا أرسلت أوامر كثيرًا ، فمن المحتمل أن يزداد احتمال الغباء. ربما يرجع ذلك إلى الدعوة المستمرة إلى ConnectDobot ، والتي قد تبدو غير ضرورية في هذا العرض التوضيحي ، ولكن تمت كتابة العرض التوضيحي بالتوازي مع المشروع الرئيسي ، وفي المشروع الرئيسي أحتاج حقًا إلى مثل هذا التنفيذ. ومع ذلك ، لمراقبة الاتصال لا يسمى في كل مرة ، ولكن تبقى مشكلة مع تعليق. للأسف ، لا توفر مهلة 1 ثانية مثل هذا القياس السلس لموضع اللطف في الفضاء ، والذي ، على سبيل المثال ، يتم تنفيذه في M1 Studio ، لكن ، من ناحية أخرى ، هذا غير مهم.

في نفس الطريقة ، يحدث طلب للأخطاء. في لطف api ، يتم تنفيذ نقل رمز الخطأ من خلال بنية AlarmState.

 struct alarmState { uint8_t value[32]; }; 

هذه البنية عبارة عن صفيف مكون من 8 بتات ، ويتم تشفير رمز الخطأ في التمثيل الثنائي لأحد عناصر الصفيف المتعددة. لحساب رمز الخطأ ، تحتاج إلى العثور على "1" في العنصر وإضافة رقم التصريف الخاص به (وحدة) إلى عناصر 8 * n (تحتوي على أو لا تحتوي على أخطاء أخرى) قبل ذلك في صفيف القيمة. نعم ، يمكن أن يكون هناك أكثر من خطأ في وقت واحد. بعد ذلك ، يجب العثور على رمز الخطأ في المستند ، والذي يتوفر للتحميل على موقع الشركة المصنعة. تم نسخ محتويات pdfk إلى ملف نصي ، والذي يتم تثبيته في المشروع كمورد. إذا كان رمز الخطأ يختلف عن 8 * 32 (بمعنى أنه لا يوجد خطأ) ، فسيظهر هذا الرمز في حقل الخطأ وبالضغط على زر المنبه يتم تحليل وصفه في الملف ، ثم يتم عرضه في حقل النص. بالمناسبة ، يتم فك تشفير الأخطاء وتحليلها خارج الفصل للتحكم في الصعود. هذا لا يبدو لي الآن الفكرة الصحيحة.

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

أفواج


في عملية استغلال Dobot ، واجهت بعض المشاكل.

  1. لا يتم عمل الثقوب الموجودة في الحامل في اتجاه الفتحات الموجودة في اللوح البصري القياسي. من ناحية أخرى ، عندما تصطدم لطفاتي عن طريق الخطأ ، عن طريق الخطأ ، انتقل أحدهما ببساطة حول محور الترباس المثبت ، والذي أعتقد أنه تجنب حدوث أضرار جسيمة.
  2. من الفقرة الأولى يتبع الثانية. بعد اصطدام Dobot ، تحولت محاورهم. لم يكن هذا مخيفًا في البداية ، لأنني كتبت طريقة لمعايرة محور Dobot بالنسبة إلى الكاميرا. حدث الشيء الرهيب في الفقرة 3.
  3. تحول المحور الرأسي أيضا والآن بلدي الطبيعي ليس طبيعيا. يمكن الكشف عن هذا بواسطة الكاميرا ، إذا قمت برسم عموديين مع النقاط. يمكنك التأكد من أنه بسبب العمودي المائل ، فإن dobot ترسم الآن بقلم ليس محاور X و Y الحقيقية ، ولكن توقعاتها. ويمكن أن يكون لهذه التوقعات زاوية أقل من 90 درجة. في الواقع ، هذا يؤدي إلى خطأ محاذاة صغير. من ناحية أخرى ، هذا ليس مخيفًا جدًا لأن الخطأ خطي.
  4. البرامج الثابتة Dobot ، من حيث المبدأ ، تقريبا. كان هناك دعامة صغيرة مع عنوان الخشخاش ، وهناك بعض المشاكل مع انتظار الردود على طلبات UDP ، ولكن خلاف ذلك فإنه يعمل بشكل جيد.
  5. يوفر التصميم بطارية ، وهي ضرورية للحفاظ على الإحداثيات الأخيرة بعد إيقاف تشغيل اللطف. عندما تموت البطارية ، ينخفض ​​التيار الكهربائي ، مما يمحو هذه البيانات. وبسبب هذا ، يتم تحميل dobot في حالة خطأ. للاستنتاج من هذه الحالات ، يجب عليك أولاً استدعاء طريقة مسح رسائل الخطأ ، ثم استدعاء طريقة البحث عن الموضع "home". يمكنك استبدال البطارية ، يتم تضمين الفائدة. ومع ذلك ، تم إخفاء البطارية في الحامل ، وللوصول إليها ، كان عليك فك 4 براغي. يتم إسقاط فتحة أحدهم.
  6. في مشروعي ، استخدمت 3 ألواح من الزجاج لزيادة مستوى الجدول. قرار جيد ، لأن الزجاج ملتوي. الحقيقة هي أن Dobot يبدأ في توليد الأخطاء عندما يكون للمحور العمودي قيمة أقل من 15 مم ، ويبدو أنه لا تتوفر جميع الوظائف. لذلك من الضروري أن توجد مساحة العمل أعلى مستوى مرفق Dobot.

استنتاج


سمحت لي Kindness بتنفيذ مشروع لتجميع الخلايا الشمسية في مقبس صغير مزين بالبلاط ، ويمكن رؤيته بالفيديو. تم التحقق من دقة تحديد الموضع على رقائق السيليكون نفسها وكانت بحد أقصى 1 بكسل على محور واحد و 10 بكسل في محور آخر. تم استخدام الكاميرا في هذا المشروع بدقة 20 ميجابكسل ، وكان مجال رؤية الكاميرا على طول الجانب الطويل حوالي 17 سم ، وليس من الصعب حساب أن 1 بكسل يتوافق مع حجم خطي حوالي 30 ميكرون. لقد حدث أن البصريات المستخدمة ، وإن كانت ذات جودة عالية ، تجعل من الممكن مراقبة رقائق السيليكون بشكل واضح فقط في وسطها ، في حين أن حواف الرقاقات تصبح ضبابية للغاية ، مما يؤدي إلى عدم اليقين في تحديد وجوهها على طول الجوانب القصيرة ، وبالتالي إلى عدم اليقين في تحديد مركز الرقاقة. بعد معايرة المحاور ، أضبط تركيز الكاميرا على الجوانب القصيرة للألواح. تجدر الإشارة إلى أنه ، من حيث المبدأ ، كان من المستحيل التركيز هناك كما هو الحال في مجال الرؤية ، ولكن لا يزال. بسبب هذا التأثير ، كان خطأ تحديد المواقع على طول المحور على طول الجانب الطويل للخلية الشمسية في حدود 10 بكسل ، ولكن فقط 1 بكسل على الجانب القصير. وهو ما يتوافق مع ما يقرب من 300 و 30 ميكرون. هذا سمح لي بالتحقق من سلامة المواصفات للتأكد من دقتها.

Source: https://habr.com/ru/post/ar467407/


All Articles