Indoor location based on iBeacon - ios

I want to locate an object position inside a house( one floor).
The object will have a iBeacon on it.
What are the best approach.
With api, i can get distance from the iBeacon, but this doesn't reflect position.
One idea was to have 4 fixed iBeacon on the floor, but seem's i can't get the distance from the moving iBeacon to a fixed.
Any idea?

iBeacon isn't the right technology for this - at least not with a single receiver.
iBeacon only gives you an approximate distance. If you have multiple beacons in known locations then you can try and triangulate the receiver's position but you can't use this information to determine the location of another transmitter in an unknown location - only estimate its distance from the receiver.
Even using known, fixed transmitters it is difficult to locate the receiver with any accuracy due to the nature of the Bluetooth signals.
If you had multiple iBeacon receivers on the floor at known locations then it might be possible to determine the location of the transmitter.

Related

iOS range to detect beacons with predefined proximity UDID

I am working on app which used to detect beacons in iOS device using objective c. I have successfully done the scanning of beacons using core bluetooth and core location framework i.e did range beacons which provides an array of scanned beacons.
Case - I have to discard beacon scanned which are of distance more than 10 meters. So I have used RSSI value for that and calculated distance using formula and not considering beacons above that distance.
Problem - did range beacon is not providing the beacons distance more than 5-6 meters sometimes it provide around 8 meter beacon also.
Question - is there any specific range after that iOS discard the scanned beacons automatically?
It is not unusual for mobile devices to not be able to detect beacons beyond 8-10 meters. This has nothing to do with the operating system and is caused by the radio signal level falling below the noise floor as detected by the receiver.
The maximum distance a beacon can be detected is typically 40-50 meters in ideal clear line of sight conditions, but this also relies on the bluetooth transmitter being set to the maximum radio signal level allowed by international regulations, and the transmitter's antenna being directed generally toward the receiver.
It also relies on the receiving mobile device having it's antenna oriented toward the beacon transmitter and not blocked by a case or other radio obstruction.
Typically conditions you describe are caused by a beacon transmitting a signal far weaker than allowed by law. This may be adjusted on some models. Check the instructions from the beacon manufacturer.
Some mobile device.models have poor Bluetooth receiver antennas, although Apple devices are generally good. (Huawei Android devices are notoriously poor receivers.). If in doubt, try another device.

Determining Distance and Direction of iDevice from Beacon

