From 0b602f523e2a759848b67c8177ff8070feb39ec1 Mon Sep 17 00:00:00 2001 From: Charles Lohr Date: Sat, 10 Dec 2016 21:26:16 -0500 Subject: Update redist with an example config, and jsmn. --- redist/Makefile | 8 + redist/jsmn.c | 315 ++++++++++++++++++++++++++ redist/jsmn.h | 77 +++++++ redist/jsmntest.c | 75 +++++++ redist/test.config | 633 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1108 insertions(+) create mode 100644 redist/Makefile create mode 100644 redist/jsmn.c create mode 100644 redist/jsmn.h create mode 100644 redist/jsmntest.c create mode 100644 redist/test.config diff --git a/redist/Makefile b/redist/Makefile new file mode 100644 index 0000000..5ba30dc --- /dev/null +++ b/redist/Makefile @@ -0,0 +1,8 @@ +all : jsmntest + +jsmntest : jsmntest.c jsmn.c + gcc -o $@ $^ + +clean : + rm -rf *.o *~ jsmntest + diff --git a/redist/jsmn.c b/redist/jsmn.c new file mode 100644 index 0000000..10ba0b3 --- /dev/null +++ b/redist/jsmn.c @@ -0,0 +1,315 @@ +#include "jsmn.h" + +/** + * Allocates a fresh unused token from the token pull. + */ +static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, + jsmntok_t *tokens, size_t num_tokens) { + jsmntok_t *tok; + if (parser->toknext >= num_tokens) { + return NULL; + } + tok = &tokens[parser->toknext++]; + tok->start = tok->end = -1; + tok->size = 0; +#ifdef JSMN_PARENT_LINKS + tok->parent = -1; +#endif + return tok; +} + +/** + * Fills token type and boundaries. + */ +static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, + int start, int end) { + token->type = type; + token->start = start; + token->end = end; + token->size = 0; +} + +/** + * Fills next available token with JSON primitive. + */ +static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, + size_t len, jsmntok_t *tokens, size_t num_tokens) { + jsmntok_t *token; + int start; + + start = parser->pos; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + switch (js[parser->pos]) { +#ifndef JSMN_STRICT + /* In strict mode primitive must be followed by "," or "}" or "]" */ + case ':': +#endif + case '\t' : case '\r' : case '\n' : case ' ' : + case ',' : case ']' : case '}' : + goto found; + } + if (js[parser->pos] < 32 || js[parser->pos] >= 127) { + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } +#ifdef JSMN_STRICT + /* In strict mode primitive must be followed by a comma/object/array */ + parser->pos = start; + return JSMN_ERROR_PART; +#endif + +found: + if (tokens == NULL) { + parser->pos--; + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + parser->pos--; + return 0; +} + +/** + * Fills next token with JSON string. + */ +static int jsmn_parse_string(jsmn_parser *parser, const char *js, + size_t len, jsmntok_t *tokens, size_t num_tokens) { + jsmntok_t *token; + + int start = parser->pos; + + parser->pos++; + + /* Skip starting quote */ + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c = js[parser->pos]; + + /* Quote: end of string */ + if (c == '\"') { + if (tokens == NULL) { + return 0; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + return 0; + } + + /* Backslash: Quoted symbol expected */ + if (c == '\\' && parser->pos + 1 < len) { + int i; + parser->pos++; + switch (js[parser->pos]) { + /* Allowed escaped symbols */ + case '\"': case '/' : case '\\' : case 'b' : + case 'f' : case 'r' : case 'n' : case 't' : + break; + /* Allows escaped symbol \uXXXX */ + case 'u': + parser->pos++; + for(i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) { + /* If it isn't a hex character we have an error */ + if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ + (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ + (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ + parser->pos = start; + return JSMN_ERROR_INVAL; + } + parser->pos++; + } + parser->pos--; + break; + /* Unexpected symbol */ + default: + parser->pos = start; + return JSMN_ERROR_INVAL; + } + } + } + parser->pos = start; + return JSMN_ERROR_PART; +} + +/** + * Parse JSON string and fill tokens. + */ +int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, + jsmntok_t *tokens, unsigned int num_tokens) { + int r; + int i; + jsmntok_t *token; + int count = parser->toknext; + + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { + char c; + jsmntype_t type; + + c = js[parser->pos]; + switch (c) { + case '{': case '[': + count++; + if (tokens == NULL) { + break; + } + token = jsmn_alloc_token(parser, tokens, num_tokens); + if (token == NULL) + return JSMN_ERROR_NOMEM; + if (parser->toksuper != -1) { + tokens[parser->toksuper].size++; +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + } + token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); + token->start = parser->pos; + parser->toksuper = parser->toknext - 1; + break; + case '}': case ']': + if (tokens == NULL) + break; + type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); +#ifdef JSMN_PARENT_LINKS + if (parser->toknext < 1) { + return JSMN_ERROR_INVAL; + } + token = &tokens[parser->toknext - 1]; + for (;;) { + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + token->end = parser->pos + 1; + parser->toksuper = token->parent; + break; + } + if (token->parent == -1) { + if(token->type != type || parser->toksuper == -1) { + return JSMN_ERROR_INVAL; + } + break; + } + token = &tokens[token->parent]; + } +#else + for (i = parser->toknext - 1; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + if (token->type != type) { + return JSMN_ERROR_INVAL; + } + parser->toksuper = -1; + token->end = parser->pos + 1; + break; + } + } + /* Error if unmatched closing bracket */ + if (i == -1) return JSMN_ERROR_INVAL; + for (; i >= 0; i--) { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) { + parser->toksuper = i; + break; + } + } +#endif + break; + case '\"': + r = jsmn_parse_string(parser, js, len, tokens, num_tokens); + if (r < 0) return r; + count++; + if (parser->toksuper != -1 && tokens != NULL) + tokens[parser->toksuper].size++; + break; + case '\t' : case '\r' : case '\n' : case ' ': + break; + case ':': + parser->toksuper = parser->toknext - 1; + break; + case ',': + if (tokens != NULL && parser->toksuper != -1 && + tokens[parser->toksuper].type != JSMN_ARRAY && + tokens[parser->toksuper].type != JSMN_OBJECT) { +#ifdef JSMN_PARENT_LINKS + parser->toksuper = tokens[parser->toksuper].parent; +#else + for (i = parser->toknext - 1; i >= 0; i--) { + if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) { + if (tokens[i].start != -1 && tokens[i].end == -1) { + parser->toksuper = i; + break; + } + } + } +#endif + } + break; +#ifdef JSMN_STRICT + /* In strict mode primitives are: numbers and booleans */ + case '-': case '0': case '1' : case '2': case '3' : case '4': + case '5': case '6': case '7' : case '8': case '9': + case 't': case 'f': case 'n' : + /* And they must not be keys of the object */ + if (tokens != NULL && parser->toksuper != -1) { + jsmntok_t *t = &tokens[parser->toksuper]; + if (t->type == JSMN_OBJECT || + (t->type == JSMN_STRING && t->size != 0)) { + return JSMN_ERROR_INVAL; + } + } +#else + /* In non-strict mode every unquoted value is a primitive */ + default: +#endif + r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); + if (r < 0) return r; + count++; + if (parser->toksuper != -1 && tokens != NULL) + tokens[parser->toksuper].size++; + break; + +#ifdef JSMN_STRICT + /* Unexpected char in strict mode */ + default: + return JSMN_ERROR_INVAL; +#endif + } + } + + if (tokens != NULL) { + for (i = parser->toknext - 1; i >= 0; i--) { + /* Unmatched opened object or array */ + if (tokens[i].start != -1 && tokens[i].end == -1) { + return JSMN_ERROR_PART; + } + } + } + + return count; +} + +/** + * Creates a new parser based over a given buffer with an array of tokens + * available. + */ +void jsmn_init(jsmn_parser *parser) { + parser->pos = 0; + parser->toknext = 0; + parser->toksuper = -1; +} + + diff --git a/redist/jsmn.h b/redist/jsmn.h new file mode 100644 index 0000000..de9ac17 --- /dev/null +++ b/redist/jsmn.h @@ -0,0 +1,77 @@ +#ifndef __JSMN_H_ +#define __JSMN_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * JSON type identifier. Basic types are: + * o Object + * o Array + * o String + * o Other primitive: number, boolean (true/false) or null + */ +typedef enum { + JSMN_UNDEFINED = 0, + JSMN_OBJECT = 1, + JSMN_ARRAY = 2, + JSMN_STRING = 3, + JSMN_PRIMITIVE = 4 +} jsmntype_t; + +enum jsmnerr { + /* Not enough tokens were provided */ + JSMN_ERROR_NOMEM = -1, + /* Invalid character inside JSON string */ + JSMN_ERROR_INVAL = -2, + /* The string is not a full JSON packet, more bytes expected */ + JSMN_ERROR_PART = -3 +}; + +/** + * JSON token description. + * type type (object, array, string etc.) + * start start position in JSON data string + * end end position in JSON data string + */ +typedef struct { + jsmntype_t type; + int start; + int end; + int size; +#ifdef JSMN_PARENT_LINKS + int parent; +#endif +} jsmntok_t; + +/** + * JSON parser. Contains an array of token blocks available. Also stores + * the string being parsed now and current position in that string + */ +typedef struct { + unsigned int pos; /* offset in the JSON string */ + unsigned int toknext; /* next token to allocate */ + int toksuper; /* superior token node, e.g parent object or array */ +} jsmn_parser; + +/** + * Create JSON parser over an array of tokens + */ +void jsmn_init(jsmn_parser *parser); + +/** + * Run JSON parser. It parses a JSON data string into and array of tokens, each describing + * a single JSON object. + */ +int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, + jsmntok_t *tokens, unsigned int num_tokens); + +#ifdef __cplusplus +} +#endif + +#endif /* __JSMN_H_ */ + diff --git a/redist/jsmntest.c b/redist/jsmntest.c new file mode 100644 index 0000000..715bd1f --- /dev/null +++ b/redist/jsmntest.c @@ -0,0 +1,75 @@ +#include "jsmn.h" +#include +#include +#include + +static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { + if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && + strncmp(json + tok->start, s, tok->end - tok->start) == 0) { + return 0; + } + return -1; +} + +int main() +{ + int i; + FILE * f = fopen( "test.config", "r" ); + fseek( f, 0, SEEK_END ); + int len = ftell( f ); + fseek( f, 0, SEEK_SET ); + char * JSON_STRING = malloc( len ); + fread( JSON_STRING, len, 1, f ); + fclose( f ); + + jsmn_parser p; + jsmntok_t t[4096]; + jsmn_init(&p); + int r = jsmn_parse(&p, JSON_STRING, len, t, sizeof(t)/sizeof(t[0])); + if (r < 0) { + printf("Failed to parse JSON: %d\n", r); + return 1; + } + if (r < 1 || t[0].type != JSMN_OBJECT) { + printf("Object expected\n"); + return 1; + } + + /* Loop over all keys of the root object */ + for (i = 1; i < r; i++) { +// if (jsoneq(JSON_STRING, &t[i], "acc_bias") == 0) { + /* We may use strndup() to fetch string value */ +// printf("ACC_BIAS: %.*s\n", t[i+1].end-t[i+1].start, JSON_STRING + t[i+1].start); +// } + if (jsoneq(JSON_STRING, &t[i], "modelPoints") == 0) { + int k; + jsmntok_t * tk = &t[i+1]; + printf( "%d / %d / %d / %d\n", tk->type, tk->start, tk->end, tk->size ); + int pts = tk->size; + for( k = 0; k < pts; k++ ) + { + tk = &t[i+2+k*4]; + printf( "++%d / %d / %d / %d\n", tk->type, tk->start, tk->end, tk->size ); + + float vals[3]; + int m; + for( m = 0; m < 3; m++ ) + { + tk++; + if( tk->type != 4 ) + { + fprintf( stderr, "Parse error.\n" ); + break; + } + printf( "%d\n", tk->type ); + } + } + /* We may additionally check if the value is either "true" or "false" */ +// printf("- CMap: %.*s\n", t[i+1].end-t[i+1].start, +// JSON_STRING + t[i+1].start); + } + } + return EXIT_SUCCESS; + + +} diff --git a/redist/test.config b/redist/test.config new file mode 100644 index 0000000..1c3108a --- /dev/null +++ b/redist/test.config @@ -0,0 +1,633 @@ +{ + "acc_bias": [ + 0.1572, + -0.02771, + -0.1465 + ], + "acc_scale": [ + 0.9991, + 0.9995, + 0.9959 + ], + "device": { + "eye_target_height_in_pixels": 1200, + "eye_target_width_in_pixels": 1080, + "first_eye": "eEYE_LEFT", + "last_eye": "eEYE_RIGHT", + "num_windows": 1, + "persistence": 0.011110999621450901, + "physical_aspect_x_over_y": 0.8999999761581421 + }, + "device_class": "hmd", + "device_pid": 8192, + "device_serial_number": "LHR-B4AB18B0", + "device_vid": 10462, + "display_edid": [ + "", + "" + ], + "display_gc": { + "black_clamp": 0.0117647061124444 + }, + "display_mc": { + "left": "Green_46GA16AL014122_mura_analyzes.mc", + "offset": -0.49803921580314636, + "right": "Green_46HA16AL015390_mura_analyzes.mc", + "scale": 0.125, + "type": 1 + }, + "gyro_bias": [ + -0.01786, + 0.01065, + -0.009912 + ], + "gyro_scale": [ + 1.0, + 1.0, + 1.0 + ], + "htcComposeTime": "2016-08-08 10:51:02.008000", + "l_revision": 12164, + "lens_separation": 0.06219471991062164, + "lighthouse_config": { + "channelMap": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31 + ], + "modelNormals": [ + [ + 0.6565292477607727, + 0.08003702759742737, + 0.7500423192977905 + ], + [ + 1, + 0, + 0 + ], + [ + 0.9510334134101868, + 0.1922958791255951, + -0.24198685586452484 + ], + [ + 0.8633409738540649, + 0.26114100217819214, + -0.43179601430892944 + ], + [ + 0.5620832443237305, + 0.8270804286003113, + -0.0007020003395155072 + ], + [ + 0.5567418932914734, + 0.8186168074607849, + -0.1410849690437317 + ], + [ + 0.12751400470733643, + 0.36096900701522827, + 0.9238190054893494 + ], + [ + 0.19732795655727386, + 0.7212077975273132, + 0.6640188097953796 + ], + [ + 0.19732792675495148, + -0.7205037474632263, + 0.6647827625274658 + ], + [ + 0.4602000117301941, + 0.003066000062972307, + 0.8878099918365479 + ], + [ + 0.025263000279664993, + -0.7483329772949219, + 0.6628419756889343 + ], + [ + 0.5567419528961182, + -0.8187658786773682, + -0.14021699130535126 + ], + [ + 0.5620829463005066, + -0.8270809054374695, + 0.00017499997920822352 + ], + [ + 0.8633410930633545, + -0.26159802079200745, + -0.4315190613269806 + ], + [ + 0.9510335326194763, + -0.19255191087722778, + -0.24178287386894226 + ], + [ + 0.6565289497375488, + -0.07924199104309082, + 0.7501268982887268 + ], + [ + -0.19732795655727386, + 0.7212077975273132, + 0.6640188097953796 + ], + [ + -0.12751400470733643, + 0.36096900701522827, + 0.9238190054893494 + ], + [ + -0.5567418932914734, + 0.8186168074607849, + -0.1410849690437317 + ], + [ + -0.5620832443237305, + 0.8270804286003113, + -0.0007020003395155072 + ], + [ + -0.8633409738540649, + 0.26114100217819214, + -0.43179601430892944 + ], + [ + -0.9510334134101868, + 0.1922958791255951, + -0.24198685586452484 + ], + [ + -1, + 0, + 0 + ], + [ + -0.6565292477607727, + 0.08003702759742737, + 0.7500423192977905 + ], + [ + -0.6565289497375488, + -0.07924199104309082, + 0.7501268982887268 + ], + [ + -0.9510335326194763, + -0.19255191087722778, + -0.24178287386894226 + ], + [ + -0.8633410930633545, + -0.26159802079200745, + -0.4315190613269806 + ], + [ + -0.5620829463005066, + -0.8270809054374695, + 0.00017499997920822352 + ], + [ + -0.5567419528961182, + -0.8187658786773682, + -0.14021699130535126 + ], + [ + -0.025263000279664993, + -0.7483329772949219, + 0.6628419756889343 + ], + [ + -0.4602000117301941, + 0.003066000062972307, + 0.8878099918365479 + ], + [ + -0.19732792675495148, + -0.7205037474632263, + 0.6647827625274658 + ] + ], + "modelPoints": [ + [ + 0.08529596030712128, + 0.016987130045890808, + 0.04625450819730759 + ], + [ + 0.09297396242618561, + -3.816593380179256e-05, + 0.03481875732541084 + ], + [ + 0.0865984782576561, + 0.01662817783653736, + 0.02058056741952896 + ], + [ + 0.0896914079785347, + 0.029333578422665596, + 0.02945086732506752 + ], + [ + 0.08003243058919907, + 0.04517722502350807, + 0.03477787971496582 + ], + [ + 0.051041457802057266, + 0.05250432714819908, + 0.033407505601644516 + ], + [ + 0.024352610111236572, + 0.019936595112085342, + 0.05934930220246315 + ], + [ + 0.04747076332569122, + 0.03348296880722046, + 0.05359809845685959 + ], + [ + 0.047707222402095795, + -0.03385186195373535, + 0.053591083735227585 + ], + [ + 0.057869475334882736, + -4.537412223726278e-06, + 0.056632302701473236 + ], + [ + 0.027427678927779198, + -0.05159146338701248, + 0.046743810176849365 + ], + [ + 0.05123027041554451, + -0.0528465174138546, + 0.03318343684077263 + ], + [ + 0.08045556396245956, + -0.04523739218711853, + 0.0347951278090477 + ], + [ + 0.0898326113820076, + -0.02926996909081936, + 0.029674140736460686 + ], + [ + 0.08679713308811188, + -0.016559496521949768, + 0.020654011517763138 + ], + [ + 0.08523146063089371, + -0.01709103211760521, + 0.046357400715351105 + ], + [ + -0.04777093604207039, + 0.03356654942035675, + 0.05359058827161789 + ], + [ + -0.02444354072213173, + 0.020076606422662735, + 0.05938776582479477 + ], + [ + -0.05102699249982834, + 0.0527305006980896, + 0.03319358080625534 + ], + [ + -0.08019497245550156, + 0.045236989855766296, + 0.03484406694769859 + ], + [ + -0.08976184576749802, + 0.02929999679327011, + 0.02958585135638714 + ], + [ + -0.08683834969997406, + 0.016578538343310356, + 0.020787812769412994 + ], + [ + -0.09312481433153152, + 0.0001750048977555707, + 0.03493703529238701 + ], + [ + -0.08524972200393677, + 0.017301730811595917, + 0.04634993150830269 + ], + [ + -0.08523391932249069, + -0.017099885269999504, + 0.04617205262184143 + ], + [ + -0.08670197427272797, + -0.016478901728987694, + 0.020614536479115486 + ], + [ + -0.08971264213323593, + -0.029298966750502586, + 0.029743636026978493 + ], + [ + -0.0803159773349762, + -0.04519243538379669, + 0.03466309234499931 + ], + [ + -0.050936102867126465, + -0.05280544236302376, + 0.033123407512903214 + ], + [ + -0.02723855897784233, + -0.051664549857378006, + 0.046714965254068375 + ], + [ + -0.05789601430296898, + -4.577871732180938e-05, + 0.0564543791115284 + ], + [ + -0.04756224900484085, + -0.03390718251466751, + 0.053489863872528076 + ] + ] + }, + "manufacturer": "HTC", + "mb_serial_number": "42JB167X03076", + "model_number": "Vive MV", + "render_model": "", + "revision": 1, + "tracking_to_eye_transform": [ + { + "distortion": { + "center_x": 0.09128676972995323, + "center_y": -0.003985467152131782, + "coeffs": [ + -0.2218608508704322, + -0.0314973006170816, + -0.03811043372221242, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "type": "DISTORT_DPOLY3" + }, + "distortion_blue": { + "center_x": 0.09128676972995323, + "center_y": -0.003985467152131782, + "coeffs": [ + -0.2596104389948281, + 0.0245967965162329, + -0.06998774577973522, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "type": "DISTORT_DPOLY3" + }, + "distortion_red": { + "center_x": 0.09128676972995323, + "center_y": -0.003985467152131782, + "coeffs": [ + -0.1857388028229403, + -0.08608016110632045, + -0.009303358857686194, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "type": "DISTORT_DPOLY3" + }, + "extrinsics": [ + [ + 1.0, + 0.0, + 0.0, + 0.03109734132885933 + ], + [ + 0.0, + 1.0, + 0.0, + -2.235174179077148e-08 + ], + [ + 0.0, + 0.0, + 1.0, + -7.450580596923828e-09 + ] + ], + "grow_for_undistort": 0.6000000238418579, + "intrinsics": [ + [ + 1.211890697479248, + 0.0, + -0.09128677099943161 + ], + [ + 0.0, + 1.09042501449585, + -0.003586920443922281 + ], + [ + 0.0, + 0.0, + -1.0 + ] + ], + "undistort_r2_cutoff": 1.140712738037109 + }, + { + "distortion": { + "center_x": -0.09042773927717189, + "center_y": -0.003588825103610428, + "coeffs": [ + -0.2167052617934642, + -0.03437283577629435, + -0.03870793318124786, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "type": "DISTORT_DPOLY3" + }, + "distortion_blue": { + "center_x": -0.09042773927717189, + "center_y": -0.003588825103610428, + "coeffs": [ + -0.2627621480864886, + 0.04275673251679024, + -0.08325460213609286, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "type": "DISTORT_DPOLY3" + }, + "distortion_red": { + "center_x": -0.09042773927717189, + "center_y": -0.003588825103610428, + "coeffs": [ + -0.1837002073444821, + -0.08437626940236018, + -0.01178900538780535, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "type": "DISTORT_DPOLY3" + }, + "extrinsics": [ + [ + 1.0, + 0.0, + 0.0, + -0.03109737858176231 + ], + [ + 0.0, + 1.0, + 0.0, + -2.235174179077148e-08 + ], + [ + 0.0, + 0.0, + 1.0, + -7.450580596923828e-09 + ] + ], + "grow_for_undistort": 0.6000000238418579, + "intrinsics": [ + [ + 1.208148002624512, + 0.0, + 0.09042774140834808 + ], + [ + 0.0, + 1.087613344192505, + -0.003229942638427019 + ], + [ + 0.0, + 0.0, + -1.0 + ] + ], + "undistort_r2_cutoff": 1.125258326530457 + } + ], + "trackref_from_head": [ + 0, + -1, + 0, + 0, + 0, + 0, + -0.021630236878991127 + ], + "trackref_from_imu": [ + 0, + 0, + -1, + 0, + -0.008495164103806019, + -0.004968234803527594, + 0.04987109825015068 + ], + "tracked_camera": +{ +"version":"1.0.6.0.4", +"pitch":0.021727, +"yaw":0.003637, +"roll":-0.002253, +"intrinsics": +{ +"width" :612, +"height" :460, +"center_x" :309.600128, +"center_y" :242.239990, +"focal_x" :283.000214, +"focal_y" :283.000214, +"distort": +{ +"center_x" :0.000000, +"center_y" :0.000000, +"coeffs" :[0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], +"type" :"DISTORT_FTHETA" +} +} +}, +"type": "Lighthouse_HMD" +} -- cgit v1.2.3