Chuyển đến nội dung
KPT — Korea Positioning Technology

TÀI LIỆU SẢN PHẨM

Hướng dẫn KAILOS

Xây dựng bản đồ trong nhà và bản đồ vô tuyến của tòa nhà, sau đó phát triển dịch vụ vị trí trong nhà với KAILOS API.

Dùng KAILOS tạo bản đồ trong nhà và dịch vụ vị trí của bạn. Bước 1 xây dựng bản đồ vô tuyến bằng công cụ bản đồ web và ứng dụng thu thập Android; Bước 2 phát triển ứng dụng với KAILOS RESTful API.

Kiến trúc hệ thống KAILOS

Hệ thống định vị trong nhà KAILOS kết hợp công cụ xây dựng bản đồ, thu thập cảm biến, máy chủ thu thập, máy chủ vị trí và máy chủ bản đồ, tạo môi trường phát triển thuận tiện cho dịch vụ vị trí.

KAILOS hoạt động phía máy chủ, giúp hệ thống dễ sử dụng, bảo trì và giữ các dịch vụ vị trí xây dựng trên đó gọn nhẹ.

Công cụ xây dựng bản đồ trong nhà

  • Công cụ lập kế hoạch tầng
  • Trình chỉnh sửa POI
  • Công cụ lập kế hoạch khảo sát
  • Trình chỉnh sửa mạng đường

Công cụ thu thập dữ liệu cảm biến

Ứng dụng Android

Máy chủ thu thập dữ liệu

  • Bộ xử lý dữ liệu thô
  • Bộ tạo bản đồ vô tuyến

Dữ liệu thô

Máy chủ vị trí

Đầu vào: Wi-Fi · PDR · tín hiệu khác

  1. Bộ lọc tín hiệu
  2. Bộ lọc vị trí
  3. Đối sánh bản đồ
  4. Bộ cung cấp vị trí kết hợp

Máy chủ bản đồ

  • Dịch vụ danh mục
  • Dịch vụ tìm đường

Maps

Dịch vụ dựa trên vị trí
Kiến trúc hệ thống KAILOS. Công cụ xây dựng bản đồ và thu thập dữ liệu cấp dữ liệu cho máy chủ thu thập, nơi tạo bản đồ vô tuyến cho máy chủ vị trí; dịch vụ vị trí sử dụng máy chủ vị trí và máy chủ bản đồ.

Bước 1: Xây dựng bản đồ vô tuyến

Trước khi cung cấp bản đồ trong nhà cho một tòa nhà hoặc tầng, cần xây dựng bản đồ vô tuyến của khu vực đó. Thực hiện các bước dưới đây; đăng ký điểm quan tâm (POI) và đường đi là tùy chọn.

  1. Bước 1Thêm tòa nhà
  2. Bước 2Thêm tầng
  3. Bước 3Lập kế hoạch thu thập tín hiệu
  4. Bước 4Thu thập tín hiệu
  5. Bước 5Hoàn thành xây dựng bản đồ vô tuyến
Các bước xây dựng bản đồ web. Sau khi thêm tầng, đăng ký POI và đường là tùy chọn.

Tòa nhà, tầng và kế hoạch thu thập tín hiệu được đăng ký bằng công cụ xây dựng bản đồ KAILOS trên web. Công cụ thu thập dữ liệu KAILOS trên Android thu tín hiệu cho bản đồ vô tuyến; kết quả có thể kiểm tra bằng ứng dụng dẫn đường thử nghiệm.

  • Công cụ xây dựng bản đồ webTòa nhà, sơ đồ tầng, POI, đường đi và kế hoạch khảo sát — trình duyệt (Chrome)
  • Công cụ thu thập dữ liệuWalking Survey Collector · Ứng dụng Android (WSTool.apk)
  • Thử dẫn đườngKAILOS Localization Tester · Ứng dụng Android (kailos-tester.apk)

Hãy liên hệ nhóm của chúng tôi để được cấp quyền truy cập công cụ cho tòa nhà của bạn.

Yêu cầu truy cập

Công cụ xây dựng bản đồ web

Công cụ xây dựng bản đồ web chạy trong trình duyệt: mở website KAILOS trên máy tính để sử dụng.

Yêu cầu tối thiểu

  • Máy tính hoặc thiết bị di động có kết nối internet
  • Trình duyệt hỗ trợ HTML5 Canvas
  • Trình duyệt hỗ trợ JavaScript tiêu chuẩn

Thêm tòa nhà

Đăng nhập KAILOS để dùng công cụ xây dựng bản đồ. Chưa đăng nhập vẫn có thể xem bản đồ người khác tạo, nhưng không thêm hoặc sửa tòa nhà được.

Sau khi đăng nhập, mở công cụ và di chuyển bản đồ đến tòa nhà cần cung cấp dịch vụ vị trí trong nhà. Ô tìm kiếm phía trên bên trái giúp tìm nhanh theo địa chỉ hoặc tên. Phóng to đến khi tòa nhà đủ lớn để thao tác thuận tiện (Hình 1).

Đưa con trỏ lên tòa nhà và nhấp chuột phải (Hình 2). Chọn Thêm tòa nhà: lớp tòa nhà mới xuất hiện. Nhấp Chỉnh sửa tòa nhà trên thanh công cụ để vào chế độ chỉnh sửa (Hình 3).

Trong chế độ chỉnh sửa tòa nhà, kéo các điểm trên viền lớp để căn theo đường bao tòa nhà thực tế (Hình 4–5).

