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.
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.
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)
Sie können den Inhalt anzeigen, indem Sie auf das Dreieck tippen oder darauf klicken. (IE und Edge scheinen nicht möglich zu sein)
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.
Der Roboter selbst hat nur Objekte wie Motortreiber, Auch hier werden Zustandsvariablen zusammengefasst. Die Bedeutung jeder Variablen ist in jedem Kapitel zusammengefasst.
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
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
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
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
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
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.
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