جدول المحتويات:

ضبط متابع خط GiggleBot - متقدم: 7 خطوات
ضبط متابع خط GiggleBot - متقدم: 7 خطوات

فيديو: ضبط متابع خط GiggleBot - متقدم: 7 خطوات

فيديو: ضبط متابع خط GiggleBot - متقدم: 7 خطوات
فيديو: كل شيء عن الحواشي السفلية وحل بعض المشكلات 2024, شهر نوفمبر
Anonim
ضبط متابع خط GiggleBot - متقدم
ضبط متابع خط GiggleBot - متقدم

في هذه التعليمات القصيرة جدًا ، ستقوم بضبط GiggleBot الخاص بك لتتبع خطًا أسود. في هذا البرنامج التعليمي الآخر GiggleBot Line Follower ، قمنا بترميز قيم الضبط للعمل وفقًا لهذا السيناريو. قد ترغب في جعله يتصرف بشكل أفضل من خلال تحقيق مكاسب أخرى.

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

الخطوة 1: المكونات المطلوبة

سوف تحتاج إلى ما يلي:

  1. روبوت GiggleBot للمايكرو بت.
  2. عدد 3 بطاريات AA
  3. x2 BBC micro: bits - أحدهما لـ GiggleBot والآخر يعمل كجهاز تحكم عن بعد لضبط المعلمات.
  4. بطارية لـ BBC micro: bit - مثل تلك التي تأتي ضمن حزمة BBC micro: bit.

احصل على GiggleBot Robot لـ BBC micro: bit هنا

الخطوة 2: إعداد المسارات والبيئة

إعداد المسارات والبيئة
إعداد المسارات والبيئة
إعداد المسارات والبيئة
إعداد المسارات والبيئة

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

نظرًا لأن هذا البرنامج التعليمي مرتبط جدًا بهذا البرنامج التعليمي الآخر المسمى GiggleBot Line Follower ، ما عليك سوى الانتقال إلى هناك واتباع الخطوتين 2 و 3 ثم العودة إلى هنا.

بالنسبة إلى IDE ، يمكنك استخدام محرر Mu ولوقت التشغيل ، تحتاج إلى تنزيل GiggleBot MicroPython Runtime. يمكن تنزيل وقت التشغيل من وثائقه هنا. توجه إلى فصل الشروع في التوثيق واتبع هذه التعليمات حول إعداد البيئة. اعتبارًا من هذه اللحظة ، يتم استخدام الإصدار v0.4.0 من وقت التشغيل.

الخطوة 3: إعداد GiggleBot

قبل وميض وقت التشغيل إلى GiggleBot ، تأكد من اختيارك للسرعة المطلوبة ومعدل التحديث لـ GiggleBot: افتراضيًا ، يتم ضبط السرعة على 100 (متغير السرعة الأساسية) ومعدل التحديث مضبوط على 70 (متغير معدل التحديث).

بالنظر إلى التنفيذ الحالي ، فإن أعلى معدل تحديث يمكن تحقيقه هو 70 وإذا تم تعيين run_neopixels على True ، فيمكن تحقيق 50 فقط. وبطريقة ما ، يمكنك القول أن معدل التحديث الافتراضي يقع على حافة ما يمكن أن يفعله بي بي سي ميكرو: بت.

للتسجيل فقط ، يمكن لمستشعر متابع الخط إرجاع التحديثات 100 مرة في الثانية.

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

GiggleBot PID Line Follower Tuner (يتطلب جهاز تحكم عن بعد لضبطه) - xjfls23