Công cụ xây dựng bản đồ phóng to khuôn viên KAIST, với ô tìm tòa nhà phía trên bên trái và danh sách tòa nhà đã đăng ký phía trên bên phải. — mở ảnh kích thước đầy đủ
Hình 1 Tìm tòa nhà và phóng to.
Menu chuột phải trên tòa nhà trong bản đồ, cho phép thêm tòa nhà, POI hoặc đường. — mở ảnh kích thước đầy đủ
Hình 2 Nhấp chuột phải vào tòa nhà và chọn Add a building.
Tòa nhà mới với bảng thông tin tòa nhà và tầng ở bên trái, cùng nút Modify a building được tô sáng trên thanh công cụ. — mở ảnh kích thước đầy đủ
Hình 3 Vào chế độ chỉnh sửa tòa nhà.
Chế độ chỉnh sửa tòa nhà: lớp tòa nhà mới là hình chữ nhật với các điểm có thể kéo trên đường viền. — mở ảnh kích thước đầy đủ
Hình 4 Lớp tòa nhà mới.
Lớp tòa nhà được kéo và xoay cho khớp đường bao trên bản đồ. — mở ảnh kích thước đầy đủ
Hình 5 Căn chỉnh lớp theo đường bao tòa nhà.

Thêm bản đồ tầng

Nhấp Tải lên rồi tải ảnh sơ đồ tầng đã chuẩn bị lên máy chủ KAILOS (Hình 6). Ảnh xuất hiện trong lớp tòa nhà (Hình 7).

Nhấp Căn chỉnh ảnh bản đồ để đặt sơ đồ tầng lên tòa nhà thực tế: di chuyển, thay đổi tỷ lệ và xoay ảnh cho khớp tòa nhà (Hình 8–11).

Khi căn chỉnh xong, nhập tên và thông tin tòa nhà, tầng, rồi nhấp Lưu để hoàn tất (Hình 12).

Hộp thoại chọn ảnh sơ đồ tầng để tải lên cho tầng đang chọn. — mở ảnh kích thước đầy đủ
Hình 6 Tải ảnh sơ đồ tầng lên.
Sơ đồ tầng tải lên hiển thị nhỏ trong lớp tòa nhà. — mở ảnh kích thước đầy đủ
Hình 7 Sơ đồ tầng đã tải lên.
Chế độ căn chỉnh ảnh: bản đồ được làm mờ, ảnh sơ đồ tầng có các điểm điều khiển để di chuyển, thay đổi tỷ lệ và xoay. — mở ảnh kích thước đầy đủ
Hình 8 Căn chỉnh ảnh sơ đồ tầng.
Ảnh sơ đồ tầng được phóng to và xoay trên tòa nhà. — mở ảnh kích thước đầy đủ
Hình 9 Thay đổi tỷ lệ và xoay ảnh.
Sơ đồ tầng căn theo đường bao tòa nhà trên bản đồ. — mở ảnh kích thước đầy đủ
Hình 10 Sơ đồ tầng khớp với tòa nhà.
Sơ đồ tầng đã căn chỉnh trên bản đồ, với thanh công cụ chỉnh sửa ở phía trên. — mở ảnh kích thước đầy đủ
Hình 11 Sơ đồ tầng đã căn chỉnh.
Tên và mô tả tòa nhà, tầng được nhập vào bảng thông tin trước khi lưu. — mở ảnh kích thước đầy đủ
Hình 12 Đặt tên tòa nhà, tầng rồi lưu.

Đăng ký điểm quan tâm (POI)

Tiếp theo, đăng ký điểm quan tâm trong tòa nhà (tùy chọn). POI là địa điểm có thể làm điểm đến khi dẫn đường trong nhà, như văn phòng, cầu thang hoặc nhà vệ sinh.

Nhấp nút POI ở đầu bản đồ, rồi nhấp địa điểm cần đăng ký. Bảng nhập thông tin mở ở phía trên bên trái (Hình 13). Nhập thông tin địa điểm rồi nhấp Lưu, sau đó nhấp nút bàn tay để hoàn tất (Hình 14). Đăng ký các địa điểm khác theo cách tương tự.

Sơ đồ tầng trong công cụ xây dựng bản đồ, với nút đăng ký POI được tô sáng trên thanh công cụ. — mở ảnh kích thước đầy đủ
Hình 13 Bắt đầu đăng ký POI.
Bảng thông tin POI với danh sách danh mục đang mở; các POI đã đăng ký như quán cà phê, nhà vệ sinh hiển thị bằng biểu tượng trên sơ đồ tầng. — mở ảnh kích thước đầy đủ
Hình 14 Nhập thông tin POI.

Đăng ký đường đi

Đường là lối mà người dùng ứng dụng vị trí trong nhà có thể đi theo. Việc đăng ký đường là tùy chọn; khi xây dựng ứng dụng, chức năng đối sánh bản đồ KAILOS sử dụng chúng để hiển thị vị trí người dùng chính xác hơn.

Nhấp nút đường đi ở đầu bản đồ (Hình 15), rồi nhấp các điểm mà đường đi qua. Nhấp đúp điểm cuối để hoàn tất (Hình 16), sau đó nhấp nút bàn tay để thoát chế độ vẽ đường. Để tiếp tục từ một đường đã có, nhấp và vẽ tiếp. Giao điểm được hiển thị bằng chấm đỏ (Hình 17).

Sơ đồ tầng với nút đăng ký đường được tô sáng trên thanh công cụ. — mở ảnh kích thước đầy đủ
Hình 15 Bắt đầu đăng ký đường.
Đường đang được vẽ trên sơ đồ tầng bằng cách nhấp các điểm dọc hành lang. — mở ảnh kích thước đầy đủ
Hình 16 Vẽ đường qua từng điểm.
Mạng đường đã đăng ký màu xanh lá, giao điểm được đánh dấu bằng chấm đỏ. — mở ảnh kích thước đầy đủ
Hình 17 Mạng đường đã hoàn thiện.

