محرك أقراص ذكي#

مقدمة#

The smartdrive class controls how a robot drives and turns using motors, wheels, and a sensor. A smartdrive can use a connected Gyro Sensor or the Brain’s built-in Inertial Sensor.

A smartdrive uses the sensor to help the robot move and turn precisely. At the start of each project, the drivetrain calibrates the sensor automatically. Keep the robot still for about 2 seconds during calibration, so the robot can move and turn correctly.

The smartdrive class is based on the drivetrain class. It can use the same drive and turn functions as drivetrain, and it also adds sensor-based functions like turnToHeading and turnToRotation.

تستخدم هذه الصفحة الاسم myDrivetrain كمثال لاسم محرك الأقراص الذكي. استبدله بالاسم الذي قمت بتكوينه حسب الحاجة.

مُنشئات الفئات#

1 — يقوم بإنشاء محرك ذكي باستخدام كائنات motor_group motor_group بالإضافة إلى مستشعر جيروسكوب أو مستشعر بالقصور الذاتي.

smartdrive(
    motor_group     &l,
    motor_group     &r,
    gyro            &g,
    double          wheelTravel = 320,
    double          trackWidth  = 320,
    double          wheelBase   = 130,
    distanceUnits   unit = mm,
    double          externalGearRatio = 1.0 );

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

smartdrive(
    motor           &l,
    motor           &r,
    gyro            &g,
    double          wheelTravel = 320,
    double          trackWidth  = 320,
    double          wheelBase   = 130,
    distanceUnits   unit = mm,
    double          externalGearRatio = 1.0 );

مُدمِّر الفئة#

يقوم بتدمير الكائن smartdrive وتحرير الموارد المرتبطة به.

~smartdrive();

حدود#

The sensor parameter can be a gyro or inertial object.

المعلمة

يكتب

وصف

&l / &r

motor_group / motor

المحركان الأيسر والأيمن أو مجموعات المحركات. يجب أن يستخدم كلا المعاملين نفس النوع: إما كائنين من نوع motor_group أو كائنين من نوع motor.

&g

gyro / inertial

مستشعر الجيروسكوب أو مستشعر القصور الذاتي المستخدم بواسطة نظام القيادة الذكية.

wheelTravel

double

محيط عجلات نظام نقل الحركة. القيمة الافتراضية هي 320.

trackWidth

double

المسافة بين العجلتين اليمنى واليسرى. القيمة الافتراضية هي 320.

wheelBase

double

المسافة بين العجلتين الأمامية والخلفية. القيمة الافتراضية هي 130.

unit

distanceUnits

الوحدة لـ wheelTravelو trackWidthو wheelBase: mm (افتراضي) أو inches.

externalGearRatio

double

نسبة التروس المستخدمة لضبط مسافات القيادة في حال استخدام التروس. القيمة الافتراضية هي 1.0.

مثال#

/* This constructor is required when using VS Code.
Drivetrain configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */

// Create the left and right motor objects.
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);

// Create the Inertial Sensor object.
inertial myInertial = inertial(PORT3);

// Create the smartdrive object.
smartdrive myDrivetrain = smartdrive(
    leftMotor,  // left motor
    rightMotor, // right motor
    myInertial, // Inertial Sensor
    259.34,     // wheelTravel
    320,        // trackWidth
    40,         // wheelBase
    mm,         // unit
    1.0 );      // externalGearRatio

الدوال الأعضاء#

تتضمن فئة smartdrive ) وظائف الأعضاء التالية:

الإجراءات — قم بتدوير الروبوت باستخدام الاتجاه أو الدوران.

  • turnToHeading — يُوجّه الروبوت نحو اتجاه مُحدد من -359 إلى 359 درجة. سيسلك الروبوت أقصر مسار للوصول إلى الاتجاه المطلوب.

  • turnToRotation — يقوم بتدوير الروبوت إلى دوران محدد.

  • calibrateDrivetrain — يقوم بمعايرة المستشعر المُكوّن باستخدام نظام القيادة الذكي.

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

  • setHeading — يغير اتجاه الروبوت الحالي إلى اتجاه جديد.

  • setRotation — يغير دوران الروبوت الحالي إلى دوران جديد.

