基于标记的ARCore/ARKit初始定位?

5
问题描述:以舒适的方式在同一位置(桌子上)创建AR可视化。我们不希望客户像无数ARCore / ARKit示例中那样自己放置物体。
我想知道是否有一种方法来实现以下步骤:
1. 检测桌子上的标记 2. 将标记的位置用作AR可视化的初始位置,并继续进行SLAM跟踪
我知道在TangoSDK的最新版本中包含了Marker-Detection API这样的东西。但是,这项技术仅限于少量设备(确切地说只有两个设备...)。
此致敬礼并提前感谢您的任何想法。

您可以免费使用aruco来检测标记。因为您只想使用初始化阶段,所以不需要标记跟踪。 - ibrahim
你可以使用三点标记来完成一件事。点击它们并计算模型放置的位置和方向。如果标记放置在水平面上,它就能正常工作。 - Alok Subedi
问题在于如何将检测到的标记的方向/位置转移到 ARKit/ARCore 中放置对象的工作流程中。我认为这些解决方案正在寻找像“检测到检测平面上的单击事件并连接对象”这样的事件。在我的情况下,它将是“获取我的标记位置并将其应用于检测到的平面”。但是,对于这些框架来说,这一步似乎并不是一个简单的情况(?) - user2463728
4个回答

2
我也对这个话题很感兴趣。我认为只有与环境理解相结合,AR才能发挥真正的力量。
我认为你有两个选择:
1.等待新的Vuforia 7发布,据说它将支持使用ARCore和ARKit进行视觉标记。
2.使用CoreML /计算机视觉-理论上是可能的,但我没有看到很多例子。我认为开始可能会有些困难(例如构建和校准模型)。
然而,苹果已经解决了这个问题: https://youtu.be/E2fd8igVQcU?t=2m58s

2
如果使用Google Tango,您可以使用内置的Area Descriptions File(ADF)系统实现此功能。该系统具有一个保持屏幕,并告诉您“四处走动”。几秒钟后,您可以重新定位到设备先前所在的区域(或从服务器等获取信息)。
谷歌的VPS(Visual Positioning Service)是一个类似的想法(仍然是封闭Beta),它应该会到ARCore。据我所知,它将允许您使用全球共享地图的摄像头提供本地化特定位置。我认为,在发布时,它将尝试填补AR Cloud类型系统的差距,这将为常规开发人员解决这些问题。
请参阅https://developers.google.com/tango/overview/concepts#visual_positioning_service_overview
在学术界和其他AR产品(如Hololens等)中,使用空间预知和相机反馈进行重新本地化的一般问题已得到解决。不需要标记/标签。但我不确定其他商业系统是否提供此功能。

2

这是我目前为止关于ARKit的内容。

@objc func tap(_ sender: UITapGestureRecognizer){
    let touchLocation = sender.location(in: sceneView)
    let hitTestResult = sceneView.hitTest(touchLocation, types: .featurePoint)

    if let hitResult = hitTestResult.first{
        if first == nil{
            first = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
        }else if second == nil{
            second = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
        }else{
            third = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)

            let x2 = first!.x
            let z2 = -first!.z
            let x1 = second!.x
            let z1 = -second!.z
            let z3 = -third!.z

            let m = (z1-z2)/(x1-x2)
            var a = atan(m)

            if (x1 < 0 && z1 < 0){
                a = a + (Float.pi*2)
            }else if(x1 > 0 && z1 < 0){
                a = a - (Float.pi*2)
            }

            sceneView.scene.rootNode.addChildNode(yourNode)
            let rotate = SCNAction.rotateBy(x: 0, y: CGFloat(a), z: 0, duration: 0.1)
            yourNode.runAction(rotate)
            yourNode.position = first!

            if z3 - z1 < 0{
                let rotate = SCNAction.rotateBy(x: 0, y: CGFloat.pi, z: 0, duration: 0.1)
                yourNode.runAction(rotate)
            }
        }
    }
}

理论是:
将点A、B、C连接成一个垂直于AC的直角三角形。按照顺序依次点击点A-B-C。
找到ARSceneView中x=0时AB的角度,以便使节点进行所需旋转。
可以参考任意一个点来计算放置节点的位置。
从C点出发,确定节点是否需要翻转。

我仍在处理一些需要满足的异常情况。


0

目前,ARKit 3.0和ARCore 1.12都具备了所需的API工具,可以完成几乎任何基于标记的任务,用于精确定位3D模型。

ARKit

ARKit可以立即检测到3D对象并将 ARObjectAnchors放置在场景中,也可以检测图像并使用 ARImageAnchors进行准确定位。主要的 ARWorldTrackingConfiguration()类包括两个实例属性:.detectionImages .detectionObjects。 ARKit从几个框架中原始地具备不可或缺的内置功能。

除了以上这些,ARKit 3.0 还与全新的RealityKit 模块紧密集成,帮助实现多用户连接、ARAnchors 列表和共享会话。

ARCore

虽然 ARCore 有一个名为增强图像的功能,但该框架没有内置的机器学习算法来帮助我们检测真实环境中的三维物体,但是 Google ML Kit 框架却有。因此,作为 Android 开发人员,您可以同时使用这两个框架,在 AR 场景中精确地自动合成三维模型到真实物体上。

值得注意的是,ARKit 3.0 比 ARCore 1.12 拥有更强大和先进的工具包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接