حركية دلتا روبوت

دلتا الروبوت


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

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

ما هو روبوت الدلتا


تم اختراع روبوت دلتا ( ويكي ) في أوائل الثمانينيات من قبل العالم السويسري ريمون كلافيل ، وفيما يلي توضيح من براءة الاختراع الأصلية US4976582 عن "جهاز لنقل ووضع عنصر في الفضاء":

تصميم دلتا روبوت


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

في وسط المنصة السفلية (8) ، يسمى الجسم العامل (باللغة الإنجليزية يستخدم مصطلح المستجيب النهائي) للروبوت (9). قد يكون هذا عبارة عن معالج أو جهاز قبض أو ، على سبيل المثال ، جهاز بثق في حالة طابعة ثلاثية الأبعاد. بالإضافة إلى ذلك ، يمكن استخدام محرك آخر (11) ، والذي يوفر دوران جسم العمل عبر القضيب (14).

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

بيان المهمة


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

نحن إضفاء الطابع الرسمي على كلتا المهمتين. يمكن تمثيل كل من القاعدة الثابتة للروبوت ومنصته المتحركة كمثلثات متساوية الأضلاع: في الرسم البياني أدناه ، يتم رسمها باللون الأخضر والوردي ، على التوالي. يتم تحديد زوايا دوران أذرع الروبوت نسبة إلى المستوى الأساسي (وهي أيضًا زوايا دوران المحركات) على أنها Ѳ 1 و Ѳ 2 و Ѳ 3 وإحداثيات النقطة هي E 0تقع في وسط المنصة المتحركة حيث سيتم إصلاح ذراع الروبوت في الحياة الواقعية - مثل (x 0 ، y 0 ، z 0 ) .

دائرة دلتا دلتا


اتضح أننا يجب أن نخرج بوظيفتين:

  • f معكوس (x 0 ، y 0 ، z 0 ) → (Ѳ 1 ، Ѳ 2 ، Ѳ 3 ) لحل المشكلة الحركية العكسية و
  • f إلى الأمام1 ، Ѳ 2 ، Ѳ 3 ) → (x 0 ، y 0 ، z 0 ) لحل المشكلة الحركية المباشرة.

الكينماتيكا العكسية


دعونا نضع بعض المعلمات الرئيسية التي تحددها الأبعاد الهندسية للروبوت لدينا:

تعيينات الأبعاد لدلتا روبوت


دعونا نشير إلى طول جانب القاعدة العليا f ، وجانب المنصة السفلية e ، وطول الذراع العلوي للرافعة r f وطول الذراع السفلي (الجانب الطويل من متوازي الأضلاع) r e . للحسابات ، نختار نظام إحداثيات بنقطة مرجعية تتزامن مع المركز الهندسي للمثلث العلوي. سيتم توجيه المحور Z إلى أعلى ، وبالتالي فإن إحداثيات z للمنصة المتحركة ستكون سلبية دائمًا.

يشير تصميم الروبوت إلى أن الرافعة F 1 J 1 (انظر الشكل أدناه) يمكن أن تدور فقط في المستوى YZ ، بينما تصف دائرة نصف قطرها r f متمركزة في نقطةF 1 (في هذا المكان يتم توصيله بالمحرك). على عكس F 1 ، تستخدم العقدتان J 1 و E 1 مفاصل عالمية ، بفضلها يمكن للكتف E 1 J 1 أن يدور بحرية بالنسبة إلى E 1 ، يصف كرة نصف قطرها r e متمركزة عند النقطة E 1 .