Lập kế hoạch thu thập tín hiệu

Trước khi thu thập tín hiệu, hãy lập kế hoạch các tuyến sẽ đi. Ở bước tiếp theo, người thu thập đi dọc các tuyến khảo sát dự kiến này với công cụ thu thập dữ liệu. Cách vẽ tương tự đăng ký đường đi.

Trước tiên, ẩn các đường để tránh vướng: nhấp nút lớp bên phải bản đồ để mở menu hiện/ẩn lớp, rồi bỏ chọn ô Đường (Hình 19).

Nhấp nút khảo sát ở đầu bản đồ (Hình 18), rồi nhấp điểm đầu của tuyến. Tuyến khảo sát đi từ điểm đầu qua các điểm chuyển hướng đến điểm cuối; nhấp đúp điểm cuối để đăng ký tuyến dự kiến (Hình 20–21). Nhấp nút bàn tay để hoàn tất lập kế hoạch.

Tiếp theo, dùng công cụ thu thập dữ liệu để thu tín hiệu dọc các tuyến dự kiến; công cụ sẽ tải kế hoạch đã đăng ký.

Sơ đồ tầng với nút lập kế hoạch khảo sát được tô sáng trên thanh công cụ. — mở ảnh kích thước đầy đủ
Hình 18 Bắt đầu lập kế hoạch thu thập tín hiệu.
Sơ đồ tầng với mạng đường đã ẩn, sẵn sàng vẽ tuyến khảo sát. — mở ảnh kích thước đầy đủ
Hình 19 Ẩn đường đi.
Tuyến khảo sát màu xanh lam đi từ điểm đầu qua các điểm chuyển hướng đến điểm cuối. — mở ảnh kích thước đầy đủ
Hình 20 Vẽ tuyến khảo sát.
Hai tuyến khảo sát dự kiến trên sơ đồ tầng, một xanh lam và một đỏ. — mở ảnh kích thước đầy đủ
Hình 21 Lập đủ các tuyến khảo sát cần thiết cho tầng.

Thu thập tín hiệu

Cài đặt và chạy công cụ thu thập dữ liệu

Cài đặt công cụ thu thập dữ liệu Android — Walking Survey Collector — trên thiết bị di động dùng để thu tín hiệu, như smartphone hoặc máy tính bảng (Hình 22).

Yêu cầu

  • Android 4.3 trở lên
  • Mô-đun mạng LAN không dây (Wi-Fi)
  • Thẻ SD

Cài đặt

  1. Sao chép tệp WSTool.apk vào một thư mục trên thẻ SD của thiết bị.
  2. Mở tệp APK bằng ứng dụng quản lý tệp trên thiết bị.
  3. Nhấn Cài đặt để cài công cụ thu thập dữ liệu.
  4. Chạy công cụ đã cài.

Đăng nhập trước khi dùng công cụ. Sau lần đầu, công cụ tự đăng nhập khi khởi động; để đăng xuất, nhấn nút Menu trên thiết bị rồi chọn Đăng xuất.

Cấu hình thiết bị

Ở màn hình chính, mở Menu → Settings, chọn Wi-Fi trong tab Kết nối, rồi mở Menu → Advanced. Bật Luôn cho phép quét (Hình 23).

Màn hình cài đặt ứng dụng Walking Survey Collector trên Android, liệt kê các quyền được yêu cầu. — mở ảnh kích thước đầy đủ
Hình 22 Cài đặt công cụ thu thập dữ liệu.
Cài đặt Wi-Fi nâng cao trên Android với tùy chọn Always allow scanning được bật. — mở ảnh kích thước đầy đủ
Hình 23 Bật Always allow scanning.

Góc nhìn chính

Tab SURVEY LIST. Tab liệt kê các tầng đã đăng ký trong công cụ xây dựng bản đồ trên web. Nhấn Tải các tầng khảo sát để tải các tầng đã đăng ký bằng ID của bạn và hiển thị thành danh sách (Hình 24–25). Nhấn tầng cần thu thập tín hiệu: công cụ tải sơ đồ tầng cùng các tuyến khảo sát, lưu vào thiết bị rồi mở màn hình thu thập của tầng.

Tab COLLECTING INFO. Các tầng được chọn trong tab SURVEY LIST sẽ được thêm vào tab COLLECTING INFO, và thông tin của chúng được lưu trên thiết bị (Hình 26). Bạn có thể mở màn hình thu thập của các tầng này ngay cả khi không có kết nối internet (Wi-Fi, 3G hoặc 4G); lưu ý 2 ở bước 3 bên dưới giải thích lý do cần kết nối. Tab tóm tắt số tuyến khảo sát và số tuyến đã thu thập của mỗi tầng. Nút Gửi dữ liệu tải dữ liệu lên máy chủ sau khi hoàn tất.

Tab SURVEY LIST của Walking Survey Collector trước khi tải tầng, với nút Load survey floors phía dưới. — mở ảnh kích thước đầy đủ
Hình 24 Tab SURVEY LIST.
Tab SURVEY LIST liệt kê các tầng đã đăng ký cần thu thập, như N1 7F, N24 B1 và E11 5F. — mở ảnh kích thước đầy đủ
Hình 25 Các tầng được tải từ công cụ web.
Tab COLLECTING INFO hiển thị tầng ISI Lab N1 7F đã lưu, số tuyến đã thu thập và nút Send data. — mở ảnh kích thước đầy đủ
Hình 26 Tab COLLECTING INFO.

Thu thập dữ liệu trong bốn bước

Ở màn hình thu thập, bạn có thể di chuyển, xoay và phóng to hoặc thu nhỏ sơ đồ tầng.