I am developing an iOS application in which I need to know the exact distance and direction of the device from the beacon. I am using Estimote beacon.
I have used iOS's CLLocation as well as Estimote's framework but both of them give an incorrect value for the distance. Moreover, the values fluctuate a lot, the beacon even goes into unknown state (accuracy -1.000) a lot of times.
I have also tried to use the formula given here:
Understanding ibeacon distancing
but in iOS, it seems there is no way to get the txPower or measured power of Beacon.
I have searched a lot but nowhere I found a satisfactory way to find the distance accurately.
is there any other way which can help me in finding accurately the distance and direction of iOS device from Beacon?
The distance is computed by comparing the received signal strength (RSSI) with the advertised transmitted power (txPower) of the beacon, as the signal strength in theory is inversely proportional to the square of the distance.
But there are lots of other things that can affect RSSI, including obstacles, orientation of the antennas, and possibly multi-path (reflections). So it's difficult to accurately measure distance based on this information.
Another way of measuring distance is using round-trip-time (RTT): you send something to the beacon, and you measure how long it takes to come back. But this requires a fixed response time, and on this sort of scale (meters), there are probably enough variable delays here and there that it might severely affect the calculation.
Direction would require either triangulation or multiple directional antennas, I don't believe that's the case in this scenario.
In short, you can get a rough idea of the distance (which is why it's good for proximity alerts), but accurate distance or direction would require different technologies.
Why do you need them? There may be alternatives based on your specific scenario.
EDIT
If you have a large number of beacons around, and you know their exact positions, it might be possible to pull off the following:
use at least 3 beacon distances to compute your exact position by triangulation
from there, as you know the position of the beacons, you can compute the distance and direction of any of the beacons (or anything else, really)
Of course, depending on the actual accuracy of the beacon distance measurement provided by the SDK, the result might be more or less accurate. The more beacons you have, the more precise you should be able to get (by picking only those that return a distance, or by eliminating those that are not "compatible" with the others when computing solutions).
Even having 3 or more beacons with fixed positions, you still won't be able to receive very accurate positioning without some serious and complex noise reduction. That's because radio waves are prone to being affected by diffraction, multipath propagation, interference and absorption - mostly by metal objects and water particles (therefore human bodies are strong signal blockers). Even phone's alignment (antenna position) can have a significant impact on the proximity readings. Therefore, without implementing alorithms for noise reduction, trilateration can give you accuracy of about 5 meters.
You can find some examples in Obj-C (https://github.com/MatVre/MiBeaconTrilaterationDemo) and Swift (https://github.com/a34729t/TriangulatorSwift) and check how they work for you.
Cheers.

How to show an iBeacon in a map

Once an app finds a beacon is possible to show both in a map (the device that found the beacon and the beacon itself)? If so how can i do that? I tried work with the distance bit with no success so far.
Unfortunately, you can't just find the exact location of an iBeacon once it's detected. You can only estimate its distance away from the device.
The proximity property tells you the relative distance (far, immediate, or close) that the beacon is away from the device while the accuracy property tells you how accurate that value is; so you can use proximity in combination with accuracy to get a general approximation of the distance. You could also potentially use these properties in combination with the RSSI, i.e. the received signal strength of the beacon, to further approximate the relative distance.
The device on the other hand can be mapped easily by turning on the map's showsUserLocation property.
I suppose your map is a MKMapView. If you know the precise location of the beacon (by having use a GPS to get the coordinates of the beacon when you have installed it) you can add an annotation on your MKMapView.
Take a look at MKMapView - (void)addAnnotation:(id < MKAnnotation >)annotation method for that.
If you don't have a database where to fetch the GPS coordinates of your beacons, there is no way to display them on a map as a beacon knows nothing about its surroundings.
By the way the accuracy property of a CLBeacon object isn't reliable enough for positioning.

Location with iBeacon

I am using an iBeacon, and using triangulation and trilateration (or something similar), want to be able to locate an exact (or fairly accurate) distance between the iBeacon and user's device (in feet/metres/e.t.c). What is the best way to do this, and how would I do this?
I forgot to mention: I understand that it is possible to find proximity (i.e near, immediate, far, etc.), however as mentioned, ideally I am looking to find an accurate distance (maybe by combining RSSI, accuracy, and proximity values).
For this you should use RSSI (Received Signal Strength Indication) of an iBeacon. The signal strength determines how close or far it is from you. But the problem is that:
Every beacon's RSSI might differ distance, accuracy.
If beacon is behind the wall or any static obstacle the RSSI-Distance-Ratio will not work.
Therefore instead of Triangulation or Trilateration you should go for Fingerprinting. This will work better then rest of the techniques.
Place obstacles all around you.
Make reference points on your map.
Calibrate your app with that location i.e. Get the signal strengths from atleast 3 nearest iBeacons and save it against that reference points.
Do this for all other reference points.
(If you can) Do this twice or thrice and take average and store in database.
Now you have laid map of calibrated reference points. (This will handle all different RSSI-DIstance-Ratios of all the beacons)
Now whenever you are at any position compare it with the nearest point and you will get to know the closest location of your reference point.
If you are using google maps, the lat long they provide is upto six decimal place i.e. 0.11 meters which i think is preety much accurate in a room as well.
I guess this helps :)
Please mark this the right answer if it works.
In iOS the Core Location beacon information you get when you range a beacon includes both a "proximity" value (far/near/immediate) and an "accuracy" reading, which is actually approximate distance, in meters.
In order for the distance reading to be as accurate as possible, you should really calibrate your beacons. To do that, you put the beacon exactly 1 meter from the receiver and take a reading. The receiver gives you a "measured power" reading, which you then set on the transmitter. The measured power reading is used in calculating the distance reading.
Distance readings are very approximate, and are subject to interference from the surroundings.
The Apple sample app "AirLocate" shows working code for calibrating a beacon, and I believe it also displays

Getting BLE peripherals to communicate with each other

I'm wanting to know if what I want to do is even possible and if there is a good practise that I should follow.
For my experiment I have a collection bluetooth low energy beacons laid on the ground with each projecting out their own BLE signal. Each of these signals is getting read in by a fourth device that takes the corresponding RSSI value and uses it to determine it's position within the area.
Following this I now want each of my beacons that are laid on the ground to know the distances that separate them from each other. So my questions are as follows:
Is it possible to have the beacons on the ground broadcast different signals using two different UUID values?
Can a beacons both read and broadcast a signal at the same time? By that I mean the beacons will still be sending out their initial signal being read in by my fourth device whilst also reading in the distance value from their fellow broadcasting beacons on the ground.
I'm not sure if I've done a good job at describing what it is I'm wanting so I've (terribly) drew a picture in order to show what I want do and describe what I've got so far.
Key:
Black dots are my beacons on the floor
Green dot is my reader that finds its distance from the floor beacons. On the green dot is another app that is projecting out a BLE signal which the floor beacons are reading.
Purple line is the BLE signal being sent out from my reader device.
Yellow line is the RSSI value showing the beacons distance from the BLE signal being projected
Blue line (this is the key to this post) is meant to represent the beacons projecting and reading their own BLE signal so they can find their distance from each other.
Green line is then each beacon sending its distance from the other beacons to the reader.
At this point Bluetooth Smart-only devices currently do not support simultaneous peripheral/central mode.
What I would suggest is using the nRF51922 which supports concurrent BLE/ANT.
ANT is fully capable of doing this functionality for you as it supports all kinds of topologies, and you can relay your final information over BLE, or go with an nRF51422 and stay ANT only, I believe all latest Sony and Samsung devices support ANT anyway so it might be enough for you.
You can read more about it at http://www.thisisant.com

Resources