PowerAR-テーブル表面でPowerBIとARKitを組み合わせます

こんにちは、Habr! ARKitが発表された最近のAppleカンファレンスを覚えていますか? ああ、ストップストップ、これはマイクロソフトのブログです。 でも、なぜだ。 結局、私たちのパートナーは、新しいAppleフレームワークをMicrosoftのPowerBiサービスの機能と組み合わせて実験することを決定しました。 詳細はこちら!







著者に発言権を与える



ARKitテクノロジーについて簡単に



ArKitテクノロジーは、仮想オブジェクトを世界に調和させてブレンドし、拡張現実を作成し、まったく新しい方法で周囲の世界と対話できるようにします。



機能:





このテクノロジーの実装の優れた例は、IKEAとAppleによって作成された共同モバイルアプリケーション Placeです。









アプリケーションユーザーが取得するもの



まず第一に、それはあらゆる角度から数十のグラフを見る機会です。 実際、私たちの前には新しい種類の可視性があります。 また、このようなグラフを使用すると、フォトエディターでそのような3Dレイアウトを作成することなく、投資家への年次報告書の美しい表紙を作成し、写真で会社のドキュメントと組み合わせることができます。



一般的に、このアプリケーションは、ユーザーが未来に触れることを可能にする概念として機能し、拡張現実はますます現実世界と密接に統合されます。



特に、Metaのコンセプトは、このようなアプリケーションの作成に影響を与えました。


プロジェクト開始



Swift 4でプロジェクトを作成することが決定されました。一部のクライアントは、データをPowerBIに転送するためにCSV形式を使用します。



リードの可視化データの例:



Media,,,, Yandex/CPC,82,70,20,172 Google/CPC,73,50,33,156 Yandex/Organic,67,45,28,140 Google/Organic,85,65,17,167 Youtube,54,42,24,120 Vk.com,33,58,20,111
      
      





1日1回、データはGoogleアナリティクスおよび/またはI. APIごとのメトリックからダウンロードされ、CSVファイルに収集され、キーによってアプリケーションからダウンロードできるようになります。 アプリケーションはサーバーにアクセスし、更新されたファイルをダウンロードし、そのコンテンツを読み取り、そこからデータをスマートフォンに既に蓄積されているデータと同期します。 アプリケーションを最初にダウンロードすると、過去30日間のすべてのCSVレポートが取得されます。



 func generateNumbers(fromDataWithIndex index: Int) -> [[Double]]? { let resourceName = String(format: "PowerBI_CSV", index) guard let dataPath = Bundle.main.path(forResource: resourceName, ofType: "csv") else { print(String(format: "Could Not Load Data %@", resourceName)) return nil } var data = [[Double]]() if let dataString = try? String(contentsOfFile: dataPath) { let lines = dataString.components(separatedBy: "\n") let headerEntries = lines[0].components(separatedBy: ",") for line in lines[1...] { let lineEntries = line.components(separatedBy: ",") if lineEntries.count == headerEntries.count { data.append(lineEntries[1...].map({ Double($0) ?? 0.0 })) } } } return data }
      
      





次のステップはARKitです。 アプリケーションの起動に続いてARSessionオブジェクトのセッションが開始され、CSVファイルのデータに基づいて列の高さを計算する3Dモデルが生成されます。



 var session: ARSession { return sceneView.session } override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self sceneView.scene = SCNScene() sceneView.showsStatistics = false sceneView.antialiasingMode = .multisampling4X sceneView.automaticallyUpdatesLighting = false sceneView.contentScaleFactor = 1.0 sceneView.preferredFramesPerSecond = 60 DispatchQueue.main.async { self.screenCenter = self.sceneView.bounds.mid } if let camera = sceneView.pointOfView?.camera { camera.wantsHDR = true camera.wantsExposureAdaptation = true camera.exposureOffset = -1 camera.minimumExposure = -1 } }
      
      





ARKitは、コンピュータービジョンを使用して表面を決定し、平面を検出する場合、会社が収集したデータを3D列の形式で配置できます。



生じた困難と発見された解決策



