Introduction
Purpose
When importing NavVis data into 3rd party development toolkits or software applications, we need to have the panorama locations and the Point cloud represented within the same global coordinate system. For this there is a manual transformation from the local coordinate system of the scan to the control point coordinate system necessary.
NavVis is not able to provide any tool or command for this transformation. Instead we encourage customers to set up their own automatic transformation by code or a 3rd party tool.
Scope
This solution applies to Desktop Processing Software (all versions), Mobile Mapping Systems (NavVis VLX and NavVis M6)
Procedure
Necessary Files
The local coordinates of each panorama is given within the file pano_poses.csv, which is located in the folder datasets_proc/<dataset_id>/pano
.
For every pano position, there is the translation vector [pano_pos_x, pano_pos_y, pano_pos_z] and the orientation given as a quaternion [pano_ori_w, pano_ori_x, pano_ori_y, pano_ori_z]. Each panorama row also contains a timestamp and corresponds to a panorama info file present in datasets_proc/<dataset_id>/info
.

When control point have been used for processing, the origin of the scan within the global coordinate system is written within the file datasets_proc/<datasets_id>/internal/anchors/origin.json
.
The transformation from the local coordinate system of the scan to the global coordinate system of the control points is also given by a position vector and an orientation quaternion.
{
"Pose": {
"orientation": {
"w": "-0.23318700107838936",
"x": "0",
"y": "0",
"z": "0.97243191151260933"
},
"position": {
"x": "551.38237098655372",
"y": "291.49346207311419",
"z": "24.213919423444075"
}
}
Note: If no control points have been used during post-processing, this file will only list a location vector equaling 0 and a quaternion being an identity vector.
{
"Pose": {
"position": {
"x": "-0",
"y": "-0",
"z": "-0"
},
"orientation": {
"w": "1",
"x": "0",
"y": "0",
"z": "0"
}
}
}
Convert pano_poses.csv to global coordinates
Each panorama position in local coordinates needs to be translated by the position vector of the origin:
[pano_pos_x, pano_pos_y, pano_pos_z] + [origin_x, origin_y, origin_z]
If the orientation of the panorama needs to be determined as well, each panorama quaternion needs to be transformed by the quaternion of the origin.
For that both quaternions need to be multiplied with a 3rd party library due to the complexity of the mathematical operation. We recommend the C++-library Eigen or the python-library pyquaternion.
What if the control point file was transferred to local coordinates <20000m for processing?
If control point coordinates are beyond 20000m, they need to be translated to a basepoint [x,y,z] = [0,0,0]. This can be done by setting the first control point to 0.
[cp_x, cp_y, cp_z] -> [0,0,0]
If this has been done before processing, this vector needs to be added to each pano location as well. Additionally in this case, this translation needs to be applied to the processed point cloud as well.