[JAVA] [Der weltweit größte Schüler der Mittel- und Oberstufe, Robocon] Über das Programm bei FRC ~ Main related ~

Dieser Artikel ist Teil von diesem Artikel. Schauen Sie sich das bitte zuerst an.

FIRST Zunaechst.

Obwohl ich die Hauptbeziehung erwähnt habe, gibt es einen Grund (nicht so sehr) und es ist eine Robot.java-bezogene Geschichte. Der Punkt ist, dass Robot.java die Rolle des Mains spielt.

Es ist ein nüchterner und wichtiger Teil.

Programmpolitik

Das Wichtigste ist, ** keine Fehlfunktionen zu verursachen (unbeabsichtigtes Verhalten) **.

Ich denke, das nächstwichtigste ist, den Roboter nicht zu belasten.

Der Roboter führt eine Schleifenverarbeitung durch. Wenn Sie den Code normal schreiben und eine Eingabe vorhanden ist, erfolgt dies in Form eines Befehls an den Motor usw. zu dem Zeitpunkt, an dem die Eingabe eingegeben wird, nicht wahr? Diese Methode verursacht jedoch (manchmal) Probleme.

Zum Beispiel ...

Lassen Sie uns einen Ort implementieren, an dem die Federung mit einer Steuerung betrieben werden kann!

python


setSpeed(controller.getX());

Ich möchte das Fahrwerk beim Aufstieg automatisch bewegen. Ich muss verschiedene Urteile fällen, weil ich verschiedene Teile bewege und es Schritt für Schritt mache. Füge if else zu setSpeed () hinzu!

python


setSpeed(controller.getX());

(Unterlassung)

