[세계 최대급 중학생 로봇 대회] FRC에서의 종목에 대해서~ Main 관계~
17801 단어 Java
FIRST
일단
마인 관계라지만 안 좋은 이유도 있어 (사실 그렇게 많지 않아) 로봇.이것은 자바에 관한 화제다.
중요한 건 메인 담당은 로봇이야.자바야.
소박하고 중요한 부분이에요.
프로젝트 방침
가장 중요한 것은 오작동을 하지 않는 것이다.
그 다음으로 중요한 것은 로봇에 부하를 가하지 않는 것이다.
로봇이 순환 처리를 하고 있다.
코드를 보통 쓰면 어떤 입력이 있으면 입력하는 순간 모터 등에 명령을 내리는 형식이죠?
그러나 이런 방식은 문제가 생길 수 있다(때로)
예컨대.
※ 함수는 간단하기 때문에 허구
컨트롤러로 다리를 조종하는 곳을 설치해라!
setSpeed(controller.getX());
계단을 오르고 싶을 때 자동으로 발을 돌려요.움직여야 할 부분도 많고 단계적으로 해야 하기 때문에 여러 가지 판단을 해야 한다.set Speed()에 if else를 붙여주세요!
setSpeed(controller.getX());
(中略)
if(controller.is_cimbMode) {
if(is_liftup){
(中略)
if(is_advance) {
setSpeed(1);
}
}
여기가 첫 번째 벽이야.이렇게 되면 모터에 대한 입력은 짧은 시간 안에 컨트롤러로부터의 입력과 1을 반복하게 된다.
말하자면 이렇게 하면 잘 안 돌아가요.
우회라면 차치하고 리프트를 쓰면 로봇에 큰 부담이 된다.
(두건을 생각하면 이해하기 쉬울 것 같다)
따라서if else로 처리하려고 해도 복잡화+어떤 절차로 작업을 진행하는지 이해하기 어렵다.
이렇게
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());
※ 이것은 인상이게 발만 돌리면 별론이야. 많은 곳에서 에너지가 생산돼...
여기서 생각났어요.
각양각색의 판정을 할 수 있고, 상황을 확인한 후에 행동할 수 있다...
잠깐만요.지도교사(지도자)에 따르면
StateBot
./컨트롤러 부분
• 차원감 있는 부분
보충 부분
이렇게 헤어져.
실행할 내용의 우선순위를 정하고, 코드적으로 우선순위가 높은 처리를 뒤에 쓰면 OK
상황을 확인하기 위해 반을 원하기 때문에 반을 만들었다
State
그러나 각 순환State
의 필드는 초기화하는 것이 가장 좋다.한 번 조작한 값이 다시 조작하지 않으면 변하지 않을 수 있기 때문이다.else 등으로 묻히면 돼요. 그런데, 일단.
또 하나의 등급
Const
을 세우고 거기서 상수를 정리한다.장점은 뒤에 값이 뭔지 잘 알 수 있다는 거예요.
추기(2019/3/17): 중요한 걸 잊은 것 같아요.
기본적으로 컨트롤러에서 손을 놓으면 동작이 멈춘다!
PID 제어의 경우에도 버튼을 누르지 않으면 중지해야 합니다.
그리고 발은 걸음 조작이고 그 외에 버튼 조작이다.
번거로운 일
IterativeRobot
반을 물려받은 클라스에 적혀 있다.(실행하니 기분이 좋다.)기본적으로 Iterative Robot의 함수를 재작성합니다.(엄밀히 말하면 Iterative Robot이 계승하는 lsrIterative RobotBase의 함수)
주요 함수 무시
클릭하거나 삼각형을 클릭하면 내용을 볼 수 있다.(IE 및 Edge가 작동하지 않는 것 같음)
public void RobotInit()
로봇 가동 시 초기화 부분
Robot
의 구조기도 변화가 없었다.변수를 인스턴스에 대입하고 초기 값을 설정하여 카메라 스냅을 시작합니다.
인코더에 대한
setDistancePerPulse
조금.인코더는 모터가 얼마나 회전했는지 측정하는 기계로 그 방법과 절차가 다소 다르다는 것을 여기에 설명한다.(인터넷에서 찾아보면 더 좋은 해설이 있을 것 같아요.)
인코더에는 등과 수광부가 있고 그 사이에 일정한 간격의 틈새식 칸막이가 있으며 이 칸막이가 회전광선이 가려질 때마다 계수를 한다.
이 계수에 따르면 로봇이 한 바퀴씩 회전하는 거리가 얼마나 돌아가는지 추정된다.
톱니바퀴 비율 등을 고려해 회전마다 거리를 계산하고 실측을 통해 결정한다.이론적으로 요구하는 것이 비교적 좋다.내가 여기서 그 방법을 베는 것을 허락해 주십시오.
public void TeleopInit()
컨트롤러 제어의 초기화 부분
우리는 사용하지 않았다.
public void TeleopPeriodic()
컨트롤러 제어 시 함수 부분
필요한 것들프로젝트 방침은 거의 다 적혀 있다.
암벽 등반은 (계단을 오르는 것은) 클렘의 보도 에서 소개된다.
public void autonomousInit()
autoonomous의 초기화 부분
저희가 안 썼어요.
public void autonomousPeriodic()
autoonomous 시 함수 부분
올해는 SandStorm에서
TeleopPeriodic()를 호출하고 있습니다.
class Robot의 변수 리스트(필요)
Robot 자체는 모터 드라이브 등 대상만
State 변수도 여기에 요약됩니다.
각 변수의 뜻을 각 장으로 총결하다.
Robot 자체 변수
variables.java
private State state;
/** Controller
* 二つで操作する形にした。
*/
private XboxController driver, operator;
/** Motors
* 足元に左右一つずつSpark(モータードライバ)が、
* リフトにTalon(こちらもモータードライバ)、腕と、段差に
* 上る用の足にVictorSP(モータードライバ)があるので宣言
*
* 一つの箇所に二つモータを使うだとかで同じようなモータードライバがある場合は
* SpeedControllerというクラスでこれらのモータードライバをまとめることができる。
* 今回は僕たちは物理的にまとめたので使用していない。
*/
private Spark driveLeft, driveRight;
private Talon liftMotor;
private VictorSP rollerMotor;
private VictorSP climbMotor;
/** Encoder, Gyro
* 足元左右とリフトにに一つずつエンコーダ(進んだ距離を測
* れたりするやつ)と足元のをまとめたやつ。
* ジャイロ(回転を計測できたりするやつ)を宣言
* EncoderGroupはオリジナルのクラス
*/
private Encoder rightDriveEncoder, leftDriveEncoder;
private EncoderGroup driveEncoder;
private Encoder liftEncoder;
private ADXRS450_Gyro gyro;
/** Solenoid
* ソレノイド(エアシリンダを動かすもの)を宣言
* 腕をしまったり板をつかんだり段差を上るのに使用
*/
private Solenoid armSolenoid, barSolenoid;
private Solenoid climbSolenoid;
/** Compressor
* コンプレッサー(空気をためるやつ)を宣言
*/
private Compressor compressor;
/** Timer for climb
* 段差に上る時に使用するタイマー
*/
private Timer climbTimer;
/* SubModule
* ロボットを大まかに分けた時のモジュール
* オリジナルのクラス
*/
private Drive drive;
private Lift lift;
private Grabber grabber;
private Climb climb;
// ライントレース用のセンサー
// 0~3.3V 白線があると電圧が上がる
// 残念ながら未実装
//private AnalogInput rightFrontSensor,
// rightBackSensor,
// leftFrontSensor,
// leftBackSensor;
/** Camera
* エレベーターについているのと、段差に上る用の枠についているもの。
*/
private CameraServer elevatorCamera, frameCamera;
/** NetWorkTable
* 画像処理の結果を受け取るためのもの
* こちらも未実装
*/
private NetworkTable networkTable;
여기서부터.드라이브 관계
방문하다.이곳에서 모든 타이어를 제어한다.
State.java
public enum DriveState {
kManual,
kLineTrace,
kCloseToLine
} // モード切替 後半二つは未実装
public DriveState driveState;
public double driveStraightSpeed, driveRotateSpeed; // コントローラー制御の値
public double driveStraightSetpoint, driveRotateSetpoint; // PID制御の目標値
public boolean is_drivePIDOn; // PID制御するかどうか
public boolean is_lineTraceOn; // ライントレースするかどうか
public boolean is_lowInputOn; // 低出力モードにするかどうか
Lift 관계기계 팔의 부품을 들어올리다.높이만 조정합니다.
State.java
public double liftSpeed; // コントローラー制御の値
public double liftSetpoint; // PID制御の目標値
public boolean is_liftPIDOn; // PID制御するかどうか
Arm 관계공을 잡고 발사해.
Grabber
.State.java
public enum CargoState {
kHold,
kRelease,
kDoNothing
}
public CargoState cargoState; // カーゴをどうするか
public boolean is_toHoldPanel; // パネルを保持するかどうか
public boolean is_toRetractArm; // アームをしまうかどうか
Climb 관계마지막 계단을 오르는 데 쓰이는 물건.
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;
}
} // 詳しい内容はClimb部分で... Stringはデバッグ用
public ClimbSequence climbSequence = ClimbSequence.kDoNothing; // 自動クライム中の状態
public boolean is_autoClimbOn; // 自動クライムしているかどうか
public boolean is_lockingClimb; // ストッパーを出すかどうか
public boolean is_lockedClimb; //ストッパーが完全に出されたかどうか
public double climbMotorSpeed; // クライムの時の枠のモーターの値
컨텐트
상수
여기에 위와 같이 열거하면 끝이 없기 때문에 일본어로 쓴다.
대강 갈라놓으면
/포트
• 필드 크기
• 로봇의 크기
• 기타 상수
네 가지.
포트는 모터 드라이브 등 찌르기roboRIO(로봇 리우)의 포트다.
필드의 사이즈는 이번 규칙으로 공을 넣는 높이다.
로봇의 사이즈인코더 펄스당 거리나 로봇과 관련된 수치가 있다.
다른 상수는 사구 및 PID 계수이다.
나는 대충 나누는 것이 비교적 관리하기 쉽다고 생각한다.
autoonomous 정보(Sandstorm 의 제어 정보)
첫 번째 15초 자동 제어.예전에는 모두 완전히 자동적으로 가동되었지만, 올해는 왜 카메라로 컨트롤러를 제어해야 하는지 모르겠다
Sandstorm인 줄 몰랐는데...
우리는 카메라로 컨트롤러를 제어했다.모든 처리가 Teleop과 같거나
teleopPeriodic()
호출됩니다.LAST
마지막.
다음은 돌려서 말하기 전에 PID 제어에 관한 이야기입니다.
그럼!
앞기사 σFIRST
다음 기사 ↑PID 제어 정보
Reference
이 문제에 관하여([세계 최대급 중학생 로봇 대회] FRC에서의 종목에 대해서~ Main 관계~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/amidaandhero02/items/4833e36d92b58398a34c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)