Bước 1 — Kiểm tra kế hoạch khảo sát. Màn hình thu thập hiển thị sơ đồ tầng đã đăng ký cùng các tuyến khảo sát dự kiến (Hình 27). Một tầng có thể có một hoặc nhiều tuyến, tùy cách vẽ trong công cụ web.

Bước 2 — Chuẩn bị và kiểm tra hướng. Chọn một tuyến khảo sát: tuyến chuyển sang màu xanh lam và hiển thị điểm bắt đầu cùng điểm kết thúc — tam giác đỏ là điểm đầu, hình tròn đỏ là điểm cuối (Hình 28).

  • Thông tin khảo sát hiển thị số lần đã thu thập trên tuyến đang chọn; nhấn để xem chi tiết (xem phần “Kiểm tra dữ liệu đã thu thập” bên dưới).
  • Thu thập bắt đầu thu thập. Hủy bỏ chọn tuyến khảo sát và quay lại trạng thái trước.

Bước 3 — Bắt đầu thu thập. Đến điểm đầu của tuyến dự kiến (tam giác đỏ), nhấn Thu thập rồi đi dọc tuyến với bước chân thoải mái, đều đặn. Khi đến điểm cuối (hình tròn đỏ), nhấn Hoàn tất thu thập.

Trong lúc thu thập, công cụ ghi cường độ Wi-Fi, BLE và dữ liệu cảm biến — gia tốc kế 3 trục, con quay hồi chuyển, la bàn, khí áp kế. Màn hình Đang thu thập… hiển thị tiến độ thời gian thực (Hình 29). Bạn có thể di chuyển, phóng hoặc xoay bản đồ để dễ quan sát.

  • Hủy thu thập hủy quá trình thu thập đang diễn ra.
  • Hoàn tất thu thập dừng thu thập và lưu dữ liệu trên thiết bị.

Bước 4 — Lưu. Khi kết thúc thu thập, dữ liệu được lưu trên thiết bị. Màn hình Đang lưu… hiển thị tiến độ cho từng loại dữ liệu — Wi-Fi, BLE và cảm biến — và hiển thị HOÀN TẤT khi lưu xong (Hình 30).

Kiểm tra dữ liệu đã thu thập

Để xem số lần quét Wi-Fi hoặc mẫu cảm biến, nhấn Thông tin khảo sát. Màn hình hiển thị số lần thu thập mỗi tuyến và chi tiết từng lần (Hình 31). Nếu một lần thu thập bị lỗi, chọn và xóa trong danh sách.

Khi nào nên xóa dữ liệu đã thu thập? Ví dụ: vô tình nhấn Hoàn tất thu thập trước khi đến điểm cuối, hoặc người thu thập đi quá nhanh hay chạy. Khi đó, số lần quét Wi-Fi quá ít để tạo bản đồ vô tuyến tốt; hãy xóa dữ liệu và thu thập lại.

Màn hình thu thập hiển thị sơ đồ tầng cùng các tuyến khảo sát dự kiến màu đỏ. — mở ảnh kích thước đầy đủ
Hình 27 Bước 1: kiểm tra kế hoạch khảo sát.
Tuyến khảo sát được chọn có màu xanh lam, tam giác đỏ ở đầu và hình tròn đỏ ở cuối, cùng bảng Survey Info và nút Collect. — mở ảnh kích thước đầy đủ
Hình 28 Bước 2: chọn tuyến khảo sát.
Đang thu thập: bộ đếm trực tiếp số phép đo Wi-Fi, BLE và cảm biến, cùng nút Cancel collecting và Complete collecting. — mở ảnh kích thước đầy đủ
Hình 29 Bước 3: thu thập.
Màn hình lưu hiển thị COMPLETE hoặc phần trăm cho từng loại dữ liệu. — mở ảnh kích thước đầy đủ
Hình 30 Bước 4: lưu.
Thông tin Survey Info chi tiết liệt kê số lần quét Wi-Fi và mẫu cảm biến đã thu thập trên một tuyến. — mở ảnh kích thước đầy đủ
Hình 31 Thông tin khảo sát chi tiết.

Tải dữ liệu đã thu thập lên máy chủ KAILOS

Khi thu thập xong theo kế hoạch, nhấn Gửi dữ liệu trong tab COLLECTING INFO để tải lên máy chủ (Hình 32–33). Khi thành công, thông báo xác nhận xuất hiện và dữ liệu đã thu thập được xóa khỏi thiết bị (Hình 34).

Tab COLLECTING INFO sau khi thu thập, hiển thị một trong một tuyến đã được thu thập và sẵn sàng gửi. — mở ảnh kích thước đầy đủ
Hình 32 Sẵn sàng gửi.
Hộp thoại tải lên hiển thị tiến độ gửi các tuyến đã thu thập đến máy chủ. — mở ảnh kích thước đầy đủ
Hình 33 Đang tải lên máy chủ.
Xác nhận dữ liệu đã được gửi đến máy chủ và dữ liệu thu thập đã được xóa khỏi thiết bị. — mở ảnh kích thước đầy đủ
Hình 34 Đã tải lên.

Hoàn thiện bản đồ vô tuyến

Sau khi gửi tín hiệu và dữ liệu cảm biến đến máy chủ KAILOS, chạy gán nhãn để hoàn tất bản đồ vô tuyến. Quá trình gán nhãn phân tích dữ liệu, gắn vị trí cho dấu vân tay đã thu thập và tự động xây dựng bản đồ vô tuyến trong nhà.

Chọn kế hoạch đã đăng ký (Kế hoạch khảo sát), rồi chọn Gán nhãn trong cửa sổ gán nhãn. Bản đồ vô tuyến đã hoàn tất (Hình 35).