من استيراد microbit *
من استيراد gigglebot *
من استيراد utime sleep_ms ، ticks_us
استيراد الراديو
ustruct الاستيراد
# تهيئة الراديو و GB neopixels
radio.on ()
neo = init ()
# توقيت
update_rate = 70
# قيم كسب افتراضية
Kp = 0.0
كي = 0.0
ك د = 0.0
نقطة الضبط = 0.5
نقطة الزناد = 0.0
min_speed_percent = 0.2
القاعدة_السرعة = 100
last_position = نقطة الضبط
لا يتجزأ = 0.0
run_neopixels = خطأ
center_pixel = 5 # حيث يوجد بكسل مركز الابتسامة على GB
# turquoise = tuple (map (lambda x: int (x / 5)، (64، 224، 208))) # لون لاستخدامه لرسم الخطأ مع neopixels
# turquoise = (12، 44، 41) # وهو بالضبط الفيروز المعلق أعلاه أعلاه
error_width_per_pixel = 0.5 / 3 # خطأ كحد أقصى مقسومًا على عدد الأجزاء بين كل نيوبكسل
defupper_bound_linear_speed_speed_reducer (abs_error ، نقطة الزناد ، الجزء العلوي ، الترابط ، الأصغر_قوة_المحرك ، أعلى_قوة_المحرك):
قاعدة_السرعة العالمية
إذا abs_error> = trigger_point:
# x0 = 0.0
# y0 = 0.0
# x1 = top_bound - نقطة انطلاق
# y1 = 1.0
# x = abs_error - نقطة انطلاق
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# مثل
y = (abs_error - trigger_point) / (upper_bound - trigger_point)
قوة_المحرك = السرعة_القاعدة * (أصغر_قوة_موتور + (1- ص) * (أعلى_قوة_موتور- أصغر_قوة_موتور_قوة))
عودة قوة المحرك
آخر:
إرجاع Base_speed * أعلى_قوة_موتور
تشغيل = خطأ
الخطأ السابق = 0
total_time = 0.0
total_counts = 0
احيانا صحيح:
# إذا تم الضغط على الزر a ، فابدأ في المتابعة
إذا button_a.is_pressed ():
تشغيل = صحيح
# ولكن إذا تم الضغط على الزر b ، فقم بإيقاف متابع الخط
إذا button_b.is_pressed ():
تشغيل = خطأ
لا يتجزأ = 0.0
الخطأ السابق = 0.0
display.scroll ('{} - {}' format (total_time، total_counts)، delay = 100، wait = False)
total_time = 0.0
total_counts = 0
بكسل_من ()
قف()
sleep_ms (500)
إذا كان المدى صحيحًا:
# قراءة مجسات الخط
start_time = ticks_us ()
# تحقق مما إذا كنا قد قمنا بتحديث مكاسب Kp / Kd بجهاز تحكم عن بعد
محاولة:
Kp، Ki، Kd، trigger_point، min_speed_percent = ustruct.unpack ('fffff'، radio.receive_bytes ())
مجموعة_عيون ()
باستثناء نوع الخطأ:
يمر
يمين ، يسار = read_sensor (LINE_SENSOR ، كلاهما)
# خط على اليسار عندما يكون الموضع <0.5
# على اليمين عندما يكون الموضع> 0.5
# خط في المنتصف عندما يكون الموضع = 0.5
# إنه متوسط حسابي مرجح
محاولة:
الموضع = يمين / عائم (يسار + يمين)
ماعدا ZeroDivisionError:
الموضع = 0.5
إذا كان الموضع == 0: الموضع = 0.001
إذا كان الموضع == 1: الموضع = 0.999
# استخدم وحدة تحكم PD
خطأ = الموضع - نقطة الضبط
تكامل + = خطأ
تصحيح = Kp * خطأ + Ki * متكامل + Kd * (خطأ - خطأ سابق)
الخطأ السابق = خطأ
# حساب سرعات المحرك
Motor_speed = upper_bound_linear_speed_speed_reducer (القيمة المطلقة (خطأ) ، نقطة الضبط * نقطة التشغيل ، نقطة الضبط ، min_speed_percent ، 1.0)
leftMotorSpeed = سرعة المحرك + التصحيح
rightMotorSpeed = سرعة المحرك - التصحيح
# قم بإضاءة neopixels لتوضيح الاتجاه الذي يجب أن يذهب إليه GiggleBot
إذا كانت run_neopixels هي عدد_الخطوات الإجمالية والعدد٪ 3 == 0:
بالنسبة إلى i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08':
الجدد = (0 ، 0 ، 0)
بالنسبة إلى i inb '\ x00 / x01 / x02 / x03':
ifabs (خطأ)> error_width_per_pixel * i:
إذا كان الخطأ <0:
neo [center_pixel + i] = (12 ، 44 ، 41)
آخر:
neo [center_pixel - i] = (12 ، 44 ، 41)
آخر:
النسبة المئوية = 1- (error_width_per_pixel * i -abs (error)) / error_width_per_pixel
# تضيء البكسل الحالي
إذا كان الخطأ <0:
# neo [center_pixel + i] = مجموعة (خريطة (lambda x: int (x * النسبة المئوية) ، فيروزي))
neo [center_pixel + i] = (int (12 * بالمائة) ، int (44 * بالمائة) ، int (41 * بالمائة))
آخر:
# neo [center_pixel - i] = مجموعة (خريطة (lambda x: int (x * النسبة المئوية) ، فيروزي))
neo [center_pixel - i] = (int (12 * بالمائة) ، int (44 * بالمائة) ، int (41 * بالمائة))
استراحة
neo.show ()
محاولة:
# مقطع المحركات
إذا تركت سرعة المحرك> 100:
يسار MotorSpeed = 100
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100
إذا كان صحيحًا ، سرعة المحرك> 100:
rightMotorSpeed = 100
يسار سرعة المحرك = يسار سرعة المحرك - يمين سرعة المحرك +100
إذا تركت
leftMotorSpeed = -100
إذا كان صحيحًا
rightMotorSpeed = -100
# شغّل المحركات
set_speed (leftMotorSpeed ، rightMotorSpeed)
قائد()
# طباعة ((خطأ ، سرعة المحرك))
إلا:
# في حالة حدوث مشكلة غير قابلة للإصلاح
يمر
# والحفاظ على تردد الحلقة
end_time = ticks_us ()
delay_diff = (end_time - start_time) / 1000
total_time + = delay_diff
total_counts + = 1
if1.0 / update_rate - delay_diff> 0:
النوم (1.0 / update_rate - delay_diff)

عرض rawgigglebot_line_follower_tuner.py مستضاف مع ❤ بواسطة GitHub

الخطوة 4: إعداد الموالف (عن بُعد)

الشيء التالي الذي يتعين علينا القيام به هو وميض وقت التشغيل + البرنامج النصي إلى 2nd BBC micro: bit. سيعمل micro: bit الثاني كجهاز تحكم عن بعد لـ GiggleBot ، والذي سيتم استخدامه لضبط المعلمات التالية:

  1. Kp = الكسب النسبي لوحدة التحكم PID.
  2. Ki = كسب متكامل لوحدة التحكم PID.
  3. Kd = كسب مشتق لوحدة تحكم PID.
  4. trigger_point = النقطة المعبر عنها بالنسب المئوية بين الحد الأدنى والأقصى لسرعات GiggleBot حيث تبدأ السرعة بالانخفاض خطيًا حتى تصل إلى الحد الأدنى للسرعة.
  5. min_speed_percent = السرعة الدنيا معبرًا عنها بالنسبة المئوية للسرعة القصوى.

المتغيرين المتبقيين الآخرين اللذين يمكن ضبطهما مشفران بشكل مباشر في البرنامج النصي الموجود على GiggleBot: update_rate و base_speed الذي يمثل السرعة القصوى. كما هو موضح في الوثائق ، فإن السرعة القصوى التي يمكن تعيينها لـ GiggleBot هي 100 ، وهي أيضًا القيمة الافتراضية لـ GiggleBot.

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

GiggleBot Remote PID Line Follower Tuner (يتطلب الجزء الآخر) - xjfls23

من استيراد microbit *
من استيراد sleep_ms
استيراد الراديو
ustruct الاستيراد
# 1st العنصر هو كسب Kp
العنصر الثاني هو مكسب كي
العنصر الثالث هو كسب Kd
العنصر الرابع هو نقطة الزناد للمحركات لخفض السرعة (0 -> 1)
العنصر الخامس هو السرعة الدنيا للمحركات كما يتم التعبير عنها بالنسب المئوية (0 -> 1)
المكاسب = [0.0 ، 0.0 ، 0.0 ، 1.0 ، 0.0]
حجم الخطوة = 0.1
# 0 و 1 للعنصر الأول
# 2 و 3 للعنصر الثاني
CurrentSetting = 0
defshowMenu ():
display.scroll ('{} - {}'. تنسيق (currentSetting ، مكاسب [int (currentSetting / 2)]) ، تأخير = 100 ، انتظر = خطأ)
radio.on ()
قائمة العرض()
احيانا صحيح:
محدث = خطأ
إذا button_a.is_pressed ():
CurrentSetting = (CurrentSetting +1)٪ (2 * 5)
محدث = صحيح
إذا button_b.is_pressed ():
إذا كان CurrentSetting٪ 2 == 0:
# زيادة الكسب عندما يكون CurrentSetting هو 0 أو 2 أو..
ifint (currentSetting / 2) في [0، 2]:
مكاسب [int (currentSetting / 2)] + = 10 * stepSize
آخر:
مكاسب [int (currentSetting / 2)] + = stepSize
آخر:
# زيادة الكسب عندما يكون CurrentSetting هو 1 أو 3 أو..
ifint (currentSetting / 2) في [0، 2]:
مكاسب [int (currentSetting / 2)] - = 10 * stepSize
آخر:
مكاسب [int (currentSetting / 2)] - = stepSize
radio.send_bytes (ustruct.pack ('fffff' ، * مكاسب))
محدث = صحيح
إذا تم التحديث:
قائمة العرض()
sleep_ms (200)

