"An indoor positioning system (IPS) is a network of devices used to locate people or objects where GPS and other satellite technologies lack precision or fail entirely, such as inside multistory buildings, airports, alleys, parking garages, and underground locations."
- Wikipedia (2022)
- (image) Bonkers.io (2018)
"Location awareness refers to devices that can passively or actively determine their location."
Using the location of a person or asset as contextual information for implicit human-computer interaction.
NOTE: You will see implicit human-computer interaction in a later lecture
Using a camera to determine the position based on the visual features in the environment.
A small (battery powered) device that sends out a BLE advertisement in a fixed interval. The received signal strength is used to esimate the linear distance.
Algorithms:
A small (battery powered) device that sends out an RF signal over a large band (6 - 8 GHz), allowing the use of Time of Flight (ToF) for determining the distance to centimeter precision. More power consumption than BLE.
Algorithms:
Existing Wi-Fi infrastructure to predict the position based on the signal strength or Time of Flight (ToF) on supported access points.
Algorithms:
Accelerometer, gyroscope and magnetometer to determine the orientation, linear and angular velocity. Optionally can contain a barometer.
Algorithms:
ts
// Data object for the person we are trackingme.displayName = "Maxim Van de Wynckel";// Phone belonging to the personconst phone = new DataObject()phone.displayName = "Maxim's Phone";phone.setParent(me);// Watch belonging to the personconst watch = new DataObject();watch.displayName = "Maxim's Android Watch";watch.setParent(me);// IP camera identified by MACconst camera = new CameraObject("80:bb:7c:37:0e:02");camera.width = 1980;camera.height = 1024;camera.fps = 30;camera.setPosition(/* ... */);
ts
// Data object for the person we are trackingme.displayName = "Maxim Van de Wynckel";// Phone belonging to the personconst phone = new DataObject();phone.displayName = "Maxim's Phone";phone.setParent(me);// Watch belonging to the personconst watch = new DataObject();watch.displayName = "Maxim's Android Watch";watch.setParent(me);// IP camera identified by MACconst camera = new CameraObject("80:bb:7c:37:0e:02");camera.width = 1980;camera.height = 1024;camera.fps = 30;camera.setPosition(/* ... */);
ts
// Data object for the person we are trackingme.displayName = "Maxim Van de Wynckel";// Phone belonging to the personconst phone = new DataObject();phone.displayName = "Maxim's Phone";phone.setParent(me);// Watch belonging to the personconst watch = new DataObject();watch.displayName = "Maxim's Android Watch";watch.setParent(me);// IP camera identified by MACconst camera = new CameraObject("80:bb:7c:37:0e:02");camera.width = 1980;camera.height = 1024;camera.fps = 30;camera.setPosition(/* ... */);
ts
// Data object for the person we are trackingme.displayName = "Maxim Van de Wynckel";// Phone belonging to the personconst phone = new DataObject();phone.displayName = "Maxim's Phone";phone.setParent(me);// Watch belonging to the personconst watch = new DataObject();watch.displayName = "Maxim's Android Watch";watch.setParent(me);// IP camera identified by MACconst camera = new CameraObject("80:bb:7c:37:0e:02");camera.width = 1980;camera.height = 1024;camera.fps = 30;camera.setPosition(/* ... */);
Absolute
Relative
ts
// Absolute geographical positionme.setPosition(new GeographicalPosition(50.8204, 4.3921));// Relative position(s) to another objectme.addRelativePosition(new RelativeDistance("9F:F1:90:4C:F5:6A", 5.2, LengthUnit.METER));me.addRelativePosition(new RelativeDistance("DC:0F:14:B2:6B:80", 1.4, LengthUnit.METER));
ts
// Sensor that captured the frameconst camera = new CameraObject();// Create a new frameconst frame = new VideoFrame();frame.source = camera;frame.image = myImage;// Add detected objects to frameframe.addObject(/* ... */);frame.addObject(/* ... */);frame.addObject(/* ... */);
ts
ModelBuilder.create().from(new CallbackSourceNode(() => {const myObject = new DataObject("mvdewync");const frame = new DataFrame();frame.addObject(myObject);return frame;})).via(new CallbackNode((frame: DataFrame) => { /* ... */ })).to(new CallbackSinkNode((frame: DataFrame) => { /* ... */ })).build().then((model: Model) => { /* ... */ });
Create a new Bluetooth beacon object with the ID column as its uid and an absolute 3d position for the X, Y and Z coordinates. Return the beacon object in this function.
Create a relative position for the rssi and beacon Use the RelativeRSSI class in combination with a new BLEObject that uses the beacon name as its UID
Convert the RSSI to a distance using log distance propagation Assume we have a calibrated received signal strength of -69 at 1 meter distance. Play around with the environment factor to see what works best.
Use the RSSI converted to a distance (from question 2) to calculate the position with multilateration.
Create a fingerprint service that will store the scene analysis. Experiment with the default RSSI value and grouping
Create a KNN fingerprinting node to convert sensor data to a position. Experiment with the parameters to obtain a better result.
Load the spaces/features defined in our dataset (spaces.geo.json). The file is already loaded as the variable GEOJSON_FEATURES.
Emit the event of entering and exiting a space This event should only trigger when you enter a new space. The 'enterspace' event should only trigger when you enter a new space. The 'exitspace' event should only trigger when you leave a space.