Основна мета — показати вам, як інкапсулювати деякі фундаментальні коди руху у функції, а не для обчислень кодувальника та маніпуляцій рухом.
Наведені нижче приклади функцій руху допоможуть створити базовий код рухів:
- Більш організований
- Більш читабельний
- Менша схильність до помилок
Перш за все, вам потрібно буде визначити наступні основні змінні:
поплавкове колесо = 10,16; float WB = 36,75; //на основі конфігурації V5 Clawbot
Примітка. Якщо ви зміните передавальне число, наведений нижче розрахунок може дещо змінитися залежно від передавального числа.
Це буде обговорено в іншій статті, присвяченій кодеру двигуна:
float EncPerCm = 360/(колесо* M_PI); float EncPerDeg = WB/Wheel;
Цей зразок лише для повороту. напр правий двигун = 100, лівий двигун = -100 і т.д.
По-друге, коли ви переглядаєте наведені нижче зразки, вам пропонується знайти параметри та їхні специфікації в онлайн-довідці API. Відвідайте:https://api.vexcode.cloud/v5/html/і знайдіть, наприклад,rotateTo
, щоб ознайомитися з параметрами.
Зразок 1: Інкапсуляція прямолінійного руху на основі різних відстаней
поплавкове колесо = 10,16; float WB = 36,75; float EncPerCm = 360,0 / (Колесо* M_PI); void reportMotionValues(motor m, int line){ Brain.Screen.printAt(5,line, "%8.2lf%8.2lf%8.2f", m.position(rev), m.position(deg)); } // відстань у сантиметрах void goStraight( float distance ){ LeftMotor.resetPosition(); LeftMotor.resetRotation(); RightMotor.resetPosition(); RightMotor.resetRotation(); float totalEnc = distance * EncPerCm; // примітка: «deg» походить із простору імен vex::. Таким чином, ви не повинні // створювати іншу змінну з назвою «deg». LeftMotor.setVelocity(50,0, відсоток);
LeftMotor.spinToPosition(totalEnc, deg, false);
RightMotor.setVelocity(50,0, відсоток);
RightMotor.spinToPosition(totalEnc, deg, false); while (LeftMotor.isSpinning() || RightMotor.isSpinning() ) wait(50, мс); повернення; } int main() { vexcodeInit(); goStraight(100,0); Brain.Screen.printAt(5,60, "Готово"); reportMotionValues(LeftMotor, 30); reportMotionValues(RightMotor, 60); }
Зразок 2: Інкапсуляція поворотів ліворуч на основі різних градусів
поплавкове колесо = 10,16; float WB = 36,75; float EncPerCm = 360,0 / (Колесо* M_PI); float EncPerDeg = WB / Колесо; void turnRight( float degrees){ LeftMotor.resetPosition(); LeftMotor.resetRotation(); RightMotor.resetPosition(); RightMotor.resetRotation(); float totalEnc = градуси * EncPerDeg; // примітка: цей «deg» із простору імен vex LeftMotor.setVelocity(100.0, percent);
LeftMotor.spinToPosition(totalEnc, deg, false);
RightMotor.setVelocity(-100,0, відсоток);
RightMotor.spinToPosition(-totalEnc, deg, false); while(LeftMotor.isSpinning() || RightMotor.isSpinning() ) wait(50, мс); повернення; } int main(){ ... повернути праворуч (90,0); ... }
Зразок 3: Інкапсуляція лівого та правого боку в одній функції
void doTurning( float degrees ) { // точно такий самий код, як turnRight вище } int main() { ... doTurning(90,0); // Правий поворот повороту ... doTurning(-90,0); // Поворот лівої опори }
Для розширеного програмування, якщо ви хочете зробити свій код більш читабельним, ви можете спробувати наступне:
#define doLeftTurn(d) doTurning(d) #define doRigtTurn(d) doTurning(-d) int main() { ... doLeftTurn(90,0); doRightTurning(90,0); ... }
#define
називається макровиразом препроцесора. Розгляньте цей вираз як символ. Усюди, де цей символ зустрічається в коді, вінбуде заміненовиразомdoTurning (вказане значення)
.
Макрос препроцесора — це інша обширна тема, і вона не буде обговорюватися в цій статті.