تقاطع هذا المجال والمستوى YZ عبارة عن دائرة متمركزة عند النقطة E ' 1 من نصف القطر E' 1 J 1 ، حيث تقع النقطة E ' 1 كإسقاط للنقطة E 1 على المستوى YZ . ثم ستكون النقطة J 1 عند تقاطع دائرتين مع مراكز عند النقطتين E ' 1 و F 1 ، ويمكننا تحديد نصف قطر هذه الدوائر. هناك دقة طفيفة: تتقاطع الدوائر عند نقطتين ، لكننا مهتمون بإحدىها فقط - مع قيمة أصغر للإحداثيات y، لأننا نريد ذراعي الروبوت أن تخرج دائمًا "أكواع". بعد تحديد إحداثيات النقطة J 1 ، يمكننا بسهولة العثور على الزاوية 1 التي تهمنا .

لسهولة الإدراك ، يتم عرض إسقاط صورتنا ثلاثية الأبعاد على مستوى YZ أدناه :



المنصة السفلية عبارة عن مثلث متساوي الأضلاع ، مركزه هو النقطة E 0 (x 0 ، y 0 ، z 0 ) . يعني المسافة

E_0E_1 = {e \ over2} \ tan (30 ^ o) = {e \ over2 \ sqrt3} ،

الذي يعطينا الإحداثيات التالية للنقطة E 1 وإسقاطها E ' 1 على الطائرة YZ :

E_1 (x_0 ، y_0- {e \ over2 \ sqrt3} ، z_0) \ Rightarrow E'_1 (0 ، y_0- {e \ over2 \ sqrt3} ، z_0)

المسافة E 1 E ' 1 = x 0 ، إذن ، وفقًا لنظرية فيثاغورس ،

E'_1J_1=\sqrt{E_1J_1^2-E_1E'_1^2}=\sqrt{r_e^2-x_0^2}


نظرًا لأن المنصة العلوية هي أيضًا مثلث متساوي الأضلاع ، فإن إحداثيات النقطة F 1 ستكون

F_1(0, {-f\over{2\sqrt3}}, 0)

لإيجاد إحداثيات النقطة J 1 ، وهي تقاطع دائرتين ، من الضروري حل نظام المعادلات:

\begin{equation*}
 \begin{cases}
   (y_{J_1}-y_{F_1})^2+(z_{J_1}-z_{F_1})^2 = r_f^2
   \\
   (y_{J_1}-y_{E'_1})^2+(z_{J_1}-z_{E'_1})^2 = r_e^2-x_0
 \end{cases}
\end{equation*}


نعرف إحداثيات مراكز الدوائر إذا استبدلناها نحصل على التعبير التالي:

\begin{equation*}
 \begin{cases}
   (y_{J_1}+{f\over{2\sqrt3}})^2+z_{J_1}^2 = r_f^2
   \\
   (y_{J_1}-y_0+{e\over{2\sqrt3}})^2+(z_{J_1}-z_0)^2 = r_e^2-x_0
 \end{cases}
\end{equation*}


إذا قمنا بفتح الأقواس وطرح معادلة من الأخرى ، يمكننا التعبير خطياً عن إحداثيات z للنقطة J 1 من حيث إحداثيات y ، وبعد ذلك ، استبدالها في المعادلة الثانية ، نحصل على المعادلة التربيعية المعتادة لـ y ، والتي نختار منها الحلين الأصغر (المزيد عن هذا تحدثنا أعلاه). وبالتالي الحصول على إحداثيات النقطة J 1 ، نجد الزاوية

\theta_1=\arctan\left({z_{J_1}\over{y_{F_1}-y_{J_1}}}\right)


اتضح أن جميع التعبيرات بسيطة للغاية بسبب الاختيار الناجح لنظام الإحداثيات: ذراع الرافعة F 1 J 1 يتحرك دائمًا في مستوى YZ ، لذلك يمكننا ببساطة تجاهل إحداثيات x . للحفاظ على هذه الميزة عند العثور على الزاويتين المتبقيتين Ѳ 2 و Ѳ 3 ، نستخدم تناظر بناء روبوت دلتا. أولاً ، أدر نظام الإحداثيات الخاص بنا 120 درجة بعكس اتجاه عقارب الساعة في المستوى XY حول المحور Z :