まず、飛行機の定義。 表面が認識されない可能性の大部分はまだあります。 テーブル表面の認識が成功した場合、ARKitの精度が向上し、そのようなアプリケーションでアニメーションを使用することをアドバイスするのを待つだけです。 次のように、成功した認識のそのようなインジケータを作成できます。



 /* s1 s2 _ _ s3 | | s4 s5 | | s6 - - s7 s8 */ let sl: Float = 0.5 let st = focusSquareThickness let c: Float = focusSquareThickness / 2 let s1 = FocusSquareSegment(name: "s1", width: sl, thickness: st, color: focusSquareColor) let s2 = FocusSquareSegment(name: "s2", width: sl, thickness: st, color: focusSquareColor) let s3 = FocusSquareSegment(name: "s3", width: sl, thickness: st, color: focusSquareColor, vertical: true) let s4 = FocusSquareSegment(name: "s4", width: sl, thickness: st, color: focusSquareColor, vertical: true) let s5 = FocusSquareSegment(name: "s5", width: sl, thickness: st, color: focusSquareColor, vertical: true) let s6 = FocusSquareSegment(name: "s6", width: sl, thickness: st, color: focusSquareColor, vertical: true) let s7 = FocusSquareSegment(name: "s7", width: sl, thickness: st, color: focusSquareColor) let s8 = FocusSquareSegment(name: "s8", width: sl, thickness: st, color: focusSquareColor) s1.position += SCNVector3Make(-(sl / 2 - c), -(sl - c), 0) s2.position += SCNVector3Make(sl / 2 - c, -(sl - c), 0) s3.position += SCNVector3Make(-sl, -sl / 2, 0) s4.position += SCNVector3Make(sl, -sl / 2, 0) s5.position += SCNVector3Make(-sl, sl / 2, 0) s6.position += SCNVector3Make(sl, sl / 2, 0) s7.position += SCNVector3Make(-(sl / 2 - c), sl - c, 0) s8.position += SCNVector3Make(sl / 2 - c, sl - c, 0)
      
      





第二に、インターフェース。 カメラを使用するアプリケーションでは、画面上のアイテムの数と直感的なコントロールの間で妥協点を見つけることが重要です。 PowerARでは、ぼかし効果のある透明なボタンを使用し、グラフの追加と削除、および設定の起動のみを残すことにしました。



 @IBOutlet weak var settingsButton: UIButton! let blurSettings = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.light)) blurSettings.frame = settingsButton.bounds blurSettings.isUserInteractionEnabled = false settingsButton.insertSubview(blurSettings, at: 0) settingsButton.layer.cornerRadius = 15.0 settingsButton.clipsToBounds = true
      
      





そして最後に、最適化。 ARKitを使用した最も単純なアプリケーションでさえ、iPhone 7 CPUの50%を消費するため、iPhone 7のCPUが加熱され、放電率が増加します。 チームは、開発に費やした時間のほぼ40%をスマートフォンリソースの最大化に費やしました。特に、100個のレンダリングされた列を使用するA9プロセッサでは、最初はアプリケーションで使用できるすべてのリソースが使用されていました。



まとめ



現時点では、アプリケーションはすでにApp Storeでデモバージョンとして利用可能であり、iOS 11がインストールされている必要があります。将来、アップロード用の外部データソースを接続する機能を追加する予定です(ベータバージョンにはデータセットがプリロードされています)。 また、iPadバージョンのアプリケーションのテストも終了しました。これにより、実世界でグラフを表示できる可能性がさらに明らかになります。



著者について



Andrey Baranchikovは、 A-Teamsの主要な開発者です。 2010年以来、彼はiOS / Androidアプリケーションとバックエンド(Spring / JEE)を開発しており、監視カメラからのストリーミングビデオ処理用のサーバーソフトウェアの開発から始めました。 ロシアでApple WatchとApple TVのアプリケーションを起動した最初の企業の1つ。





Mixed Reality Imagine Hack



私たちは現在、国際学生コンテストImagine Cup 2018の申し込みを集めていることに注意してください。優勝者は$ 10万を獲得できます。



コンテストを見越して、チームやメンターを見つけ、専門家と話し、プロジェクトを彼らに提示できる一連のハッカソンを実施しています。 それらの最も近いものはMR / VRの開発に専念し、AVRAとTemoCenterの支援を受けてモスクワ2月9〜10日に開催されます。 今すぐ参加してください



All Articles