القصور الذاتي#

مقدمة#

يحتوي روبوت VEX AIM للبرمجة على مستشعر قصور ذاتي مدمج. يقيس هذا المستشعر كيفية تحرك الروبوت ودورانه.

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

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

فيما يلي قائمة بجميع الطرق:

الاتجاه — تحديد وإعادة ضبط اتجاه الروبوت، ودورانه، وإمالته.

  • get_rotation — تُرجع هذه الدالة مقدار دوران الروبوت.

  • get_heading — تُرجع الاتجاه الذي يواجهه الروبوت، من 0 إلى 359.99 درجة.

  • get_yaw — تُرجع زاوية انحراف الروبوت.

  • get_roll — تُرجع زاوية دوران الروبوت.

  • get_pitch — يعيد زاوية ميل الروبوت.

  • reset_rotation — يعيد ضبط دوران الروبوت الحالي إلى 0 درجة.

  • reset_heading — يعيد ضبط اتجاه الروبوت الحالي إلى 0 درجة.

  • set_heading — يقوم بتعيين اتجاه الروبوت الحالي إلى قيمة اتجاه جديدة.

حوادث التصادم — اكتشاف التصادمات.

  • crashed — يسجل دالة لتشغيلها عند اكتشاف عطل.

  • set_crash_sensitivity — يحدد مدى حساسية اكتشاف التصادم للتأثيرات.

الحركة — قياس التسارع وسرعة الدوران.

  • get_acceleration — تُرجع مدى سرعة تسارع أو تباطؤ الروبوت على المحور المحدد.

  • get_turn_rate — تُرجع مدى سرعة دوران الروبوت على المحور المحدد.

المعايرة — إدارة معايرة المستشعر.

  • calibrate — معايرة المستشعر بالقصور الذاتي.

  • is_calibrating — تُرجع ما إذا كان المستشعر بالقصور الذاتي يقوم بالمعايرة حاليًا.

توجيه#

get_rotation#

الدوران هو مقدار دوران الروبوت، ويُقاس بالدرجات. على عكس الاتجاه، يمكن أن يزيد الدوران عن 359.99 درجة أو ينقص عن 0 درجة. في بداية المشروع، تُضبط قيمة الدوران على 0 درجة. تُعيد get_rotation قيمة الدوران الحالية للروبوت كعدد عشري.

يؤدي الانعطاف يمينًا إلى زيادة الدوران، بينما يؤدي الانعطاف يسارًا إلى تقليله. على سبيل المثال، ينتج عن الانعطاف دورتين كاملتين إلى اليمين دوران مقداره 720 درجة. أما الانعطاف دورة كاملة واحدة إلى اليسار من وضع الصفر فينتج عنه دوران مقداره -360 درجة.

Usage:
robot.inertial.get_rotation()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Display the robot's rotation as it rotates
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    robot.screen.print(f"Rotation: {robot.inertial.get_rotation():.2f}")
    wait(50, MSEC)

get_heading#

الاتجاه هو المسار الذي يواجهه الروبوت، ويُقاس بالدرجات من 0 إلى 359.99. get_heading تُرجع اتجاه الروبوت الحالي كعدد عشري.

الاتجاه الابتدائي هو 0 درجة. إذا تجاوز الروبوت 359.99 درجة، فسيعود الاتجاه إلى 0 درجة.

Usage:
robot.inertial.get_heading()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Turn right until the heading reaches 90 degrees
robot.turn(RIGHT)
while robot.inertial.get_heading() < 90:
    wait(50, MSEC)
robot.stop_all_movement()

# Display the robot's heading as it is rotated by hand
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    robot.screen.print(f"Heading: {robot.inertial.get_heading()} degrees")
    wait(50, MSEC)

get_yaw#

يصف الانحراف دوران الروبوت يمينًا أو يسارًا حول محوره الرأسي. تُعيد get_yaw زاوية انحراف الروبوت ضمن النطاق من -180.00 إلى 180.00 درجة كقيمة عشرية.

تستخدم الصورة أدناه الأسهم لإظهار اتجاه الدوران الموجب للانحراف.

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

Usage:
robot.inertial.get_yaw()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Display the robot's yaw angle as it is rotated by hand
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    robot.screen.print(robot.inertial.get_yaw())
    wait(50, MSEC)

get_roll#

يصف Roll ميل الروبوت من جانب إلى آخر. تُعيد get_roll زاوية ميل الروبوت في النطاق من -180.00 إلى 180.00 درجة كقيمة عشرية.

تستخدم الصورة أدناه الأسهم لإظهار اتجاه الدوران الموجب للتدحرج.

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

Usage:
robot.inertial.get_roll()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Display the robot's roll angle as it is tilted by hand
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    robot.screen.print(robot.inertial.get_roll())
    wait(50, MSEC)

get_pitch#

يصف Pitch ميل الروبوت للأمام أو للخلف. تُعيد get_pitch زاوية ميل الروبوت في النطاق من -90.00 إلى 90.00 درجة كقيمة عشرية.

تستخدم الصورة أدناه الأسهم لإظهار اتجاه الدوران الإيجابي للميل.

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

Usage:
robot.inertial.get_pitch()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Display the robot's pitch angle as it is tilted by hand
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    robot.screen.print(robot.inertial.get_pitch())
    wait(50, MSEC)

reset_rotation#

reset_rotation يعيد ضبط دوران الروبوت الحالي إلى 0 درجة.

بعد استخدام هذه الطريقة، يتتبع الروبوت المنعطفات المستقبلية انطلاقاً من قيمة الدوران الجديدة البالغة 0 درجة.

Usage:
robot.inertial.reset_rotation()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Reset the robot's rotation if it exceeds 180 degrees
while True:
    if robot.inertial.get_rotation() >= 180:
        robot.inertial.reset_rotation()

    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    robot.screen.print(f"Rotation: {robot.inertial.get_rotation():.2f}")

    wait(50, MSEC)

reset_heading#

reset_heading يعيد ضبط اتجاه الروبوت الحالي إلى 0 درجة.

بعد استخدام هذه الطريقة، يصبح اتجاه الروبوت الحالي هو الاتجاه الجديد بزاوية 0 درجة.

Usage:
robot.inertial.reset_heading()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Turn the robot around using a new 90 degree heading
robot.turn_to(90)
wait(1, SECONDS)
robot.inertial.reset_heading()
robot.turn_to(90)

set_heading#

الاتجاه هو الاتجاه الذي يواجهه الروبوت، ويُقاس بالدرجات من 0 إلى 359.99. set_heading يغير اتجاه الروبوت الحالي إلى قيمة اتجاه جديدة.

على سبيل المثال، إذا استدار الروبوت ليواجه اليمين، فإن ضبط اتجاهه على 0 درجة يجعل وضعية مواجهة اليمين هي الوضعية الجديدة التي تمثل 0 درجة. عندها يستطيع الروبوت تتبع الاتجاهات الأخرى بناءً على هذا الاتجاه الجديد.

Usage:
robot.inertial.set_heading(heading)

حدود

وصف

heading

قيمة الاتجاه، بالدرجات، التي يجب ضبطها للروبوت. يمكن أن تكون هذه القيمة من 0 إلى 359.99.

# Turn the robot to 90 degrees using its new heading
robot.inertial.set_heading(45)
robot.turn_to(90)

يتحطم#

crashed#

crashed يسجل وظيفة ليتم استدعاؤها عندما يكتشف الروبوت تأثيرًا مفاجئًا أو تصادمًا.

طريقة الاستخدام:

robot.inertial.crashed(callback, arg)

حدود

وصف

callback

A function that is previously defined to execute when a collision is detected.

arg

اختياري. مجموعة تحتوي على الوسائط التي يتم تمريرها إلى دالة الاستدعاء. راجع استخدام الدوال ذات المعاملات لمزيد من المعلومات.

# Define what happens when a crash occurs
def crash_detected():
    # Stop all movement and indicate a crash occurred
    robot.screen.print("Crash detected")
    robot.stop_all_movement()

robot.inertial.crashed(crash_detected)

# Drive forward until crash
robot.move_at(0, 100)

set_crash_sensitivity#

set_crash_sensitivity يضبط مقدار التسارع المفاجئ اللازم لكي يكتشف الروبوت وقوع حادث.

Usage:
robot.inertial.set_crash_sensitivity(sensitivity)

حدود

وصف

sensitivity

حساسية التصادم:

  • HIGH — الأكثر حساسية؛ يكتشف الصدمات الصغيرة ويُفعّل عند 1G.
  • NORMAL — الحساسية الافتراضية؛ يكتشف الصدمات المتوسطة ويُفعّل عند 1.5G.
  • LOW — الأقل حساسية؛ يكتشف الصدمات الأقوى ويُفعّل عند 2G.

def crashed_callback():
    robot.stop_all_movement()
    robot.sound.play(CRASH)

# system event handlers
robot.inertial.crashed(crashed_callback)
# add 15ms delay to make sure events are registered correctly.
wait(15, MSEC)

# Detect a crash at a slow velocity.
robot.set_move_velocity(35, PERCENT)
robot.inertial.set_crash_sensitivity(HIGH)
robot.move_at(0)

حركة#

get_acceleration#

التسارع هو مدى سرعة تسارع أو تباطؤ الروبوت. تُعيد get_acceleration تسارع الروبوت على المحور المُحدد، من -4.00 G إلى 4.00 G، كقيمة عشرية.

وحدة قياس التسارع هي G تشعر به من الجاذبية الأرضية وأنت جالس بلا حراك.

يمكن أن تكون القيمة موجبة أو سالبة حسب اتجاه التسارع على المحور المحدد. في برنامج AIM، تُسمى خيارات المحور وفقًا لاتجاهات حركة الروبوت: FORWARDلليمين RIGHTWARDللأسفل، و DOWNWARD.

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

طريقة الاستخدام:

robot.inertial.get_acceleration(type)

حدود

وصف

type

محور قياس التسارع:

  • DOWNWARD — يقيس التسارع على طول الاتجاه الرأسي للروبوت.
  • FORWARD — يقيس التسارع على طول الاتجاه الأمامي الخلفي للروبوت.
  • RIGHTWARD — يقيس التسارع على طول الاتجاه الجانبي للروبوت.

# Display the acceleration as the robot begins to move
robot.screen.set_cursor(4,1)
sitting_accel = robot.inertial.get_acceleration(RIGHTWARD)
robot.screen.print(f"Resting: {sitting_accel:.2f}")
wait(0.5, SECONDS)
robot.screen.next_row()

robot.move_at(90, 100)
wait(0.1, SECONDS)

robot.screen.print(f"Startup: {robot.inertial.get_acceleration(RIGHTWARD):.2f}")

get_turn_rate#

معدل الدوران هو سرعة دوران الروبوت. تُعيد get_turn_rate معدل دوران الروبوت بالدرجات في الثانية \(dps\) كقيمة عشرية، من -1000.00 إلى 1000.00 dps.

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

روبوت VEX AIM للبرمجة مزود بأسهم اتجاهية ممتدة من مركزه. سهم أخضر مكتوب عليه "الدوران" يمتد من مقدمة الروبوت، ويحيط به سهم أسود منحني يشير عكس اتجاه عقارب الساعة. سهم أزرق مكتوب عليه "الانعطاف" يمتد من أسفل الروبوت، ويحيط به سهم أسود منحني يشير مع اتجاه عقارب الساعة. وسهم أحمر مكتوب عليه "الميل" يمتد من جانب الروبوت أسفل شعار VEX، ويحيط به سهم أسود منحني يشير عكس اتجاه عقارب الساعة.

Usage:
robot.inertial.get_turn_rate(axis)

حدود

وصف

axis

أي اتجاه للعودة:

  • YAW
  • ROLL
  • PITCH
# Display the gyro rate as the robot is rotated by hand
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    robot.screen.print(robot.inertial.get_turn_rate(YAW))
    wait(50, MSEC)

معايرة#

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

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

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

calibrate#

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

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

Usage:
robot.inertial.calibrate()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Calibrate the gyro before moving
robot.inertial.calibrate()
robot.screen.show_emoji(THINKING)
wait(2, SECONDS)
robot.screen.show_emoji(PROUD)
robot.move_for(50, 90)

is_calibrating#

is_calibrating تُرجع قيمة منطقية تشير إلى ما إذا كان المستشعر بالقصور الذاتي يقوم بالمعايرة.

  • True — يتم معايرة المستشعر بالقصور الذاتي.

  • False — لا تتم معايرة المستشعر بالقصور الذاتي.

Usage:
robot.inertial.is_calibrating()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Move after the calibration is completed
robot.inertial.calibrate()
while robot.inertial.is_calibrating():
    robot.screen.show_emoji(THINKING)
    wait(50, MSEC)
robot.screen.show_emoji(PROUD)
robot.move_for(50, 90)