summaryrefslogtreecommitdiff
path: root/src/main.h
blob: d1932c8aa53226556ab9e9e2ded6c1f05ad7eca9 (plain)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#ifndef  main_INC
#define  main_INC

//#define USE_ROS            /* Uncomment to use with ROS */

#ifndef  USE_ROS
#include <cstdio>
#include <cstring>
#endif     /* -----  USE_ROS  ----- */

#include <cmath>
#include <Eigen/Dense>
#include <iostream>

#include "body.h"
#include "state.h"

#define MAXLINE 8192
#define MAXFILENAME 1024

// A struct for storing PVA covariance.
typedef struct {
    Eigen::Matrix3d position,velocity,attitude;
} covariance_t;

// A struct for storing x,y,z data.
typedef struct {
    double x,y,z;
} tuple;

// A struct for storing velocity in world frame
typedef struct {
    double east, north, up;
} velocity_t;

// A struct for storing attitude data.
typedef struct {
    double roll,pitch,yaw;
} attitude_t;

// A struct for storing UTM data.
typedef struct {
    double northing,easting,up;
    int zone_i;
    char zone_c;
} UTM;

// A struct for storing GPS data.
typedef struct {
    double latitude, longitude, altitude;
} gps;

// Message types
typedef enum {BESTUTM,IMG,INSCOVS,INSPVAS,RAWIMUS} message_type;

/*
 * The message struct is a general container for all message types. Not all
 * members are used for all messages, so care must be taken not to use garbage
 * values. 
 */
typedef struct {
    int secs,nsecs;
} timestamp;

typedef struct {
    // These should always be set.
    timestamp stamp;
    message_type msg_type;

    // Only the members needed by the msg_type are stored.
    tuple angular_velocity;
    attitude_t attitude;
    char image_names[2][MAXFILENAME];
    tuple linear_acceleration;
    gps position;
    UTM utm;
    velocity_t velocity;
    covariance_t covariance;
} message;

int parseLine(char *line, message *msg);
timestamp update_dt(const timestamp t, timestamp *t_old);

#ifdef  USE_ROS
void imuCallback();
#else      /* -----  not USE_ROS  ----- */
void covCallback(const message &msg, Eigen::Matrix<double,9,9> &P,
        const Eigen::Quaternion<double> &q);
void imgCallback(const message *msg);
void imuCallback(const message &msg, Eigen::Matrix<double,9,1> &X,
        Eigen::Matrix<double,9,9> &P, const Eigen::Quaternion<double> &q,
        const timestamp dt);
void pvaCallback(const message &msg, Eigen::Matrix<double,9,1> &X,
        Eigen::Quaternion<double> &q);
void utmCallback(const message &msg, Eigen::Matrix<double,9,1> &X);
#endif     /* -----  not USE_ROS  ----- */

#endif   /* ----- #ifndef main_INC  ----- */