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

时间:2017-12-14 10:19:24

标签: marker google-project-tango arkit arcore slam

问题情况:以舒适的方式始终在同一个地方(在桌面上)创建AR-Visualizations。我们不希望客户像在无数的ARCore / ARKit示例中一样放置对象。

我想知道是否有办法实施这些步骤:

  1. 检测表格上的标记
  2. 使用标记的位置作为AR-Visualization的初始位置,继续使用SLAM-Tracking
  3. 我知道TangoSDK的最新版本中包含了Marker-Detection API。但是这项技术仅限于少量设备(准确地说是两个......)。

    最好的问候和提前感谢任何想法

4 个答案:

答案 0 :(得分:1)

我也对这个话题感兴趣。我认为AR的真正力量只有在与环境理解相结合时才能释放出来。

我认为你有两个选择:

  1. 等待新的Vuforia 7发布,据说它将支持使用ARCore和ARKit的视觉标记。
  2. 参与CoreML /计算机视觉 - 理论上它是可能的,但我还没有看到很多例子。我认为开始可能有点困难(例如构建和校准模型)。
  3. 然而,Apple已将其分类: https://youtu.be/E2fd8igVQcU?t=2m58s

答案 1 :(得分:1)

如果使用Google Tango,您可以使用内置的区域描述文件(ADF)系统实现此功能。 系统有一个保持屏幕,你被告知要四处走动"。在几秒钟内,您可以重新定位到设备之前的区域。 (或从服务器等处提取信息。)

谷歌VPS(视觉定位服务)是一个类似的想法,(封闭的Beta仍然)应该来到ARCore。据我所知,它将允许您使用来自所有扫描位置的全局共享地图的相机Feed来本地化特定位置。我认为,在发布时,它将尝试填补AR Cloud类型系统的空白,这将为常规开发人员解决这些问题。

请参阅https://developers.google.com/tango/overview/concepts#visual_positioning_service_overview

仅使用对空间和相机馈送的预知识来重新定位到空间的一般问题在学术界和其他AR产品,hololens等中得到解决......标记/标签不是必需的。 但是,我不确定哪个其他商业系统提供此功能。

答案 2 :(得分:1)

这是我到目前为止为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使得AB垂直于AC。按A-B-C顺序点击点 在ARSceneView的x = 0中找到AB的角度,该角度为节点提供所需的旋转 可以参考任何一个点来计算放置节点的位置 从C找到是否需要翻转节点。

我仍在努力解决一些需要满足的例外情况。

答案 3 :(得分:0)

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

  

ARKit

开箱即用,ARKit能够检测3D对象并将 ARObjectAnchors 放置在场景中以及检测图像并使用 {{ 3}} 进行精确定位。主ARImageAnchors类包括两个实例属性– .detectionImages.detectionObjects。并不是说ARKit最初具有来自几个框架的必不可少的内置功能并不是多余的:

除上述内容外,ARKit 3.0与全新的 AVFoundation 模块紧密集成,有助于实现多用户连接, RealityKit 和共享会话。

  

ARCore

尽管ARCore具有称为 ARAnchors 的功能,但该框架没有内置的机器学习算法,可帮助我们检测真实环境的3D对象,但是 Google {{3 }} 框架确实具有。因此,作为Android开发人员,您可以同时使用两个框架,以在AR场景中的真实对象上精确地自动合成3D模型。

值得认识到的是,ARKit 3.0具有比ARCore 1.12更健壮和高级的工具包。