我如何检测到本地化已经发生?

How do I detect that localisation has occured?

在使用 Tango 时,我会使用什么,回调或其他方式来检测设备何时本地化到先前加载的 ADF?

这主要用于 UI 结合 Tango UX 的目的,告诉用户在环境中走动。

当您的 ADF TangoPoseData with a frame 恢复有效时,可能会检测到本地化。

使用以下简化逻辑查看 AreaLearningActivity 的 Tango Java 示例:

//tell tango to provide pose for ADF
ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<TangoCoordinateFramePair>();
framePairs.add(new TangoCoordinateFramePair(
        TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION,
        TangoPoseData.COORDINATE_FRAME_DEVICE));

//register a listener for the frames chosen
mTango.connectListener(framePairs, new OnTangoUpdateListener() {

  //listens for updates from tango pose
  public void onPoseAvailable(TangoPoseData pose) {

    //base frame of ADF provides coordinates relative to the origin of the ADF
    if (pose.baseFrame == TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION
        && pose.targetFrame == TangoPoseData.COORDINATE_FRAME_DEVICE)

      //if the status is valid then localization has succeeded
      if(pose.statusCode == TangoPoseData.POSE_VALID){
        Log.i(TAG,"Successfully localized with ADF");
      }
    }
  }

您的配置必须指明感兴趣的 ADF:

 config.putString(TangoConfig.KEY_STRING_AREADESCRIPTION,adfId);

这个过程从代码中不容易观察到,但我在调试AreaLearningActivity 示例时发现了它。 Java API 将受益于更高级别的抽象,使您请求的常见场景更加明显和更易于使用:

TangoLocalizer.builder().register(myListener).adfId(myAdfId).build();

在Unity3D中,您可以在OnTangoPoseAvailable(TangoPoseData)中使用pose.status_code来检查位姿w.r.t的状态(VALID/INVALID)。定义的坐标系对。 对于 Device Localization,您需要将 targetFrame 设置为 TANGO_COORDINATE_FRAME_DEVICE 并将 baseFrame 设置为 TANGO_COORDINATE_FRAME_AREA_DESCRIPTION

public void OnTangoPoseAvailable(TangoPoseData pose)
{
    // Define the frame-pair 
    if (pose.framePair.baseFrame == TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_AREA_DESCRIPTION
        && pose.framePair.targetFrame == TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE)
    {

    // Check if the pose is VALID or INVALID
        if (pose.status_code == TangoEnums.TangoPoseStatusType.TANGO_POSE_VALID)
        {
            ////......if pose is VALID
        }
        else 
        {
            ////......if pose is INVALID
        }
    }
}

您还需要使用 m_tangoApplication.Startup (m_selectedADF); 加载 ADF。