لقد حصلنا على نظام إحداثيات جديد X'Y'Z ، وفي هذا النظام الجديد يمكننا استخدام صيغنا الجاهزة لإيجاد الزاوية Ѳ 2 . الدقيقة الوحيدة هي أنه يجب علينا أولاً إعادة حساب إحداثيات النقطة E 0 في الإطار المرجعي الجديد. يتم ذلك بسهولة باستخدام الصيغة المعروفة (التحولات عندما يدور النظام حول الأصل) ، كما هو موضح في الشكل أعلاه. لإيجاد الزاوية Ѳ 3سيكون من الضروري أيضًا تدوير النظام المرجعي الأصلي ، ولكن الآن في اتجاه عقارب الساعة. يتم تنفيذ هذه التقنية بشكل مريح للغاية في شكل برنامج: يكفي كتابة دالة لحساب الزاوية Ѳ في المستوى YZ ، ثم استدعاءها ثلاث مرات لكل من الزوايا والأنظمة المرجعية.

الكينماتيكا المباشرة


دعنا نحاول حل المشكلة العكسية: الآن نعرف الزوايا Ѳ 1 و Ѳ 2 و Ѳ 3 ، ونريد أن نجد الإحداثيات (x 0 ، y 0 ، z 0 ) للنقطة E 0 الموجودة في مركز المنصة المتحركة للروبوت الخاص بنا. بمعرفة الزوايا ، يمكننا بسهولة العثور على إحداثيات النقاط J 1 و J 2 و J 3 (انظر الشكل أدناه). أكتاف الرافعة J 1 E 1 و J 2 E 2 و J 3 Eيمكن أن يدور 3 بحرية حول النقاط J 1 و J 2 و J 3 على التوالي ، مشكلين في الفضاء ثلاث دوائر مع نصف قطر r e .



نستخدم تقنية صعبة: نزيح مراكز كل من هذه المجالات من النقاط J 1 و J 2 و J 3 في المستوى XY في اتجاه المحور Z ، باستخدام ناقلات الإزاحة E 1 E 0 و E 2 E 0 و E 3 E 0 على التوالي (في الشكل الذي تظهر كسهام حمراء). بعد هذا التحول ، اتضح أن المجالات الثلاثة تتقاطع عند النقطة E 0 ، كما هو موضح في الشكل أدناه:



اتضح أنه لتحديد الإحداثيات (x 0 ، y 0 ، z 0 ) للنقطة E 0 ، يجب أن نجد نقطة التقاطع لثلاث مجالات ، نصف قطر وإحداثيات المراكز التي نعرفها. بعبارة أخرى ، نحتاج إلى حل نظام من ثلاث معادلات تصف المجالات ثلاثية الأبعاد:

(x-x_i)^2 + (y-y_i)^2 + (z-z_i)^2 = r_e^2,

حيث (x i ، y i ، z i ) هي إحداثيات مراكز الكرات J ' 1 و J' 2 و J ' 3 ، والتي يمكن العثور عليها على النحو التالي:



أدناه ، لتقصير الترميز ، سأستخدم الترميز (x 1 ، y 1 ، z 1 ) ، (x 2 ، y 2 ، z 2 ) و (x 3 ، y كتنسيق إحداثيات النقاط J ' 1 ، J' 2 و J ' 3 3 ، z 3 ) ، على التوالي. أريد أيضًا ملاحظة أن x 1 = 0 (نظرًا لأن النقطة J ' 1 موجودة في المستوى YZ ). نحصل على نظام المعادلات التالي:

\begin{equation*}
 \begin{cases}
   x^2+(y-y_1)^2+(z-z_1)^2 = r_e^2
   \\
   (x-x_2)^2+(y-y_2)^2+(z-z_2)^2 = r_e^2
   \\
   (x-x_3)^2+(y-y_3)^2+(z-z_3)^2 = r_e^2
 \end{cases}
