summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorMartin Miller2017-03-18 20:32:08 -0500
committerMartin Miller2017-03-18 20:32:08 -0500
commit816411abf8e9ff633a29449cc0ac445c11f73a1c (patch)
tree6e388395e8a5a56024113661da0bcacd5b7d8287 /src/main.cpp
parentc0727bbe1404e788b4ae82f6c6d99e105ecfacdf (diff)
downloadrefslam-816411abf8e9ff633a29449cc0ac445c11f73a1c.zip
refslam-816411abf8e9ff633a29449cc0ac445c11f73a1c.tar.gz
Major rewrite moves state variables into state.
Rather than maintain X and P in the main function they are moved into the body and state classes, respectively. This will become much more important when features are added and the accounting becomes more complicated.
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp83
1 files changed, 33 insertions, 50 deletions
diff --git a/src/main.cpp b/src/main.cpp
index c3c6fa9..6cc4317 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -22,6 +22,7 @@
#include "main.h"
bool seenutm=false;
bool seenpva=false;
+bool seencov=false;
using std::cout;
using std::endl;
using std::cerr;
@@ -30,15 +31,15 @@ using std::cerr;
#else /* ----- not USE_ROS ----- */
void
-covCallback(const message &msg, Matrix<double,9,9> &P, const Quaternion<double> &q)
+covCallback(const message &msg, State &mu, const Quaternion<double> &q)
{
- if (seenutm==false || seenpva==false) {
- Matrix3d Rbw(q.toRotationMatrix());
- Matrix3d Renuned;
- Renuned << 0.,1.,0.,1.,0.,0.,0.,0.,-1;
- P.block(0,0,3,3) = Renuned*msg.covariance.position*Renuned.transpose();
- P.block(3,3,3,3) = Rbw.transpose()*msg.covariance.velocity*Rbw;
- }
+ if (seencov && seenutm && seenpva) return;
+ seencov=true;
+ Matrix3d Rbw(q.toRotationMatrix());
+ Matrix3d Renuned;
+ Renuned << 0.,1.,0.,1.,0.,0.,0.,0.,-1;
+ mu.position_covariance(Renuned*msg.covariance.position*Renuned.transpose());
+ mu.velocity_covariance(Rbw.transpose()*msg.covariance.velocity*Rbw);
}
void
@@ -48,28 +49,21 @@ imgCallback(const message *msg)
}
void
-imuCallback(const message &msg, Matrix<double,9,1> &X,
- Matrix<double,9,9> &P, const Quaternion<double> &q,
- const timestamp dt)
+imuCallback(const message &msg, State &mu, const Quaternion<double> &q, const timestamp dt)
{
- if (!seenutm || !seenpva || (dt.secs==0 && dt.nsecs==0)) return;
+ if (!seenutm || !seenpva || !seencov || (dt.secs==0 && dt.nsecs==0)) return;
Vector3d acc(msg.linear_acceleration.y,msg.linear_acceleration.x,-msg.linear_acceleration.z);
Vector3d ang(msg.angular_velocity.y,msg.angular_velocity.x,-msg.angular_velocity.z);
// WARNING: This is the bias for 1112-1
Vector3d ang_bias(-2.795871394666666222e-03, 6.984255690000021506e-03, 1.418145565750002614e-03);
- ang-=ang_bias;
- Body body;
- State mu;
+ ang -= ang_bias;
double dtf = dt.secs+dt.nsecs*1e-9;
- Matrix<double,9,9> F;
- F = body.F(X,ang,q);
- mu.Pkk1(P,F,body.Q(dtf));
- body.motionModel(X,acc,ang,q,dtf);
+ mu.motionModel(acc,ang,q,dtf);
}
void
-pvaCallback(const message &msg, Matrix<double,9,1> &X, Quaternion<double> &q)
+pvaCallback(const message &msg, State &mu, Quaternion<double> &q)
{
// Update quaternion
using Eigen::AngleAxisd;
@@ -85,31 +79,24 @@ pvaCallback(const message &msg, Matrix<double,9,1> &X, Quaternion<double> &q)
q = Quaternion<double>(R);
// Set body velocity
- if (!seenpva) {
+ if (!seenpva || !seencov || !seenutm) {
Vector3d vw(msg.velocity.north,msg.velocity.east,-msg.velocity.up);
- X.segment(3,3) = R.transpose()*vw;
+ mu.vel(R.transpose()*vw);
seenpva=true;
}
return;
}
void
-utmCallback(const message &msg, Matrix<double,9,1> &X, Matrix<double,9,9> &P)
+utmCallback(const message &msg, State &mu)
{
- if (!seenutm) {
+ if (!seenutm || !seencov || !seenpva) {
seenutm=true;
- X[0] = msg.utm.northing;
- X[1] = msg.utm.easting;
- X[2] = -msg.utm.up;
+ mu.enu(msg.utm);
} else { // Perform Z measurement
- State mu;
- Body body;
- Matrix<double,1,1> z,h;
- Matrix<double,1,9> H;
- z(0) = -msg.utm.up;
- h = body.h(X);
- body.H(H);
- mu.update(X,P,H,h,z,body.R());
+ Matrix<double,1,1> z;
+ z << -msg.utm.up;
+ mu.update(z);
}
return;
}
@@ -229,11 +216,12 @@ update_dt(const timestamp t, timestamp *t_old)
int
main(int argc, char **argv)
{
+ State mu;
Quaternion<double> qbw;
- Matrix<double,9,1> bodyStateVector;
- Matrix<double,9,9> P;
// bias in FRD coordinates
- bodyStateVector.segment(6,3) << -0.03713532, 1.125*0.01465135, -1*-0.00709229;
+ Vector3d acc_bias;
+ acc_bias << -0.03713532, 1.125*0.01465135, -1*-0.00709229;
+ mu.accelerometer_bias(acc_bias);
timestamp dt{0,0};
timestamp t_old{0,0};
@@ -249,8 +237,7 @@ while (scanf("%s", line)!=EOF) {
switch ( msg.msg_type ) {
case BESTUTM:
- dt = update_dt(msg.stamp, &t_old);
- utmCallback(msg,bodyStateVector,P);
+ utmCallback(msg, mu);
break;
case IMG:
@@ -258,23 +245,19 @@ while (scanf("%s", line)!=EOF) {
break;
case INSPVAS:
- dt = update_dt(msg.stamp, &t_old);
- pvaCallback(msg, bodyStateVector, qbw);
- //std::cout << bodyStateVector.transpose() << std::endl;
- if (seenutm)
- printf("%d,%c,%f,%f,%f,%f,%f,%f,%f,%f,%f\n", msg.utm.zone_i,msg.utm.zone_c,
- bodyStateVector[0],bodyStateVector[1],-bodyStateVector[2],
- bodyStateVector[3],bodyStateVector[4],bodyStateVector[5],
- bodyStateVector[6],bodyStateVector[7],bodyStateVector[8]);
+ pvaCallback(msg, mu, qbw);
+ if (seenutm && seencov && seenpva)
+ mu.unicsv();
break;
case RAWIMUS:
dt = update_dt(msg.stamp, &t_old);
- imuCallback(msg, bodyStateVector, P, qbw, dt);
+ imuCallback(msg, mu, qbw, dt);
break;
case INSCOVS:
- covCallback(msg, P, qbw);
+ covCallback(msg, mu, qbw);
+ break;
default:
break;