في وقت كتابة هذا التقرير ، كانت التكلفة النهائية المقدرة للمنتج حوالي 70000 روبل. إذا كان لديك طابعة ثلاثية الأبعاد ، فيمكنك خصم 20000 روبل منها بأمان. إذا لم تكن هناك طابعة ، فسيكون مظهرها مكافأة ممتعة. سأصف جميع النفقات على افتراض أنه ليس لدينا سوى المال. كيف
تبدو النتيجة:
تجدر الإشارة أيضًا إلى أنه لبرمجة اليد ، نحتاج إلى جهاز كمبيوتر مثبت عليه نظام التشغيل Linux OS (أنا أستخدم Ubuntu 18.04) وإطار عمل ROS (أنا أستخدم Melodic).
قد يطرح السؤال "لماذا 70 ألف روبل رخيصة؟"
أجيب.في البداية ، لم أكن أرغب في إنشاء ذراع آلية وفكرت في شراء شيء بسيط ، لكن وظيفي بدرجة كافية لتجميعه.
ما هي معايير الوظيفة والحد الأدنى من البساطة المقبولة بالنسبة لي (أي لماذا المتلاعبين من aliexpress غير مناسبين) يمكن مناقشته في التعليقات حتى لا يثقل كاهل الأشخاص الواضحين و / أو غير المهتمين.
حلول تنافسية في السوق
سأصف ، مع ذلك ، أمثلة موجزة لما فكرت فيه في السوق:
1) top3dshop.ru/robots/manipulators/dobot-magician-basic.html
176000 روبل. يمكنك شراء DOBOT ليس فقط من هذا المتجر ، ولكنه عادة ما يكون أكثر تكلفة. بالتأكيد هناك فرصة للعثور عليه في مكان ما أرخص ، لكنه سيظل أغلى بكثير من 70000 روبل.
2) robotbaza.ru/product/robot-manipulyator-widowx-robotic-arm-mark-ii
280.000 روبل. حتى أكثر تكلفة. بشكل عام ، فإن المتلاعبين من TossenRobotics مباشرة من الشركة المصنعة يكلفون أموالاً معقولة. لكن التسليم إلى روسيا (وكنت هنا) من متجرهم لا يمكن طلبه.
بالمضي قدماً قليلاً ، سأقول إننا سنصنع نسخة من PhantomX Pincher Robot Arm Kit Mark II ، التي تنتجها TossenRobotics.
في المجموع ، نرى أن 70000 روبل ليست باهظة الثمن على الإطلاق.
ماذا نحتاج للشراء؟
أقتبس جميع الأسعار في وقت كتابة هذا التقرير (يوليو 2020):
1) 6 محركات DYNAMIXEL AX-12A
اشتريتها بسعر 7200 روبل لقطعة واحدة ، لكن يبدو أنه يمكنك العثور عليها مقابل 6000 إذا كنت تريد ذلك حقًا. لنفترض أنك غير محظوظ وسوف تشتري أيضًا مقابل 7200.
التكلفة الإجمالية: 43200 روبل
2) طابعة ثلاثية الأبعاد
ستفعل أي طابعة بسيطة ، يمكنك الاحتفاظ بها في حدود 20000 روبل.
3) Arduino Uno + Power Shield
التكلفة: 4000 روبل تقريبًا
4) اختياري (لكنني أوصي بشدة):
تكلفة إمداد الطاقة للمختبر : 3500 روبل تقريبًا
المجسم
ممتاز! اشترينا كل ما نحتاجه (ربما أطول فترة انتظار لتسليم المحركات ، تم نقلها إلي لأكثر من شهر).
ماذا بعد؟
1) دعونا نطبع أجزاء المناور على طابعة ثلاثية الأبعاد.
قم بتنزيل ملفات STL من هنا
2) تجميعها مع المحركات. يجب ألا تكون هناك مشاكل في التجميع ، ولكن إذا ظهرت فجأة ، يمكنك استخدام هذه التعليمات.
صنع نموذج ثلاثي الأبعاد
صف دراسي! لدينا يد ، لكن يجب السيطرة عليها بطريقة ما. أود أن أحقق أقصى استفادة من إنجازات البشرية ، لذلك دعونا نثبت ROS لأنفسنا .
لكي تعمل بشكل كامل مع المعالج في ROS ، تحتاج إلى جعله نموذج URDF . سنحتاجه من أجل التحكم في الذراع الآلية باستخدام حزمة MoveIT!
في وقت كتابة هذا التقرير ، كان أحدث إصدار مستقر متاحًا لـ Melodic / Ubuntu 18.04 ، وهو ما يشرح اختياري للنظام وإصدار إطار العمل في بداية المقالة.
يعد بناء نموذج URDF جزءًا شاقًا إلى حد ما (وفي رأيي ، الجزء الأكثر مللاً) من هذا المشروع. من الضروري الانتهاء قليلاً من ملف stl لنماذج المكونات وربطها معًا في ملف على شكل XML ، واختيار المعاملات الصحيحة لإزاحة الأجزاء بالنسبة لبعضها البعض يدويًا.
أي شخص يريد القيام بالعمل بمفرده ، سأحفظ أعصاب الآخرين وأعطي رابطًا
لملفي النهائي: github.com/vladmiron85/armbot/blob/master/catkin_ws/src/armbot_description/urdf/base.urdf
هذا النموذج ليس مثيرًا بعد ومع ذلك ، حتى اللحظة لالتقاط الأشياء في العالم الحقيقي ، ما زلنا بعيدين. بالنسبة للمهام الأخرى ، يعد هذا النموذج أكثر من كافٍ.
النموذج يشبه هذا:
من ملف URDF الناتج ، سنقوم بإنشاء MoveIT! Config ، والذي سيسمح لنا بمحاكاة حركات المناول وإرسال أوامر التحكم إلى ذراع آلية حقيقية.
يوجد برنامج تعليمي ممتاز لإنشاء config ( رابط )
هنا يمكنني توفير الوقت مرة أخرى وتقديم ملف config. يقع هنا:
github.com/vladmiron85/armbot/tree/master/catkin_ws/src/armbot_moveit_config
يمكنك تنزيل التكوين من github وتشغيله باستخدام الأمر التالي:
roslaunch armbot_moveit_config demo.launch
شيء من هذا القبيل سيكون ممكنًا للتحكم في يدنا الآلية الحقيقية من خلال rviz عندما نربطها بـ ROS:
ماذا عن اليد الحقيقية؟
دعنا ننتقل من عالم النماذج ثلاثية الأبعاد إلى الواقع القاسي. لدينا مناور تم تجميعه مسبقًا. أود أن أنقله بطريقة ما. لنفعل ذلك باستخدام Arduino UNO و Power Shield. دعنا
نوصِّل المحرك الأول للمعالج (الموجود أدناه) بـ Power Shield ومزود الطاقة على النحو التالي:
نعم ، سنقوم بتوصيل دبوس بيانات المحرك مباشرةً بالدبابيس 3 و 4 في Arduino. سيلاحظ القارئ الفضولي لدليل Dynamixel (ها هو ) على الفور أن الاتصال بالعالم الخارجي في المحرك منظم وفقًا لاتصال تسلسلي غير متزامن نصف مزدوج ، مما يعني أنه يتم استخدام دبوس البيانات فورًا لتلقي الأوامر والاستجابة.
بشكل افتراضي ، على مستوى الأجهزة ، يمكن لـ Arduino العمل فقط مع Full Duplex UART. يمكن التحايل على هذه المشكلة باستخدام مكتبة Soft Serial ، وهو ما سنفعله. إن استخدام وضع Half Duplex هو الذي يشرح اتصال دبوس بيانات المحرك بالدبابيس 3 و 4 من الدرع في نفس الوقت.
بالإضافة إلى الاتصال أحادي الاتجاه ، فإن العمل مع Dynamixel عبر Arduino يحتوي على بضع نقاط مثيرة للاهتمام قد لا تكون واضحة تمامًا منذ البداية. دعونا نجمعهم جميعًا معًا.
كيف تحرك مناورنا؟
1) أولاً ، قم بتنزيل المكتبة المطلوبة. يطلق عليه ardyno ويمكن الحصول عليه من خلال Arduino Library Manager ، أو هنا ( رابط )
2) بشكل افتراضي ، تريد Dynamixel AX-12A العمل مع معدل الباود = 1000000. ومع ذلك ، لن تدعم واجهة البرنامج التسلسلي هذه السرعة ، لذلك يجب تقليل معدل البث بالباود إلى 57600. وبالتالي ، ستبدو بداية الملف مع برنامجك كما يلي:
#include "DynamixelMotor.h"
// communication baudrate
const long unsigned int baudrate = 57600;
SoftwareDynamixelInterface interface(3, 4);
3) جميع محركاتنا متصلة في سلسلة مع بعضها البعض. لذا ، من أجل معالجة كل منهم ، تحتاج إلى معرفة هويته؟ هذا هو الحال بالفعل ، يتلقى كائن DynamixelMotor معلمتين أثناء التهيئة: الواجهة (نفس الشيء بالنسبة للجميع ، قمنا بتعيينها في الفقرة السابقة) والمعرف (يجب أن يكون لكل شخص مختلف ، وإلا فسيكون سلوك المتلاعب غريبًا جدًا)
DynamixelMotor motor(interface, id);
يجب ضبط المعرف لكل محرك يدويًا. يبدو أنه ، من خلال الاتصال في سلسلة ، كان بإمكانهم حساب أنفسهم باستخدام الأرقام من 1 إلى 6 ، لكن هذا غير متوفر. لذلك ، تحتاج إلى توصيل كل محرك على حدة بـ Arduino (فصل من الباقي) وتشغيل البرنامج التالي:
#include "DynamixelMotor.h"
// communication baudrate
const long unsigned int baudrate = 57600;
// id of the motor
const uint8_t id=1;
SoftwareDynamixelInterface interface(3, 4);
DynamixelMotor motor(interface, id);
void setup()
{
interface.begin(baudrate);
delay(100);
// check if we can communicate with the motor
// if not, we turn the led on and stop here
uint8_t status=motor.init();
if(status!=DYN_STATUS_OK)
{
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
while(1);
}
motor.changeId(NEW_ID);
}
void loop()
{}
في البداية ، تحتوي جميع المحركات على معرف = 1 ، وهذا هو السبب في أننا نشير إلى الأعلى
const uint8_t id=1;
يجب استبدال NEW_ID لكل محرك برقم من 1 إلى 6 (نعم ، حسنًا ، ليس عليك لمس المحرك الأول). نقوم بترقيمها بالترتيب من الأسفل إلى الأعلى.
الصيحة! لدينا مناور كامل يمكننا تحريكه ، ولدينا أيضًا نموذج ثلاثي الأبعاد له. يمكنك أخذ ROS وبرمجة أي أشياء رائعة. لكن هذه قصة لمقال منفصل (وليست واحدة). انتهت هذه القصة ، شكرا لاهتمامكم!