Concept and Architecture
The following section explains the concept and special features of OpenIndy.
“Metrology is the science of measurement. Metrology includes all theoretical and practical aspects of measurement. The word comes from Greek μέτρον (metron), “measure” + “λόγος” (logos), amongst others meaning “speech, oration, discourse, quote, study, calculation, reason”. In Ancient Greek the term μετρολογία (metrologia) meant “theory of ratios”.” (wikipedia)
Requirements for OpenIndy:
- Controlling of 3D - Measurement Systems (laser tracker, tachymeter, etc)
- Open data exchange format (openindyXML.xml)
- Various algorithms to fit, construct and manipulate geometries
- Algorithms for the measurement analysis are easy to add or change
- Easy to use development framework for students
- Easy to use GUI, which provides a deep insight into the measurement data.
OpenIndy is a typical desktop application. All functionality and sensor integration will be realized by plugins. That way you can configure OpenIndy for your custom task pane. The backend is a SQLite database that stores the user-defined configuration. The collected and processed data are stored in a XML format (openIndyXML).
OpenIndy has three major object groups:
A sensor generates readings. A reading is an original measurement value of the sensor. For example a polar reading is described by two angles and a distance. If possible the reading will be transformed to an observation. An observation is a 3D coordinate that knows the reading from which it was generated. Each observation can belong to one or more geometries and can be changed by system tranformations.
A feature is anything which can be manipulated by functions. OpenIndy uses features to describe all elements in an abstract way that you need to solve your task. For example you want to measure a pipeline. So you will need the feature cylinder to reconstruct the pipeline. In addition to the feature, you need a function(fit or construct) that solves the cylinder.
Feature and function
OpenIndy is feature based. Every feature can be changed by functions. For example, you can solve a geometry with a fit function, and then rotate the geometry using a transformation function. Each function generates a statistics object with information about the accuracy and passes it to the next function. Thus, a consistent error propagation is possible.
There are four kinds of feature:
OpenIndy describes the “world” through features. A feature has all the necessary attributes to describe it. But a feature doesn’t know how to get valid values for his attributes. To calculate values for the attributes of the feature, OpenIndy uses functions. Functions uses other features or observations to solve “his” feature.
A point feature (geometry) knows his attributes (x,y,z), but it doesn’t know how to get them. You set a best fit function for the point. This functions uses any number of observations to solve the attributes of the point.
The concept behind OpenIndy envisages that every feature can be solved by one or more functions. Hence you can assign as many functions as you want to a feature. The order of those functions is important, because they will be executed in the same order as they were assigned to a feature. This concept of assigning multiple functions to a feature is illustrated in the following diagram.
The first function that is assigned to a feature solves it and each additional function changes the previously solved feature. Thereby each function can calculate statistical values for the feature using variance propagation. In OpenIndy there are five different types of functions which are described in the following table.
|fit function||If overdetermination is present, fit functions have the purpose to calculate the adjusted parameters of a geometry by using observations. So for example a fit function can calculate the center of n xyz-observations.|
|construct function||Construct functions are used to calculate geometries by using other geometries. For example the intersection of a line and a plane results in a new point.|
|geodetic function||Geodetic functions are intended to calculate special geodetic tasks like spatial intersection etc..|
|object transformation||In contrast to fit- and construct functions, object transformations do not define a geometry, but change a previously defined one. A point which has been fit before can for instance be moved along a line by a certain amount.|
|system transformation||System transformations are used to calculate the parameters of a transformation from one coordinate system to another one.|
While object transformations can only be assigned to a feature that was previously solved by another function, the other function types are meant to solve a feature so functions of those types can only be assigned to a feature once and only as the first function. (For example you cannot shift a point that has never been solved.) To better understand this concept let us consider a concrete example:
In OpenIndy you can for example create a point feature which you then can measure with a sensor of your choice. This results in n observations and precision values for each of those observations. When you now add the function “Best Fit” to the point feature you get the adjusted coordinates of the point. Therefor the function “Best Fit” uses the n observations and their precision values. Besides the adjusted coordinates this function also calculates the covariance matrix ∑XX with the accuracy of the parameters of the point (X,Y,Z) and their correlation.
Now let us assume that you want to shift the adjusted point along the normal vector of a plane by a specified amount. So you add another function “Translate by Plane” to the point. This function needs a plane and a distance to be executed, so you have to input a plane and a distance which may both have been solved by a chain of functions before. In summary the function “Translate by Plane” gets the adjusted point with its covariance matrix, a plane with a covariance matrix and a distance with its accuracy as input. Because this function knows its functional relationship it is able do variance propagation. As the result you get the covariance matrix of the shifted point and, of course, the coordinates of the shifted point itself.
OpenIndy allows you to implement you own functions. Therefor you have to write a plugin (or extend an existing one).
OpenIndy-Math (linear algebra)
OpenIndy-Math is a seperate Qt-project where classes for linear algebra are implemented. In OpenIndy and in all plugins the “OpenIndy-Math” is linked against as a dynamic library. In the following diagram you can see the structure of that library.
There are two classes OiVec and OiMat. This classes have methods to do vector and matrix algebra and to access the elements of a vector and a matrix respectively. It is recommended to use this classes in your plugins for all calculations. Furthermore there is an interface LinearAlgebra where all methods for vector and matrix algebra are defined.
This interface may be realized by many different implementations. The great advantage of this is that OpenIndy is not dependent on one special linear algebra library. There is always the possibility to switch the used linear algebra implementation. To switch the current implementation there is the static class ChooseLALib. Via the method
setLinearAlgebra the current linear algebra library can be changed. Currently there is only one implementation
LAArmadillo which uses the open source library Armadillo.