تطبيق خوارزمية لتحديد عرض كائن باستخدام محدد المدى والمشفرات بالموجات فوق الصوتية بلغة RobotC

يوم جيد!

أود اليوم أن أشارك تطبيق الخوارزمية لتحديد عرض كائن باستخدام محدد المدى والمشفرات بالموجات فوق الصوتية في لغة برمجة RobotC (باستخدام منصة VEX EDR).

عصور ما قبل التاريخ


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

قاعدة عنصرية


كأرضية تدريب تجريبي ، استخدمت بيئة Robot Virtual Worlds لمنصة VEX ، ونموذج الروبوت الافتراضي VEX Launcher ، ونماذج افتراضية لعناصر منافسة VRC Turning Point (الشكل 1) وأبسط الصيغ الرياضية (لتحديد طول الوتر في دائرة بزاوية مركزية معروفة).

صورة
الشكل 1 . ملعب تدريب افتراضي مع روبوت

مهمة


- تحديد قطر الكرة باستخدام محدد المدى والمشفرات فوق الصوتي المركب على الروبوت فقط

اساس نظرى


لتحديد عرض الجسم ، استخدمت مفهوم مخطط الإشعاع (الشكل 2).

صورة
الشكل 2. الحساسية والنمط الاتجاهي لمكتشف مدى الموجات فوق الصوتية

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

صورة
الشكل 3 . هندسة الخوارزميات سنبحث عن

الزاوية المركزية للقوس بناءً على العلاقة بين نصف قطر الزاوية وقوس دوران الروبوت. تتوافق قيمة العرض النهائي مع وتر m للقوس.

معلمات الإدخال


كمعلمات إدخال ، اخترت:

  • dist = 100 مم (المسافة التي يتوقف عندها الروبوت للقياس ، يتم تحديد المعلمة بناءً على وجود أشياء أخرى حول الجسم قد تقع في مجال رؤية المستشعر وتتداخل مع القياس)
  • d_wheel = 102 مم (قطر عجلة الروبوت)
  • d_ball = 102 مم (قطر الكرة الفعلي)

تم تحديد خطأ كمعلمة إخراج لهذه المهمة ، والتي ستشير إلى دقة أسلوبنا والمعلمات المحددة:

  • الخطأ = القيمة المطلقة (d_ball_exper - d_ball)

خوارزمية تشغيل البرنامج


تم تحديد المراحل التالية من الخوارزمية.

  1. الحركة إلى الكائن.
  2. قم بالتدوير إلى أقصى نقطة في الجسم.
  3. استدارة إلى أقصى يسار الكائن.
  4. حساب الزاوية باستخدام قراءات مأخوذة من برامج التشفير.
  5. حساب الخطأ.

تنفيذ RobotC الخوارزمية


بادئ ذي بدء ، نحن بحاجة إلى تهيئة التكوين القياسي للروبوت الظاهري:

#pragma config(StandardModel, "VEX Launchbot")

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

int turn_to_over_object(int leftSpeed, int rightSpeed, int distance, bool need_object, bool left_side)
{
if(need_object == true)
{
if(left_side == true)
{
while(SensorValue[sonarSensor] > distance)
{
setMultipleMotors(-leftSpeed, leftMotor,frontLeftMotor);
setMultipleMotors(rightSpeed, rightMotor,frontRightMotor);
}
}
else
{
while(SensorValue[sonarSensor] > distance)
{
setMultipleMotors(leftSpeed, leftMotor,frontLeftMotor);
setMultipleMotors(-rightSpeed, rightMotor,frontRightMotor);
}
}
}
else
{
if(left_side == true)
{
while(SensorValue[sonarSensor] < (distance + 1))
{
setMultipleMotors(-leftSpeed, leftMotor,frontLeftMotor);
setMultipleMotors(rightSpeed, rightMotor,frontRightMotor);
}
}
else
{
while(SensorValue[sonarSensor] < (distance + 1))
{
setMultipleMotors(leftSpeed, leftMotor,frontLeftMotor);
setMultipleMotors(-rightSpeed, rightMotor,frontRightMotor);
}
}
}

return getMotorEncoder(leftMotor);
}

