Інкапсуляція основних рухів робота у VEXcode Pro V5

Основна мета — показати вам, як інкапсулювати деякі фундаментальні коди руху у функції, а не для обчислень кодувальника та маніпуляцій рухом.

Наведені нижче приклади функцій руху допоможуть створити базовий код рухів:

  • Більш організований
  • Більш читабельний
  • Менша схильність до помилок

Перш за все, вам потрібно буде визначити наступні основні змінні:

поплавкове колесо = 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 (вказане значення).

Макрос препроцесора — це інша обширна тема, і вона не буде обговорюватися в цій статті.

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: