смартдрайв#

Вступ#

Клас smartdrive контролює рух та повороти робота за допомогою двигунів, коліс та датчика. smartdrive може використовувати Інерційний датчик або Гіроскопічний датчик для відстеження напрямку та обертання.

A smartdrive використовує датчик, щоб допомогти роботу точно рухатися та повертатися. На початку кожного проекту трансмісія автоматично калібрує датчик. Під час калібрування тримайте робота нерухомим приблизно 2 секунди, щоб він міг правильно рухатися та повертатися.

Клас smartdrive базується на класі drivetrain. Він може використовувати ті ж функції керування та повороту, що й drivetrain, а також додає функції на основі датчиків, такі як turnToHeading та turnToRotation.

Конструктори класів#

1 — Створює смарт-привід, використовуючи існуючі об’єкти motor_group для лівого (&l) та правого (&r) боків, а також інерційний датчик або гіроскоп.

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.

Параметр

Тип

Опис

&l / &r

motor_group / motor

Посилання на існуючі екземпляри motor або motor_group Обидва параметри повинні бути одного типу: або два екземпляри motor_group , або два екземпляри motor Параметр &l стосується лівого двигуна або групи двигунів, а &r – правого двигуна або групи двигунів.

&g

gyro&

Посилання на існуючий екземпляр гіроскопа 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 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 містить такі функції-члени:

Дії — Повернути робота за допомогою напрямку руху або обертання.

Налаштування — Налаштуйте значення заголовка та повороту.

  • 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 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#

Курс руху – це напрямок, у якому рухається робот, виміряний у градусах. turnToHeading повертає робота у певному напрямку від -359 до 359 градусів. Робот поверне у найкоротшому напрямку, щоб досягти цільового курсу.

Початковий курс робота становить 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 до 600 об/хв при використанні rpm, або від 0 до 3600 градусів за секунду при використанні dps. Якщо швидкість не вказана, робот повертається з поточною швидкістю повороту.

units_v

velocityUnits

Одиниця вимірювання швидкості: velocityUnits::pct (відсоток), rpm (оберти за хвилину) або dps (градуси за секунду).

waitForCompletion

bool

true (за замовчуванням) змушує проект чекати, поки робот завершить обертання, перш ніж виконувати наступний рядок коду. false змушує наступний рядок коду виконуватися негайно.

Return Values

Повертає, чи досяг робот цільового напрямку, у вигляді логічного значення.

  • true — Робот досяг цільового курсу.

  • false — Робот не завершив хід, або функція повернула результат до завершення ходу, оскільки waitForCompletion було встановлено на false.

Notes
  • Виконання іншої функції руху трансмісії (наприклад, turn або drive) під час виконання turnToHeading перерве поточний рух.

  • Оскільки turnToHeading базується на цілі (використовує параметр кута angle ), такі функції, як isDone та isMoving, працюють з turnToHeading.

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

turnToRotation#

turnToRotation повертає робота до певного обертання.

Обертання – це кут повороту робота, що вимірюється в градусах або обертах. На початку проекту значення повороту встановлюється на 0 градусів. Обертання також можна встановити за допомогою функції setRotation.

Значення обертання є абсолютними. Це означає, що напрямок повороту залежить від поточного обертання робота. Поворот праворуч збільшує обертання, а поворот ліворуч зменшує обертання.

Наприклад, якщо робот починає рух з кута 0 градусів, а потім повертається на 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 до 600 об/хв при використанні rpm, або від 0 до 3600 градусів за секунду при використанні dps. Якщо швидкість не вказана, робот повертається з поточною швидкістю повороту.

units_v

velocityUnits

Одиниця вимірювання швидкості: velocityUnits::pct (відсоток), rpm (оберти за хвилину) або dps (градуси за секунду).

waitForCompletion

bool

true (за замовчуванням) змушує проект чекати, поки робот завершить обертання, перш ніж виконувати наступний рядок коду. false змушує наступний рядок коду виконуватися негайно.

Return Values

Повертає, чи досяг робот цільового обертання, у вигляді логічного значення.

  • true — Робот досяг цільового обертання.

  • false — Робот не завершив хід, або функція повернула результат до завершення ходу, оскільки waitForCompletion було встановлено на false.

Notes
  • Виконання іншої функції руху трансмісії (наприклад, turn або drive) під час виконання turnToRotation перерве поточний рух.

  • Оскільки turnToRotation базується на цілі (використовує параметр кута angle ), такі функції, як isDone та isMoving, працюють з turnToRotation.

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

calibrateDrivetrain#

calibrateDrivetrain калібрує інерційний датчик або гіроскоп, налаштований за допомогою смарт-приводу.

Калібрування допомагає датчику правильно вимірювати рух. Під час калібрування тримайте робота нерухомим приблизно 2 секунди. Якщо робот рухається під час калібрування, датчик може неправильно вимірювати рух.

Проєкт чекатиме на завершення калібрування, перш ніж буде виконано наступний рядок коду.

Значення calibrateDrivetrain генерується автоматично VEXcode, коли трансмісія налаштована з інерціальним датчиком або гіроскопічним датчиком. Воно надається як частина вихідного коду проекту та не є частиною C++ API VEX EXP.

Available Functions
void calibrateDrivetrain();

Parameters

Ця функція не приймає жодних параметрів.

Return Values

Ця функція не повертає значення.

Notes
  • Робот калібрується автоматично на початку кожного проєкту.

  • Тримайте робота нерухомо приблизно 2 секунди під час калібрування.

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 змінює поточний курс робота на нове значення курсу.

Наприклад, якщо робот повернувся обличчям праворуч, встановлення курсу на 0 градусів робить це положення обличчям праворуч новим 0 градусами. Потім робот може повертатися в інші позиції на основі цього нового курсу.

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#

Обертання – це величина повороту робота, що вимірюється в градусах або обертах. На початку проекту значення повороту встановлюється на 0 градусів. 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#

Обертання – це кут повороту робота, виміряний у градусах або обертах. На початку проекту значення повороту встановлюється на 0 градусів. 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();