00001
00002
00003
00004
00005
00006
00007
00008 #include <iostream>
00009 #include <string>
00010 #include "uvsim/navigation/Ins.h"
00011 #include "uvsim/navigation/GeoMag.h"
00012 #include "uvsim/utilities/utilities.h"
00013 #include "uvsim/visualization/Frame.h"
00014 #include <osg/PositionAttitudeTransform>
00015 #include <uvsim/navigation/KalmanFilter.h>
00016 #include <uvsim/dynamics/AhrsErrorDynamics.h>
00017 #include <boost/numeric/ublas/io.hpp>
00018 #include <iostream>
00019
00020 using namespace uvsim;
00021 using namespace boost::numeric::ublas;
00022
00023 vector<double> measure(Ins * ins);
00024
00025 int main()
00026 {
00027
00028 const static double insFreq = 500, dispFreq = 20, kfFreq = 300;
00029
00030
00031 vector<double> freqCutMb(3), freqCutFb(3), freqCutWb(3);
00032
00033
00034 freqCutMb(0) = 312;
00035 freqCutMb(1) = 312;
00036 freqCutMb(2) = 312;
00037
00038
00039 freqCutFb(0) = 350;
00040 freqCutFb(1) = 350;
00041 freqCutFb(2) = 150;
00042
00043
00044 freqCutWb(0) = 120;
00045 freqCutWb(1) = 120;
00046 freqCutWb(2) = 120;
00047
00048
00049 float dec, dip, ti, gv;
00050
00051
00052 float alt, glat, glon, time;
00053 alt = 184.7;
00054 glat = 40.41194444;
00055 glon = -86.93361111;
00056 time = 2009.7;
00057
00058
00059 Imu6DofSensor imu("/dev/rfcomm0", freqCutMb, freqCutFb, freqCutWb);
00060 Ins ins(std::string(DATADIR)+="/data/Ins15g.dat",
00061 std::string(DATADIR)+="/data/Gyro.dat",
00062 std::string(DATADIR)+="/data/Mag.dat",insFreq,&imu);
00063 ins.initializeStatic(alt,glat,glon);
00064
00065
00066 int n = 9;
00067 int m = 3;
00068 int p = 1;
00069
00070
00071 vector<double> x(n), w(n), v(m), y(m), u(p);
00072 matrix<double> P(n,n);
00073
00074
00075 x = zero_vector<double>(n);
00076 P = identity_matrix<double>(n)*0;
00077 y = zero_vector<double>(m);
00078 u = zero_vector<double>(p);
00079
00080
00081 vector<double> euler, eulerMag, dEuler;
00082 AhrsErrorDynamics md(&x, &u, &ins);
00083 md.initialize();
00084 KalmanFilter kf(&md, &y, &P);
00085 md.print();
00086 kf.print();
00087
00088
00089 osg::Vec3 center(0,0,0), eye(0,20,-10), up(0,0,-1);
00090 vector<double> pos(3);
00091 osgViewer::Viewer *viewer = new osgViewer::Viewer;
00092 viewer->setUpViewInWindow(0,0,300,300);
00093
00094
00095 osg::Group *root = new osg::Group;
00096 Frame *frame = new uvsim::Frame(5);
00097 osg::PositionAttitudeTransform *frameTrans = new osg::PositionAttitudeTransform;
00098 frameTrans->addChild(frame->root);
00099 root->addChild(frameTrans);
00100
00101 viewer->setSceneData(root);
00102 viewer->realize();
00103
00104
00105 for (int i=0; !viewer->done(); i++)
00106 {
00107
00108 if ((i % int(insFreq/kfFreq)) == 0)
00109 {
00110
00111 eulerMag = measure(&ins);
00112 euler = quat2Euler(ins.quat);
00113 dEuler = euler - eulerMag;
00114 y(0) = dEuler(2);
00115 y(1) = dEuler(1);
00116 y(2) = dEuler(0);
00117
00118
00119 x = zero_vector<double>(n);
00120 md.update();
00121 md.discretize(kfFreq,3);
00122 kf.update();
00123
00124
00125 vector<double> deltaEuler(3);
00126 deltaEuler(0) = x(2);
00127 deltaEuler(1) = x(1);
00128 deltaEuler(2) = x(0);
00129
00130 ins.quat = euler2Quat(quat2Euler(ins.quat) - deltaEuler);
00131
00132 ins.gyroM = ins.gyroM + subrange(x,6,9);
00133 ins.gyroB = ins.gyroB + subrange(x,3,6);
00134 }
00135
00136 if ((i % int(insFreq/dispFreq)) == 0)
00137 {
00138
00139 vector<double> quat = ins.getQuat();
00140 frameTrans->setAttitude(osg::Quat(quat(1),quat(2),quat(3),quat(0)));
00141 pos = ins.getGeo().getCartesian();
00142
00143
00144
00145 viewer->getCamera()->setViewMatrixAsLookAt(eye, center, up);
00146 viewer->frame();
00147
00148
00149 clear();
00150 ins.print();
00151
00152 kf.print();
00153 std::cout << "euler (deg) : " << euler*180/M_PI << std::endl;
00154 std::cout << "eulerMag (deg) : " << eulerMag*180/M_PI << std::endl;
00155 std::cout << "y (deg) : " << y*180/M_PI << std::endl;
00156 }
00157
00158
00159 ins.update();
00160
00161 ins.velocity = zero_vector<double>(3);
00162 ins.longitude = ins.longitudeInit;
00163 ins.latitude = ins.latitudeInit;
00164 ins.altitude = ins.altitudeInit;
00165 }
00166 ins.stop();
00167 return(0);
00168 }
00169
00170 vector<double> measure(Ins * ins)
00171 {
00172
00173
00174 vector<double> axis0(3), axis1(3), quatMag(4), quat0(4), quat1(4),
00175 magTempFrame(3), unit_x(3), unit_z(3);
00176 double angle0, angle1;
00177
00178
00179 unit_z(0) = 0;
00180 unit_z(1) = 0;
00181 unit_z(2) = 1;
00182 unit_x(0) = 1;
00183 unit_x(1) = 0;
00184 unit_x(2) = 0;
00185
00186
00187 axis0 = norm(crossProd(-ins->accel, unit_z));
00188 angle0 = acos(inner_prod(-norm(ins->accel), unit_z));
00189 quat0 = axisAngle2Quat(axis0, angle0);
00190
00191
00192 magTempFrame = quatRotate(quat0, ins->mag);
00193 magTempFrame(2) = 0;
00194 magTempFrame = norm(magTempFrame);
00195 axis1 = norm(crossProd(magTempFrame, unit_x));
00196 angle1 = acos(inner_prod(unit_x, magTempFrame)) + M_PI/180*ins->geoMag->dec;
00197 quat1 = axisAngle2Quat(axis1, angle1);
00198
00199
00200 quatMag = quatProd(quat1,quat0);
00201 quatMag = norm(quatMag);
00202 return quat2Euler(quatMag);
00203 }
00204
00205