\end{equation*}
\Rightarrow
\begin{equation*}
 \begin{cases}
   x^2+y^2+z^2-2y_1y-2z_1z=r_e^2-y_1^2-z_1^2
   \\
   x^2+y^2+z^2-2x_2x-2y_2y-2z_2z=r_e^2-x_2^2-y_2^2-z_2^2
   \\
   x^2+y^2+z^2-2x_3x-2y_3y-2z_3z=r_e^2-x_3^2-y_3^2-z_3^2
 \end{cases}
\end{equation*}


نحن نقدم الترميز

w_i=x_i^2+y_i^2+z_i^2


وطرح الثاني والثالث من المعادلة العليا ، وكذلك الثالث من الثاني ، نحصل على:

\begin{equation*}
 \begin{cases}
   x_2x+(y_1-y_2)y+(z_1-z_2)z=(w_1-w_2)/2
   \\
   x_3x+(y_1-y_3)y+(z_1-z_3)z=(w_1-w_3)/2
   \\
   (x_2-x_3)x+(y_2-y_3)y+(z_2-z_3)z=(w_2-w_3)/2
 \end{cases}
\end{equation*}


بطرح الثانية من المعادلة الأولى (وبالتالي تقليل y ) والثالثة من الثانية (تقليل x ) ، يمكننا التعبير عن x و y من حيث z :

x=a_1z+b_1\qquad y=a_2z+b_2


a_1={1\over{d}}\left[(z_2-z_1)(y_3-y_1)-(z_3-z_1)(y_2-y_1)\right] \qquad a_2=-{1\over{d}}\left[(z_2-z_1)x_3-(z_3-z_1)x_2\right]


b_1 = - {1 \ over {2d}} \ left [(w_2-w_1) (y_3-y_1) - (w_3-w_1) (y_2-y_1) \ right] \ qquad b_2 = {1 \ over {2d}} \ يسار [(w_2-w_1) x_3- (w_3-w_1) x_2 \ right]


د = (y_2-y_1) x_3- (y_3-y_1) x_2


