• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Zurückgelegte Distanz erhalten?? (Seit Start Cartridge)

cotwild

Geocacher
Hallo zusammen
Leider funktioniert die Such-Funktion hier bei mir irgendwie nicht (Iexplorer 64bit). Ich habe die ersten 10 Seiten dieses Forums durchgeackert und leider nirgends etwas passendes gefunden.
Ebenfalls in den LUA-Tutorials habe ich (bislang) nichts gefunden, was mir hilft.

Wie kann ich die seit dem Start zurückgelegte Strecke auslesen? Muss ich die Distanzen zu den Zonen manuell addieren oder gibt es da eine Funktion dafür, die dies sowieso aufzeichnet??

Besten Dank
cotwild
 

Krolock

Geocacher
ne Trackaufzeichnis gibt es nicht. Du müsstest schon die Distanzen manuell addieren.
Code:
  local d, b = Wherigo.VectorToPoint(aZone.OriginalPoint, anotherZone.OriginalPoint)
  local dm = d:GetValue"m"
aZone.OriginalPoint bezeichnet den Mittelpunkt der Zone (sofern der Builder - z.B Urwigo-) ihn korrekt berechnet. Vllt kann dir da bodenseepingu auch noch weitere Infos geben. Von seinem Code hab ich meine Abstandberechnungen herausgezogen.
 

AoiSora

Geocacher
Ja wie schon gesagt eine Trackaufzeichnung gibt es nicht.
Solang sich die Zonen nicht ändern, sondern einen festen Platz haben würde ich jedoch nicht mit extra LUA-Code rumhantieren. Da würde ich nur mal schnell in externen Programmen die jeweiligen Entfernungen notieren und im Programm addieren.
 
OP
C

cotwild

Geocacher
Besten Dank für Eure Antworten.

Gute Idee mit dem externen Addieren, leider ergeben sich zu viele mögliche Varianten. Arbeite an einer Mister-X Version mit 96 Zonen. Das Spiel läuft wunderbar, bastle noch etwas an den Gadgets.. Wie Aktuelle Spieldauer und eben bereits zurückgelegte Distanz.

Vielleicht verwerfe ich die Sache auch. Habe mich schon ein paar Tage mit LUA Code befasst und schon eine Distanzmessung (Spieler<=>Zone) gemacht. Vor dem grossen Coden wollte ich mich noch schlau machen, obs da keine implementierte Funktion gibt. :)

Nochmals Danke und Gruss
cotwild
 

Krolock

Geocacher
cotwild schrieb:
obs da keine implementierte Funktion gibt. :)
Es gibt zwar "Distance to a zone", aber die ist auf Player <=> Zone festgelegt.

Es ist wie so oft, die Klicki-Bunti-Oberfläche ist schön und gut, aber wenn die Ansprüche steigen, dann reicht sie oft nicht aus.
Ist ja auch verständlich, denn um die Oberfläche nicht zu überladen, kann man halt nur die meistgebrauchten Operationen anbieten. Und Abstand zwischen zwei Zonen gehört bestimmt nicht zu den UseCases, die man ständig braucht.
Da hilft nur die direkte Implementierung in lua.
 

bodenseepingu

Geomaster
Ich habe mehrere Cartridges, in denen ich die zurückgelegte Entfernung messe.

Hierzu habe ich einen periodischen Timer - 1 oder 2 Sekunden reicht völlig, der eine kleine LUA-Routine aufruft.

In der LUA-Routine prüfe ich zuerst mal die zurückgelegte Distanz zum zuletzt gespeicherten Punkt.
Nur wenn sich der Spieler signifikant fortbewegt hat (z.b. 8...10 Meter) speichere ich die neue Position und addiere die Distanz zur zuletztgespeicherten Position zu einer globalen Variable Gesamtstrecke.

Das funktioniert m.E. recht zuverlässig und denke auch einigermassen genau und filtert zudem noch das "Rumstehen" und Positionsschwankungen währenddessen raus. Klar ist diese signifikante Strecke abhängig von der GPS-Genauigkeit - die könnte man auch ablesen und diese zurückgelegte Distanz auch dynamisch machen um kein Rauschen auf die Distanz aufzuaddieren.

Bei Gelegenheit kann ich das mal extrahieren und publizieren - vielleicht auch mal wenn ich Zeit habe mit der GPS-Genauigkeit experimentieren.
 

bodenseepingu