Màn hình kế hoạch khảo sát trong công cụ bản đồ, danh sách gán nhãn mở và các tuyến đã thu thập trên sơ đồ tầng. — mở ảnh kích thước đầy đủ
Hình 35 Chạy gán nhãn để hoàn tất bản đồ vô tuyến.

Thử dẫn đường

Khi bản đồ vô tuyến hoàn tất, bạn có thể theo dõi vị trí bằng KAILOS API. Ứng dụng Android KAILOS Localization Tester hiển thị vị trí ước lượng bằng API trên các bản đồ đã thêm.

Yêu cầu

  • Android 4.0 trở lên
  • Mô-đun mạng LAN không dây (Wi-Fi)
  • Thẻ SD
  • 10 MB dung lượng trống

Cài đặt

  1. Lấy gói ứng dụng kailos-tester.apk.
  2. Sao chép tệp APK vào một thư mục trên thẻ SD của thiết bị.
  3. Mở tệp APK bằng ứng dụng quản lý tệp trên thiết bị.
  4. Nhấn Cài đặt để cài ứng dụng dẫn đường thử nghiệm.
  5. Chạy ứng dụng đã cài.

Sử dụng ứng dụng

Ứng dụng trực quan, chỉ có vài chức năng — nếu đã dùng bản đồ di động, bạn có thể bỏ qua phần này. Khi khởi động, ứng dụng hiển thị bản đồ (Hình 36). Hai nút phía trên bên phải điều khiển theo dõi vị trí:

  • Nút theo dõi bắt đầu hoặc dừng theo dõi vị trí. Khi bắt đầu, vị trí ước lượng được đánh dấu trên bản đồ (Hình 37).
  • Nút đánh dấu di chuyển, phóng bản đồ đến vị trí ước lượng; điểm đánh dấu sẽ theo bạn khi di chuyển (Hình 38).

Để mở trợ giúp, mở menu — nhấn nút menu hoặc vuốt từ cạnh trái màn hình — rồi chọn Trợ giúp (Hình 39).

KAILOS Localization Tester hiển thị bản đồ khuôn viên, với nút theo dõi vị trí và đánh dấu ở phía trên bên phải. — mở ảnh kích thước đầy đủ
Hình 36 Bản đồ khi khởi động ứng dụng.
Theo dõi vị trí được bật: vị trí ước lượng được đánh dấu bằng biểu tượng KAILOS. — mở ảnh kích thước đầy đủ
Hình 37 Đã bật theo dõi vị trí.
Bản đồ phóng đến vị trí ước lượng trên sơ đồ tầng N1 7F, với vòng độ chính xác quanh điểm đánh dấu. — mở ảnh kích thước đầy đủ
Hình 38 Tập trung vào vị trí hiện tại.
Menu ứng dụng mở từ cạnh trái, hiển thị mục Help. — mở ảnh kích thước đầy đủ
Hình 39 Mở Help từ menu.

Bước 2: Phát triển ứng dụng với KAILOS API

Để phát triển dịch vụ vị trí trong nhà, KAILOS cung cấp API dưới dạng dịch vụ web RESTful. Đường dẫn tương đối với máy chủ KAILOS; để truy cập API và biết địa chỉ máy chủ dự án, hãy liên hệ nhóm chúng tôi.

API vị trí

Ước lượng vị trí

POST/api/location

Ước lượng vị trí người dùng từ dấu vân tay Wi-Fi, kết quả quét BLE và dữ liệu định vị vệ tinh.

Tham số

data
JSON, như bên dưới.
Yêu cầu · dataJSON
{
  "wifi": [ // Fingerprint (list of AP scans)
    {
      "bssid": "00:26:66:2f:43:60", // BSSID
      "rss": -80, // RSS
      "ssid": "Welcome-KAIST" // SSID (optional)
    },
    ...
  ],
  "ble": [ // BLE fingerprint (scan result over one second)
    {
      "bssid": "00:26:66:2f:43:61",
      "rss": -85,
      "device_name": "myPhone" // (optional)
    },
    ...
  ],
  "gps": [
    {
      "lng": 100.0, // Longitude
      "lat": 100.0, // Latitude
      "acc": 0.0, // Accuracy
      "alt": 0.0, // Altitude
      "bear": 0.0, // Bearing
      "elap": 0.0, // Elapsed real-time nanos
      "speed": 0.0, // Speed
      "time": 0.0 // Time
    },
    ...
  ]
}
Phản hồiJSON
{
  "lnglat": { // GeoJSON format
    type: "Point", // GeoJSON Point type
    coordinate: [100.0, 100.0] // GeoJSON coordinate: [lng, lat] (WGS-84)
  },
  "alt": 45.0000, // Altitude (optional)
  "level": 7, // Level number
  "floorID": 9, // Floor map ID
  "bd": "N1", // Building code (optional)
  "err": 6.7 // Position error (optional)
}

Cập nhật dữ liệu khảo sát

POST/api/db/updateSurveyData

Tải dữ liệu khảo sát Wi-Fi (quét điểm truy cập tại vị trí đã biết) lên cơ sở dữ liệu bản đồ vô tuyến.

Tham số

data
JSON, như bên dưới.
Yêu cầu · dataJSON
{
  "wifiList": [
    {
      "apList": [
        {
          "ssid": "isiLab",
          "bssid": "00:26:66:2f:43:60",
          "rssi": -89
        },
        ...
      ],
      "lng": 127.36534260538609,
      "lat": 36.374168514955834,
      "level": 7, // Building floor
      "bd": "N1", // Building name
      "floorID": 9 // Unique floor ID
    },
    ...
  ]
}

Phản hồi Mã trạng thái HTTP.

API bản đồ

Lấy bản đồ tầng

GET/floors/{floorId}/image

Trả về ảnh sơ đồ của tầng.

