我的团队希望在我们的项目中实现区域学习以实现重定位目的。
我添加了这个功能,似乎运行良好。但是当发生漂移灾难(运动跟踪丢失)并且主摄像机瞬间投射到“宇宙的另一侧”时,该程序无法重新定位它:摄像机位于距离下方2米处或者3米处。它应该在哪里。
是区域描述错误(因为它没有足够的兴趣点)? 或者我还没有理解如何使用区域学习?
非常感谢。
P.S .: 我使用Unity SDK。
public void Update()
{
TangoPoseData pose = new TangoPoseData ();
TangoCoordinateFramePair pair;
if(poseLocalized)
{
pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_AREA_DESCRIPTION;
pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE;
}
else
{
pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_START_OF_SERVICE;
pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE;
}
double timestamp = VideoOverlayProvider.RenderLatestFrame(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR);
PoseProvider.GetPoseAtTime (pose, timestamp, pair);
m_status = pose.status_code;
if (pose.status_code == TangoEnums.TangoPoseStatusType.TANGO_POSE_VALID)
{
// it does not differ with the pair base frame
Matrix4x4 ssTd = UpdateTransform(pose);
m_uwTuc = m_uwTss * ssTd * m_dTuc;
}
}
public void OnTangoPoseAvailable(TangoPoseData pose)
{
if (pose == null)
{
return;
}
// Relocalization signal
if (pose.framePair.baseFrame == TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_AREA_DESCRIPTION &&
pose.framePair.targetFrame == TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_START_OF_SERVICE)
{
poseLocalized = true;
}
// If pose status is not valid, nothing is valid
if (!(pose.status_code == TangoEnums.TangoPoseStatusType.TANGO_POSE_VALID))
{
poseLocalized = false;
// Do I forget something here ?
}
}
答案 0 :(得分:1)
我经常观察到区域学习的定位和重新定位可以产生几米的x,y姿势坐标。
如果在搬到新区域之前我更加小心地记录一个区域,那么坐标可以更准确。
重新定位后,如果平板电脑能够在前往新区域之前使用缓慢,一致的运动观察该区域,则会提高坐标精度。
如果我学习了一个新区域,我总是会回到一个众所周知的区域以获得更高的准确度,如drift correction所述:
我有两个使用Java应用程序的Tango平板电脑,它可以自动导航我家中的iRobot。我使用1米的磁带标记设置了一个网格测试站点来进行观察。