Sorun giderme

Tam Arızaların Giderilmesi

Robotunuzun tamamen yanlış bir şey yapmasına neden olabilecek birkaç şey vardır. Aşağıdaki kontrol listesi bazı yaygın hataları kapsamaktadır.

  • Robotum hareket etmiyor.

    • Gerçekten motorlarınıza çıktı mı veriyorsunuz?

    • Sürücü istasyonuna bir MalformedSplineException yazdırılıyor mu? Evet ise, aşağıdaki MalformedSplineException bölümüne gidin.

    • Yörüngeniz çok kısa mı yoksa yanlış birimlerde mi?

  • Robotum, yörüngeyi diğer yöne bakacak şekilde sürmek için dönüyor.

    • Yörüngenizin başlangıç ve bitiş yörüngeleri yanlış mı?

    • Robotunuzun jiroskopu yanlış yöne mi sıfırlanıyor?

    • Ters bayrağı yanlış mı ayarlanmış?

    • Gyro açılarınız saat yönünde pozitif mi? Eğer öyleyse, onları reddetmelisiniz.

  • Robotum dönmesi gerekmesine rağmen sadece düz bir çizgide ilerliyor.

    • Gyro’nuz doğru bir şekilde kurulmuş ve iyi veriler döndürüyor mu?

    • Gyro başlığınızı odometri nesnenize doğru birimlerle mi geçiriyorsunuz?

    • İz genişliğiniz doğru mu? Doğru birimlerde mi?

  • Sürücü istasyonunda bir MalformedSplineException çıktısı alıyorum ve robot hareket etmiyor.

    • Ters bayrağı yanlış mı ayarlanmış?

    • Yaklaşık olarak zıt başlıklarla birbirine çok yakın iki ara noktanız var mı?

    • Aynı (veya neredeyse aynı) koordinatlara sahip iki ara noktanız var mı?

  • Robotum çok uzağa gidiyor.

    • Kodlayıcı birimi dönüştürmeleriniz doğru ayarlanmış mı?

    • Kodlayıcılarınız bağlı mı?

  • Robotum çoğunlukla doğru olanı yapıyor, ancak biraz yanlış.

    • Sonraki bölüme gidin.

Kötü Performans Sorunlarını Giderme

Not

Bu bölüm çoğunlukla, derleme hataları, dönen ve yanlış yöne giden robotlar veya MalformedSplineException lar gibi yıkıcı arızalar değil, bir metre hata gibi zayıf yörünge izleme performansının giderilmesiyle ilgilidir.

Not

Bu bölüm diferansiyel tahrikli robotlar için tasarlanmıştır, ancak fikirlerin çoğu swerve veya mecanum sürüşü yönlendirmek için uyarlanabilir.

Zayıf yörünge izleme performansının giderilmesi zor olabilir. Yörünge oluşturucu ve takipçinin kullanımı kolay ve kutudan çıkar çıkmaz performans göstermesi amaçlansa da, robotunuzun olması gerektiği yere tam olarak varmadığı durumlar vardır. Yörünge oluşturucu ve takipçilerin ayarlanması gereken çok sayıda düğmesi ve birçok hareketli parçası vardır, bu nedenle, özellikle robotun genel davranışından yörünge sorunlarının kaynağını bulmak zor olduğu için nereden başlayacağını bilmek zor olabilir.

Yörünge oluşturucu katmanını ve hatalı davranan takipçileri bulmak çok zor olabileceğinden, genel olarak kötü izleme performansı için sistematik, katman katman bir yaklaşım önerilir (örneğin, robot birkaç feet veya yirmi dereceden fazla uzakta) . Aşağıdaki adımlar, yapmanız gereken sıraya göre listelenmiştir; Farklı adımların etkilerini birbirinden ayırabilmeniz için bu sırayı takip etmeniz önemlidir.

Not

The below examples put diagnostic values onto NetworkTables. The easiest way to graph these values is to use Shuffleboard’s graphing capabilities.

Odometriyi Doğrula

Odometreniz kötüyse, Ramsete kontrol cihazınız yanlış davranabilir, çünkü robotunuzun hedef hızlarını, odometrenizin robotun nerede olduğunu düşündüğüne bağlı olarak değiştirir.

  1. Her odometre güncellemesinden sonra robotunuzun konumunu kaydetmek için kodunuzu ayarlayın:

NetworkTableEntry m_xEntry = NetworkTableInstance.getDefault().getTable("troubleshooting").getEntry("X");
NetworkTableEntry m_yEntry = NetworkTableInstance.getDefault().getTable("troubleshooting").getEntry("Y");

