1
0
mirror of https://github.com/kepler155c/opus synced 2025-01-03 20:30:28 +00:00

GPS ambiguous position fix

This commit is contained in:
xAnavrins 2019-07-27 00:13:24 -04:00
parent b3efbc7438
commit c1430f6dac
2 changed files with 64 additions and 43 deletions

View File

@ -1,3 +1,5 @@
local Util = require('opus.util')
local GPS = { }
local device = _G.device
@ -89,19 +91,17 @@ end
-- end stock gps api
function GPS.trilaterate(tFixes)
local pos1, pos2 = trilaterate(tFixes[1], tFixes[2], tFixes[3])
local attemps = 0
for tFixes in Util.permutation(tFixes) do
attemps = attemps + 1
local pos1, pos2 = trilaterate(tFixes[4], tFixes[3], tFixes[2])
if pos2 then
pos1, pos2 = narrow(pos1, pos2, tFixes[4])
pos1, pos2 = narrow(pos1, pos2, tFixes[1])
end
if not pos2 then
return pos1, attemps
end
if pos1 and pos2 then
print("Ambiguous position")
print("Could be "..pos1.x..","..pos1.y..","..pos1.z.." or "..pos2.x..","..pos2.y..","..pos2.z )
return
end
return pos1
end
return GPS

View File

@ -799,4 +799,25 @@ function Util.getOptions(options, args, ignoreInvalid)
return true, Util.size(rawOptions)
end
-- https://www.lua.org/pil/9.3.html
function Util.permutation(tbl)
local function permgen(a, n)
if n == 0 then
coroutine.yield(a)
else
for i=1,n do
a[n], a[i] = a[i], a[n]
permgen(a, n - 1)
a[n], a[i] = a[i], a[n]
end
end
end
local co = coroutine.create(function() permgen(tbl, #tbl) end)
return function()
local _, res = coroutine.resume(co)
return res
end
end
return Util