/
RelativeRSSIProcessing.ts
81 lines (75 loc) · 2.79 KB
/
RelativeRSSIProcessing.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { RelativeRSSI, RFTransmitterObject } from '../data';
import {
DataFrame,
DataObject,
RelativeDistance,
RelativePositionProcessing,
ObjectProcessingNodeOptions,
LengthUnit,
} from '@openhps/core';
/**
* Relative RSSI processing node to convert [[RelativeRSSI]] to [[RelativeDistance]] using
* a distance propagation formula.
*/
export class RelativeRSSIProcessing<InOut extends DataFrame> extends RelativePositionProcessing<InOut, RelativeRSSI> {
protected options: RelativeRSSIOptions;
constructor(options?: RelativeRSSIOptions) {
super(RelativeRSSI, options);
this.options.propagationModel = this.options.propagationModel || PropagationModel.LOG_DISTANCE;
}
public processRelativePositions(
dataObject: DataObject,
relativePositions: Map<RelativeRSSI, RFTransmitterObject>,
): Promise<DataObject> {
return new Promise((resolve) => {
relativePositions.forEach((relativeObj, relValue) => {
const distance = this.convertToDistance(relValue, relativeObj);
if (distance) {
dataObject.addRelativePosition(distance);
}
});
resolve(dataObject);
});
}
protected convertToDistance(rel: RelativeRSSI, transmitter: RFTransmitterObject): RelativeDistance {
const environmentFactor = this.options.environmentFactor || transmitter.environmentFactor;
const calibratedRSSI = transmitter.calibratedRSSI || this.options.defaultCalibratedRSSI;
switch (this.options.propagationModel) {
case PropagationModel.LOG_DISTANCE:
if (calibratedRSSI && rel.rssi && environmentFactor) {
const relDistance = new RelativeDistance(
transmitter,
Math.pow(10, (calibratedRSSI - rel.rssi) / (10 * environmentFactor)),
);
relDistance.timestamp = rel.timestamp;
relDistance.distanceUnit = LengthUnit.CENTIMETER;
return relDistance;
} else {
return undefined;
}
}
}
}
export interface RelativeRSSIOptions extends ObjectProcessingNodeOptions {
/**
* RSSI distance propagation model
* @default PropagationModel.LOG_DISTANCE
*/
propagationModel?: PropagationModel;
/**
* Environment factor to override transmitter environment factor
*/
environmentFactor?: number;
/**
* Default calibrated RSSI value at 1 meter distance
* @default undefined
*/
defaultCalibratedRSSI?: number;
}
export enum PropagationModel {
/**
* Log distance path loss
* @see {@link https://en.wikipedia.org/wiki/Log-distance_path_loss_model}
*/
LOG_DISTANCE,
}