d/ns: fix polynomial distortion math again, document nonsensical parts of polynomial math, update config files

This commit is contained in:
Moses Turner 2021-01-07 15:36:42 -06:00
parent 684daa3293
commit fc47d0baad
6 changed files with 214 additions and 120 deletions

View file

@ -33,7 +33,7 @@
#include "../realsense/rs_interface.h"
#endif
DEBUG_GET_ONCE_LOG_OPTION(ns_log, "NS_LOG", U_LOGGING_WARN)
DEBUG_GET_ONCE_LOG_OPTION(ns_log, "NS_LOG", U_LOGGING_INFO)
/*
*
@ -41,6 +41,12 @@ DEBUG_GET_ONCE_LOG_OPTION(ns_log, "NS_LOG", U_LOGGING_WARN)
*
*/
static double map(double value, double fromLow, double fromHigh, double toLow, double toHigh) {
return (value - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow;
} // Math copied from https://www.arduino.cc/reference/en/language/functions/math/map/
// This is pure math so it is still under the Boost Software License.
static void
ns_hmd_destroy(struct xrt_device *xdev)
{
@ -224,14 +230,15 @@ ns_fov_calculate(struct xrt_fov *fov, struct xrt_quat projection)
fov->angle_left =
projection.z; // atanf(fabsf(projection.z) / near_plane);
fov->angle_right =
projection.w; // atanf(fabsf(projection.w) / near_plane);
projection.w; // atanf(fabsf(projection.w) / near_plane);
}
/*
*
*
* V2 optics.
*
*/
*
*
*/
static void
@ -305,8 +312,15 @@ ns_v2_mesh_calc(struct xrt_device *xdev,
float v,
struct xrt_uv_triplet *result)
{
u = 1.0 - u; // Not sure why these are necessary: somewhat concerning.
v = 1.0 - v; // They make it work though, so hey.
/*! @todo (Moses Turner) It should not be necessary to reverse the U and V coords.
* I have no idea why it is like this. It shouldn't be like this.
* It must be something wrong with the undistortion calibrator.
* The V2 undistortion calibrator software is here if you want to look:
* https://github.com/BryanChrisBrown/ProjectNorthStar/tree/feat-gen-2-software/Software/North%20Star%20Gen%202/North%20Star%20Calibrator
*/
//u = 1.0 - u;
v = 1.0 - v;
struct ns_hmd *ns = ns_hmd(xdev);
@ -321,20 +335,9 @@ ns_v2_mesh_calc(struct xrt_device *xdev,
float up_ray_bound = tan(ns->eye_configs_v2[view].fov.angle_up);
float down_ray_bound = tan(ns->eye_configs_v2[view].fov.angle_down);
float u_eye = map(x_ray, left_ray_bound, right_ray_bound, 0, 1);
// Both of these are very concise implementations of map() in Arduino.
// https://www.arduino.cc/reference/en/language/functions/math/map/
// In other words, a one-axis linear transformation.
// I wish I was better at linear algebra so I had could describe this
// better
// map(x_ray, left_ray_bound, right_ray_bound, 0, 1)
float u_eye =
(x_ray + right_ray_bound) / (right_ray_bound - left_ray_bound);
// map(y_ray, down_ray_bound, up_ray_bound, 0, 1)
float v_eye = (y_ray + up_ray_bound) / (up_ray_bound - down_ray_bound);
float v_eye = map(y_ray, down_ray_bound, up_ray_bound, 0, 1);
// boilerplate, put the UV coordinates in all the RGB slots
@ -404,6 +407,9 @@ ns_config_load(struct ns_hmd *ns)
cJSON_GetObjectItemCaseSensitive(config_json, "baseline"),
&ns->ipd);
ns->ipd = ns->ipd / 1000.0f; // converts from mm to m
/*! @todo (Moses Turner) Next four u_json_get_float_array calls don't make any sense.
* They put the X coefficients from the JSON file into the Y coefficients in the structs, which is totally wrong, but the distortion looks totally wrong if we don't do this.
*/
u_json_get_float_array(cJSON_GetObjectItemCaseSensitive(
config_json, "left_uv_to_rect_x"),
ns->eye_configs_v2[0].y_coefficients,
@ -423,7 +429,7 @@ ns_config_load(struct ns_hmd *ns)
if (!u_json_get_float(
cJSON_GetObjectItemCaseSensitive(config_json,
"leftEyeAngleLeft"),
"left_fov_radians_left"),
&ns->eye_configs_v2[0]
.fov
.angle_left)) { // not putting this directly in
@ -437,43 +443,46 @@ ns_config_load(struct ns_hmd *ns)
"example in "
"src/xrt/drivers/north_star/"
"v2_example_config.json.");
ns->eye_configs_v2[0].fov.angle_left = -0.6;
ns->eye_configs_v2[0].fov.angle_right = 0.6;
ns->eye_configs_v2[0].fov.angle_up = 0.6;
ns->eye_configs_v2[0].fov.angle_down = -0.6;
ns->eye_configs_v2[0].fov.angle_left = -0.8;
ns->eye_configs_v2[0].fov.angle_right = 0.8;
ns->eye_configs_v2[0].fov.angle_up = 0.8;
ns->eye_configs_v2[0].fov.angle_down = -0.8;
ns->eye_configs_v2[1].fov.angle_left = -0.6;
ns->eye_configs_v2[1].fov.angle_right = 0.6;
ns->eye_configs_v2[1].fov.angle_up = 0.6;
ns->eye_configs_v2[1].fov.angle_down = -0.6;
ns->eye_configs_v2[1].fov.angle_left = -0.8;
ns->eye_configs_v2[1].fov.angle_right = 0.8;
ns->eye_configs_v2[1].fov.angle_up = 0.8;
ns->eye_configs_v2[1].fov.angle_down = -0.8;
} else {
u_json_get_float(
cJSON_GetObjectItemCaseSensitive(
config_json, "leftEyeAngleRight"),
&ns->eye_configs_v2[0].fov.angle_right);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "leftEyeAngleUp"),
&ns->eye_configs_v2[0].fov.angle_up);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "leftEyeAngleDown"),
&ns->eye_configs_v2[0].fov.angle_down);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "rightEyeAngleLeft"),
&ns->eye_configs_v2[1].fov.angle_left);
u_json_get_float(
cJSON_GetObjectItemCaseSensitive(
config_json, "rightEyeAngleRight"),
&ns->eye_configs_v2[1].fov.angle_right);
config_json, "left_fov_radians_left"),
&ns->eye_configs_v2[0].fov.angle_left);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "rightEyeAngleUp"),
&ns->eye_configs_v2[1].fov.angle_up);
config_json, "left_fov_radians_right"),
&ns->eye_configs_v2[0].fov.angle_right);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "rightEyeAngleDown"),
&ns->eye_configs_v2[1].fov.angle_down);
config_json, "left_fov_radians_up"),
&ns->eye_configs_v2[0].fov.angle_up);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "left_fov_radians_down"),
&ns->eye_configs_v2[0].fov.angle_down);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "right_fov_radians_left"),
&ns->eye_configs_v2[1].fov.angle_left);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "right_fov_radians_right"),
&ns->eye_configs_v2[1].fov.angle_right);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "right_fov_radians_up"),
&ns->eye_configs_v2[1].fov.angle_up);
u_json_get_float(cJSON_GetObjectItemCaseSensitive(
config_json, "right_fov_radians_down"),
&ns->eye_configs_v2[1].fov.angle_down);
}
ns->is_v2 = true;

