indoor-positioning-system http://www.e-learn.cn/tag/indoor-positioning-system zh-hans Multiliteration implementation with inaccurate distance data http://www.e-learn.cn/topic/4066244 <span>Multiliteration implementation with inaccurate distance data</span> <span><span lang="" about="/user/227" typeof="schema:Person" property="schema:name" datatype="">烂漫一生</span></span> <span>2021-02-07 10:20:36</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>I am trying to create an android smartphone application which uses Apples iBeacon technology to determine the current indoor location of itself. I already managed to get all available beacons and calculate the distance to them via the rssi signal. </p> <p>Currently I face the problem, that I am not able to find any library or implementation of an algorithm, which calculates the estimated location in 2D by using 3 (or more) distances of fixed points with the condition, that these distances are not accurate (which means, that the three "trilateration-circles" do not intersect in one point).</p> <p>I would be deeply grateful if anybody can post me a link or an implementation of that in any common programming language (Java, C++, Python, PHP, Javascript or whatever). I already read a lot on stackoverflow about that topic, but could not find any answer I were able to convert in code (only some mathematical approaches with matrices and inverting them, calculating with vectors or stuff like that).</p> <p><strong>EDIT</strong></p> <p>I thought about an own approach, which works quite well for me, but is not that efficient and scientific. I iterate over every meter (or like in my example 0.1 meter) of the location grid and calculate the possibility of that location to be the actual position of the handset by comparing the distance of that location to all beacons and the distance I calculate with the received rssi signal. </p> <p>Code example:</p> <pre><code>public Location trilaterate(ArrayList&lt;Beacon&gt; beacons, double maxX, double maxY) { for (double x = 0; x &lt;= maxX; x += .1) { for (double y = 0; y &lt;= maxY; y += .1) { double currentLocationProbability = 0; for (Beacon beacon : beacons) { // distance difference between calculated distance to beacon transmitter // (rssi-calculated distance) and current location: // |sqrt(dX^2 + dY^2) - distanceToTransmitter| double distanceDifference = Math .abs(Math.sqrt(Math.pow(beacon.getLocation().x - x, 2) + Math.pow(beacon.getLocation().y - y, 2)) - beacon.getCurrentDistanceToTransmitter()); // weight the distance difference with the beacon calculated rssi-distance. The // smaller the calculated rssi-distance is, the more the distance difference // will be weighted (it is assumed, that nearer beacons measure the distance // more accurate) distanceDifference /= Math.pow(beacon.getCurrentDistanceToTransmitter(), 0.9); // sum up all weighted distance differences for every beacon in // "currentLocationProbability" currentLocationProbability += distanceDifference; } addToLocationMap(currentLocationProbability, x, y); // the previous line is my approach, I create a Set of Locations with the 5 most probable locations in it to estimate the accuracy of the measurement afterwards. If that is not necessary, a simple variable assignment for the most probable location would do the job also } } Location bestLocation = getLocationSet().first().location; bestLocation.accuracy = calculateLocationAccuracy(); Log.w("TRILATERATION", "Location " + bestLocation + " best with accuracy " + bestLocation.accuracy); return bestLocation; } </code></pre> <p>Of course, the downside of that is, that I have on a 300m² floor 30.000 locations I had to iterate over and measure the distance to every single beacon I got a signal from (if that would be 5, I do 150.000 calculations only for determine a single location). That's a lot - so I will let the question open and hope for some further solutions or a good improvement of this existing solution in order to make it more efficient. </p> <p>Of course it has not to be a Trilateration approach, like the original title of this question was, it is also good to have an algorithm which includes more than three beacons for the location determination (Multilateration).</p> <br /><h3>回答1:</h3><br /><p>If the current approach is fine except for being too slow, then you could speed it up by recursively subdividing the plane. This works sort of like finding nearest neighbors in a kd-tree. Suppose that we are given an axis-aligned box and wish to find the approximate best solution in the box. If the box is small enough, then return the center.</p> <p>Otherwise, divide the box in half, either by x or by y depending on which side is longer. For both halves, compute a bound on the solution quality as follows. Since the objective function is additive, sum lower bounds for each beacon. The lower bound for a beacon is the distance of the circle to the box, times the scaling factor. Recursively find the best solution in the child with the lower lower bound. Examine the other child only if the best solution in the first child is worse than the other child's lower bound.</p> <p>Most of the implementation work here is the box-to-circle distance computation. Since the box is axis-aligned, we can use interval arithmetic to determine the precise range of distances from box points to the circle center.</p> <p><sub>P.S.: <code>Math.hypot</code> is a nice function for computing 2D Euclidean distances.</sub></p> <br /><br /><br /><h3>回答2:</h3><br /><p>Instead of taking confidence levels of individual beacons into account, I would instead try to assign an overall confidence level for your result after you make the best guess you can with the available data. I don't think the only available metric (perceived power) is a good indication of accuracy. With poor geometry or a misbehaving beacon, you could be trusting poor data highly. It might make better sense to come up with an overall confidence level based on how well the perceived distance to the beacons line up with the calculated point assuming you trust all beacons equally. </p> <p>I wrote some Python below that comes up with a best guess based on the provided data in the 3-beacon case by calculating the two points of intersection of circles for the first two beacons and then choosing the point that best matches the third. It's meant to get started on the problem and is not a final solution. If beacons don't intersect, it slightly increases the radius of each up until they do meet or a threshold is met. Likewise, it makes sure the third beacon agrees within a settable threshold. For n-beacons, I would pick 3 or 4 of the strongest signals and use those. There are tons of optimizations that could be done and I think this is a trial-by-fire problem due to the unwieldy nature of beaconing.</p> <pre class="lang-py prettyprint-override"><code>import math beacons = [[0.0,0.0,7.0],[0.0,10.0,7.0],[10.0,5.0,16.0]] # x, y, radius def point_dist(x1,y1,x2,y2): x = x2-x1 y = y2-y1 return math.sqrt((x*x)+(y*y)) # determines two points of intersection for two circles [x,y,radius] # returns None if the circles do not intersect def circle_intersection(beacon1,beacon2): r1 = beacon1[2] r2 = beacon2[2] dist = point_dist(beacon1[0],beacon1[1],beacon2[0],beacon2[1]) heron_root = (dist+r1+r2)*(-dist+r1+r2)*(dist-r1+r2)*(dist+r1-r2) if ( heron_root &gt; 0 ): heron = 0.25*math.sqrt(heron_root) xbase = (0.5)*(beacon1[0]+beacon2[0]) + (0.5)*(beacon2[0]-beacon1[0])*(r1*r1-r2*r2)/(dist*dist) xdiff = 2*(beacon2[1]-beacon1[1])*heron/(dist*dist) ybase = (0.5)*(beacon1[1]+beacon2[1]) + (0.5)*(beacon2[1]-beacon1[1])*(r1*r1-r2*r2)/(dist*dist) ydiff = 2*(beacon2[0]-beacon1[0])*heron/(dist*dist) return (xbase+xdiff,ybase-ydiff),(xbase-xdiff,ybase+ydiff) else: # no intersection, need to pseudo-increase beacon power and try again return None # find the two points of intersection between beacon0 and beacon1 # will use beacon2 to determine the better of the two points failing = True power_increases = 0 while failing and power_increases &lt; 10: res = circle_intersection(beacons[0],beacons[1]) if ( res ): intersection = res else: beacons[0][2] *= 1.001 beacons[1][2] *= 1.001 power_increases += 1 continue failing = False # make sure the best fit is within x% (10% of the total distance from the 3rd beacon in this case) # otherwise the results are too far off THRESHOLD = 0.1 if failing: print 'Bad Beacon Data (Beacon0 &amp; Beacon1 don\'t intersection after many "power increases")' else: # finding best point between beacon1 and beacon2 dist1 = point_dist(beacons[2][0],beacons[2][1],intersection[0][0],intersection[0][1]) dist2 = point_dist(beacons[2][0],beacons[2][1],intersection[1][0],intersection[1][1]) if ( math.fabs(dist1-beacons[2][2]) &lt; math.fabs(dist2-beacons[2][2]) ): best_point = intersection[0] best_dist = dist1 else: best_point = intersection[1] best_dist = dist2 best_dist_diff = math.fabs(best_dist-beacons[2][2]) if best_dist_diff &lt; THRESHOLD*best_dist: print best_point else: print 'Bad Beacon Data (Beacon2 distance to best point not within threshold)' </code></pre> <p>If you want to trust closer beacons more, you may want to calculate the intersection points between the two closest beacons and then use the farther beacon to tie-break. Keep in mind that almost anything you do with "confidence levels" for the individual measurements will be a hack at best. Since you will always be working with very bad data, you will defintiely need to loosen up the power_increases limit and threshold percentage.</p> <br /><br /><br /><h3>回答3:</h3><br /><p>You have 3 points : A(xA,yA,zA), B(xB,yB,zB) and C(xC,yC,zC), which respectively are approximately at dA, dB and dC from you goal point G(xG,yG,zG). Let's say cA, cB and cC are the confidence rate ( 0 &lt; cX &lt;= 1 ) of each point. Basically, you might take something really close to 1, like {0.95,0.97,0.99}. If you don't know, try different coefficient depending of distance avg. If distance is really big, you're likely to be not very confident about it.</p> <p>Here is the way i'll do it :</p> <pre><code>var sum = (cA*dA) + (cB*dB) + (cC*dC); dA = cA*dA/sum; dB = cB*dB/sum; dC = cC*dC/sum; xG = (xA*dA) + (xB*dB) + (xC*dC); yG = (yA*dA) + (yB*dB) + (yC*dC); xG = (zA*dA) + (zB*dB) + (zC*dC); </code></pre> <p>Basic, and not really smart but will do the job for some simple tasks.</p> <p><strong>EDIT</strong></p> <p>You can take any confidence coef you want in [0,inf[, but IMHO, restraining at [0,1] is a good idea to keep a realistic result.</p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/25852053/multiliteration-implementation-with-inaccurate-distance-data</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/algorithm" hreflang="zh-hans">algorithm</a></div> <div class="field--item"><a href="/tag/localization" hreflang="zh-hans">localization</a></div> <div class="field--item"><a href="/tag/ibeacon" hreflang="zh-hans">ibeacon</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> <div class="field--item"><a href="/tag/trilateration" hreflang="zh-hans">trilateration</a></div> </div> </div> Sun, 07 Feb 2021 02:20:36 +0000 烂漫一生 4066244 at http://www.e-learn.cn I want to make an indoor map. how can i accomplish a real map /webview like scrolling in it? http://www.e-learn.cn/topic/4034419 <span>I want to make an indoor map. how can i accomplish a real map /webview like scrolling in it?</span> <span><span lang="" about="/user/191" typeof="schema:Person" property="schema:name" datatype="">末鹿安然</span></span> <span>2021-01-29 06:00:33</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>I am trying to make an indoor map of a hospital , when i click on certain buildings it would open their respective indoor maps and when i select a certain area of their respective floor it would show me further details.How can I achieve this?</p> <p>Any suggestions would be appreciated. </p> <p>P.S I have tried using image view but i can't get the image to scroll freely like a real map or a webview (pinch zoom in/zoom out ,rotation etc).</p> <br /><h3>回答1:</h3><br /><p>As you wanted your "floor" to have the behavior of a map you should have look for custom map implementations.</p> <p>Then you may have found that you can use your own Tile Overlay using a Custom Map Tile Provider as described in Using custom map tiles with Google Map API V2 for Android?</p> <p>Or if you don't want to use Google, you can look at Open Street Map Android SDK</p> <p>Ether way you are still responsible for the graphical assets of tile layers. As well as any UI/UX leading to the custom map view.</p> <p>Alternatively there are third-party libraries for 'deep zoom' of an image which may provide the expected touch behavior like: https://github.com/davemorrissey/subsampling-scale-image-view</p> <br /><br /><br /><h3>回答2:</h3><br /><p>You can have rooms as scolling views, with a background view image and buttons where you want to click. Clicking the buttons opens a popup with an image. You can also place transparent buttons on the buildings to have a natural feeling of click to open.</p> <p>From your question it seems that you don't want to use web view, but you can code a regular html page/web app and use a web view to display it. That way, you only have a screen with a web view to deal with.</p> <p>Then the possibilities are endless and fun and shifts in the web domain!</p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/57377660/i-want-to-make-an-indoor-map-how-can-i-accomplish-a-real-map-webview-like-scro</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/android" hreflang="zh-hans">android</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> </div> </div> Thu, 28 Jan 2021 22:00:33 +0000 末鹿安然 4034419 at http://www.e-learn.cn Determine if current location is inside or outside building with IndoorAtlas http://www.e-learn.cn/topic/3224758 <span>Determine if current location is inside or outside building with IndoorAtlas</span> <span><span lang="" about="/user/144" typeof="schema:Person" property="schema:name" datatype="">核能气质少年</span></span> <span>2020-01-15 08:00:47</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>I'm using indoorAtlas SDK. I already succed to show current location and floorplan using indoorAtlas. But it has some weird result. </p> <p>If i'm inside building that i listed the floorplanid and venue id, it gives the correct current location. But when i'm outside that building and i'm trying to locate current location it gives the result in the floorplan map but it gives some random location.</p> <p>Is there any way to give some notification or action that i'm outside in area that i'm listed floorplanid and venueid ?</p> <br /><h3>回答1:</h3><br /><p>In current SDK there is nothing that would give you straight answer to your question. I'd say that your best tools at the moment are the getUncertainty() -method in returned location update (ServiceState -class) combined with platform locations. Experiment with uncertainty value (radius in meters) to see when it would be best to start trusting platform locations over IndoorAtlas's indoor locations and to conclude that user has exited the building. In a more advanced version, when moving towards the edges of your floor plan (or better yet towards the exits) you could be more sure that transition (in-&gt;out, out-&gt;in) is likely to take place. </p> <p>You could also combine this logic with geofences (http://developer.android.com/reference/com/google/android/gms/location/GeofencingApi.html) in one or more ways. E.g. use geofence as an indication that IndoorAtlas services should be turned on as user may enter a building and when entered, dynamically create a larger geofence as a safeguard to help your algorithm to detect that user has exited building and IndoorAtlas service can be turned off. </p> <p>Hope this helps to find your solution. </p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/30419995/determine-if-current-location-is-inside-or-outside-building-with-indooratlas</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/android" hreflang="zh-hans">android</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> </div> </div> Wed, 15 Jan 2020 00:00:47 +0000 核能气质少年 3224758 at http://www.e-learn.cn UUIDs of iBeacons are different on different devices http://www.e-learn.cn/topic/2777932 <span>UUIDs of iBeacons are different on different devices</span> <span><span lang="" about="/user/70" typeof="schema:Person" property="schema:name" datatype="">蹲街弑〆低调</span></span> <span>2019-12-23 00:25:13</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>I'm developing an application that will use iBeacons for indoor navigation, and I found that the rate the function <code>locationManager:rangingBeaconsDidFailForRegion:withError:</code> is being called is not high enough, so I'm going to add the RSSI data from CoreBluetooth's <code>centralManager:didDiscoverPeripheral:advertisementData:RSSI:</code>.</p> <p>And I found a curious fact: when I listen to the iBeacon with CoreLocation and log the peripheral id:</p> <pre><code>- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { NSLog(@"%@, RSSI: %@", peripheral, RSSI); </code></pre> <p>each beacon is reported with different UUID on different devices:</p> <pre><code>A25804BD-D77A-5004-4C2C-301D996C7367 - my iPhone 5 843F4237-6059-9A5E-AA34-0BD92304BE1F - colleague's iPhone 5 77685805-C253-52BD-B787-8B95308834FB - other colleague's iPad mini </code></pre> <p>The idea was to bind UUID of each beacon to its location, so this behavior is quite functionality-breaking.</p> <p>Why the UUID of physically the same beacon (not powered off/on) is different on different devices? Is it an expected behavior? If it is, how could I opt out of it?</p> <br /><h3>回答1:</h3><br /><p>You cannot read the identifiers of standard iBeacons using <code>CoreBluetooth</code>. As Chris Stratton said in his comment, the UUID that CoreBluetooth gives you is a device UUID, which is randomly generated on a per-session basis by iOS. It has nothing to do with the iBeacon ProximityUUID.</p> <p>More details on why you can't read iBeacon identifiers with <code>CoreBluetooth</code> are here: http://developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html</p> <p>It is true that you only get on RSSI measurement per <code>locationManager:didRangeBeacons:inRegion:</code> callback. This is a real obstacle to doing a custom distance estimate. Behind the scenes, iOS can gather 10x as many measurements for iBeacons transmitting at 10Hz. You are correct that you can get more measurements using <code>CoreBluetooth</code>, but the problem is that there is no reliable way of lining up which bluetooth devices you see with <code>CoreBluetooth</code> correspond to the iBeacons you can see with <code>CoreLocation</code>. </p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/24265569/uuids-of-ibeacons-are-different-on-different-devices</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/ios" hreflang="zh-hans">ios</a></div> <div class="field--item"><a href="/tag/core-bluetooth" hreflang="zh-hans">core-bluetooth</a></div> <div class="field--item"><a href="/tag/ibeacon" hreflang="zh-hans">ibeacon</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> </div> </div> Sun, 22 Dec 2019 16:25:13 +0000 蹲街弑〆低调 2777932 at http://www.e-learn.cn Multi-point trilateration algorithm in Java http://www.e-learn.cn/topic/2719736 <span>Multi-point trilateration algorithm in Java</span> <span><span lang="" about="/user/179" typeof="schema:Person" property="schema:name" datatype="">不羁岁月</span></span> <span>2019-12-21 09:28:18</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>I'm trying to implement a trilateration algorithm into my Android app to determine a user's indoor location. I'm using ultra-wideband beacons to get the distances to fixed points. I was able to adapt the method suggested in Trilateration Method Android Java as follows:</p> <pre><code>public LatLng getLocationByTrilateration( LatLng location1, double distance1, LatLng location2, double distance2, LatLng location3, double distance3){ //DECLARE VARIABLES double[] P1 = new double[2]; double[] P2 = new double[2]; double[] P3 = new double[2]; double[] ex = new double[2]; double[] ey = new double[2]; double[] p3p1 = new double[2]; double jval = 0; double temp = 0; double ival = 0; double p3p1i = 0; double triptx; double tripty; double xval; double yval; double t1; double t2; double t3; double t; double exx; double d; double eyy; //TRANSALTE POINTS TO VECTORS //POINT 1 P1[0] = location1.latitude; P1[1] = location1.longitude; //POINT 2 P2[0] = location2.latitude; P2[1] = location2.longitude; //POINT 3 P3[0] = location3.latitude; P3[1] = location3.longitude; //TRANSFORM THE METERS VALUE FOR THE MAP UNIT //DISTANCE BETWEEN POINT 1 AND MY LOCATION distance1 = (distance1 / 100000); //DISTANCE BETWEEN POINT 2 AND MY LOCATION distance2 = (distance2 / 100000); //DISTANCE BETWEEN POINT 3 AND MY LOCATION distance3 = (distance3 / 100000); for (int i = 0; i &lt; P1.length; i++) { t1 = P2[i]; t2 = P1[i]; t = t1 - t2; temp += (t*t); } d = Math.sqrt(temp); for (int i = 0; i &lt; P1.length; i++) { t1 = P2[i]; t2 = P1[i]; exx = (t1 - t2)/(Math.sqrt(temp)); ex[i] = exx; } for (int i = 0; i &lt; P3.length; i++) { t1 = P3[i]; t2 = P1[i]; t3 = t1 - t2; p3p1[i] = t3; } for (int i = 0; i &lt; ex.length; i++) { t1 = ex[i]; t2 = p3p1[i]; ival += (t1*t2); } for (int i = 0; i &lt; P3.length; i++) { t1 = P3[i]; t2 = P1[i]; t3 = ex[i] * ival; t = t1 - t2 -t3; p3p1i += (t*t); } for (int i = 0; i &lt; P3.length; i++) { t1 = P3[i]; t2 = P1[i]; t3 = ex[i] * ival; eyy = (t1 - t2 - t3)/Math.sqrt(p3p1i); ey[i] = eyy; } for (int i = 0; i &lt; ey.length; i++) { t1 = ey[i]; t2 = p3p1[i]; jval += (t1*t2); } xval = (Math.pow(distance1, 2) - Math.pow(distance2, 2) + Math.pow(d, 2))/(2*d); yval = ((Math.pow(distance1, 2) - Math.pow(distance3, 2) + Math.pow(ival, 2) + Math.pow(jval, 2))/(2*jval)) - ((ival/jval)*xval); t1 = location1.latitude; t2 = ex[0] * xval; t3 = ey[0] * yval; triptx = t1 + t2 + t3; t1 = location1.longitude; t2 = ex[1] * xval; t3 = ey[1] * yval; tripty = t1 + t2 + t3; return new LatLng(triptx,tripty); } </code></pre> <p>Using this approach gives me a user location, but is not terribly accurate. How can I extend this to use more than 3 known locations/distances? Ideally N number of points where N&gt;=3.</p> <br /><h3>回答1:</h3><br /><p>When formulated in the correct manner, the multilateration problem is an optimization problem.</p> <p>Most scholarly examples, like the one on wikipedia, deal with exactly three circles and assume perfectly accurate information. These circumstances allow for much simpler problem formulations with exact answers, and are usually not satisfactory for practical situations like the one you describe.</p> <p>The problem in R<sup>2</sup> or R<sup>3</sup> euclidean space with distances that contain measurement error, an area (ellipse) or volume (ellipsoid) of interest is usually obtained instead of a point. If a point estimate is desired instead of a region, the area centroid or volume centroid should be used. R<sup>2</sup> space requires at least 3 non-degenerate points and distances to obtain a unique region; and similarly R<sup>3</sup> space requires at least 4 non-degenerate points and distances to obtain a unique region.</p> <p>Here is a open source java library that will easily meet your needs: https://github.com/lemmingapex/Trilateration</p> <p></p> <p>It uses a popular nonlinear least squares optimizer, the Levenberg-Marquardt algorithm, from Apache Commons Math.</p> <pre><code>double[][] positions = new double[][] { { 5.0, -6.0 }, { 13.0, -15.0 }, { 21.0, -3.0 }, { 12.42, -21.2 } }; double[] distances = new double[] { 8.06, 13.97, 23.32, 15.31 }; NonLinearLeastSquaresSolver solver = new NonLinearLeastSquaresSolver(new TrilaterationFunction(positions, distances), new LevenbergMarquardtOptimizer()); Optimum optimum = solver.solve(); // the answer double[] calculatedPosition = optimum.getPoint().toArray(); // error and geometry information RealVector standardDeviation = optimum.getSigma(0); RealMatrix covarianceMatrix = optimum.getCovariances(0); </code></pre> <br /><br /><br /><h3>回答2:</h3><br /><p>I found this solution in an e-book;</p> <p>https://books.google.co.uk/books?id=Ki2DMaeeHpUC&amp;pg=PA78</p> <p>I coded this into a Java example and it seems to work pretty well for 3 circles. However, I have no idea how to adapt this formula to cover trilateration with a 4th and 5th point in the solution. My maths is just not that good.</p> <p>My code for the formula is here;</p> <pre><code>private void findCenter() { int top = 0; int bot = 0; for (int i=0; i&lt;3; i++) { Circle c = circles.get(i); Circle c2, c3; if (i==0) { c2 = circles.get(1); c3 = circles.get(2); } else if (i==1) { c2 = circles.get(0); c3 = circles.get(2); } else { c2 = circles.get(0); c3 = circles.get(1); } int d = c2.x - c3.x; int v1 = (c.x * c.x + c.y * c.y) - (c.r * c.r); top += d*v1; int v2 = c.y * d; bot += v2; } int y = top / (2*bot); Circle c1 = circles.get(0); Circle c2 = circles.get(1); top = c2.r*c2.r+c1.x*c1.x+c1.y*c1.y-c1.r*c1.r-c2.x*c2.x-c2.y*c2.y-2*(c1.y-c2.y)*y; bot = c1.x-c2.x; int x = top / (2*bot); imHere = new Circle(x,y,5); } </code></pre> <p></p><p></p><p></p><img class="b-lazy" data-src="https://www.eimg.top/images/2020/03/24/1245a90092121dbf4ab22f6375e413ad.png" data-original="https://www.eimg.top/images/2020/03/24/1245a90092121dbf4ab22f6375e413ad.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /><p></p><p></p> <p>I would ideally like a code solution that could work with 3+ nodes and also, where multiple points were used, would weight the solution more towards the point derived from nodes with small radius values.</p> <p>Anyone got any ideas?</p> <p>Either how to expand the book formula for 4+ nodes, or a better code implementation?</p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/30336278/multi-point-trilateration-algorithm-in-java</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/java" hreflang="zh-hans">java</a></div> <div class="field--item"><a href="/tag/android" hreflang="zh-hans">android</a></div> <div class="field--item"><a href="/tag/gps" hreflang="zh-hans">gps</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> <div class="field--item"><a href="/tag/trilateration" hreflang="zh-hans">trilateration</a></div> </div> </div> Sat, 21 Dec 2019 01:28:18 +0000 不羁岁月 2719736 at http://www.e-learn.cn How to improve accuracy of indoor positioning? http://www.e-learn.cn/topic/2601037 <span>How to improve accuracy of indoor positioning?</span> <span><span lang="" about="/user/238" typeof="schema:Person" property="schema:name" datatype="">一曲冷凌霜</span></span> <span>2019-12-18 10:30:27</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>I should be developing an indoor positioning system for some place , so I started by gathering info about how to develop such a system , the question I am up to now is : what controls the accuracy of positioning and how to improve it ? I found different APIs and projects with various accuracies , for example : ericsson indoor positioning API provides an accuracy within 10 meters , while Qubulus API provides an accuracy within 4 meters , and I met some projects like iDOCNET which claims to provide an accuracy of about 1.2 meters. So, what is the main component of the indoor navigating systems that controls the accuracy ?</p> <br /><h3>回答1:</h3><br /><p>I'm working on a similar project and I tested a couple of the existing tools.</p> <p>You can find some interesting info about IPS accuracy/precision/resolution here:</p> <p>Stackoverflow thread on IPS resolution</p> <p>Read the answer from Carol Politi of TRX Systems, in particular.</p> <p>In short, the precision depends mainly on the type and density of the radio beacons used as reference signals (that can be GSM/WDCMA/UMTS network cells, wi-fi access points, Bluetooth dongles/beacons, etc.). As a consequence, to improve your system's precision you have to use all of the existing/available radio sources (phone cells AND wi-fi access points) AND, maybe, you have to add/install your own reference points (most likely wi-fi routers). </p> <p>As long as I was able to see from my experiments so far, the actual precision you can expect from such radio-based systems is as following.</p> <ul><li>Phone network: 1 to 2 Km </li> <li>Wi-Fi: 10 to 150 m (most often 40 - 150 m) </li> <li>Bluetooth: 4 to 10 m (maybe better with Nokia technology, that uses BT 3.0 and special beacons)</li> </ul><p>Using different technologies together just gives you the precision of the best one. For example, when you use cell phones AND wi-fi access points as reference points, you just get a resolution of 10 to 150 m. Nothing better.</p> <p>For example/inspiration regarding wi-fi-fingerprint-based systems, look at: Redpin .</p> <p>The only way to get room-level resolution, using ONLY radio signals (radio multilateration), seems to be Bluetooth. Nokia has developed something for this.</p> <p>An effective way to improve the resolution of the whole system is to pair a radio-based positioning system (like wi-fi fingerprinting) with a map-based one (Google for "pathfinding": the same map navigation technology used in many 2D games).</p> <p>This way, you enforce your whole system to pinpoint your user just where he/she can actually be (in a aisle, inside a room), escluding the not-walkable areas (like the inner part of a wall or a not-accessible part of the building). This makes your calculated navigation path much more sensible but in long corridors and aisles the resolution can still be quite bad (5 to 10 m or worse).</p> <p>Another way is known as "sensor fusion": add to the radio-based system the position/movement knowledge that come from the accelerometer, compass and other sensors that are built-in in the user's mobile device.</p> <p>Such hybrid systems are already available on the market and can give you a resolution up to 2 - 4 m (room-level, aisle-level) WITHOUT installing any auxiliary radio beacon (such systems are also known as "infrastructureless indoor positioning systems"). A few of these systems use a pathfinding algorithm as well.</p> <p>For example/inspiration regarding hybrid systems, look at: Footpath .</p> <p>For an even more inspiring project, see UnLoc by Duke University: UnLoc at Gizmag and UnLoc at Duke .</p> <p>If you need an even better resolution, most likely you have to install your own Bluetooth beacons (and/or use Nokia technology).</p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/12098122/how-to-improve-accuracy-of-indoor-positioning</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/wifi" hreflang="zh-hans">wifi</a></div> <div class="field--item"><a href="/tag/trilateration" hreflang="zh-hans">trilateration</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> </div> </div> Wed, 18 Dec 2019 02:30:27 +0000 一曲冷凌霜 2601037 at http://www.e-learn.cn How to improve accuracy of indoor positioning? http://www.e-learn.cn/topic/2601021 <span>How to improve accuracy of indoor positioning?</span> <span><span lang="" about="/user/99" typeof="schema:Person" property="schema:name" datatype="">牧云@^-^@</span></span> <span>2019-12-18 10:30:05</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>I should be developing an indoor positioning system for some place , so I started by gathering info about how to develop such a system , the question I am up to now is : what controls the accuracy of positioning and how to improve it ? I found different APIs and projects with various accuracies , for example : ericsson indoor positioning API provides an accuracy within 10 meters , while Qubulus API provides an accuracy within 4 meters , and I met some projects like iDOCNET which claims to provide an accuracy of about 1.2 meters. So, what is the main component of the indoor navigating systems that controls the accuracy ?</p> <br /><h3>回答1:</h3><br /><p>I'm working on a similar project and I tested a couple of the existing tools.</p> <p>You can find some interesting info about IPS accuracy/precision/resolution here:</p> <p>Stackoverflow thread on IPS resolution</p> <p>Read the answer from Carol Politi of TRX Systems, in particular.</p> <p>In short, the precision depends mainly on the type and density of the radio beacons used as reference signals (that can be GSM/WDCMA/UMTS network cells, wi-fi access points, Bluetooth dongles/beacons, etc.). As a consequence, to improve your system's precision you have to use all of the existing/available radio sources (phone cells AND wi-fi access points) AND, maybe, you have to add/install your own reference points (most likely wi-fi routers). </p> <p>As long as I was able to see from my experiments so far, the actual precision you can expect from such radio-based systems is as following.</p> <ul><li>Phone network: 1 to 2 Km </li> <li>Wi-Fi: 10 to 150 m (most often 40 - 150 m) </li> <li>Bluetooth: 4 to 10 m (maybe better with Nokia technology, that uses BT 3.0 and special beacons)</li> </ul><p>Using different technologies together just gives you the precision of the best one. For example, when you use cell phones AND wi-fi access points as reference points, you just get a resolution of 10 to 150 m. Nothing better.</p> <p>For example/inspiration regarding wi-fi-fingerprint-based systems, look at: Redpin .</p> <p>The only way to get room-level resolution, using ONLY radio signals (radio multilateration), seems to be Bluetooth. Nokia has developed something for this.</p> <p>An effective way to improve the resolution of the whole system is to pair a radio-based positioning system (like wi-fi fingerprinting) with a map-based one (Google for "pathfinding": the same map navigation technology used in many 2D games).</p> <p>This way, you enforce your whole system to pinpoint your user just where he/she can actually be (in a aisle, inside a room), escluding the not-walkable areas (like the inner part of a wall or a not-accessible part of the building). This makes your calculated navigation path much more sensible but in long corridors and aisles the resolution can still be quite bad (5 to 10 m or worse).</p> <p>Another way is known as "sensor fusion": add to the radio-based system the position/movement knowledge that come from the accelerometer, compass and other sensors that are built-in in the user's mobile device.</p> <p>Such hybrid systems are already available on the market and can give you a resolution up to 2 - 4 m (room-level, aisle-level) WITHOUT installing any auxiliary radio beacon (such systems are also known as "infrastructureless indoor positioning systems"). A few of these systems use a pathfinding algorithm as well.</p> <p>For example/inspiration regarding hybrid systems, look at: Footpath .</p> <p>For an even more inspiring project, see UnLoc by Duke University: UnLoc at Gizmag and UnLoc at Duke .</p> <p>If you need an even better resolution, most likely you have to install your own Bluetooth beacons (and/or use Nokia technology).</p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/12098122/how-to-improve-accuracy-of-indoor-positioning</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/wifi" hreflang="zh-hans">wifi</a></div> <div class="field--item"><a href="/tag/trilateration" hreflang="zh-hans">trilateration</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> </div> </div> Wed, 18 Dec 2019 02:30:05 +0000 牧云@^-^@ 2601021 at http://www.e-learn.cn IndoorAtlas SDK 2.0: Using Picasso with custom ImageView http://www.e-learn.cn/topic/2325944 <span>IndoorAtlas SDK 2.0: Using Picasso with custom ImageView</span> <span><span lang="" about="/user/12" typeof="schema:Person" property="schema:name" datatype="">倖福魔咒の</span></span> <span>2019-12-12 02:24:31</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>So...., I want to use <strong>Picasso</strong> image loader library with an existing custom imageview class to load,resize,and rotate my image. The problem is I am unsuccessful with it as if I use this code: <strong>"Picasso.with(this).load(url).into(custom ImageView)"</strong>,it gives me an error and suggests <strong>"cast parameter to target"</strong>. After casting the parameter "custom imageview" to target, when I test the application it gives me error saying <strong>"custom imageview cannot be cast to target"</strong> in the Logcat. After this problem, I am using a different piece of code which contains <strong>"onBitmapLoaded"</strong> method which corresponds to the Picasso library's Target interface and I am successfully able to load,resize, and rotate the image,but as I am working on the development of an Indoor Positioning System, the blue dot is being displayed out of sight. The reason why it is being displayed out of sight/incorrectly is because the custom imageview is not being used with picasso to load and display the image. And here is the bit of code containing "onBitmapLoaded" method where I am not getting the result I want and it is also not correct, as after some moment the app crashes with this error <strong>"java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@1d21751f"</strong> and it refers to the line of code <strong>"super.onDraw(canvas)"</strong> in the custom ImageView class:</p> <pre><code>private IAFloorPlan mFloorPlan; private BlueDotView mImageView; private Target mLoadTarget; private void showFloorPlanImage(String filePath) { final String url = mFloorPlan.getUrl(); if (mLoadTarget == null) { mLoadTarget = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { Log.d(TAG, "onBitmap loaded with dimensions: " + bitmap.getWidth() + "x" + bitmap.getHeight()); mImageView.setImage(ImageSource.bitmap(bitmap)); mImageView.setRadius(mFloorPlan.getMetersToPixels() * dotRadius); //mImageView.setRotation(90); //setupGroundOverlay(floorPlan, bitmap); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { // N/A } @Override public void onBitmapFailed(Drawable placeHolderDraweble) { Toast.makeText(AutomaticFloorPlanLoader.this, "Failed to load bitmap", Toast.LENGTH_SHORT).show(); } }; } RequestCreator request = Picasso.with(this).load(url).rotate(90).resize(500,500); final int bitmapWidth = mFloorPlan.getBitmapWidth(); final int bitmapHeight = mFloorPlan.getBitmapHeight(); if (bitmapHeight &gt; MAX_DIMENSION) { request.resize(0, MAX_DIMENSION); } else if (bitmapWidth &gt; MAX_DIMENSION) { request.resize(MAX_DIMENSION, 0); } request.into(mLoadTarget); /*DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int screenWidth = displaymetrics.widthPixels; int screenHeight = displaymetrics.heightPixels; LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(screenWidth,screenHeight); mImageView.setLayoutParams(parms);*/ //Picasso.with(this).load(Uri.parse(mFloorPlan.getUrl())).into((Target) mImageView); Log.w(TAG, "showFloorPlanImage: " + filePath); /* mImageView.setRadius(mFloorPlan.getMetersToPixels() * dotRadius); mImageView.setImage(ImageSource.uri(filePath)); mImageView.setRotation(90);*/ } </code></pre> <p>Here is the result of the above code in my application: "http://i.imgur.com/kcSa2x1.png" </p> <pre><code>And here is the custom ImageView class: import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.util.AttributeSet; import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; public class BlueDotView extends SubsamplingScaleImageView { //private static final float RATIO = 4f / 3f; private float radius = 1.0f; private PointF dotCenter = null; public void setRadius(float radius) { this.radius = radius; } public void setDotCenter(PointF dotCenter) { this.dotCenter = dotCenter; } public BlueDotView(Context context) { this(context, null); } public BlueDotView(Context context, AttributeSet attr) { super(context, attr); initialise(); } private void initialise() { setWillNotDraw(false); setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_CENTER); } /*public BlueDotView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }*/ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (!isReady()) { return; } if (dotCenter != null) { PointF vPoint = sourceToViewCoord(dotCenter); //float scaledRadius = getScale() * radius; Paint paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.BLUE); canvas.drawCircle(vPoint.x, vPoint.y, 10, paint); } } } </code></pre> <p>I have tried setLinearLayout,displayMetrics, and the onMeasure method and failed to resize the image with all of them. </p> <p>So,overall my question is: <strong>how can I use Picasso with the custom ImageView class/the imageView itself to load,resize, and rotate the image and also displaying the blue dot correctly in this particular example?</strong></p> <p>Many thanks in advance if you can help me solve this problem.</p> <br /><h3>回答1:</h3><br /><p>The <code>BlueDotView</code> (here: https://github.com/IndoorAtlas/android-sdk-examples/blob/master/Basic/src/main/java/com/indooratlas/android/sdk/examples/imageview/BlueDotView.java) in IndoorAtlas's example extends <code>SubsamplingScaleImageView</code> by Dave Morissey (here: https://github.com/davemorrissey/subsampling-scale-image-view). <code>SubsamplingScaleImageView</code> does not extend <code>android.widget.ImageView</code> and hence you cannot use it directly as load target: <code>Picasso.with(this).load(url).into(mImageView)</code> but you need to use <code>Target</code> just as you did.</p> <p>What comes to <code>java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@1d21751f</code> this is because <code>SubsamplingScaleImageView</code> does not work out-of-the-box with most image loading libraries. Read more here: https://github.com/davemorrissey/subsampling-scale-image-view/wiki/X.-Using-with-Picasso. That link also explains the proper way of mixing <code>SubsamplingScaleImageView</code> with Picasso. The quick hack is to pass a copy of the <code>Bitmap</code> to image view:</p> <pre><code>@Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { mImageView.setImage(ImageSource.bitmap(bitmap.copy(bitmap.getConfig(), true)); } </code></pre> <p>This may be ok for small bitmaps that don't change often but is waste of resources for large bitmaps and can cause OOM exceptions.</p> <p>It looks like your are resizing your bitmap to 500x500 pixels. If your original floor plan bitmap was not square (?) you are changing aspect ratio and positioning blue dot correctly will fail. To set e.g. width of your bitmap to 500px and still maintain aspect ratio, use: <code>resize(500, 0)</code>.</p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/33708350/indooratlas-sdk-2-0-using-picasso-with-custom-imageview</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/java" hreflang="zh-hans">java</a></div> <div class="field--item"><a href="/tag/imageview" hreflang="zh-hans">imageview</a></div> <div class="field--item"><a href="/tag/android-custom-view" hreflang="zh-hans">android-custom-view</a></div> <div class="field--item"><a href="/tag/picasso" hreflang="zh-hans">picasso</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> </div> </div> Wed, 11 Dec 2019 18:24:31 +0000 倖福魔咒の 2325944 at http://www.e-learn.cn Current location in Offline Indoor Navigation in ios http://www.e-learn.cn/topic/1991183 <span>Current location in Offline Indoor Navigation in ios</span> <span><span lang="" about="/user/239" typeof="schema:Person" property="schema:name" datatype="">旧城冷巷雨未停</span></span> <span>2019-12-08 09:45:51</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>As a part of my ibeacon based ios application i have to find the current location of the user in my indoor map offline, I am using mapbox SDK for displaying my offline indoor map there is any way to calculate the user location with the help of near by beacons.Thanks in advance.</p> <br /><h3>回答1:</h3><br /><p><strong>Yes! You can use Radius Networks' NavigationKit framework</strong> to do offline indoor navigation. There is a reference app that shows you how to use it with an image-based map, but you can modify it to work with mapbox as well. Best of all, NavigationKit is free to use on deployments of up to 100 mobile devices. </p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/28863372/current-location-in-offline-indoor-navigation-in-ios</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/ios" hreflang="zh-hans">ios</a></div> <div class="field--item"><a href="/tag/ibeacon" hreflang="zh-hans">ibeacon</a></div> <div class="field--item"><a href="/tag/mapbox" hreflang="zh-hans">mapbox</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> </div> </div> Sun, 08 Dec 2019 01:45:51 +0000 旧城冷巷雨未停 1991183 at http://www.e-learn.cn How to map in real time using indoor beacons on Android http://www.e-learn.cn/topic/1965655 <span>How to map in real time using indoor beacons on Android</span> <span><span lang="" about="/user/39" typeof="schema:Person" property="schema:name" datatype=""> ̄綄美尐妖づ</span></span> <span>2019-12-08 04:28:32</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h3>问题</h3><br /><p>How to map in real time using indoor beacons on Android? Did tests using the SDK Estimote however, they do not have support for Android in indoor and do not have a method that returns the distance to the beacon. With that, I'm using Alt SDK that returns me the distance. But not her how to solve these doubts:</p> <p>1) create a map (2D or 3D Google Maps type) with the location map of the inside of a room or shop for example.</p> <p>2) show the location of the user's route to the beacon.</p> <p>3) how to deal with the route to the beacon avoiding collision enters walls on the map?</p> <p>4) how to locate the user's position in relation to beacons and know the position x, y or lat, long each beacon?</p> <p>5) I saw this project trilateration but not your using to address the above questions.</p> <p>6) need to use the GPS plus Bluetooth or just the Bluetooth solves?</p> <br /><h3>回答1:</h3><br /><p>I would recommend using one of the existing solutions, as this is a huge task that you're trying to achieve. I work for Proximi.io, that is a unified positioning platform. We provide beacon trilateration and showing your exact positioning on top of an indoor map based on that info. However, we don't have routing features. For that I would recommend checking out Steerpath, http://www.steerpath.com/. They specialize in beacon-based navigation, and deal with the wall issue.</p> <br /><br /><br /><h3>回答2:</h3><br /><p>Building an indoor navigation system is very complex. Beacon toolkits can tell you roughly how far you are from a stationary transmitter, but cannot tell you direction. It is just a tiny building block of a big system. A beacon is to an indoor navigation system as a brick is to a building.</p> <p>You have brought up several important requirements and there are many others, including:</p> <ul><li><p>Building a system to record beacon positions in a known coordinate frame, and send them to your app</p></li> <li><p>Transform beacon coordinate frame estimated positions to map coordinate frame for displaying a blue dot.</p></li> </ul><p>How to build such a system is simply beyond the scope of questions that can be answered properly on StackOverflow.</p> <br /><br /><p>来源:<code>https://stackoverflow.com/questions/38658217/how-to-map-in-real-time-using-indoor-beacons-on-android</code></p></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/android" hreflang="zh-hans">android</a></div> <div class="field--item"><a href="/tag/ibeacon-android" hreflang="zh-hans">ibeacon-android</a></div> <div class="field--item"><a href="/tag/indoor-positioning-system" hreflang="zh-hans">indoor-positioning-system</a></div> </div> </div> Sat, 07 Dec 2019 20:28:32 +0000  ̄綄美尐妖づ 1965655 at http://www.e-learn.cn