Tạo ứng dụng thực tế tăng cường (AR) bằng API Không gian địa lý ARCore mới

1. Tổng quan

ARCore là bộ khung của Google để xây dựng trải nghiệm thực tế tăng cường trên điện thoại thông minh. API Không gian địa lý ARCore mới cung cấp một khía cạnh mới cho Thực tế tăng cường, cho phép bạn đặt các điểm tham chiếu Thực tế tăng cường theo vị trí cụ thể xung quanh các địa danh trong thế giới thực.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ làm quen với API Không gian địa lý ARCore. Bạn sẽ khám phá những thông tin mà API không gian địa lý có thể cung cấp cho trải nghiệm thực tế tăng cường tổng thể của bạn và cách sử dụng dữ liệu này để hỗ trợ một trải nghiệm tìm đường đơn giản trong thực tế tăng cường.

Kiến thức bạn sẽ học được

  • Cách thiết lập dự án ARCore sử dụng API Không gian địa lý.
  • Cách yêu cầu dữ liệu địa lý qua API Không gian địa lý và hiển thị dữ liệu đó bằng Google Maps.
  • Cách đặt một Neo được gắn vào một vị trí thực tế.

Những gì bạn cần có

2. Thiết lập môi trường phát triển

Thiết lập Android Studio

Để bắt đầu với API Không gian địa lý, chúng tôi đã cung cấp một dự án khởi đầu bao gồm những thông tin cơ bản về dự án ARCore được tích hợp với SDK Google Maps. Việc này giúp bạn có thể bắt đầu nhanh chóng với API Không gian địa lý.

  1. Khởi động Android Studio và nhập một dự án qua VCS.
    • Nếu bạn đã mở một dự án, hãy sử dụng Tệp > Mới > Dự án từ chế độ Quản lý phiên bản....
    • Nếu bạn thấy cửa sổ Welcome to Android Studio (Chào mừng bạn đến với Android Studio), hãy sử dụng Get from VCS (Lấy trên VCS). Lấy từ vị trí VCS
  2. Chọn Git và sử dụng URL https://github.com/google-ar/codelab-geospatial.git để nhập dự án.

Thiết lập một dự án trên Google Cloud

API Không gian địa lý sử dụng hình ảnh trong Chế độ xem đường phố kết hợp với từ kế của thiết bị và thông tin cảm biến của máy ảnh để cải thiện các giá trị hướng. Để dùng dịch vụ này, bạn cần thiết lập một dự án trên Google Cloud.

  1. Tạo một dự án trong Google Cloud Console:
    • Hãy xem bài viết Tạo dự án trong Google Cloud Platform. Tạo một dự án trên Google Cloud
    • Nhập Tên dự án phù hợp (ví dụ: "Dự án API không gian địa lý ARCore") rồi chọn bất kỳ vị trí nào.
    • Nhấp vào Tạo.
  2. Bật các API cần thiết:
    • Trong thanh bên, hãy chọn API và Services, sau đó chọn Thư viện.
    • Tìm ARCore API.
    • Nhấp vào Bật.
    • Quay lại Thư viện.
    • Tìm kiếm Maps SDK dành cho Android.
    • Nhấp vào Bật.
  3. Tạo thông tin xác thực Khoá API:
    • Trong API & Services, chọn Thông tin xác thực.
    • Trong thanh trên cùng, hãy nhấp vào Tạo thông tin xác thực, rồi chọn Khoá API.
    • Ghi lại khoá đã tạo vì bạn cần đến khoá này cho bước tiếp theo. Quay lại trang Thông tin xác thực nếu bạn cần truy xuất thông tin đó.

Với những bước này, bạn đã tạo được một Dự án trên Google Cloud với sự cho phép khoá API và bạn đã sẵn sàng sử dụng API không gian địa lý.

Tích hợp khoá API với dự án Android Studio

Để liên kết khoá API trên Google Cloud với dự án của bạn, hãy mở dự án bạn đã tạo trong Android Studio rồi sửa đổi các khoá API:

  1. Mở app > src > AndroidManifest.xml.
  2. Tìm các mục meta-data sau:
    <meta-data
        android:name="com.google.android.ar.API_KEY"
        android:value="PLACEHOLDER_API_KEY" />
    
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="PLACEHOLDER_API_KEY" />
    
  3. Thay thế PLACEHOLDER_API_KEY bằng khoá API mà bạn đã tạo trong dự án trên Google Cloud.

