1 /*
2 * Copyright (C) 2018 Alberto Irurueta Carro (alberto@irurueta.com)
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package com.irurueta.navigation.indoor;
17
18 import com.irurueta.algebra.Matrix;
19 import com.irurueta.geometry.Point;
20
21 /**
22 * Contains a located reading associated to a given radio source (e.g. Wi-Fi access point or
23 * bluetooth beacon) containing signal strength and distance to associated radio source.
24 *
25 * @param <S> a {@link RadioSource} type.
26 * @param <P> a {@link Point} type.
27 */
28 public class RangingAndRssiReadingLocated<S extends RadioSource, P extends Point<?>> extends RangingAndRssiReading<S>
29 implements ReadingLocated<P> {
30
31 /**
32 * Position where Wi-Fi reading was made.
33 */
34 private P position;
35
36 /**
37 * Covariance of inhomogeneous coordinates of current position
38 * (if available).
39 */
40 private Matrix positionCovariance;
41
42 /**
43 * Constructor.
44 *
45 * @param source radio source associated to this reading.
46 * @param distance distance in meters to the radio source.
47 * @param rssi received signal strength indicator in dBm.
48 * @param position position where reading was made.
49 * @throws IllegalArgumentException if radio source data is null, distance is negative
50 * or position is null.
51 */
52 public RangingAndRssiReadingLocated(final S source, final double distance, final double rssi, final P position) {
53 super(source, distance, rssi);
54
55 if (position == null) {
56 throw new IllegalArgumentException();
57 }
58
59 this.position = position;
60 }
61
62 /**
63 * Constructor.
64 *
65 * @param source radio source associated to this reading.
66 * @param distance distance in meters to the radio source.
67 * @param rssi received signal strength indicator in dBm.
68 * @param position position where reading was made.
69 * @param numAttemptedMeasurements number of attempted measurements used in the RTT exchange.
70 * @param numSuccessfulMeasurements number of successful measurements used to calculate the
71 * distance and standard deviation.
72 * @throws IllegalArgumentException if radio source data is null, distance is negative,
73 * position is null, number of attempted measures is less than 1 or number of
74 * successful measures is negative.
75 */
76 public RangingAndRssiReadingLocated(
77 final S source, final double distance, final double rssi, final P position,
78 final int numAttemptedMeasurements, final int numSuccessfulMeasurements) {
79 super(source, distance, rssi, numAttemptedMeasurements, numSuccessfulMeasurements);
80
81 if (position == null) {
82 throw new IllegalArgumentException();
83 }
84
85 this.position = position;
86 }
87
88 /**
89 * Constructor.
90 *
91 * @param source radio source associated to this reading.
92 * @param distance distance in meters to the radio source.
93 * @param rssi received signal strength indicator in dBm.
94 * @param position position where reading was made.
95 * @param distanceStandardDeviation standard deviation of distance, if available.
96 * @param rssiStandardDeviation standard deviation of RSSI, if available.
97 * @throws IllegalArgumentException if radio source data is null, distance is negative,
98 * position is null or any of the standard deviations is zero or negative.
99 */
100 public RangingAndRssiReadingLocated(
101 final S source, final double distance, final double rssi, final P position,
102 final Double distanceStandardDeviation, final Double rssiStandardDeviation) {
103 super(source, distance, rssi, distanceStandardDeviation, rssiStandardDeviation);
104
105 if (position == null) {
106 throw new IllegalArgumentException();
107 }
108
109 this.position = position;
110 }
111
112 /**
113 * Constructor.
114 *
115 * @param source radio source associated to this reading.
116 * @param distance distance in meters to the radio source.
117 * @param rssi received signal strength indicator in dBm.
118 * @param position position where reading was made.
119 * @param distanceStandardDeviation standard deviation of distance, if available.
120 * @param rssiStandardDeviation standard deviation of RSSI, if available.
121 * @param numAttemptedMeasurements number of attempted measurements used in the RTT exchange.
122 * @param numSuccessfulMeasurements number of successful measurements used to calculate the
123 * distance and standard deviation.
124 * @throws IllegalArgumentException if radio source data is null, distance is negative,
125 * position is null, any of the standard deviations is zero or negative, number of
126 * attempted measures is less than 1 or number of successful measures is negative.
127 */
128 public RangingAndRssiReadingLocated(
129 final S source, final double distance, final double rssi, final P position,
130 final Double distanceStandardDeviation, final Double rssiStandardDeviation,
131 final int numAttemptedMeasurements, final int numSuccessfulMeasurements) {
132 super(source, distance, rssi, distanceStandardDeviation, rssiStandardDeviation, numAttemptedMeasurements,
133 numSuccessfulMeasurements);
134
135 if (position == null) {
136 throw new IllegalArgumentException();
137 }
138
139 this.position = position;
140 }
141
142 /**
143 * Constructor.
144 *
145 * @param source radio source associated to this reading.
146 * @param distance distance in meters to the radio source.
147 * @param rssi received signal strength indicator in dBm.
148 * @param position position where reading was made.
149 * @param positionCovariance covariance of inhomogeneous coordinates of
150 * current position (if available).
151 * @throws IllegalArgumentException if radio source data is null, distance is negative
152 * position is null or position covariance has wrong size.
153 */
154 public RangingAndRssiReadingLocated(
155 final S source, final double distance, final double rssi, final P position,
156 final Matrix positionCovariance) {
157 this(source, distance, rssi, position);
158
159 if (positionCovariance != null) {
160 final var dims = position.getDimensions();
161 if (positionCovariance.getRows() != dims || positionCovariance.getColumns() != dims) {
162 throw new IllegalArgumentException();
163 }
164 }
165 this.positionCovariance = positionCovariance;
166 }
167
168 /**
169 * Constructor.
170 *
171 * @param source radio source associated to this reading.
172 * @param distance distance in meters to the radio source.
173 * @param rssi received signal strength indicator in dBm.
174 * @param position position where reading was made.
175 * @param positionCovariance covariance of inhomogeneous coordinates of
176 * current position (if available).
177 * @param numAttemptedMeasurements number of attempted measurements used in the RTT exchange.
178 * @param numSuccessfulMeasurements number of successful measurements used to calculate the
179 * distance and standard deviation.
180 * @throws IllegalArgumentException if radio source data is null, distance is negative,
181 * position is null, position covariance has wrong size, number of attempted
182 * measures is less than 1 or number of successful measures is negative.
183 */
184 public RangingAndRssiReadingLocated(
185 final S source, final double distance, final double rssi, final P position, final Matrix positionCovariance,
186 final int numAttemptedMeasurements, final int numSuccessfulMeasurements) {
187 this(source, distance, rssi, position, numAttemptedMeasurements, numSuccessfulMeasurements);
188
189 if (positionCovariance != null) {
190 final var dims = position.getDimensions();
191 if (positionCovariance.getRows() != dims || positionCovariance.getColumns() != dims) {
192 throw new IllegalArgumentException();
193 }
194 }
195 this.positionCovariance = positionCovariance;
196 }
197
198 /**
199 * Constructor.
200 *
201 * @param source radio source associated to this reading.
202 * @param distance distance in meters to the radio source.
203 * @param rssi received signal strength indicator in dBm.
204 * @param position position where reading was made.
205 * @param distanceStandardDeviation standard deviation of distance, if available.
206 * @param rssiStandardDeviation standard deviation of RSSI value.
207 * @param positionCovariance covariance of inhomogeneous coordinates of
208 * current position (if available).
209 * @throws IllegalArgumentException if radio source data is null, distance is negative,
210 * position is null or standard deviation is zero or negative.
211 */
212 public RangingAndRssiReadingLocated(
213 final S source, final double distance, final double rssi, final P position,
214 final Double distanceStandardDeviation, final Double rssiStandardDeviation,
215 final Matrix positionCovariance) {
216 this(source, distance, rssi, position, distanceStandardDeviation, rssiStandardDeviation);
217
218 if (positionCovariance != null) {
219 final var dims = position.getDimensions();
220 if (positionCovariance.getRows() != dims || positionCovariance.getColumns() != dims) {
221 throw new IllegalArgumentException();
222 }
223 }
224 this.positionCovariance = positionCovariance;
225 }
226
227 /**
228 * Constructor.
229 *
230 * @param source radio source associated to this reading.
231 * @param distance distance in meters to the radio source.
232 * @param rssi received signal strength indicator in dBm.
233 * @param position position where reading was made.
234 * @param distanceStandardDeviation standard deviation of distance, if available.
235 * @param rssiStandardDeviation standard deviation of RSSI value.
236 * @param positionCovariance covariance of inhomogeneous coordinates of
237 * current position (if available).
238 * @param numAttemptedMeasurements number of attempted measurements used in the RTT exchange.
239 * @param numSuccessfulMeasurements number of successful measurements used to calculate the
240 * distance and standard deviation.
241 * @throws IllegalArgumentException if radio source data is null, distance is negative,
242 * position is null, any of the standard deviations is zero or negative,
243 * position covariance has wrong size, number of attempted
244 * measures is less than 1 or number of successful measures is negative.
245 */
246 public RangingAndRssiReadingLocated(
247 final S source, final double distance, final double rssi, final P position,
248 final Double distanceStandardDeviation, final Double rssiStandardDeviation, final Matrix positionCovariance,
249 final int numAttemptedMeasurements, final int numSuccessfulMeasurements) {
250 this(source, distance, rssi, position, distanceStandardDeviation, rssiStandardDeviation,
251 numAttemptedMeasurements, numSuccessfulMeasurements);
252
253 if (positionCovariance != null) {
254 final var dims = position.getDimensions();
255 if (positionCovariance.getRows() != dims || positionCovariance.getColumns() != dims) {
256 throw new IllegalArgumentException();
257 }
258 }
259 this.positionCovariance = positionCovariance;
260 }
261
262 /**
263 * Empty constructor.
264 */
265 protected RangingAndRssiReadingLocated() {
266 super();
267 }
268
269 /**
270 * Gets position where reading was made.
271 *
272 * @return position where reading was made.
273 */
274 public P getPosition() {
275 return position;
276 }
277
278 /**
279 * Gets covariance of inhomogeneous coordinates of current position (if available).
280 *
281 * @return covariance of position or null.
282 */
283 public Matrix getPositionCovariance() {
284 return positionCovariance;
285 }
286 }