@Override
public void periodic() {
    // Update the odometry in the periodic block
    m_odometry.update(Rotation2d.fromDegrees(getHeading()), m_leftEncoder.getDistance(),
        m_rightEncoder.getDistance());

    var translation = m_odometry.getPoseMeters().getTranslation();
    m_xEntry.setNumber(translation.getX());
    m_yEntry.setNumber(translation.getY());
}
  1. Robotunuza paralel bir mezura yerleştirin ve robotunuzu şerit metre boyunca yaklaşık bir metre dışarı doğru itin. Y ekseni boyunca bir şerit metre yerleştirin ve baştan başlayın, robotunuzu X ekseni boyunca bir metre ve Y ekseni boyunca bir metre kaba bir yay çizerek itin.

  2. Robot tarafından bildirilen X ve Y’yi gerçek X ve Y ile karşılaştırın. X ilk testte 5 santimetreden fazla sapmışsa, tekerlek çapınızı doğru ölçtüğünüzü ve tekerleklerinizin aşınmadığını kontrol etmelisiniz. İkinci test X veya Y’de 5 santimetreden fazla saparsa, iz genişliğiniz (sol tekerleğin merkezinden sağ tekerleğin merkezine olan mesafe) yanlış olabilir; İz genişliğini bir şerit metre ile doğru ölçtüğünüzden eminseniz, robotunuzun tekerlekleri iz genişliğine göre hesaba katılmayacak bir şekilde kayıyor olabilir - bu durumda yapmanız gerekenler iz genişliği karakterizasyonu ve şerit ölçünüzdeki iz genişliği yerine bu iz genişliğini kullanın.

Highlights the trackwidth section of characterization.

Feedforward - ileribesleme’yi Doğrula

İleri beslemeniz kötüyse, robotun her iki tarafındaki P denetleyicileri de takip etmeyecek ve DifferentialDriveVoltageConstraint, robotunuzun hızlanmasını doğru bir şekilde sınırlamayacaktır. İleriye doğru ilerlemeyi izole edip test edebilmek için çoğunlukla tekerlek P kontrol cihazlarını kapatmak istiyoruz.

  1. İlk olarak, her tekerlek için P kontrolörünü devre dışı bırakmalıyız. Her kontrolör için P kazancını 0’a ayarlayın. RamseteCommand örneğinde, kPDriveVel değerini 0 olarak ayarlarsınız:

136
137
        new PIDController(DriveConstants.kPDriveVel, 0, 0),
        new PIDController(DriveConstants.kPDriveVel, 0, 0),
  1. (Yalnızca Java) Daha sonra, sorunlu davranışımızı izole etmeyi kolaylaştırmak için Ramsete denetleyicisini devre dışı bırakmak istiyoruz. Bu biraz daha karmaşık çünkü kazançları (b ve zeta) 0’a ayarlayamayız. Aşağıdakileri RamseteCommand e aktarın:

// Paste this variable in
RamseteController disabledRamsete = new RamseteController() {
    @Override
    public ChassisSpeeds calculate(Pose2d currentPose, Pose2d poseRef, double linearVelocityRefMeters,
            double angularVelocityRefRadiansPerSecond) {
        return new ChassisSpeeds(linearVelocityRefMeters, 0.0, angularVelocityRefRadiansPerSecond);
    }
};

// Be sure to pass your new disabledRamsete variable
RamseteCommand ramseteCommand = new RamseteCommand(
    exampleTrajectory,
    m_robotDrive::getPose,
    disabledRamsete,
    ...
);
  1. Son olarak, istenen tekerlek hızını ve gerçek tekerlek hızını kaydetmemiz gerekir (Shuffleboard kullanıyorsanız veya grafik yazılımınız bu özelliğe sahipse, gerçek ve istenen hızları aynı grafiğe koymalısınız):

var table = NetworkTableInstance.getDefault().getTable("troubleshooting");
var leftReference = table.getEntry("left_reference");
var leftMeasurement = table.getEntry("left_measurement");
var rightReference = table.getEntry("right_reference");
var rightMeasurement = table.getEntry("right_measurement");

var leftController = new PIDController(kPDriveVel, 0, 0);
var rightController = new PIDController(kPDriveVel, 0, 0);
RamseteCommand ramseteCommand = new RamseteCommand(
    exampleTrajectory,
    m_robotDrive::getPose,
    disabledRamsete, // Pass in disabledRamsete here
    new SimpleMotorFeedforward(ksVolts, kvVoltSecondsPerMeter, kaVoltSecondsSquaredPerMeter),
    kDriveKinematics,
    m_robotDrive::getWheelSpeeds,
    leftController,
    rightController,
    // RamseteCommand passes volts to the callback
    (leftVolts, rightVolts) -> {
        m_robotDrive.tankDriveVolts(leftVolts, rightVolts);

        leftMeasurement.setNumber(m_robotDrive.getWheelSpeeds().leftMetersPerSecond);
        leftReference.setNumber(leftController.getSetpoint());

        rightMeasurement.setNumber(m_robotDrive.getWheelSpeeds().rightMetersPerSecond);
        rightReference.setNumber(rightController.getSetpoint());
    },
    m_robotDrive
);
  1. Run the robot on a variety of trajectories (curved and straight line), and check to see if the actual velocity tracks the desired velocity by looking at graphs from NetworkTables.

  2. İstenilen ve gerçek olan çok yanlışsa, karakterizasyon için kullandığınız tekerlek çapının ve kodlayıcı EPR nin doğru olup olmadığını kontrol etmelisiniz. Birimlerinizin ve dönüştürmelerinizin doğru olduğunu doğruladıysanız, daha iyi veri alıp alamayacağınızı görmek için test ettiğiniz aynı zeminde yeniden nitelendirmeyi denemelisiniz.

P Kazancını Doğrula

Önceki adımı tamamladıysanız ve sorun ortadan kalktıysa, sorununuz muhtemelen sonraki adımlardan birinde bulunabilir. Bu adımda, tekerlek P kontrol cihazlarınızın iyi ayarlanmış olduğunu doğrulayacağız. Java kullanıyorsanız, Ramsete’yi kapatmak istiyoruz, böylece PF denetleyicilerimizi kendi başlarına görüntüleyebilelim.

  1. **P kazancının önceki sıfır olmayan değere ayarlanması dışında **, gerçek ve istenen hızı (ve Java kullanıyorsanız Ramsete’yi devre dışı bırakan kodu) günlüğe kaydeden önceki adımdaki tüm kodu tekrar kullanmanız gerekir.

  2. Robotu çeşitli yörüngelerde tekrar çalıştırın ve gerçek ve istenen grafiklerin iyi göründüğünü kontrol edin.

  3. Grafikler iyi görünmüyorsa (yani gerçek hız, istenenden çok farklıysa), P kazancınızı ayarlamayı ve test yörüngelerini yeniden çalıştırmayı denemelisiniz.

Kısıtlamaları Kontrol Et

Not

Bu adım için P kazancınızın sıfır olmadığından ve önceki adımlarda eklenen günlük kodunun hala bulunduğundan emin olun. Java kullanıyorsanız, Ramsete’yi devre dışı bırakmak için kodu kaldırmalısınız.

Doğruluk sorununuz önceki adımların tümünde devam ettiyse, kısıtlamalarınızla ilgili bir sorununuz olabilir. Aşağıda, farklı mevcut kısıtlamaların yetersiz ayarlandığında göstereceği belirtilerin bir listesi bulunmaktadır.

Her seferinde bir kısıtlamayı test edin! Diğer kısıtlamaları kaldırın, kalan kısıtlamalardan birini ayarlayın ve kullanmak istediğiniz her kısıtlama için bu işlemi tekrarlayın. Aşağıdaki kontrol listesi, bir seferde yalnızca bir kısıtlama kullandığınızı varsayar.

  • DifferentialDriveVoltageConstraint:

    • Robotunuz çok yavaş hızlanırsa, bu kısıtlama için maksimum voltajın çok düşük olması mümkündür.

    • Robotunuz yolun sonuna ulaşmazsa, karakterizasyon verileriniz sorunlu olabilir.

  • DifferentialDriveKinematicsConstraint:

    • Robotunuz yanlış istikamette biterse, maksimum aktarma organı yan hızının çok düşük veya çok yüksek olması mümkündür. Bunu söylemenin tek yolu maksimum hızı ayarlamak ve ne olacağını görmektir.

  • CentripetalAccelerationConstraint:

    • Robotunuz yanlış istikamette biterse, suçlu bu olabilir. Robotunuz yeterince dönmüyorsa, maksimum merkezcil ivmeyi artırmalısınız, ancak hızlı dönüşler hızla dönüyorsa, maksimum merkezcil ivmeyi-maximum centripetal azaltmalısınız.

Yörünge Yol Noktalarını Kontrol Edin

Yörüngenizin kendisinin pek sürülebilir olmaması mümkündür. Keskin dönüşleri azaltmak için ara noktaları (ve varsa ara noktalardaki yönleri) hareket ettirmeyi deneyin.