Geomaster
Hier das versprochene Beispiel, funktioniert auf jeden Fall mal auf Garmin und auf Android - wie genau das ist, mögen andere mal ausprobieren - in diesem Fall habe ich jetzt einfach mal die Positionsgenauigkeit mit reingebaut und zähle die Wegstrecke nur hoch, wenn die Distanz zur zuletzt gespeicherten Wegstrecke mehr als 2 mal die Positionsgenauigkeit ist. Mein Garmin Oregon bringt bei gutem Empfang 3m als Positionsgenauigkeit, auf dem Android-Tablet wurde hier sogar kleiner als 2m angezeigt.

http://www.das-wherigo-handbuch.de/index.php?title=Beispiele/Codeschnipsel_in_LUA
 
OP
C

cotwild

Geocacher
Toll, besten Dank.

Ich habe mittlerweilen eine Lösun. Beim Betreten einer Zone wird die zurückgelegte Distanz (letzte bis aktuelle Zone, Luftlinie) berechnet und zur vorherig gespeicherten Distanz addiert. Die Distanz seit der letzten Zone lasse ich dann nur beim Aufruf der Statistik zur Ansicht addieren. Klappt so ganz gut :) Das nächste Mal würde ich jedoch auch mit dem Timer arbeiten.. (Obwohl ich da etwas vorsichtig bin und ungerne zu viele Timer laufen lasse wegen evtl. Abstürzen bei fortgeschrittener Zeit.. Oder ist es kein Problem einen Timer über lange Zeit laufen zu lassen??)

Danke und Gruss
 

bodenseepingu

Geomaster
Ein Problem sehe ich nicht über längere zeit - klar - besser nicht zu viele timer und das Thema - Timer und Cartridge Restore müsste man sich auch nochmal anschauen - mag sein dass Timer nach Cartridge restore gestoppt sind
 

bodenseepingu

Geomaster
Hier noch für diejenigen, die lieber den Code hier sehen die wesentlichen Bestandteile - Erläuterungen sind im Code:
Code:
--
-- Created by IntelliJ IDEA.
-- User: andi
-- Date: 19.04.12
-- Time: 19:00
-- To change this template use File | Settings | File Templates.
--

-- LUA Code to measure distance of Player
-- Interface to Urwigo:
--
-- init-routine: store_current_position() - should be called on start of measurement or after restore of cartridge
--walked_distance(): should be called via timer - e.g. every one or 2 seconds


local last_pos = ZonePoint(0,0,0)  --not persistent, so init-function should be called after restore of cartridge


function store_current_position()
    --just store the current position
    last_pos = Player.ObjectLocation
end


function get_gps_accuracy()
    local pos_acc = Player.PositionAccuracy
    local gps_acc = pos_acc:GetValue 'm'
    return gps_acc
end


function walked_distance()  --return walked_distance - if more than twice position accuracy
   --try to work with PositionAccuracy

   local d, b = Wherigo.VectorToPoint(last_pos, Player.ObjectLocation)
   local dn = d:GetValue 'm'
   local gps_acc = get_gps_accuracy()
   if dn > 2 * gps_acc then
       store_current_position()
       --not used last_bearing = b - if it is interesting in which direction player is walking
       return dn  --return distance
   end
   return 0
end
 

bodenseepingu

Geomaster
Die Aufsummierung der Gesamtstrecke im obigen Code habe ich nach Urwigo ausgelagert in die Timer-Funktion. D.h. die Routine walked_distance() gibt entweder 0 zurück, wenn weniger als zwei mal die aktuelle Positionsungenauigkeit zurückgelegt wurde oder die Entfernung zum zuletzt gespeicherten Punkt.

Jetzt bin ich kein Mathematiker - aber ich würde das Ding als eine diskrete Annäherungsfunktion an die tatsächlich zurückgelegte Strecke betrachten. :p
 

Krolock

Geocacher
bodenseepingu schrieb:
Jetzt bin ich kein Mathematiker - aber ich würde das Ding als eine diskrete Annäherungsfunktion an die tatsächlich zurückgelegte Strecke betrachten. :p

Da helfen bestimmt die Annäherungsalgorithmen der GPSr Empfänger beim Aufzeichnen des Tracks. Ich denke im Automatikmodus (Aufnahme von GPS-Positionen und Glätten des Graphes) arbeiten die Geräte von Garmin genauso.
Es wäre lediglich dann abweichend, wenn du innerhalb der Positionsungenauigkeit ständig hin und her laufen würdest.

Wer es genauer haben möchte, darf nach Graphentheorie und Glättung von Graphen, bzw. Zusammenführung von Kanten googeln. Einen groben Einstieg bietet auch http://de.wikipedia.org/wiki/Exponentielle_Gl%C3%A4ttung
 
Oben