if(controller.is_cimbMode) {
    if(is_liftup){
    (Unterlassung)
    if(is_advance) {
        setSpeed(1);
    }
}

Hier ist die erste Wand. Wenn dies unverändert bleibt, wiederholt die Eingabe in den Motor die Eingabe von der Steuerung und 1 in kurzer Zeit.

Es funktioniert überhaupt nicht gut Wenn Sie dies mit einem Aufzug tun, wird der Roboter stark belastet. (Es ist möglicherweise einfacher zu verstehen, wenn Sie an Head Banking denken.)   Selbst wenn Sie versuchen, damit umzugehen, wird es kompliziert und es wird ziemlich schwierig zu verstehen, wie die Arbeit erledigt wird. genau wie dieser,,,

python


if(controller.is_climbMode) {
    if(is_StopperOn && !is_liftMoving) {
        setSpeed(0.3);
        Timer.reset();
        Timer.start();
    }else if(is_liftUp && Timer.get() > 1) {
        setSpeed(1);
    }else {
        setSpeed(0);
    }
}else if(controller.hoge) {
    if(fuga) {
        setSpeed(-0.7);
    }else {
        setSpeed(0);
    }
}else {
    setSpeed(controller.getX());

Wenn dies nur das Fahrwerk ist, wird es an verschiedenen Orten in Massenproduktion hergestellt ...: Welle:

Hier habe ich mir ausgedacht

Lassen Sie uns verschiedene Urteile fällen und die Situation bestätigen, bevor wir umziehen ...

Wann. Laut dem Mentor (Leiter) heißt es "State Bot".

・ Controller-Teil ・ Teil, um eine Stufe zu erklimmen ・ Hoge Teil Es kann so geteilt werden.

Es ist in Ordnung, wenn Sie die Priorität des auszuführenden Inhalts festlegen und die Verarbeitung später im Code mit hoher Priorität schreiben

Ich möchte, dass eine Klasse die Situation behebt, daher ist die erstellte Klasse "State"

Es ist jedoch besser, das Feld jeder Schleife "State" zu initialisieren. Dies liegt daran, dass sich ein Wert, der einmal bearbeitet wurde, möglicherweise nur ändert, wenn er erneut bearbeitet wird. Sie können es mit anderen usw. anhängen, aber vorerst.

Außerdem habe ich eine Klasse namens "Const" erstellt und die Konstanten dort abgelegt. Der Vorteil ist ** es ist einfach, den Wert später zu ändern + es ist leicht zu verstehen, was der Wert ist **

Nachtrag (17.3.2019): Ich habe das Gefühl, etwas Wichtiges vergessen zu haben Grundsätzlich funktioniert es nicht mehr, wenn Sie Ihre Hand vom Controller nehmen! Achten Sie auch bei PID-Regelung darauf, anzuhalten, wenn die Taste nicht mehr gedrückt wird.

Auch die Aufhängung ist eine Stick-Operation, und die anderen sind Knopfoperationen.

Machen

Schreiben Sie in eine Klasse, die die IterativeRobot-Klasse erbt. (Die Ausführung wird besser.) Grundsätzlich überschreibt es die Funktion des iterativen Roboters. (Genau genommen die von IterativeRobot geerbte Funktion von lsrIterativeRobotBase)

Hauptfunktionen zum Überschreiben

Sie können den Inhalt anzeigen, indem Sie auf das Dreieck tippen oder darauf klicken. (IE und Edge scheinen nicht möglich zu sein)

public void RobotInit() Initialisierungsteil beim Starten des Roboters Der Konstruktor von `Robot` ändert sich nicht viel. Weisen Sie einer Variablen eine Instanz zu, legen Sie einen Anfangswert fest oder starten Sie eine Kameraerfassung.

Ein wenig über den Encoder setDistancePerPulse. Ein Encoder ist eine Maschine, die misst, wie viel sich ein Motor gedreht hat, aber ich werde diese Methode erklären, da sie leicht mit dem Programm zusammenhängt. (Ich denke, es gibt eine bessere Erklärung, wenn Sie im Internet suchen)

Im Inneren des Encoders befinden sich ein Licht und ein Lichtempfangsteil, und es gibt eine Schlitztrennwand mit einem Abstand zwischen ihnen in regelmäßigen Abständen, die jedes Mal zählt, wenn sich die Trennwand dreht und das Licht blockiert wird. Anhand der Zählzahl schätzen wir, wie viel sich der Roboter bewegt hat, indem wir die Entfernung pro Umdrehung multiplizieren. Der Abstand pro Umdrehung wird durch Berechnung oder tatsächliche Messung des Übersetzungsverhältnisses bestimmt. Es ist besser, theoretisch gefragt zu werden. Lassen Sie mich die Methode hier weglassen.

public void TeleopInit() Initialisierungsteil bei der Steuerung der Steuerung Wir haben es nicht benutzt.
public void TeleopPeriodic() Funktionsteil zum Zeitpunkt der Steuerung Die meisten erforderlichen Informationen sind in [Programmrichtlinie](# Programmrichtlinie) beschrieben. Clime wird in [Climb Article]() eingeführt.
public void autonomousInit() Initialisierungsteil, wenn autonom Wir haben es nicht benutzt
public void autonomousPeriodic() Funktionsteil im autonomen Zustand Dieses Jahr ist während des Sandsturms. Sie rufen TeleopPeriodic () auf.

Liste der Klasse Robotervariablen (erforderlich)

Der Roboter selbst hat nur Objekte wie Motortreiber, Auch hier werden Zustandsvariablen zusammengefasst. Die Bedeutung jeder Variablen ist in jedem Kapitel zusammengefasst.

Variablen, die der Roboter selbst hat

variables.java



    private State state;

    /** Controller 
     *Ich habe es zu einer Form gemacht, mit zwei zu operieren.
     */
    private XboxController driver, operator;

    /** Motors 
     *Funken links und rechts zu Ihren Füßen(Kraftfahrer)Aber,
     *Talon im Aufzug(Dies ist auch ein Motortreiber)Am Arm und auf der Stufe
     *Victor SP an den Beinen zum Klettern(Kraftfahrer)Erklärung, weil es gibt
     * 
     *Wenn es einen ähnlichen Motortreiber gibt, z. B. wenn zwei Motoren an einem Ort verwendet werden
     *Diese Motortreiber können in einer Klasse namens SpeedController zusammengefasst werden.
     *Dieses Mal haben wir es nicht verwendet, weil es physisch zusammengefasst ist.
     */
    private Spark driveLeft, driveRight;
    private Talon liftMotor;
    private VictorSP rollerMotor;
    private VictorSP climbMotor;

    /** Encoder, Gyro
     *Jeweils ein Encoder für den linken und rechten Fuß und einer für den Lift(Messen Sie die zurückgelegte Strecke
     *Derjenige, der krank wird)Und der Typ, der seine Füße zusammengesetzt hat.
     *Kreisel(Derjenige, der die Rotation messen kann)Erklären
     *EncoderGroup ist die ursprüngliche Klasse
     */ 
    private Encoder rightDriveEncoder, leftDriveEncoder;
    private EncoderGroup driveEncoder;
    private Encoder liftEncoder;
    private ADXRS450_Gyro gyro;

    /** Solenoid
     *Magnet(Was bewegt den Luftzylinder)Erklären
     *Wird verwendet, um die Arme zu verschränken, ein Brett zu ergreifen oder eine Stufe zu erklimmen
     */
    private Solenoid armSolenoid, barSolenoid;
    private Solenoid climbSolenoid;

    /** Compressor
     *Kompressor(Derjenige, der die Luft sammelt)Erklären
     */
    private Compressor compressor;

    /** Timer for climb
     *Timer beim Steigen
     */
    private Timer climbTimer;

    /* SubModule
     *Modul, wenn der Roboter grob geteilt ist
     *Ursprüngliche Klasse
     */
    private Drive drive;
    private Lift lift;
    private Grabber grabber;
    private Climb climb;

    //Sensor zur Linienverfolgung
    // 0~3.Die Spannung steigt an, wenn eine weiße 3-V-Leitung vorhanden ist
    //Leider nicht implementiert
    //private AnalogInput rightFrontSensor, 
    //                  rightBackSensor, 
    //                  leftFrontSensor, 
    //                  leftBackSensor;

    /** Camera
     *Der am Aufzug befestigte und der am Rahmen befestigte, um die Stufe zu erklimmen.
     */
    private CameraServer elevatorCamera, frameCamera;

    /** NetWorkTable
     *Um das Ergebnis der Bildverarbeitung zu erhalten
     *Dies ist ebenfalls nicht implementiert
     */
    private NetworkTable networkTable;

Staat von hier

Laufwerksbezogen
Fahrwerk. Alle Reifen werden hier gesteuert.

State.java


     public enum DriveState {
        kManual,
        kLineTrace,
        kCloseToLine
    }    //Modusumschaltung: Die beiden letzteren sind nicht implementiert
    public DriveState driveState;
    public double driveStraightSpeed, driveRotateSpeed;    //Steuerwert der Steuerung
    public double driveStraightSetpoint, driveRotateSetpoint;    //Zielwert der PID-Regelung
    public boolean is_drivePIDOn;    //Gibt an, ob die PID gesteuert werden soll
    public boolean is_lineTraceOn;    //Gibt an, ob eine Spur verfolgt werden soll
    public boolean is_lowInputOn;    //Gibt an, ob in den Low-Output-Modus gewechselt werden soll
Beziehung aufheben
Derjenige, der den Arm anhebt (später beschrieben). Es gibt nur eine Höhenkontrolle.

State.java


    public double liftSpeed;    //Steuerwert der Steuerung
    public double liftSetpoint;   //Zielwert der PID-Regelung
    public boolean is_liftPIDOn;    //Gibt an, ob die PID gesteuert werden soll
Armbeziehung
Ein Ort, an dem Sie einen Ball greifen und schießen oder ein Brett greifen und es befestigen können. Es heißt "Grabber".

State.java


    public enum CargoState {
        kHold,
        kRelease,
        kDoNothing
    }
  public CargoState cargoState;    //Was tun mit Fracht?
    public boolean is_toHoldPanel;    //Gibt an, ob das Panel gehalten werden soll
    public boolean is_toRetractArm;    //Ob der Arm aufbewahrt werden soll
Kletterbeziehung
Wird zum Klettern der letzten Stufe verwendet.

State.java


    public enum ClimbSequence {
        kDoNothing("kDoNothing"),
        kLiftUp("kLiftUp"),
        kLocking("kLocking"),
        kAdvance("kAdvance"),
        kUnlocking("kUnlocking"),
        kLiftDown("kLiftDown");

        String name;
        ClimbSequence(String name) {
            this.name = name;
        }
    }    //Einzelheiten finden Sie im Teil Aufstieg....String dient zum Debuggen
    public ClimbSequence climbSequence = ClimbSequence.kDoNothing;    //Zustand während des automatischen Aufstiegs
    public boolean is_autoClimbOn;    //Ob Sie automatisch klettern
    public boolean is_lockingClimb;    //Ob ein Stopper gelöscht werden soll
    public boolean is_lockedClimb;    //Ob der Stopper vollständig freigegeben ist
    public double climbMotorSpeed;    //Der Wert des Rahmenmotors zum Zeitpunkt des Kletterns

Inhalt von Const

Es ist eine Konstante. Es ist keine Zeit, hier wie oben aufzuzählen (~~ copy ~~), also auf Japanisch.

Grob geteilt

·Hafen ** · Feldabmessungen ** ** ・ Roboterabmessungen ** ** ・ Andere Konstanten **

Vier Arten von.

Der Port ist der Port, an dem der Motortreiber usw. in roboRIO (Roborio) steckt.

Nach dieser Regel ist die Größe des Feldes die Höhe, auf die der Ball gelegt wird.

Die Abmessungen des Roboters können Abstand pro Impulsgeber oder numerische Werte sein, die sich auf den Roboter beziehen.

Andere Konstanten sind Totzone und PID-Koeffizient.

Ich denke, es ist einfacher zu handhaben, wenn Sie es grob teilen.

Über Autonomie (über Kontrolle während des Sandsturms)

Automatische Steuerung für die ersten 15 Sekunden. Es funktioniert jedes Jahr vollautomatisch, aber aus irgendeinem Grund ist es in diesem Jahr möglich, den Controller mit einer Kamera zu steuern. Es heißt Sandsturm ...

Wir haben eine Kamera verwendet, um den Controller zu steuern. Die gesamte Verarbeitung ist dieselbe wie bei Teleop oder ruft "teleopPeriodic ()" auf.

LAST Schließlich. Bevor wir uns mit dem Fahrwerk befassen, wollen wir uns mit der PID-Regelung befassen.

Dann!

Vorheriger Artikel ⇒ FIRST Nächster Artikel ⇒ Informationen zur PID-Regelung

Recommended Posts

[Der weltweit größte Schüler der Mittel- und Oberstufe, Robocon] Über das Programm bei FRC ~ Main related ~
[Der weltweit größte Schüler der Mittel- und Oberstufe, Robocon] Über das FRC-Programm ~ Grabber related ~
[Der weltweit größte Schüler der Mittel- und Oberstufe, Robocon] Über das FRC-Programm ~ Lift related ~
[Der weltweit größte Schüler der Mittel- und Oberstufe, Robocon] Über das FRC-Programm ~ Über Begriffe usw. ~
[Der weltweit größte Schüler Robocon] Über das FRC-Programm ~ Über die PID-Regelung ~
Über das weltgrößte Robocon FRC-Programm für Schüler ~ Climb related ~
Eine Geschichte von sechs Schülern der Mittel- und Oberstufe, die einen Dienst leisten und den ersten Platz bei einem Programmierschulwettbewerb einnehmen