القيم — تحقق من العنوان والتدوير.

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

  • rotation — يعيد الدوران الحالي للروبوت.

يمكن لـ smartdrive أيضًا استخدام وظائف الأعضاء الموروثة من drivetrain، مثل drive، driveFor، turn، turnFor، stop، isDone، و isMoving.

قبل استدعاء أي من وظائف الأعضاء smartdrive ، يجب إنشاء كائن smartdrive.

/* This constructor is required when using VS Code.
Drivetrain configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */

// Create the left and right motor objects.
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);

// Create the Inertial Sensor object.
inertial myInertial = inertial(PORT3);

// Create the smartdrive object.
smartdrive myDrivetrain = smartdrive(
    leftMotor,  // left motor
    rightMotor, // right motor
    myInertial, // Inertial Sensor
    259.34,     // wheelTravel
    320,        // trackWidth
    40,         // wheelBase
    mm,         // unit
    1.0 );      // externalGearRatio

turnToHeading#

A heading is the direction the robot is facing, measured in degrees. turnToHeading turns the robot to face a specific heading from -359 to 359 degrees. The robot will turn the shortest direction to reach the target heading.

اتجاه بدء الروبوت هو 0 درجة.

سينتظر المشروع حتى ينتهي الروبوت من الدوران قبل تشغيل سطر التعليمات البرمجية التالي.

Available Functions

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

bool turnToHeading(
    double        angle,
    rotationUnits units,
    bool          waitForCompletion = true );

2 — يقوم بتوجيه الروبوت إلى الاتجاه المحدد بالسرعة المحددة.

bool turnToHeading(
    double        angle,
    rotationUnits units,
    double        velocity,
    velocityUnits units_v,
    bool          waitForCompletion = true );

Parameters

المعلمة

يكتب

وصف

angle

double

الاتجاه الذي يجب أن يواجهه الروبوت، بالدرجات. يمكن أن يكون هذا الاتجاه من -359 إلى 359 عند استخدام deg أو degrees.

units

rotationUnits

وحدة القياس: deg (درجة)، rev (دورات)، أو raw (وحدات خام). الدورة الواحدة تساوي 360 درجة.

velocity

double

تتراوح سرعة الدوران من 0% إلى 100% عند استخدام velocityUnits::pct، ومن 0 إلى 120 دورة في الدقيقة عند استخدام rpm، أو من 0 إلى 720 درجة في الثانية عند استخدام dpsفي حال عدم تحديد سرعة، يدور الروبوت بسرعة الدوران الحالية.

units_v

velocityUnits

وحدة السرعة: velocityUnits::pct (نسبة مئوية)، rpm (دورات في الدقيقة)، أو dps (درجات في الثانية).

waitForCompletion

bool

true (الوضع الافتراضي) يجعل المشروع ينتظر حتى ينتهي الروبوت من الدوران قبل تنفيذ سطر التعليمات البرمجية التالي. false يجعل سطر التعليمات البرمجية التالي يُنفذ فورًا.

Return Values

تُرجع هذه الدالة ما إذا كان الروبوت قد وصل إلى الاتجاه المستهدف، كقيمة منطقية (Boolean).

  • true — وصل الروبوت إلى الاتجاه المستهدف.

  • false — لم يكمل الروبوت الدور، أو تم إرجاع الدالة قبل اكتمال الدور لأن waitForCompletion تم تعيينها إلى false.

Notes
  • تشغيل وظيفة حركة أخرى لنظام نقل الحركة أثناء تشغيل turnToHeading سيؤدي إلى مقاطعة الحركة الحالية.

  • turnToHeading يستخدم اتجاهًا مستهدفًا، لذلك يمكن استخدام isDone و isMoving معه.

Examples
// Face the new 0 degrees.
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);

turnToRotation#

turnToRotation يقوم بتدوير الروبوت إلى دوران محدد.

