👉 To download the full dataset, please visit Indoor Location Competition 2.0 Dataset.
👉 For more details on the competition including winning solutions, please visit our Kaggle competition site.
This repository contains sample data and code for Indoor Location Competition 2.0, a continuation of Microsoft Indoor Location Competition. Competition this year will be completely virtual and evaluated on large-scale real indoor location datasets. The dataset to be released consists of dense indoor signatures of WiFi, geomagnetic field, iBeacons etc., as well as ground truth collected from hundreds of buildings in Chinese cities.
We held a webinar in July, the video is here.
data
folder contains indoor traces from two sites. Each trace (*.txt
) corresponds to an indoor path between position p1 and p2 walked by a site-surveyor. During the walk, site-surveyor is holding an Android smartphone flat in front of his body, and a sensor data recording app is running on the device to collect IMU (accelerometer, gyroscope) and geomagnetic field (magnetometer) readings, as well as WiFi and Bluetooth iBeacon scanning results. A detailed description of the format of trace file is shown below. In addition to raw traces, floor plan metadata (e.g., raster image, size, GeoJSON) are also included for each floor.
Time | Data Type | Value | |||||||
---|---|---|---|---|---|---|---|---|---|
1574659531598 | TYPE_WAYPOINT | 196.41757 | 117.84907 | ||||||
Location surveyor labeled on the map | Coordinate x (meter) | Coordiante y (meter) | |||||||
1574659531695 | TYPE_ACCELEROMETER | -1.7085724 | -0.274765 | 16.657166 | 2 | ||||
Android Sensor.TYPE_ACCELEROMETER | X axis | Y axis | Z axis | accuracy | |||||
1574659531695 | TYPE_GYROSCOPE | -0.3021698 | 0.2773285 | 0.107543945 | 3 | ||||
Android Sensor.TYPE_GYROSCOPE | X axis | Y axis | Z axis | accuracy | |||||
1574659531695 | TYPE_MAGNETIC_FIELD | 20.181274 | 16.209412 | -32.22046 | 3 | ||||
Android Sensor.TYPE_MAGNETIC_FIELD | X axis | Y axis | Z axis | accuracy | |||||
1574659531695 | TYPE_ROTATION_VECTOR | -0.00855688 | 0.051367603 | 0.362504 | 3 | ||||
Android Sensor.TYPE_ROTATION_VECTOR | X axis | Y axis | Z axis | accuracy | |||||
1574659531695 | TYPE_ACCELEROMETER_UNCALIBRATED | -1.7085724 | -0.274765 | 16.657166 | 0.0 | 0.0 | 0.0 | 3 | |
Android Sensor.TYPE_ACCELEROMETER_UNCALIBRATED | X axis | Y axis | Z axis | X axis | Y axis | Z axis | accuracy | ||
1574659531695 | TYPE_GYROSCOPE_UNCALIBRATED | -0.42333984 | 0.20202637 | 0.09623718 | -7.9345703E-4 | 3.2043457E-4 | 4.119873E-4 | 3 | |
Android Sensor.TYPE_GYROSCOPE_UNCALIBRATED | X axis | Y axis | Z axis | X axis | Y axis | Z axis | accuracy | ||
1574659531695 | TYPE_MAGNETIC_FIELD_UNCALIBRATED | -29.830933 | -26.36261 | -300.3006 | -50.012207 | -42.57202 | -268.08014 | 3 | |
Android Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED | X axis | Y axis | Z axis | X axis | Y axis | Z axis | accuracy | ||
1574659533190 | TYPE_WIFI | intime_free | 0e:74:9c:a7:b2:e4 | -43 | 5805 | 1574659532305 | |||
Wi-Fi data | ssid | bssid | RSSI | frequency | last seen timestamp | ||||
1574659532751 | TYPE_BEACON | FDA50693-A4E2-4FB1-AFCF-C6EB07647825 | 10073 | 61418 | -65 | -82 | 5.50634293288929 | 6B:11:4C:D1:29:F2 | 1574659532751 |
iBeacon data | UUID | MajorID | MinorID | Tx Power | RSSI | Distance | MAC Address | same with Unix time, padding data |
The first column is Unix Time in millisecond. In specific, we use SensorEvent.timestamp for sensor data and system time for WiFi and Bluetooth scans.
The second column is the data type (ten in total).
- TYPE_ACCELEROMETER
- TYPE_MAGNETIC_FIELD
- TYPE_GYROSCOPE
- TYPE_ROTATION_VECTOR
- TYPE_MAGNETIC_FIELD_UNCALIBRATED
- TYPE_GYROSCOPE_UNCALIBRATED
- TYPE_ACCELEROMETER_UNCALIBRATED
- TYPE_WIFI
- TYPE_BEACON
- TYPE_WAYPOINT: ground truth location labeled by the surveyor
Data values start from the third column.
Column 3-5 of TYPE_ACCELEROMETER、TYPE_MAGNETIC_FIELD、TYPE_GYROSCOPE、TYPE_ROTATION_VECTOR are SensorEvent.values[0-2] from the callback function onSensorChanged(). Column 6 is SensorEvent.accuracy.
Column 3-8 of TYPE_ACCELEROMETER_UNCALIBRATED、TYPE_GYROSCOPE_UNCALIBRATED、TYPE_MAGNETIC_FIELD_UNCALIBRATED are SensorEvent.values[0-5] from the callback function onSensorChanged(). Column 9 is SensorEvent.accuracy.
Values of TYPE_BEACON are obtained from ScanRecord.getBytes(). The results are decoded based on iBeacon protocol using the code below.
val major = ((scanRecord[startByte + 20].toInt() and 0xff) * 0x100 + (scanRecord[startByte + 21].toInt() and 0xff))
val minor = ((scanRecord[startByte + 22].toInt() and 0xff) * 0x100 + (scanRecord[startByte + 23].toInt() and 0xff))
val txPower = scanRecord[startByte + 24]
Distance in column 8 is calculated as
private static double calculateDistance(int txPower, double rssi) {
if (rssi == 0) {
return -1.0; // if we cannot determine distance, return -1.
}
double ratio = rssi*1.0/txPower;
if (ratio < 1.0) {
return Math.pow(ratio,10);
}
else {
double accuracy = (0.89976)*Math.pow(ratio,7.7095) + 0.111;
return accuracy;
}
}
https://developer.android.com/guide/topics/sensors
https://developer.android.com/reference/android/net/wifi/ScanResult.html
https://developer.android.com/reference/android/bluetooth/le/ScanRecord
Along with sample data from two sites, this repo also provides several scripts on parsing and analyzing indoor traces. All scripts are tested with Python 3.6.9 on both Windows 10 and Mac OS 15.
python main.py
Functions | Output |
---|---|
Ground truth location visualization | output/site1/F1/path_images |
Sample step detection and visualization | output/site1/F1/step_position.html |
Geo-magnetic field intensity visualization | output/site1/F1/magnetic_strength.html |
WiFi RSSI heatmap generation | output/site1/F1/wifi_images |
iBeacon RSSI heatmap generation | output/site1/F1/ibeacon_images |
WiFi SSID counts visualization | output/site1/F1/wifi_count.html |
indoor-location-competition-20
│ README.md
│ main.py //main function of the sample code
| compute_f.py //data processing functions
| io_f.py //data preprocessing functions
| visualize_f.py //visualization function
│
└───data //raw data from two sites
└───site1
| └───B1 //traces from one floor
| | └───path_data_files
| | | └───5dda14a2c5b77e0006b17533.txt //trace file
| | | | ...
| | |
| | | floor_image.png //raster floor plan
| | | floor_info.json //floor size info
| | | geojson_map.json //floor plan in vector format (GeoJSON)
| |
| └───F1
| │ ...
|
└───site2
│ ...
This repository is licensed with the MIT license.