Giá trị được lưu trữ trong com.google.android.ar.API_KEY cho phép ứng dụng này sử dụng API Không gian địa lý và giá trị lưu trữ trong com.google.android.geo.API_KEY cho phép ứng dụng này sử dụng SDK Google Maps.

Xác minh dự án của bạn

Hãy đảm bảo dự án của bạn đã sẵn sàng hoạt động. Trong Android Studio, hãy chạy ứng dụng của bạn. Bạn sẽ thấy được chế độ xem máy ảnh cùng với bản đồ đang hoạt động ở cuối màn hình.

Dự án Boilerplate

3. Xác định vị trí của người dùng

Ở bước này, bạn thêm mã vào dự án mẫu để bắt đầu sử dụng API không gian địa lý.

Định cấu hình phiên ARCore để sử dụng API Không gian địa lý

Để nhận Dữ liệu không gian địa lý, bạn cần bật API không gian địa lý. Thay đổi GeospatialMode trong cấu hình phiên của bạn thành ENABLED bằng cách sửa đổi hàm configureSession trong HelloGeoActivity.kt:

fun configureSession(session: Session) {
  session.configure(
    session.config.apply {
      // Enable Geospatial Mode.
      geospatialMode = Config.GeospatialMode.ENABLED
    }
  )
}

Mặc dù chế độ Không gian địa lý là ENABLED, nhưng ứng dụng có thể lấy thông tin Không gian địa lý.

Yêu cầu dữ liệu từ API không gian địa lý

Trong HelloGeoRenderer.kt, hãy tìm dòng sau:

// TODO: Obtain Geospatial information and display it on the map.

Bên dưới lớp này, hãy kiểm tra để đảm bảo rằng đối tượng Earth có sẵn để sử dụng. Đó là khi cấu hình có trackingState TrackingState.ENABLED.

val earth = session.earth
if (earth?.trackingState == TrackingState.TRACKING) {
  // TODO: the Earth object may be used here.
}

Bên dưới TODO, hãy yêu cầu cung cấp thông tin không gian địa lý từ ARCore. Thêm dòng này:

val cameraGeospatialPose = earth.cameraGeospatialPose

Thao tác này sẽ cung cấp cho bạn GeospatialPose chứa thông tin sau:

  • Vị trí, được biểu thị bằng vĩ độ và kinh độ. Thông tin ước tính về độ chính xác của vị trí cũng được cung cấp.
  • Cao độ và thông tin ước tính về độ chính xác cao độ.
  • Tiêu đề, thông tin ước tính về hướng của thiết bị và ước tính độ chính xác của tiêu đề.

Hiển thị thông tin định vị trên bản đồ

Bạn có thể sử dụng GeospatialPose được lưu trữ trong cameraGeospatialPose để di chuyển một điểm đánh dấu trên bản đồ cho thấy vị trí của người dùng. Tiếp tục từ nơi bạn đã dừng lại và thêm vào như sau:

activity.view.mapView?.updateMapPosition(
  latitude = cameraGeospatialPose.latitude,
  longitude = cameraGeospatialPose.longitude,
  heading = cameraGeospatialPose.heading
)

Thao tác này liên tục cập nhật vị trí của bản đồ bằng cách sử dụng các giá trị thu được từ API không gian địa lý.

Dùng thử

Trong Android Studio, hãy nhấp vào Play (Chơi). Hãy giơ thiết bị lên rồi di chuyển thiết bị xung quanh để giúp ARCore thiết lập tính năng theo dõi. Sau một lúc ngắn, bạn sẽ thấy một điểm đánh dấu màu xanh lục xuất hiện trên bản đồ. Điểm đánh dấu này sẽ xoay khi bạn quan sát xung quanh. Mũi tên cũng phải chỉ theo hướng chính xác: khi bạn quay mặt về phía Bắc, mũi tên cũng chỉ về hướng Bắc.

Mũi tên màu xanh lục theo vị trí và tiêu đề của bạn.

4. Đặt một neo bằng toạ độ Earth

API không gian địa lý có thể đặt Neo tại bất kỳ cặp toạ độ và xoay vòng nào trong thế giới thực. Nhờ đó, người dùng của bạn có thể xem nội dung cố định sau khi ghé thăm những vị trí cụ thể.

Trong bước này, bạn thêm cách để đặt Neo bằng cách nhấn vào bản đồ.

Đặt hành động khi nhấn vào bản đồ

Dự án này có một hàm onMapClick được gọi cùng với vĩ độ và kinh độ khi người dùng nhấp vào mảnh bản đồ. Tìm hàm onMapClick trong HelloGeoRenderer.kt.

Đảm bảo rằng bạn có thể sử dụng đối tượng Earth

Trước khi tạo neo trên Trái Đất, hãy đảm bảo rằng TrackingState của đối tượng Trái Đất là TRACKING, tức là đã biết vị trí của Trái Đất. Ngoài ra, hãy đảm bảo EarthState của API đó là ENABLED, nghĩa là không gặp phải vấn đề nào với API Không gian địa lý. Thêm các dòng này bên trong onMapClick:

val earth = session?.earth ?: return
if (earth.trackingState != TrackingState.TRACKING) {
  return
}

Xác định vị trí của Neo mới

Sau khi xác nhận rằng đối tượng Earth đang theo dõi, hãy tách earthAnchor trước đó, nếu có. Bạn sẽ thay thế earthAnchor bằng một quảng cáo cố định mới trong các bước tiếp theo:

earthAnchor?.detach()

Sau đó, sử dụng cameraGeospatialPose để xác định cao độ cho điểm neo mới. Sử dụng cặp toạ độ từ việc nhấn vào bản đồ làm vị trí của điểm neo.

// Place the earth anchor at the same altitude as that of the camera to make it easier to view.
val altitude = earth.cameraGeospatialPose.altitude - 1
// The rotation quaternion of the anchor in the East-Up-South (EUS) coordinate system.
val qx = 0f
val qy = 0f
val qz = 0f
val qw = 1f
earthAnchor =
  earth.createAnchor(latLng.latitude, latLng.longitude, altitude, qx, qy, qz, qw)

createAnchor tạo một Anchor cố định theo toạ độ trắc địa với một độ xoay nhất định. Neo này cố gắng duy trì trạng thái ổn định và cố định theo toạ độ và độ cao được chỉ định.

Hiển thị điểm đánh dấu đã đặt trên bản đồ

Cuối cùng, di chuyển một điểm đánh dấu mới cho biết nơi đã đặt điểm đánh dấu:

activity.view.mapView?.earthMarker?.apply {
  position = latLng
  isVisible = true
}

Dùng thử

Trong Android Studio, hãy nhấp vào Play (Chơi). Hãy giơ thiết bị lên và di chuyển thiết bị xung quanh để giúp ARCore thiết lập tính năng theo dõi. Sau một lúc ngắn, bạn sẽ thấy một điểm đánh dấu màu xanh lục xuất hiện trên bản đồ cho biết vị trí hiện tại của bạn.

Thao tác nhấn vào bản đồ sẽ sử dụng API Không gian địa lý để đặt điểm neo. API này được cố định vào một vị trí trong thế giới thực. Hãy thử đặt neo gần vị trí hiện tại của bạn để bạn có thể nhìn thấy nó trong chế độ xem thực tế tăng cường. Mã này phải luôn ổn định khi bạn xử lý môi trường.

Đặt một điểm đánh dấu bằng cách nhấn vào bản đồ.

5. Kết luận

Trong lớp học lập trình này, bạn đã tìm hiểu cách sử dụng API Không gian địa lý để tạo ra một trải nghiệm thực tế tăng cường đơn giản gắn liền với thế giới thực.

Đặt một điểm đánh dấu bằng cách nhấn vào bản đồ.

Nội dung đã đề cập

  • Cách thiết lập một dự án trên Google Cloud có bật API không gian địa lý.
  • Cách lấy thông tin Không gian địa lý trong dự án ARCore và hiển thị thông tin đó trên bản đồ.
  • Cách đặt quảng cáo cố định được định vị trong thế giới thực bằng cách sử dụng vị trí địa lý.

Tài nguyên khác

Để biết thêm thông tin về các khái niệm địa lý và SDK được sử dụng trong lớp học lập trình này, hãy xem thêm các tài nguyên sau: