Yes, conceptually, this is what it will seem like, if you use the spacetime server. However, under the covers, that is not what actually happens. It won't matter to you, the user, because, for the user, it will seem like the above is what is happening...
The spacetime server will store the positions in an octree, and, whenever you ask for the value, you will always get the latest and greatest value. For efficiency reasons, the values attached to the atoms never actually change; instead, things inside the octomap change. But, for you, it will behave as if the values were changing all the time.
To make this work, you will use PositionValue instead of FloatSeqValue. The PositionValue c++ class "automatically knows" to look in the octomap to get the current location.
So the API might be:
PredicateNode "current-position"
ConceptNode "face 42"
PositionValue
Notice that $X $Y $Z is gone ... if you want to get the position (in C++) you first get your hands on an instance of the C++ class PositionValue and then call method `value()` which returns std::vector<double> which holds the position. Under the covers, the value() method looks into the octomap to find what it needs.
Now comes the tricky part: how do you get your hands on a PositionValue? More importantly, one that knows where to find the right position? There are several ways to do this, I worked this out with Misgana a month ago, and don't recall quite what we agreed to. This should be in some github issue ... !?
I think we agreed to a two-part implementation.
Part A) The PositionValue constructor takes two arguments: "what", and "when". For example: "what" could be (Concept "face 42") and "when" could be (Predicate "right-now"). Once you run the constructor, you can save this PositionValue wherever you want; it always knows how to respond.
Part B) There is a GroundedPredicateNode "octomap-object-tracking-value" which you use like this:
EvaluationLink
GroundedPredicateNode "octomap-object-tracking-value"
ListLink
Concept "face 42"
Predicate "right now"
and when you evaluate it, you get back a pointer to a PositionValue from Part A)
Part B) is needed, because Part A) alone is not atomese: calling the constructor is awkward, the scheme bindings are awkward, the python bindings are awkward. Part B) eliminates this awkwardness. Part B) is pure atomese.
If you want the position one-half hour ago, it will be something like this:
EvaluationLink
GroundedPredicateNode "octomap-object-tracking-value"
ListLink
Concept "face 42"
TimeNode "-00:30:00" ;;; understood as a half-hour offset from "right now"
Misgana is working out the exact details of this. I don't recall if it's called PostionValue or LocationValue. I'm not sure of what the AtTimeLink syntax is supposed to be.
I'm not sure what github issue this is covered under.