Robotu Tank Sürüş methodu ve Joysticklerle Sürmek

Yaygın bir kullanım durumu, bir alt sistemin parçası olan bazı aktüatörleri çalıştırması gereken bir kumanda çubuğuna sahip olmaktır. Sorun, joystick’in RobotContainer sınıfında oluşturulması ve kontrol edilecek motorların alt sistemde olmasıdır. Buradaki fikir, programlandığında, joystick’ten girdi okuyan ve motorları çalıştıran alt sistemde oluşturulan bir yöntemi çağıran bir komut oluşturmaktır.

Bu örnekte, bir çift kumanda kolu kullanılarak tank sürücüsünde çalıştırılan bir sürücü tabanı alt sistemi gösterilmektedir.

Drive Train Subsystem Oluşturun

../../../../../_images/driving-with-joysticks-subsystem.png

Drive Train adlı bir alt sistem oluşturun. Sorumluluğu, robot tabanı için sürüşü idare etmek olacaktır.

../../../../../_images/driving-with-joysticks-differential-drive.png

Aktarma Organının içinde iki motorlu sürücü için bir Diferansiyel Sürücü nesnesi oluşturun. Diferansiyel Sürücü sınıfının bir parçası olarak bir sol motor ve sağ motor vardır.

../../../../../_images/driving-with-joysticks-speed-controller-group.png

Robotu sürmek için ikiden fazla motor kullanmak istediğimizden, Diferansiyel Sürücünün içinde iki Hız Kontrol Grubu oluşturun. Bunlar, Diferansiyel Sürücü ile kullanılabilmeleri için birden fazla hız kontrol cihazını gruplayacaktır.

../../../../../_images/driving-with-joysticks-speed-controller.png

Son olarak, her Hız Kontrol Grubunda iki Hız Kontrol Cihazı oluşturun.

Joystickleri Operatör Arayüzüne Ekleyin

../../../../../_images/driving-with-joysticks-joysticks.png

Operatör Arayüzüne iki kumanda çubuğu ekleyin, biri sol çubuk ve diğeri sağ çubuktur. İki kumanda kolundaki y ekseni, robotları sola ve sağa sürmek için kullanılır.

Not

Sonraki adıma geçmeden önce programınızı C ++ veya Java’ya aktardığınızdan emin olun.

Motorları Alt Sisteme Yazmak İçin Bir Yöntem Oluşturun

public class Drivetrain extends SubsystemBase {

    // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
private PWMVictorSPX left1;
private PWMVictorSPX left2;
private SpeedControllerGroup leftMotor;
private PWMVictorSPX right1;
private PWMVictorSPX right2;
private SpeedControllerGroup rightMotor;
private DifferentialDrive drive;

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS

    public Drivetrain() {
        // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
left1 = new PWMVictorSPX(0);
 addChild("left1",left1);
 left1.setInverted(false);

left2 = new PWMVictorSPX(1);
 addChild("left2",left2);
 left2.setInverted(false);

SpeedControllerGroup leftMotor = new SpeedControllerGroup(left1, left2  );
 addChild("Left Motor",leftMotor);


right1 = new PWMVictorSPX(5);
 addChild("right1",right1);
 right1.setInverted(false);

right2 = new PWMVictorSPX(6);
 addChild("right2",right2);
 right2.setInverted(false);

SpeedControllerGroup rightMotor = new SpeedControllerGroup(right1, right2  );
 addChild("Right Motor",rightMotor);


drive = new DifferentialDrive(leftMotor, left1);
 addChild("Drive",drive);
 drive.setSafetyEnabled(true);
drive.setExpiration(0.1);
drive.setMaxOutput(1.0);

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
    }

    // Put methods for controlling this subsystem
    // here. Call these from Commands.

    public void drive(double left, double right) {
        drive.tankDrive(left, right);
    }
}