الآن ، باستبدال x و y ، المعبر عنهما z ، في معادلة الدائرة الأولى (متمركزة عند النقطة J ' 1 ) ، نحصل على:

(a_1 ^ 2 + a_2 ^ 2 + 1) z ^ 2 + 2 (a_1 + a_2 (b_2-y_1) -z_1) z + (b_1 ^ 2 + (b_2-y_1) ^ 2 + z_1 ^ 2-r_e ^ 2) = 0


يبقى حل هذه المعادلة التربيعية (بالطريقة القياسية ، من خلال التمييز) لإيجاد z (نتذكر أنه يجب علينا اختيار أصغر من z !) ، ومن خلالها x و y .

أمثلة كود المصدر


فيما يلي أمثلة على وظائف حساب الكينماتيكا لروبوت دلتا في C. تتوافق أسماء المتغيرات مع الترميز المستخدم في المقالة والزوايا theta1، theta2ويتم theta3الإشارة إليها بالدرجات.

//  
// ( .  )
const float e = 115.0;     //   
const float f = 457.3;     //   
const float re = 232.0;
const float rf = 112.0;

//  
const float sqrt3 = sqrt(3.0);
const float pi = 3.141592653;    // PI
const float sin120 = sqrt3/2.0;
const float cos120 = -0.5;
const float tan60 = sqrt3;
const float sin30 = 0.5;
const float tan30 = 1/sqrt3;

//  : (theta1, theta2, theta3) -> (x0, y0, z0)
//  : 0=OK, -1= 
int delta_calcForward(float theta1, float theta2, float theta3, float &x0, float &y0, float &z0) {
    float t = (f-e)*tan30/2;
    float dtr = pi/(float)180.0;

    theta1 *= dtr;
    theta2 *= dtr;
    theta3 *= dtr;

    float y1 = -(t + rf*cos(theta1));
    float z1 = -rf*sin(theta1);

    float y2 = (t + rf*cos(theta2))*sin30;
    float x2 = y2*tan60;
    float z2 = -rf*sin(theta2);

    float y3 = (t + rf*cos(theta3))*sin30;
    float x3 = -y3*tan60;
    float z3 = -rf*sin(theta3);

    float dnm = (y2-y1)*x3-(y3-y1)*x2;

    float w1 = y1*y1 + z1*z1;
    float w2 = x2*x2 + y2*y2 + z2*z2;
    float w3 = x3*x3 + y3*y3 + z3*z3;

    // x = (a1*z + b1)/dnm
    float a1 = (z2-z1)*(y3-y1)-(z3-z1)*(y2-y1);
    float b1 = -((w2-w1)*(y3-y1)-(w3-w1)*(y2-y1))/2.0;

    // y = (a2*z + b2)/dnm;
    float a2 = -(z2-z1)*x3+(z3-z1)*x2;
    float b2 = ((w2-w1)*x3 - (w3-w1)*x2)/2.0;

    // a*z^2 + b*z + c = 0
    float a = a1*a1 + a2*a2 + dnm*dnm;
    float b = 2*(a1*b1 + a2*(b2-y1*dnm) - z1*dnm*dnm);
    float c = (b2-y1*dnm)*(b2-y1*dnm) + b1*b1 + dnm*dnm*(z1*z1 - re*re);

    // 
    float d = b*b - (float)4.0*a*c;
    if (d < 0) return -1; //  

    z0 = -(float)0.5*(b+sqrt(d))/a;
    x0 = (a1*z0 + b1)/dnm;
    y0 = (a2*z0 + b2)/dnm;
    return 0;
}

//  
//  ,   theta1 (  YZ)
int delta_calcAngleYZ(float x0, float y0, float z0, float &theta) {
    float y1 = -0.5 * 0.57735 * f; // f/2 * tg 30
    y0 -= 0.5 * 0.57735 * e;       //    
    // z = a + b*y
    float a = (x0*x0 + y0*y0 + z0*z0 +rf*rf - re*re - y1*y1)/(2*z0);
    float b = (y1-y0)/z0;
    // 
    float d = -(a+b*y1)*(a+b*y1)+rf*(b*b*rf+rf);
    if (d < 0) return -1; //  
    float yj = (y1 - a*b - sqrt(d))/(b*b + 1); //   
    float zj = a + b*yj;
    theta = 180.0*atan(-zj/(y1 - yj))/pi + ((yj>y1)?180.0:0.0);
    return 0;
}

//  : (x0, y0, z0) -> (theta1, theta2, theta3)
//  : 0=OK, -1= 
int delta_calcInverse(float x0, float y0, float z0, float &theta1, float &theta2, float &theta3) {
    theta1 = theta2 = theta3 = 0;
    int status = delta_calcAngleYZ(x0, y0, z0, theta1);
    if (status == 0) status = delta_calcAngleYZ(x0*cos120 + y0*sin120, y0*cos120-x0*sin120, z0, theta2);  // rotate coords to +120 deg
    if (status == 0) status = delta_calcAngleYZ(x0*cos120 - y0*sin120, y0*cos120+x0*sin120, z0, theta3);  // rotate coords to -120 deg
    return status;
}

الأدب المستخدم


أخذت كل الأفكار الرئيسية حول الكينماتيكا لروبوت دلتا من عمل البروفيسور. Paul Zsombor-Murray " التحليل الحركي الهندسي الوصفي لروبوت دلتا" Clavel . أعترف بصدق أن تدريبي الرياضي لم يكن كافياً لفهمه حتى النهاية ، لذلك كان يجب أن أستنتج الكثير من نفسي.

الخلاصة


شكرا لكل من قرأ هذا المقال حتى النهاية. آمل أن يكون شخصًا مفيدًا وملهمًا لإنشاء إصداراتهم الخاصة من روبوت دلتا.

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


All Articles