Saltar al contenido principal

Localización con MegaTag

  1. Asegúrate de que un mapa de campo esté cargado en tu Limelight.
  2. Configura el pipeline 0 como un Pipeline de Apriltag y habilita la funcionalidad 3D.
  3. Configura la pose de tu Limelight relativa al centro de tu robot en la interfaz de usuario de Limelight.
  4. Observa el código a continuación. Solo incorporamos las estimaciones de Limelight cuando más de una etiqueta es visible. Establecemos la desviación estándar de la rotación medida a un número grande porque podemos confiar en que nuestro IMU nos dará la orientación correcta del robot.
  5. Siempre leemos la medición botpose_wpiblue porque las herramientas comunes de planificación de trayectorias han adoptado una estrategia de origen de campo siempre en la esquina azul.
  6. Usa megatag 2 si es posible.

Puedes ver el proyecto de ejemplo completo aquí

  public void updateOdometry() {
m_poseEstimator.update(
m_gyro.getRotation2d(),
new SwerveModulePosition[] {
m_frontLeft.getPosition(),
m_frontRight.getPosition(),
m_backLeft.getPosition(),
m_backRight.getPosition()
});


boolean useMegaTag2 = true; //establecer en false para usar MegaTag1
boolean doRejectUpdate = false;
if(useMegaTag2 == false)
{
LimelightHelpers.PoseEstimate mt1 = LimelightHelpers.getBotPoseEstimate_wpiBlue("limelight");

if(mt1.tagCount == 1 && mt1.rawFiducials.length == 1)
{
if(mt1.rawFiducials[0].ambiguity > .7)
{
doRejectUpdate = true;
}
if(mt1.rawFiducials[0].distToCamera > 3)
{
doRejectUpdate = true;
}
}
if(mt1.tagCount == 0)
{
doRejectUpdate = true;
}

if(!doRejectUpdate)
{
m_poseEstimator.setVisionMeasurementStdDevs(VecBuilder.fill(.5,.5,9999999));
m_poseEstimator.addVisionMeasurement(
mt1.pose,
mt1.timestampSeconds);
}
}
else if (useMegaTag2 == true)
{
LimelightHelpers.SetRobotOrientation("limelight", m_poseEstimator.getEstimatedPosition().getRotation().getDegrees(), 0, 0, 0, 0, 0);
LimelightHelpers.PoseEstimate mt2 = LimelightHelpers.getBotPoseEstimate_wpiBlue_MegaTag2("limelight");
if(Math.abs(m_gyro.getRate()) > 720) // si nuestra velocidad angular es mayor a 720 grados por segundo, ignoramos las actualizaciones de visión
{
doRejectUpdate = true;
}
if(mt2.tagCount == 0)
{
doRejectUpdate = true;
}
if(!doRejectUpdate)
{
m_poseEstimator.setVisionMeasurementStdDevs(VecBuilder.fill(.7,.7,9999999));
m_poseEstimator.addVisionMeasurement(
mt2.pose,
mt2.timestampSeconds);
}
}
}