Kumanda kolu girişlerini, bu durumda sol ve sağ sürücü kumanda çubuğunu alan bir yöntem oluşturun. Değerler, joystick değerlerini kullanarak tankı yönlendiren RobotDrive nesnesine aktarılır. Ayrıca robotun hareket etmesini engelleyen stop() adında bir yöntem oluşturun, bu daha sonra kullanışlı olabilir.

Not

Anlaşılır olması için bu örnekte bazı RobotBuilder çıktıları kaldırılmıştır

Kumanda Kolu Değerlerini Okuyun ve Subsystem Methodlarını Çağırın

../../../../../_images/driving-with-joysticks-command.png

Bu durumda Tank Drive adlı bir komut oluşturun. Amacı, joystick değerlerini okumak ve Drive Base alt sistemine göndermek olacaktır. Bu komutun Drive Train alt sistemini Gerektirdiğine dikkat edin. Bu, Drive Train’i başka bir şey kullanmaya çalıştığında çalışmasının durmasına neden olacaktır.

Not

Sonraki adıma geçmeden önce programınızı C ++ veya Java’ya aktardığınızdan emin olun.

Sürüş yapmak için Kodu Ekleyin

public class TankDrive extends CommandBase {

    // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_DECLARATIONS
        private final Drivetrain m_drivetrain;

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_DECLARATIONS

    private Joystick leftJoystick = RobotContainer.getInstance().getJoystick1();
    private Joystick rightJoystick = RobotContainer.getInstance().getJoystick2();

    // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS


    public TankDrive(Drivetrain subsystem) {


    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
        // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_SETTING

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_SETTING
        // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=REQUIRES

        m_drivetrain = subsystem;
        addRequirements(m_drivetrain);

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=REQUIRES
    }

    // Called when the command is initially scheduled.
    @Override
    public void initialize() {
    }

    // Called every time the scheduler runs while the command is scheduled.
    @Override
    public void execute() {
        m_drivetrain.drive(leftJoystick.getY(), rightJoystick.getY());
    }

    // Called once the command ends or is interrupted.
    @Override
    public void end(boolean interrupted) {
        m_drivetrain.drive(0.0, 0.0);
    }

    // Returns true when the command should end.
    @Override
    public boolean isFinished() {
        return false;
    }

    @Override
    public boolean runsWhenDisabled() {
        // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DISABLED
        return false;

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DISABLED
    }
}

Gerçek sürüşü yapmak için yürütme yöntemine kod ekleyin. Tek gereken, sol ve sağ sürüş joystickleri için Joystick nesnelerini almak ve bunları Drive Train alt sistemine iletmektir. Alt sistem, bunları yalnızca RobotDrive nesnesinde tank yönlendirme yöntemi için kullanır. Ve tankı yönlendiriyoruz.

Ayrıca end() methodu da doldurduk, böylece bu komut kesildiğinde veya durdurulduğunda, motorlar bir güvenlik önlemi olarak durdurulacak.

Varsayılan Komutu Yap

../../../../../_images/driving-with-joysticks-default-command.png

Son adım, Tank Tahrik komutunun Aktarma Organları alt sistemi için “Default Command” olmasını sağlamaktır. Bu, Aktarma Sistemini başka bir komut kullanmadığında kumanda kollarının kontrol altında olacağı anlamına gelir. Muhtemelen arzu edilen davranış budur. Otonom kod çalışırken, aynı zamanda aktarma organını da gerektirecek ve Tank Sürüş komutunu kesecektir. Otonom kod bittiğinde, DriveWithJoysticks komutu otomatik olarak yeniden başlayacak (çünkü bu varsayılan komuttur) ve operatörler kontrolü geri alacak. Teleop otomatik sürüş yapan herhangi bir kod yazarsanız, bu komutlar da Tank Sürüşü komutunu kesecek ve tam kontrole sahip olacak şekilde DriveTrain’i “require-gerektirmelidir”.

Not

Devam etmeden önce programınızı C++ veya Java’ya aktardığınızdan emin olun.