Tham số

floorId
ID tầng.
Yêu cầu · Ví dụHTTP
GET /floors/554ff57ec900625812229172/image

Lấy POI của một tầng

GET/pois/floor/{floorId}

Trả về POI đăng ký trên tầng. Thêm ID tầng vào URL; phản hồi là chuỗi cần phân tích dưới dạng JSON.

Tham số

floorId
ID tầng.
Yêu cầu · Ví dụHTTP
GET /pois/floor/533107a2eff3417c12f357f9
Phản hồiJSON
[
  {
    "_id": "54866f6c32c4250829314146", // POI ID
    "category": "prof", // POI category
    "floorId": "533107a2eff3417c12f357f9", // Floor ID
    "geometry": { // Location as GeoJSON
      "type": "Point",
      "coordinates": [127.36565597355366, 36.37398342955928]
    },
    "name": "한동수 Demo", // POI name
    "level": "3", // Zoom level of the POI (importance)
    "roomNumber": "704", // Room number
    "zoomEnd": 30, // Not used
    "zoomStart": 15, // Not used
    "userId": "5322d496285a9bfc0537539f", // ID of the user who registered the POI
    "regTime": "1418096492643", // Registration timestamp
    "description": "DongSoo Han - Demo" // Description
  },
  {
    "_id": "54c95ac0bed48ea802d0ddb8",
    "category": "elevator",
    "floorId": "533107a2eff3417c12f357f9",
    "geometry": {
      "type": "Point",
      "coordinates": [127.36574783921242, 36.3740876309574]
    },
    "name": "",
    "level": "3",
    "roomNumber": "",
    "zoomEnd": 30,
    "zoomStart": 15,
    "userId": "5322d496285a9bfc0537539f",
    "regTime": 1422482112074,
    "description": ""
  },
  ...
  {
    "_id": "551a582f65ea1154059b0a11",
    "category": "lab",
    "floorId": "533107a2eff3417c12f357f9",
    "geometry": {
      "type": "Point",
      "coordinates": [127.3655292391777, 36.37419723124106]
    },
    "name": "ISILab",
    "level": "3",
    "roomNumber": "723",
    "zoomEnd": 30,
    "zoomStart": 15,
    "userId": "5322d496285a9bfc0537539f",
    "regTime": 1427789871625,
    "description": "ISILab"
  }
]
Ví dụ Android (Java, từ tài liệu gốc)
Ví dụ · Ví dụ Android (Java, từ tài liệu gốc)Java
// KAILOS_SERVER: the address of your KAILOS server.
public class PoiRestThread extends Thread {
    private static String TAG = "PoiRestThread";
    public static boolean isThreadWorking = false;

    private String mFloorId;

    public PoiRestThread() {
    }

    public void setRequestFloorId(String floorId) {
        mFloorId = floorId;
    }

    public void start() {
        isThreadWorking = true;
        super.start();
    }

    // Requests the POIs of a floor, parses the JSON response and notifies a handler.
    public void run() {
        ArrayList poiList = null;

        try {
            String strRequestURL = KAILOS_SERVER + "/pois/floor/" + mFloorId;

            HttpGet httpGet = new HttpGet(strRequestURL);

            HttpParams httpParameters = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParameters, Constants.SOCKET_TIME_OUT_MS * 2);
            HttpConnectionParams.setSoTimeout(httpParameters, Constants.SOCKET_TIME_OUT_MS);

            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            ClientConnectionManager clientConnectionManager = httpClient.getConnectionManager();
            httpClient = new DefaultHttpClient(
                new ThreadSafeClientConnManager(httpParameters, clientConnectionManager.getSchemeRegistry()),
                httpParameters);
            ResponseHandler responseHandler = new BasicResponseHandler();

            String strResponse = httpClient.execute(httpGet, responseHandler);

            if (strResponse != null && !strResponse.equals("null")) {
                Log.i(TAG, strResponse);
                // The POIs of the floor were retrieved.
            }
        } catch (Exception e) {
            // Exceptions such as time-outs are ignored.
        }
    }
}

Lấy POI của tầng theo danh mục

GET/pois/floor/{floorId}/{categoryType}

Tương tự lấy POI của tầng, nhưng thêm loại danh mục từ danh sách bên dưới vào URL. Phản hồi có cùng định dạng.

Tham số

floorId
ID tầng.
categoryType
Loại danh mục POI, ví dụ elevator.

Danh mục POI

POI sử dụng các loại sau, được nhóm theo danh mục.

Danh mục POI và các loại
Danh mụcLoại
education
  • prof
  • seminar
  • researcher
  • lab
  • studyroom
Khẩn cấp
  • call
  • hydrant
  • fireextinguisher
  • firstaidkit
store
  • hair
  • cafe
  • bread
  • restaurant
facility
  • cctv
  • nfc
  • qr
  • Bluetooth
  • wifi
  • temperaturesensor
  • motionsensor
  • light
  • firsensor
  • basestation
general
  • atm
  • postoffice
  • resting
  • sport
  • shower
  • watersupply
  • wash
  • restroom
  • office
floorchange
  • Cầu thang
  • elevator
  • escalator
etc
  • storehouse
  • memorial
  • vendingmachine
  • etc

Lấy các tầng của tòa nhà

GET/floors/building/{buildingId}

Trả về danh sách tầng của tòa nhà.

Tham số