الدوران هو مقدار دوران الروبوت، ويُقاس بالدرجات أو الدورات. في بداية المشروع، تُضبط قيمة الدوران على صفر درجة. كما يمكن ضبط الدوران باستخدام الدالة setRotation.

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

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

سينتظر المشروع حتى ينتهي الروبوت من الدوران قبل تشغيل سطر التعليمات البرمجية التالي.

Available Functions

1 — يقوم بتدوير الروبوت إلى الدوران المحدد باستخدام سرعة الدوران الحالية.

bool turnToRotation(
    double        angle,
    rotationUnits units,
    bool          waitForCompletion = true );

2 — يقوم بتدوير الروبوت إلى الدوران المحدد بالسرعة المحددة.

bool turnToRotation(
    double        angle,
    rotationUnits units,
    double        velocity,
    velocityUnits units_v,
    bool          waitForCompletion = true );

Parameters

المعلمة

يكتب

وصف

angle

double

قيمة الدوران التي سيتجه إليها الروبوت.

units

rotationUnits

وحدة الدوران: deg (درجة)، rev (دورات)، أو raw (وحدات خام). الدورة الواحدة تساوي 360 درجة.

velocity

double

تتراوح سرعة الدوران من 0% إلى 100% عند استخدام velocityUnits::pct، ومن 0 إلى 120 دورة في الدقيقة عند استخدام rpm، أو من 0 إلى 720 درجة في الثانية عند استخدام dpsفي حال عدم تحديد سرعة، يدور الروبوت بسرعة الدوران الحالية.

units_v

velocityUnits

وحدة السرعة: velocityUnits::pct (نسبة مئوية)، rpm (دورات في الدقيقة)، أو dps (درجات في الثانية).

waitForCompletion

bool

true (الوضع الافتراضي) يجعل المشروع ينتظر حتى ينتهي الروبوت من الدوران قبل تنفيذ سطر التعليمات البرمجية التالي. false يجعل سطر التعليمات البرمجية التالي يُنفذ فورًا.

Return Values

تُرجع هذه الدالة ما إذا كان الروبوت قد وصل إلى الدوران المستهدف، كقيمة منطقية (Boolean).

  • true — وصل الروبوت إلى الدوران المستهدف.

  • false — لم يكمل الروبوت الدور، أو تم إرجاع الدالة قبل اكتمال الدور لأن waitForCompletion تم تعيينها إلى false.

Notes
  • تشغيل وظيفة حركة أخرى لنظام نقل الحركة أثناء تشغيل turnToRotation سيؤدي إلى مقاطعة الحركة الحالية.

  • turnToRotation يستخدم دورانًا مستهدفًا، لذلك يمكن استخدام isDone و isMoving معه.

Examples
// Spin counterclockwise for 2 turns, then face forward.
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);

calibrateDrivetrain#

calibrateDrivetrain يقوم بمعايرة مستشعر الجيروسكوب المتصل أو مستشعر القصور الذاتي المدمج في الدماغ والمُهيأ باستخدام محرك القيادة الذكي.

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

سينتظر المشروع حتى يتم الانتهاء من عملية المعايرة قبل تشغيل السطر التالي من التعليمات البرمجية.

ملاحظة: يتم إنشاء الأمر calibrateDrivetrain تلقائيًا بواسطة VEXcode عند تهيئة نظام نقل الحركة باستخدام مستشعر جيروسكوبي أو مستشعر قصور ذاتي. وهو مُضمّن في مصدر المشروع وليس جزءًا من واجهة برمجة تطبيقات VEX IQ C++.

Available Functions
void calibrateDrivetrain();

Parameters

لا تقبل هذه الدالة أي معلمات.

Return Values

هذه الدالة لا تُرجع قيمة.

Notes
  • يقوم الروبوت بالمعايرة تلقائيًا في بداية كل مشروع عند تكوين محرك ذكي في VEXcode.

  • حافظ على ثبات الروبوت لمدة ثانيتين تقريبًا أثناء عملية المعايرة.

Function Implementation

فيما يلي مثال على التنفيذ التلقائي لـ calibrateDrivetrain الذي أنشأه VEXcode:

bool vexcode_initial_drivetrain_calibration_completed = false;
void calibrateDrivetrain() {
  wait(200, msec);
  Brain.Screen.print("Calibrating");
  Brain.Screen.newLine();
  Brain.Screen.print("Inertial");
  DrivetrainInertial.calibrate();
  while (DrivetrainInertial.isCalibrating()) {
    wait(25, msec);
  }
  vexcode_initial_drivetrain_calibration_completed = true;
  // Clears the screen and returns the cursor to row 1, column 1.
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
}

setHeading#

الاتجاه هو المسار الذي يواجهه الروبوت، ويُقاس بالدرجات. يُغيّر setHeading اتجاه الروبوت الحالي إلى قيمة اتجاه جديدة.

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

Available Functions
void setHeading(
  double value,
  rotationUnits units);

Parameters

المعلمة

يكتب

وصف

value

double

قيمة الاتجاه المراد ضبطها للروبوت. يمكن أن تتراوح هذه القيمة بين -359 و359 عند استخدام deg أو degrees.

units

rotationUnits

وحدة القياس: deg (درجة)، rev (دورات)، أو raw (وحدات خام). الدورة الواحدة تساوي 360 درجة.

Return Values

هذه الدالة لا تُرجع قيمة.

Examples
// Face the new 0 degrees.
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);

setRotation#

الدوران هو مقدار دوران الروبوت، ويُقاس بالدرجات أو الدورات. في بداية المشروع، تُضبط قيمة الدوران على صفر درجة. يُغيّر setRotation قيمة الدوران الحالية للروبوت إلى قيمة جديدة.

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

Available Functions
void setRotation(
  double value,
  rotationUnits units);

Parameters

المعلمة

يكتب

وصف

value

double

قيمة الدوران التي يجب ضبطها للروبوت.

units

rotationUnits

وحدة الدوران: deg (درجة)، rev (دورات)، أو raw (وحدات خام). الدورة الواحدة تساوي 360 درجة.

Return Values

هذه الدالة لا تُرجع قيمة.

Examples
// Spin counterclockwise for 2 turns, then face forward.
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);

heading#

الاتجاه هو المسار الذي يواجهه الروبوت، ويُقاس بالدرجات. يُعيد الأمر heading اتجاه الروبوت الحالي من 0 إلى 359 درجة.

اتجاه بدء الروبوت هو 0 درجة.

Available Functions
double heading( rotationUnits units = rotationUnits::deg );

Parameters

المعلمة

يكتب

وصف

units

rotationUnits

اختياري. وحدة قياس اتجاه العودة: degrees، deg (افتراضي)، rev، أو rawالدورة الواحدة تساوي 360 درجة.

Return Values

يُعيد هذا الأمر اتجاه الروبوت الحالي كرقم double بالوحدة المحددة.

Examples
// Show heading before and after turning.
Brain.Screen.print("Before: %f", myDrivetrain.heading(degrees));
myDrivetrain.turnFor(right, 90, degrees);
wait(1, seconds);
Brain.Screen.newLine();
Brain.Screen.print("After: %f", myDrivetrain.heading(degrees));
myDrivetrain.stop();

rotation#

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

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

Available Functions
double rotation( rotationUnits units = rotationUnits::deg );

Parameters

المعلمة

يكتب

وصف

units

rotationUnits

اختياري. وحدة قياس الدوران: degrees، deg (افتراضي)، rev، أو rawالدورة الواحدة تساوي 360 درجة.

Return Values

يُعيد هذا الأمر دوران الروبوت الحالي كقيمة double في الوحدة المحددة.

Examples
// Show rotation before and after turning.
Brain.Screen.print("Before: %f", myDrivetrain.rotation(degrees));
myDrivetrain.turnFor(right, 90, degrees);
wait(1, seconds);
Brain.Screen.newLine();
Brain.Screen.print("After: %f", myDrivetrain.rotation(degrees));
myDrivetrain.stop();