View file

@ -0,0 +1,3 @@
Copyright 2020, CombineReality.
SPDX-License-Identifier: BSL-1.0

View file

@ -3,19 +3,19 @@
"ellipseMinorAxis": 0.24494899809360505,
"ellipseMajorAxis": 0.3099985122680664,
"screenForward": {
"x": 0.2824554741382599,
"y": -0.20611988008022309,
"z": 0.9368743300437927
"x": 0.37583938241004946,
"y": -0.2950916886329651,
"z": 0.878445029258728
},
"screenPosition": {
"x": -0.07859157025814057,
"y": -0.005049339961260557,
"z": 0.012514465488493443
"x": -0.07663544267416,
"y": -0.006479046773165464,
"z": 0.015394501388072968
},
"eyePosition": {
"x": -0.03200000151991844,
"y": 0.001083331648260355,
"z": -0.012499995529651642
"x": -0.030106136575341226,
"y": -0.014616160653531552,
"z": -0.004279683344066143
},
"eyeRotation": {
"x": 7.395533370627759e-32,
@ -33,33 +33,33 @@
"e00": 0.05101080238819122,
"e01": 0.06071346998214722,
"e02": 0.29330453276634219,
"e03": -0.11532726138830185,
"e03": -0.1151043102145195,
"e10": 0.0,
"e11": 0.23695310950279237,
"e12": -0.07855913043022156,
"e13": 0.026422245427966119,
"e13": 0.026667742058634759,
"e20": -0.23957861959934236,
"e21": 0.012927045114338398,
"e22": 0.062450066208839419,
"e23": -0.05475877597928047,
"e23": -0.05541845038533211,
"e30": 0.0,
"e31": 0.0,
"e32": 0.0,
"e33": 1.0
},
"worldToScreenSpace": {
"e00": 1.3777992725372315,
"e01": 14.81815242767334,
"e02": 2.8447227478027345,
"e03": 0.14750510454177857,
"e10": -16.076780319213868,
"e11": 0.5414643883705139,
"e12": 4.966066360473633,
"e13": -1.3229130506515504,
"e20": 0.2824554145336151,
"e21": -0.2061198651790619,
"e22": 0.9368743300437927,
"e23": 0.009433363564312458,
"e00": 2.027873992919922,
"e01": 14.474093437194825,
"e02": 3.994591236114502,
"e03": 0.1876906156539917,
"e10": -15.437186241149903,
"e11": 0.3111684322357178,
"e12": 6.709270000457764,
"e13": -1.284305453300476,
"e20": 0.37583935260772707,
"e21": -0.2950916290283203,
"e22": 0.8784450888633728,
"e23": 0.013367477804422379,
"e30": 0.0,
"e31": 0.0,
"e32": 0.0,
@ -70,19 +70,19 @@
"ellipseMinorAxis": 0.24494899809360505,
"ellipseMajorAxis": 0.3099985122680664,
"screenForward": {
"x": -0.2919599413871765,
"y": -0.20477625727653504,
"z": 0.934251606464386
"x": -0.35585933923721316,
"y": -0.27381938695907595,
"z": 0.8935251235961914
},
"screenPosition": {
"x": 0.07982077449560166,
"y": -0.005731542594730854,
"z": 0.01401037909090519
"x": 0.07577500492334366,
"y": -0.009351296350359917,
"z": 0.014919517561793328
},
"eyePosition": {
"x": 0.03200000151991844,
"y": 0.001083331648260355,
"z": -0.012499995529651642
"x": 0.0300484336912632,
"y": 0.006817266810685396,
"z": 0.0022060188930481674
},
"eyeRotation": {
"x": 7.395533370627759e-32,
@ -100,33 +100,33 @@
"e00": 0.05101081356406212,
"e01": -0.060713451355695727,
"e02": -0.29330453276634219,
"e03": 0.11689796298742295,
"e03": 0.1155824139714241,
"e10": 0.0,
"e11": 0.23695312440395356,
"e12": -0.07855910062789917,
"e13": 0.026351751759648324,
"e13": 0.02368796430528164,
"e20": 0.23957861959934236,
"e21": 0.0129270413890481,
"e22": 0.062450066208839419,
"e23": -0.052946362644433978,
"e23": -0.0545220747590065,
"e30": 0.0,
"e31": 0.0,
"e32": 0.0,
"e33": 1.0
},
"worldToScreenSpace": {
"e00": -1.4188950061798096,
"e01": 14.821781158447266,
"e02": 2.805335283279419,
"e03": 0.15890516340732575,
"e10": -16.02415657043457,
"e11": -0.5628440976142883,
"e12": -5.131026744842529,
"e13": 1.3477222919464112,
"e20": -0.2919600307941437,
"e21": -0.2047763168811798,
"e22": 0.9342517256736755,
"e23": 0.00904157105833292,
"e00": -1.7429742813110352,
"e01": 14.570849418640137,
"e02": 3.7710490226745607,
"e03": 0.21206799149513246,
"e10": -15.61334228515625,
"e11": -0.23936468362808228,
"e12": -6.291592597961426,
"e13": 1.2747303247451783,
"e20": -0.35585933923721316,
"e21": -0.27381935715675356,
"e22": 0.8935251235961914,
"e23": 0.011073712259531021,
"e30": 0.0,
"e31": 0.0,
"e32": 0.0,
@ -139,14 +139,14 @@
"localPose": {
"position": {
"x": 0.0,
"y": 0.039777886122465137,
"z": 0.0804821103811264
"y": 0.02151,
"z": 0.06684
},
"rotation": {
"x": 0.3123600482940674,
"y": 0.0,
"z": 0.0,
"w": 0.9499638080596924
"x": 0.3255681,
"y": 0,
"z": 0,
"w": 0.9455186
}
}
}

View file

@ -1,17 +0,0 @@
{"baseline": 64.0,
"left_uv_to_rect_x": [-0.6496146862315304, 1.522223227078294, -0.4813404618897057, 0.35702657717980785, -0.07956037872995925, 1.1454020997970913, -3.2505199559593336, 1.6279076622052455, 0.38831554051443307, -3.5783949261594095, 7.668716710704405, -4.166750433790205, -0.2855168004377634, 2.304654520623994, -4.773857525576798, 2.6771905826607756],
"left_uv_to_rect_y": [0.5735680823264238, -0.07201032485360503, -0.3760147865913098, 0.12237851205003134, -1.1789607449622186, -0.3639051399896993, 1.9433544351592553, -1.428768695251512, 0.43448180786102064, 1.4198893425729027, -4.061494083054925, 2.5833812097228908, -0.20318807476847794, -0.8824999019236596, 2.2256952824902, -1.3778198332457088],
"right_uv_to_rect_x": [-0.6265143917747795, 1.2911622275040877, -0.5517955125123675, 0.34277683878971815, -0.008660007647723567, 0.5057868616188462, -0.7608772693869136, 0.441561492954449, 0.01102824175518119, -0.32306477445426557, 0.7580684800480195, -0.4808991141180218, -0.0517219007106306, 0.2799238117904546, -0.4494394376437649, 0.3706889336770174],
"right_uv_to_rect_y": [0.5259106471825626, -0.1663727700922601, 0.28233333974385694, 0.1745576324081204, -1.0358003574621981, 0.13565673296823005, 0.03669780270514961, -0.28419296928833887, 0.4258466087687195, -0.03876248767088333, -0.37766287840406676, 0.43848943099165466, -0.34808893357030296, 0.22156250909608152, 0.13817451999521518, -0.2468046426038312],
"leftEyeAngleLeft": -0.6,
"leftEyeAngleRight": 0.6,
"leftEyeAngleUp": 0.6,
"leftEyeAngleDown": -0.6,
"rightEyeAngleLeft": -0.6,
"rightEyeAngleRight": 0.6,
"rightEyeAngleUp": 0.6,
"rightEyeAngleDown": -0.6
}

View file

@ -0,0 +1,96 @@
{
"baseline": 64.0,
"left_fov_radians_left": -0.8,
"left_fov_radians_right": 0.8,
"left_fov_radians_up": 0.8,
"left_fov_radians_down": -0.8,
"right_fov_radians_left": -0.8,
"right_fov_radians_right": 0.8,
"right_fov_radians_up": 0.8,
"right_fov_radians_down": -0.8,
"t265_to_eyes_center": {
"translation_meters": {
"x": 0,
"y": -0.0683,
"z": 0.0744
},
"rotation_quaternion": {
"x": 0.102931,
"y": 0,
"z": 0,
"w": 0.994689
}
},
"left_uv_to_rect_x": [
-0.7801988839098829,
1.5908068712799723,
-0.9827824328911254,
0.5263358892466966,
0.18664841081239514,
-0.5246668149574745,
1.4048420164308815,
-0.9330577906613924,
-0.15392100230529293,
1.106540330862997,
-2.87151330241086,
2.0315485110726668,
-0.06427965195537277,
-0.3146940276594198,
1.5763979534056192,
-1.1327966252705322
],
"left_uv_to_rect_y": [
-0.4409536269756768,
0.2888996614465091,
-0.3848014983107932,
-0.1223362997546647,
0.9670157125483582,
-0.3256816024594271,
0.533926353628004,
-0.23310084856690347,
-0.17082017203715041,
-0.059688885588560045,
-0.9941995171671563,
1.0721046441395208,
0.2547327106222003,
-0.25419242442834455,
1.0488819862049827,
-0.9515005068294279
],
"right_uv_to_rect_x": [
-0.6710613688416264,
1.1362689645641848,
0.3956957345987107,
-0.21326295396259742,
-0.5335462524956397,
4.546071135245812,
-10.207643227900032,
5.846282899290887,
1.3039161130160792,
-10.66129593656746,
22.158725872611857,
-12.912719005943362,
-0.9563087974847321,
6.870750205887958,
-13.828097816218262,
8.10122851327323
],
"right_uv_to_rect_y": [
-0.36496330390320814,
-0.34773830007498274,
1.1607448604832324,
-0.5639076806706572,
0.5129009330129037,
4.133391411431411,
-9.131958871130214,
5.601050711809029,
1.1111421772677867,
-10.247117862137081,
20.539322154891007,
-12.003706549179878,
-0.671733941602777,
6.353458803843707,
-12.784556822147636,
7.548883311524131
]
}

View file

@ -0,0 +1,3 @@
Copyright 2021, Moses Turner
SPDX-License-Identifier: BSL-1.0