buildingId
ID tòa nhà.
Phản hồiJSON
[
  {
    "_id": "5403e318b11b008c1406a646",
    "buildingId": "5403e318b11b008c1406a645",
    "description": "1",
    "floorNumber": 1,
    "floorPlanType": "image/png",
    "geometry": {
      "type": "Polygon",
      "coordinates": [
        ["127.3662497", "36.3745616"],
        ["127.3650642", "36.3740173"]
      ],
      "angle": "0"
    },
    "name": "1",
    "regTime": "1409540888640",
    "userId": "5322d496285a9bfc0537539f",
    "zoomEnd": "28",
    "zoomStart": "15"
  },
  {
    "_id": "5403e5d7b11b008c1406a647",
    "buildingId": "5403e318b11b008c1406a645",
    "description": "2",
    "floorNumber": 2,
    "floorPlanType": "image/png",
    "geometry": {
      "type": "Polygon",
      "coordinates": [
        ["127.36624958772654", "36.37456190071682"],
        ["127.36512807350164", "36.374028005943565"]
      ],
      "angle": "0.00"
    },
    "name": "2",
    "regTime": "1409541591516",
    "userId": "5322d496285a9bfc0537539f",
    "zoomEnd": "28",
    "zoomStart": "15"
  }
]

API tuyến đường

Tìm đường

POST/routes

Tìm tuyến dẫn đường giữa hai điểm trong nhà hoặc ngoài trời. Phản hồi là chuỗi cần phân tích dưới dạng JSON: tuyến đường gồm một danh sách các đoạn.

Nội dung yêu cầu (application/x-www-form-urlencoded)

startFloorId
ID tầng của điểm đầu nếu ở trong nhà; chuỗi rỗng nếu ở ngoài trời.
startX
Kinh độ điểm đầu.
startY
Vĩ độ điểm đầu.
endFloorId
ID tầng của điểm đến nếu ở trong nhà; chuỗi rỗng nếu ở ngoài trời.
endX
Kinh độ điểm đến.
endY
Vĩ độ điểm đến.
Phản hồiJSON
[
  {
    "lng1": 127.36141960240502, // Longitude of the segment start
    "lat1": 36.370199561212004, // Latitude of the segment start
    "lng2": 127.36141960240502, // Longitude of the segment end
    "lat2": 36.370199561212004, // Latitude of the segment end
    "type": "OUT" // Segment type: OUT = outdoor, IN_OUT = indoor-outdoor connection, IN = indoor
  },
  ...
  {
    "lng1": 127.36456921426938,
    "lat1": 36.37411861283401,
    "lng2": 127.36458644270897,
    "lat2": 36.37414054145845,
    "type": "IN_OUT"
  },
  {
    "lng1": 127.36458644270897,
    "lat1": 36.37414054145845,
    "lng2": 127.36458644270897,
    "lat2": 36.37414054145845,
    "type": "IN",
    "floorNumber": 100, // Floor number of an indoor segment
    "floorId": "5493d972eb4b45d42d777720", // Floor ID
    "buildingId": "5403e318b11b008c1406a645" // ID of the building the floor belongs to
  },
  ...
]
Ví dụ Android (Java, từ tài liệu gốc)
Ví dụ · Ví dụ Android (Java, từ tài liệu gốc)Java
// KAILOS_SERVER: the address of your KAILOS server.
package kr.ac.kaist.isilab.kai_navi.route;

import java.util.ArrayList;
import java.util.List;

import kr.ac.kaist.isilab.kai_navi.utils.Constants;

import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import android.content.Context;
import android.util.Log;

public class RouteRestThread extends Thread {
    private static String TAG = "RouteRestThread";
    public static DefaultHttpClient mHttpClient = null;
    private static Context mContext = null;

    private String mStartFloorId = "";
    private Double mStartLng = 127.36561;
    private Double mStartLat = 36.374101;

    private String mEndFloorId = "";
    private Double mEndLng = 127.36561;
    private Double mEndLat = 36.374101;

    public static void createHttpClient() {
        HttpParams httpParameters = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters, 20000);
        HttpConnectionParams.setSoTimeout(httpParameters, 10000);

        mHttpClient = new DefaultHttpClient(httpParameters);
        ClientConnectionManager clientConnectionManager = mHttpClient.getConnectionManager();
        mHttpClient = new DefaultHttpClient(
            new ThreadSafeClientConnManager(httpParameters, clientConnectionManager.getSchemeRegistry()),
            httpParameters);
    }

    public void setContext(Context context) {
        mContext = context;
    }

    public RouteRestThread() {
    }

    public void setRequestData(Double startLng, Double startLat, String startFloorId,
                               Double endLng, Double endLat, String endFloorId) {
        mStartFloorId = startFloorId;
        mStartLng = startLng;
        mStartLat = startLat;
        mEndFloorId = endFloorId;
        mEndLng = endLng;
        mEndLat = endLat;
    }

    @Override
    public void start() {
        super.start();
    }

    @Override
    public void run() {
        try {
            String strServerURL = KAILOS_SERVER + "/routes";

            if (mHttpClient == null)
                createHttpClient();

            HttpPost httpPost = new HttpPost(strServerURL);
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Accept-Language", "ko_KR");
            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");

            List pairs = new ArrayList();
            pairs.add(new BasicNameValuePair("startX", mStartLng.toString()));
            pairs.add(new BasicNameValuePair("startY", mStartLat.toString()));
            pairs.add(new BasicNameValuePair("startFloorId", mStartFloorId));
            pairs.add(new BasicNameValuePair("endX", mEndLng.toString()));
            pairs.add(new BasicNameValuePair("endY", mEndLat.toString()));
            pairs.add(new BasicNameValuePair("endFloorId", mEndFloorId));

            httpPost.setEntity(new UrlEncodedFormEntity(pairs));

            ResponseHandler responseHandler = new BasicResponseHandler();
            String strResponse = mHttpClient.execute(httpPost, responseHandler);

            if (strResponse != null && !strResponse.equals("null")) {
                Log.i(TAG, strResponse);
                // The route was retrieved.
            }
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
        }
    }
}

