Hermetyzacja podstawowych ruchów robota w VEXcode Pro V5

Głównym celem jest pokazanie, jak zawrzeć niektóre podstawowe kody ruchu w funkcje, a nie do obliczania enkodera i manipulacji ruchem.

Poniższe przykładowe funkcje ruchu pomogą w stworzeniu podstawowego kodu ruchów:

  • Bardziej zorganizowany
  • Bardziej czytelny
  • Mniej podatne na błędy

Przede wszystkim będziesz musiał zdefiniować następujące podstawowe zmienne:

koło pływakowe = 10,16;
float WB = 36,75; //na podstawie konfiguracji V5 Clawbot

Uwaga: Jeśli zmienisz przełożenie, poniższe obliczenia mogą się nieznacznie zmienić w zależności od przełożenia.

Zostanie to omówione w innym artykule skupiającym się na enkoderze silnika:

float EncPerCm = 360/(koło* M_PI);
float EncPerDeg = WB/koło;

Ta próbka dotyczy tylko skrętu obrotowego. Np. prawy silnik = 100, lewy silnik = -100 itd.

Po drugie, gdy przeglądasz poniższe przykłady, zachęcamy do przejrzenia referencji API online dla parametrów i ich specyfikacji. Odwiedź: https://api.vexcode.cloud /v5/html/ i wyszukaj np. rotateTo w celu zapoznania się z parametrami.


Próbka 1: Enkapsuluj ruch prosty w oparciu o różne odległości

koło pływakowe = 10,16; 
float WB = 36,75; 
float EncPerCm = 360,0 / (Koło* 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)); 
}

// odległość w centymetrach
void goStraight( float odległość ){
	
	LeftMotor.resetPosition();
	LeftMotor.resetRotation();
	RightMotor.resetPosition();
	RightMotor.resetRotation();
  	
	float totalEnc = odległość * EncPerCm;
	
	// uwaga: „deg” pochodzi z przestrzeni nazw vex::. Dlatego nie należy 
        // tworzyć kolejnej zmiennej o nazwie „deg”. 

       LeftMotor.setVelocity(50,0, procent);
LeftMotor.spinToPosition(totalEnc, deg, false);

RightMotor.setVelocity (50,0, procent);
RightMotor.spinToPosition(totalEnc, deg, false); while (LeftMotor.isSpinning() || RightMotor.isSpinning() ) czekaj (50, ms); powrót; } int main() { vexcodeInit(); goStraight(100.0); Brain.Screen.printAt(5,60, "Gotowe"); reportMotionValues(LeftMotor, 30); reportMotionValues(RightMotor, 60); }

Próbka 2: Enkapsuluj skręty w lewo w oparciu o różne stopnie

koło pływakowe = 10,16; 
float WB = 36,75; 
float EncPerCm = 360,0 / (Koło* M_PI); 
float EncPerDeg = WB / Koło;

void turnRight( float stopni){
	
	LeftMotor.resetPosition( );
	LeftMotor.resetRotation();
	RightMotor.resetPosition();
	RightMotor.resetRotation();
  	
	float totalEnc = stopnie * EncPerDeg;
	
       // uwaga: ten „stopień” pochodzi z przestrzeni nazw vex
       LeftMotor.setVelocity(100,0, procent);
LeftMotor.spinToPosition(totalEnc, deg, false);

RightMotor.setVelocity(-100,0, procent);
RightMotor.spinToPosition(-totalEnc, deg, false); while(LeftMotor.isSpinning() || RightMotor.isSpinning() ) wait(50, ms); return; } int main(){ ... skręć w prawo (90,0); ... }

Próbka 3: Hermetyzuj lewą i prawą stronę w jednej funkcji

void doTurning( float stopni ) {
	// dokładnie ten sam kod co turnRight powyżej
}

int main() {
...
   do toczenia(90,0); // Obrót w prawo
   ...
   doToczenie (-90,0); // Skręt w lewo
}

W przypadku bardziej zaawansowanego programowania, jeśli chcesz, aby Twój kod był znacznie bardziej czytelny, możesz wypróbować następujące rozwiązania:

#define doLeftTurn(d) doTurning(d)
#define doRigtTurn(d) doTurning(-d)

int main( ) {
   ...
   skręć w lewo (90.0);  
   doRightTurning(90.0);
   ...
}

#define nazywa się makro wyrażeniem preprocesora. Spójrz na to wyrażenie jako na symbol. Gdziekolwiek ten symbol występuje w kodzie, będzie to zastąpiono wyrażeniem doTurning(określona wartość).

Makro preprocesora to inny obszerny temat i nie będzie omawiany w tym artykule.

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

Last Updated: