محرك أقراص ذكي#
مقدمة#
The smartdrive class controls how a robot drives and turns using motors, wheels, and a sensor. A smartdrive can use an Inertial Sensor or Gyro Sensor to track heading and rotation.
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.
مُنشئات الفئات#
1 — Creates a smartdrive using existing
motor_groupobjects for the left (&l) and right (&r) sides, along with an Inertial Sensor or Gyro Sensor.smartdrive( motor_group &l, motor_group &r, inertial &g, double wheelTravel = 320, double trackWidth = 320, double wheelBase = 130, distanceUnits unit = mm, double externalGearRatio = 1.0 );
2 — يقوم بإنشاء محرك ذكي باستخدام كائنات المحرك
motorللجانب الأيسر (&l) والجانب الأيمن (&r)، بالإضافة إلى مستشعر القصور الذاتي أو مستشعر الدوران.smartdrive( motor &l, motor &r, inertial &g, double wheelTravel = 320, double trackWidth = 320, double wheelBase = 130, distanceUnits unit = mm, double externalGearRatio = 1.0 );
مُدمِّر الفئة#
يقوم بتدمير الكائن smartdrive وتحرير الموارد المرتبطة به.
~smartdrive();
حدود#
يمكن أن تكون معلمة المستشعر عبارة عن جسم قصوري inertial أو gyro.
المعلمة |
يكتب |
وصف |
|---|---|---|
|
|
تشير هذه المعامل إلى مثيلات موجودة من نوع |
|
|
إشارة إلى مثيل موجود |
|
|
محيط عجلات نظام نقل الحركة. القيمة الافتراضية هي |
|
|
المسافة بين العجلتين اليمنى واليسرى. القيمة الافتراضية هي |
|
|
المسافة بين العجلتين الأمامية والخلفية. القيمة الافتراضية هي |
|
|
وحدة قياس |
|
|
نسبة التروس المستخدمة لضبط مسافات القيادة في حال استخدام التروس. القيمة الافتراضية هي |
مثال#
/* 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 instances
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);
// Create the inertial instance
inertial myInertial = inertial(PORT3);
// Create the smartdrive instance
smartdrive myDrivetrain = smartdrive(
leftMotor, // left motor object
rightMotor, // right motor object
myInertial, // inertial object
259.34, // wheelTravel
320, // trackWidth
40, // wheelBase
mm, // unit
1.0 ); // externalGearRatio
الدوال الأعضاء#
تتضمن فئة smartdrive ) وظائف الأعضاء التالية:
الإجراءات — قم بتدوير الروبوت باستخدام الاتجاه أو الدوران.
turnToHeading— يُوجّه الروبوت نحو اتجاه مُحدد من -359 إلى 359 درجة. سيسلك الروبوت أقصر مسار للوصول إلى الاتجاه المطلوب.turnToRotation— يقوم بتدوير الروبوت إلى دوران محدد.calibrateDrivetrain— معايرة المستشعر بالقصور الذاتي أو مستشعر الدوران.
الإعدادات — ضبط قيم الاتجاه والدوران.
setHeading— يغير اتجاه الروبوت الحالي إلى اتجاه جديد.setRotation— يغير دوران الروبوت الحالي إلى دوران جديد.
القيم — تحقق من العنوان والدوران.
يمكن لـ 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 instances
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);
// Create the inertial instance
inertial myInertial = inertial(PORT3);
// Create the smartdrive instance
smartdrive myDrivetrain = smartdrive(
leftMotor, // left motor object
rightMotor, // right motor object
myInertial, // inertial object
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 Functions1 — يقوم بتحويل مجموعة نقل الحركة إلى الاتجاه المحدد باستخدام سرعة الدوران المُكوّنة.
bool turnToHeading( double angle, rotationUnits units, bool waitForCompletion = true );
Parameters2 — يقوم بتحويل مجموعة نقل الحركة إلى الاتجاه المحدد بالسرعة المحددة.
bool turnToHeading( double angle, rotationUnits units, double velocity, velocityUnits units_v, bool waitForCompletion = true );
المعلمة |
يكتب |
وصف |
|---|---|---|
|
|
الاتجاه الذي يجب أن يواجهه الروبوت، بالدرجات. يمكن أن يكون هذا الاتجاه من -359 إلى 359 عند استخدام |
|
|
وحدة الدوران: |
|
|
تتراوح سرعة الدوران من 0% إلى 100% عند استخدام |
|
|
وحدة السرعة: |
|
|
|
تُرجع هذه الدالة ما إذا كان الروبوت قد وصل إلى الاتجاه المستهدف، كقيمة منطقية (Boolean).
true— وصل الروبوت إلى الاتجاه المستهدف.false— لم يكمل الروبوت الدور، أو تم إرجاع الدالة قبل اكتمال الدور لأنwaitForCompletionتم تعيينها إلىfalse.
سيؤدي تنفيذ وظيفة حركة أخرى لنظام نقل الحركة (مثل
turnأوdrive) أثناء تنفيذturnToHeadingإلى مقاطعة الحركة الحالية.لأن
turnToHeadingيعتمد على الهدف (يستخدم معلمة زاويةangle)، فإن وظائف مثلisDoneوisMovingتعمل معturnToHeading.
// Face the new 0 degrees
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);
turnToRotation#
turnToRotation يقوم بتدوير الروبوت إلى دوران محدد.
الدوران هو مقدار دوران الروبوت، ويُقاس بالدرجات أو الدورات. في بداية المشروع، تُضبط قيمة الدوران على صفر درجة. كما يمكن ضبط الدوران باستخدام الدالة setRotation.
قيم الدوران مطلقة. وهذا يعني أن اتجاه الدوران يعتمد على دوران الروبوت الحالي. الدوران إلى اليمين يزيد من الدوران، والدوران إلى اليسار يقلل منه.
على سبيل المثال، إذا بدأ الروبوت من زاوية صفر درجة، ثم قمت بتدويره بزاوية 720 درجة، فسيدور إلى اليمين مرتين. وإذا قمت بعد ذلك بتدويره بزاوية 360 درجة، فسيدور إلى اليسار مرة واحدة، لأن 360 درجة أقل من 720 درجة.
سينتظر المشروع حتى ينتهي الروبوت من الدوران قبل تشغيل سطر التعليمات البرمجية التالي.
Available Functions1 — يقوم بتدوير مجموعة نقل الحركة إلى الدوران المحدد باستخدام سرعة الدوران المُكوّنة.
bool turnToRotation( double angle, rotationUnits units, bool waitForCompletion = true );
Parameters2 — يقوم بتدوير مجموعة نقل الحركة إلى الدوران المحدد بالسرعة المحددة.
bool turnToRotation( double angle, rotationUnits units, double velocity, velocityUnits units_v, bool waitForCompletion = true );
المعلمة |
يكتب |
وصف |
|---|---|---|
|
|
قيمة الدوران التي سيتجه إليها الروبوت. |
|
|
وحدة الدوران: |
|
|
تتراوح سرعة الدوران من 0% إلى 100% عند استخدام |
|
|
وحدة السرعة: |
|
|
|
تُرجع هذه الدالة ما إذا كان الروبوت قد وصل إلى الدوران المستهدف، كقيمة منطقية (Boolean).
true— وصل الروبوت إلى الدوران المستهدف.false— لم يكمل الروبوت الدور، أو تم إرجاع الدالة قبل اكتمال الدور لأنwaitForCompletionتم تعيينها إلىfalse.
سيؤدي تنفيذ وظيفة حركة أخرى لنظام نقل الحركة (مثل
turnأوdrive) أثناء تنفيذturnToRotationإلى مقاطعة الحركة الحالية.لأن
turnToRotationيعتمد على الهدف (يستخدم معلمة زاويةangle)، فإن وظائف مثلisDoneوisMovingتعمل معturnToRotation.
// Spin counterclockwise for 2 turns, then face forward
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);
calibrateDrivetrain#
calibrateDrivetrain يقوم بمعايرة مستشعر القصور الذاتي أو مستشعر الجيروسكوب المُهيأ مع نظام القيادة الذكي.
تساعد عملية المعايرة المستشعر على قياس الحركة بدقة. حافظ على ثبات الروبوت لمدة ثانيتين تقريبًا أثناء المعايرة. إذا تحرك الروبوت أثناء المعايرة، فقد لا يقيس المستشعر الحركة بدقة.
سينتظر المشروع حتى يتم الانتهاء من عملية المعايرة قبل تشغيل السطر التالي من التعليمات البرمجية.
يتم إنشاء الأمر calibrateDrivetrain تلقائيًا بواسطة VEXcode عند تهيئة نظام نقل الحركة باستخدام مستشعر القصور الذاتي أو مستشعر الدوران. وهو مُضمّن في مصدر المشروع وليس جزءًا من واجهة برمجة تطبيقات VEX EXP C++.
void calibrateDrivetrain();
لا تقبل هذه الدالة أي معلمات.
Return Valuesهذه الدالة لا تُرجع قيمة.
Notesيقوم الروبوت بمعايرة نفسه تلقائيًا في بداية كل مشروع.
حافظ على ثبات الروبوت لمدة ثانيتين تقريبًا أثناء عملية المعايرة.
فيما يلي التنفيذ التلقائي للأمر 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 Functionsvoid setHeading(
double value,
rotationUnits units);
المعلمة |
يكتب |
وصف |
|---|---|---|
|
|
قيمة الاتجاه المراد ضبطها للروبوت. يمكن أن تتراوح هذه القيمة بين -359 و359 عند استخدام |
|
|
وحدة القياس: |
هذه الدالة لا تُرجع قيمة.
Examples// Face the new 0 degrees
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);
setRotation#
الدوران هو مقدار دوران الروبوت، ويُقاس بالدرجات أو الدورات. في بداية المشروع، تُضبط قيمة الدوران على صفر درجة. يُغيّر setRotation قيمة الدوران الحالية للروبوت إلى قيمة جديدة.
على سبيل المثال، إذا أكمل الروبوت دورتين كاملتين إلى اليمين، ستكون قيمة دورانه 720 درجة. ضبط قيمة الدوران على 0 درجة سيعيد ضبطها من 720 إلى 0 درجة. بعد ذلك، يمكن للروبوت الدوران وفقًا لهذه القيمة الجديدة.
Available Functionsvoid setRotation(
double value,
rotationUnits units);
المعلمة |
يكتب |
وصف |
|---|---|---|
|
|
قيمة الدوران التي يجب ضبطها للروبوت. |
|
|
وحدة الدوران: |
هذه الدالة لا تُرجع قيمة.
Examples// Spin counterclockwise for 2 turns, then face forward
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);
heading#
الاتجاه هو المسار الذي يواجهه الروبوت، ويُقاس بالدرجات. يُعيد الأمر heading اتجاه الروبوت الحالي من 0 إلى 359 درجة.
اتجاه بدء الروبوت هو 0 درجة.
Available Functionsdouble heading( rotationUnits units = rotationUnits::deg );
المعلمة |
يكتب |
وصف |
|---|---|---|
|
|
اختياري. وحدة قياس اتجاه العودة: |
يُعيد هذا الأمر اتجاه الروبوت الحالي كرقم double بالوحدة المحددة.
// 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 Functionsdouble rotation( rotationUnits units = rotationUnits::deg );
المعلمة |
يكتب |
وصف |
|---|---|---|
|
|
اختياري. وحدة قياس اتجاه العودة: |
يُعيد هذا الأمر دوران الروبوت الحالي كقيمة double في الوحدة المحددة.
// 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();