Các endpoint trước đây

Bản tiếng Anh của tài liệu gốc mô tả phiên bản Map và Route API trước đây, trong đó mọi truy vấn là yêu cầu POST đến /api/map/…. Chúng được liệt kê ở đây cho các tích hợp hiện có.

Hiện endpoint Map và Route trước đây

Lấy bản đồ tầng

POST/api/map/getFloorMaps

Tham số

data
JSON, như bên dưới.
Yêu cầu · dataJSON
{
  "queryType": "NEAREST_ENTIRE", // Query type [NEAREST_ENTIRE | NEAREST_REPRESENTATIVE | FLOOR_ID]
  "lng": "100.0", // Longitude (used for NEAREST_ENTIRE, NEAREST_REPRESENTATIVE)
  "lat": "101.0", // Latitude (used for NEAREST_ENTIRE, NEAREST_REPRESENTATIVE)
  "floorID": "1234" // Floor ID (used for FLOOR_ID)
}
Phản hồiJSON
{
  "floormaps": [
    {
      "objID": 14,
      "neLat": 36.374393463134766,
      "neLng": 127.36409759521484,
      "swLat": 36.373573303222656,
      "swLng": 127.36292266845703,
      "angle": 0,
      "areaID": 1,
      "buildingID": 15,
      "floorID": 12,
      "category": "IMG",
      "memberID": 1,
      "floorName": "N5 2F",
      "floorNumber": 2,
      "buildingName": "N5 기초과학연구동",
      "floorNumberBase": 2,
      "areaName": "KAIST 한국과학기술원",
      "imageURL": "uploads/1____1377087116.png"
    },
    ...
  ]
}

Lấy POI

POST/api/map/directory

Tham số

data
JSON, như bên dưới.
Yêu cầu · dataJSON
{
  "queryType": "POI", // Query type [POI]
  "keyword": "dongsoo" // Search keyword
}
Phản hồiJSON
{
  "poi": [
    {
      "_id": "525cc557fd4be8314bc5951d",
      "floorId": "525cc3f8fd4be8314bc594e7",
      "name": {
        "kr": "한동수",
        "en": "Dongsoo Han"
      },
      "category": "prof",
      "roomNumber": "814",
      "visibleZoomStart": 19,
      "visibleZoomEnd": 30,
      "geometry": {
        "type": "POINT",
        "coordinates": [[127.3660891, 36.3740404]]
      },
      "memberId": "1"
    },
    {
      "_id": "525cc557fd4be8314bc5952b",
      "floorId": "525cc3f8fd4be8314bc594e5",
      "name": {
        "kr": "한동수",
        "en": "Dongsoo Han"
      },
      "category": "prof",
      "roomNumber": "704",
      "visibleZoomStart": 19,
      "visibleZoomEnd": 30,
      "geometry": {
        "type": "POINT",
        "coordinates": [[127.365545, 36.3740436]]
      },
      "memberId": "1"
    }
  ]
}

Lấy mạng đường đi của một tầng

POST/api/map/route

Tham số

queryType
GET_ROADS_BY_FLOORID
floorId
ID tầng (chuỗi).
Yêu cầu · Ví dụHTTP
queryType: "GET_ROADS_BY_FLOORID"
floorId: "525cc3f8fd4be8314bc594c3"
Phản hồiJSON
{
  "road": [
    [
      [127.363031, 36.37373, "525cc3f8fd4be8314bc594c3"],
      [127.363031, 36.37373, "525cc3f8fd4be8314bc594c9"]
    ],
    [
      [127.363017, 36.374319, "525cc3f8fd4be8314bc594c3"],
      [127.363017, 36.374319, "525cc3f8fd4be8314bc594ca"]
    ],
    [
      [127.363018, 36.37432, "525cc3f8fd4be8314bc594c3"],
      [127.363018, 36.37432, "525cc3f8fd4be8314bc594c9"]
    ]
  ]
}

Tìm đường ngắn nhất

POST/api/map/route

Tham số

queryType
FIND_PATH
from
Điểm đầu: kinh độ, vĩ độ, ID tầng (chuỗi).
to
Điểm đến: kinh độ, vĩ độ, ID tầng (chuỗi).
Yêu cầu · Ví dụHTTP
queryType: "FIND_PATH"
from: 127.3658898,36.3741702,525cc3f8fd4be8314bc594e7
to: 127.3658872,36.3741724,525cc3f8fd4be8314bc594e7
Phản hồiJSON
{
  "path": [
    [127.3658872, 36.3741724, "525cc3f8fd4be8314bc594e7"],
    [127.3658872, 36.3741238, "525cc3f8fd4be8314bc594e7"],
    [127.3658872, 36.3740968, "525cc3f8fd4be8314bc594e7"],
    [127.3658858, 36.3740579, "525cc3f8fd4be8314bc594e7"],
    [127.3661031, 36.3740557, "525cc3f8fd4be8314bc594e7"],
    [127.3661031, 36.3740795, "525cc3f8fd4be8314bc594e7"],
    [127.3661031, 36.3741724, "525cc3f8fd4be8314bc594e7"]
  ]
}

Hỗ trợ API

Với câu hỏi về cách dùng KAILOS, API hoặc yêu cầu API bổ sung, hãy trao đổi với nhóm chúng tôi.

Trao đổi với chúng tôi

Ban đầu được Phòng thí nghiệm Tích hợp Dịch vụ Thông minh của KAIST công bố dưới tên KAILOS Manual trên kailos.io.

Triển khai định vị trong nhà cho môi trường của bạn.

Hãy cho chúng tôi biết về tòa nhà, phạm vi, người dùng và ứng dụng mục tiêu.

Trao đổi về KAILOS