عرض rawgigglebot_line_follower_configurator.py مستضاف مع ❤ بواسطة GitHub

الخطوة 5: ضبط GiggleBot

ضبط GiggleBot
ضبط GiggleBot

ضع GiggleBot على المسار ، قم بتشغيله واتركه يعمل. في غضون ذلك ، سيتعين عليك باستمرار إعادته إلى المسار الصحيح وضبط المكاسب / المعلمات باستخدام BBC micro: bit الآخر الذي تمسكه بيدك.

لبدء تشغيل GiggleBot ، اضغط على الزر A في BBC micro: bit الخاص بـ GiggleBot ولإيقافه ومن ثم إعادة تعيين حالته ، اضغط على الزر B.

على جهاز BBC micro: bit البعيد ، سيأخذك الضغط على الزر A خلال كل خيار في قائمته ويؤدي الزر B إلى زيادة / تقليل القيمة المقابلة. إنه مثل ضبط الساعة على لوحة عدادات سيارة قديمة. الخيارات كالتالي:

  1. 0-1 الخيارات هي لربح Kp.
  2. 2-3 خيارات لكسب Ki.
  3. 4-5 خيارات لربح Kd.
  4. 6-7 خيارات لضبط نقطة الضبط للحظة عندما تبدأ المحركات في التباطؤ.
  5. 8-9 خيارات لضبط السرعة الدنيا.

ضع في اعتبارك أن الأرقام الزوجية في القائمة مخصصة لزيادة القيم المقابلة والأرقام الفردية هي عكس ذلك تمامًا.

أيضًا ، عند الضغط على الزر B في BBC micro: bit الخاص بـ GiggleBot ، سترى على شاشته من صنع Neopixel عدد المللي ثانية المنقضية منذ آخر إعادة تعيين وعدد الدورات التي مر بها الروبوت - باستخدام هاتين 2 يمكنك حساب معدل تحديث الروبوت.

أخيرًا والأهم ، لقد توصلت إلى ضبطين لـ GiggleBot. أحدهما مخصص عند إيقاف تشغيل Neopixel LEDs والآخر عندما يكون الأمر بخلاف ذلك. تُستخدم مصابيح Neopixel LED لإظهار الاتجاه الذي تراكم فيه الخطأ.

المجموعة الأولى من ضبط المعلمات (مع إيقاف تشغيل NeoPixel LEDs)

  1. Kp = 32.0
  2. كي = 0.5
  3. دينار كويتي = 80.0
  4. Trigger_setpoint = 0.3 (وهو 30٪)
  5. min_speed_percent = 0.2 (أي 20٪)
  6. Base_speed = 100 (ويعرف أيضًا باسم السرعة القصوى)
  7. update_rate = 70 (يعمل @ 70 هرتز)

المجموعة الثانية من ضبط المعلمات (مع تشغيل NeoPixel LEDs)

  1. Kp = 25.0
  2. كي = 0.5
  3. دينار كويتي = 35.0
  4. Trigger_setpoint = 0.3 (30٪)
  5. min_speed_percent = 0.3 (وهو 30٪)
  6. Base_speed = 70 (ويعرف أيضًا باسم السرعة القصوى)
  7. update_rate = 50 (يعمل عند 50 هرتز)
  8. أيضًا ، يجب تعيين run_neopixels المتغير إلى True في البرنامج النصي الذي يتم تحميله على BBC micro: bit الخاص بـ GiggleBot. سيؤدي ذلك إلى جعل مصابيح NeoPixel LED تومض بطريقة تشير إلى الاتجاه الذي يتراكم فيه الخطأ.

الخطوة 6: تشغيل GiggleBot مع إيقاف تشغيل NeoPixels

هذا مثال على تشغيل GiggleBot باستخدام معلمات الضبط الأولى الموجودة في الخطوة السابقة. تم إيقاف تشغيل مصابيح NeoPixel في هذا المثال.

الخطوة 7: تشغيل GiggleBot مع تشغيل Neopixels

هذا مثال على تشغيل GiggleBot مع المجموعة الثانية من معلمات الضبط الموجودة في الخطوة 5. هذا المثال تم تشغيل NeoPixel LEDs.

لاحظ كيف أن GiggleBot في هذا المثال يواجه صعوبة أكبر في اتباع الخط - وذلك لأن مصابيح Neopixel LED "تأكل" وقت وحدة المعالجة المركزية لـ BBC micro: bit. لهذا السبب اضطررنا إلى تقليل معدل التحديث من 70 إلى 50.

موصى به: