نحيا السداسي. الجزء الثالث

كما أظهرت الممارسة ، فإن وفرة الشفرة في المقالة لا تؤثر على سهولة قراءتها. ولكن لفهم كيفية عمل كل شيء ، يكلفك أحيانًا إجهاد عقلك. ما الهدف من المنشور السابق. اليوم سأحاول إكمال سلسلة من المقالات حول حشو برامج hexapod بإعطاء لمحة موجزة عما لم نتعرف عليه.

دورة المقالات السابقة:


كيف قمنا بطباعة السداسي وماذا حصل
ونحيي السداسي. الجزء الأول
نعيد إحياء السداسي. الجزء الثاني

ترتيب


يتم تعريف الخصائص الفيزيائية للروبوت في البرنامج كمجموعة من معلمات التكوين ونقلها إلى ملف تكوين منفصل config.h . من بين هذه المعلمات ، يمكن تمييز المجموعات الرئيسية التالية:

مقاسات الأطراف وخصائص حركتهم
المعرفميزة الوصف
COXA_LENGTHطول الكتف (مم)
FEMORA_LENGTHطول الفخذ (مم)
TIBIA_LENGTHطول شين (مم)
TIBIA_OFFSET()
COXA_ANGLE_0()
FEMORA_ANGLE_0()
TIBIA_ANGLE_0()
COXA_ANGLE_INVERSE
FEMORA_ANGLE_INVERSE
TIBIA_ANGLE_INVERSE


موقع وتوجيه أطراف الروبوت بالنسبة لمركزه
LEFT_FRONT_FOOT_POSITION
LEFT_MIDLE_FOOT_POSITION
LEFT_BACK_FOOT_POSITION
RIGTH_FRONT_FOOT_POSITION
RIGTH_MIDLE_FOOT_POSITION
RIGTH_BACK_FOOT_POSITION
LEFT_FRONT_FOOT_ROTATION
LEFT_MIDLE_FOOT_ROTATION
LEFT_BACK_FOOT_ROTATION
RIGTH_FRONT_FOOT_ROTATION
RIGTH_MIDLE_FOOT_ROTATION
RIGTH_BACK_FOOT_ROTATION


نطاقات زاوية مسموح بها لمحركات المؤازرة
COXA_MIN_ANGLE
COXA_MAX_ANGLE
FEMORA_MIN_ANGLE
FEMORA_MAX_ANGLE
TIBIA_MIN_ANGLE
TIBIA_MAX_ANGLE
COMPLEX_ANGLE_LIMITS_1
MIDLE_COXA_MIN_ANGLE
MIDLE_COXA_MAX_ANGLE


خصائص حركة الروبوت
MOTION_JOB_PERIOD()
MOVE_STEP()
ROTATE_STEP()


الرياضيات


لحساب الكينماتيكا الأمامية والعكسية للروبوت ، يلزم حساب المتجهات والمصفوفة. يتم ذلك باستخدام فئتي Vector3D و Matrix3D المعلن عنها في 3d_math.h

بناء Vector3D
struct Vector3D {
  float x,y,z;

  Vector3D operator -(void) {
    return {-x, -y ,-z};
  }                        

  Vector3D& operator=(const Vector3D a);
  
  float len();
};


هيكل Matrix3D
struct Matrix3D {
  float a[3][3];

  Vector3D operator *(Vector3D& v) {
    Vector3D p;
    p.x = v.x*a[0][0] + v.y*a[0][1] + v.z*a[0][2];
    p.y = v.x*a[1][0] + v.y*a[1][1] + v.z*a[1][2];
    p.z = v.x*a[2][0] + v.y*a[2][1] + v.z*a[2][2];
    return p;
  };                                               

  Matrix3D operator *(Matrix3D m) {
    Matrix3D r;
    for(int i=0; i<3; i++) {
      for(int j=0; j<3; j++) {
        r.a[i][j] = 0;
        for(int k=0; k<3; k++)
          r.a[i][j] += a[i][k]*m.a[k][j];
      }
    }
    return r;
  };
};

عامل التحميل الزائد ووظائف المساعد
Vector3D operator +=(Vector3D left, const Vector3D right);
Vector3D operator -=(Vector3D left, const Vector3D right);
Vector3D operator- (Vector3D a, Vector3D b);
Vector3D operator+ (Vector3D a, Vector3D b);
Vector3D operator* (Vector3D a, Vector3D b);
Vector3D operator* (float a, Vector3D b);
Vector3D operator* (Vector3D a, float b);
Vector3D operator/ (Vector3D a, int b);
//        r = {rx, ry, rz}
Matrix3D rotMatrix(Vector3D r);  //   
Matrix3D rotMatrix2(Vector3D r);  //   
//  
float arcctn(float);


مصدر الرمز


جميع ملفات المصدر متاحة الآن على GitHub . هناك يمكنك العثور على مسودة التطبيق لنظام Android ونماذج للطباعة ثلاثية الأبعاد. يتكون قسم اردوينو من قسمين:

  • main - المجموعة الرئيسية من الملفات لوحدة تحكم Arduino
  • wifi - البرامج الثابتة لـ esp8622 مطلوبة لتنظيم قناة اتصال عبر Wi-Fi

ماذا بعد؟


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

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

شكرا!

All Articles