دعونا نلقي نظرة فاحصة على الحجج الوظيفية:

  • leftSpeed ​​- سرعة محرك الأقراص الأيسر
  • rightSpeed ​​- سرعة القيادة الصحيحة
  • rightSpeed ​​- سرعة القيادة الصحيحة
  • المسافة - المسافة إلى الكائن حيث توقف الروبوت
  • need_object - وضع الحركة: صحيح ، إذا كانت هناك حاجة إلى كائن في مجال رؤية المستشعر ، خطأ إذا كانت هناك حاجة إلى كائن
  • الجانب الأيسر - اتجاه دوران الروبوت. صحيح - استدر يسارًا ، خطأ - استدر يمينًا

باستخدام القيمة need_object = True ، سيتم تدوير الروبوت حتى يصبح الكائن على مسافة من الروبوت (في حالتنا ، 100 مم).

باستخدام القيمة need_object = False ، سيتم تدوير الروبوت حتى يصبح الكائن على مسافة (مسافة + 1) من الروبوت. تؤثر معلمة الوحدة في المجموع على الدقة النهائية لتحديد عدم وجود كائن في مجال رؤية المستشعر (من الممكن تحسين البرنامج عن طريق أخذ هذه المعلمة في وسيطات الدالة).

لنكتب النص الرئيسي للبرنامج:

task main()
{
int d_ball = 10.2; //sm
int d_wheel = 10.2;

int dist = 10; //sm
//  
setMotor(armMotor, -50);
wait(1);

while(SensorValue[sonarSensor] > 10)
{
setMultipleMotors(50, leftMotor, rightMotor, frontLeftMotor, frontRightMotor);
}
stopAllMotors();
int enc = 0;
enc = turn_to_over_object(50, 50, dist, false, false);
enc = turn_to_over_object(50, 50, dist, true, true);
resetMotorEncoder(leftMotor);
enc = turn_to_over_object(50, 50, dist, false, true);
stopAllMotors();

float teta = abs(enc) * PI * d_wheel * d_wheel / (dist * 627);
float d_ball_exper = 2 * dist * sin(teta / 2);
	
float error = abs(d_ball_exper - d_ball);
while(1)
{
}
}

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

للحصول على صيغة الزاوية ، تم إرشادي بالصيغ التالية:
- enc = N * 627 ، حيث
    N هو عدد
    دورات العجلة ، enc هو قراءة التشفير ،
    627 هي دقة التشفير => express N؛
- S = N * l ، حيث
    l هو طول العجلة ، l = PI * d_wheel * d_wheel => نستبدل N و l => S = enc * PI * d_wheel * d_wheel / 627 ؛
- من ناحية أخرى ، S = dist * teta ، أين
    S هو حجم القوس الذي
    يحوله الروبوت ، تيتا هي الزاوية المركزية المطلوبة ؛
- استنادًا إلى البيانات المذكورة أعلاه ، فإننا نعبر عن teta => teta = enc * PI * d_wheel * d_wheel / (627 * dist)

لإيجاد الوتر يساوي القطر المطلوب للكرة ، نستخدم الصيغة:
    d_ball_exper = 2 * dist * sin (teta / 2)

يعد التكرار اللانهائي أثناء الحلقة في نهاية البرنامج ضروريًا لرؤية القيم المستلمة في مصحح الأخطاء.

بيانات تلخيصية


تم الحصول على القيم التالية لقطر الكرة والأخطاء في المجال الظاهري:

    d_ball_exper = 10.6 سم
    خطأ = 0.4 سم

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

الآفاق


في المستقبل ، سأفكر في طرق أخرى لاستخدام أجهزة استشعار الروبوت لتحديد المعلمات البيئية.

All Articles