int test() { time_t t; t = time(NULL); srand(unsigned(t)); Matrix3 R0; Vector3 Vrl0, axis0, ori, theta0; AngleAxis j0; /// The number of samples const unsigned kmax=2000; ///sampling period const double dt=5e-3; ///Sizes of the states for the state, the measurement, and the input vector const unsigned stateSize=18; const unsigned measurementSize=6; const unsigned inputSize=48; (void)measurementSize; ///The array containing all the states, the measurements and the inputs IndexedVectorArray x; IndexedVectorArray u; ///simulation of the signal /// the IMU dynamical system functor flexibilityEstimation::IMUElasticLocalFrameDynamicalSystem imu(dt); imu.setInputSize(inputSize); ///the simulator initalization DynamicalSystemSimulator sim; sim.setDynamicsFunctor(& imu); // choice of the dynamical system //std::cout << "hello" << std::endl; /// Input initialization Vector6 Inert; Vector uk=Vector::Zero(imu.getInputSize(),1); // // Inertia, the robot is considered as a full cylindar // Inert << 0.25*hrp2::m*hrp2::R*hrp2::R+0.33*hrp2::m*hrp2::H*hrp2::H, 0.25*hrp2::m*hrp2::R*hrp2::R+0.33*hrp2::m*hrp2::H*hrp2::H, 0.5*hrp2::m*hrp2::R*hrp2::R, 0.0, 0.0, 0.0; // uk.segment(input::Inertia,6)=Inert; // // // Contacts // imu.setContactsNumber(1); // uk.segment(input::contacts,6) << 0.0094904630937003645, -0.095000000000000001, 1.9819700013135044e-07,0,0,0; // uk.segment(input::contacts+6,6) << 0.0094904630936998632, 0.095000000000000001, 1.9819700018686159e-07,0,0,0; // // // Input init // uk.segment(input::posCom,3) << 0, // 0, // 0.80771;//hrp2::H*0.5; // // uk.segment(input::accCom,3) << 0, // 0, // -9.8; uk << 0.0135672, 0.001536, 0.80771, -2.50425e-06, -1.03787e-08, 5.4317e-08, -2.50434e-06, -1.03944e-08, 5.45321e-08, 48.1348, 46.9498, 1.76068, -0.0863332, -0.59487, -0.0402246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.098, -1.21619e-10, 1.1174, 3.06752e-22, -1.06094e-20, 7.75345e-22, -2.84609e-06, -1.18496e-08, -4.52691e-18, 2.95535e-20, -1.0346e-18, 7.58731e-20, -0.000284609, -1.18496e-06, -4.52691e-16, 0.0094904630937003645, 0,//-0.15000000000000001, 1.9819700013135044e-07, 0, 0, 0; // 0.0094904630936998632, // 0.15000000000000001, // 1.9819700018686159e-07, // 0, // 0, // 0; // // contacts position // double angleZ; // angleZ=-PI/4; // // Vector6 v1, v2; // v1 << -0.095*tan(angleZ),//0.0094904630936998632, // 0.095000000000000001, // 1.9819700018686159e-07, // 0, // 0, // angleZ; // // v2 << 0.095*tan(angleZ),//0.0094904630936998632+ // -0.095000000000000001, // 1.9819700018686159e-07, // 0, // 0, // angleZ; // // Matrix4 cont1, cont2; // cont1=kine::vector6ToHomogeneousMatrix(v1); // cont2=kine::vector6ToHomogeneousMatrix(v2); // uk.segment(input::contacts,6) << cont1(0,3), cont1(1,3), cont1(2,3), cont1(1,2), cont1(0,2), cont1(0,1);//0.0094904630937003645, -0.095000000000000001, 1.9819700013135044e-07,0,0,0; // uk.segment(input::contacts+6,6) << cont2(0,3), cont2(1,3), cont2(2,3), cont2(1,2), cont2(0,2), cont2(0,1);//0.0094904630936998632, 0.095000000000000001, 1.9819700018686159e-07,0,0,0; // std::cout << uk.transpose() << std::endl; // for (i=0;i<uk.size();++i) // { // if(uk(i)<0.001 && uk(i)>-0.001) // { // uk(i)=0.0; // } // } /// State initialization Vector x0=(Vector::Zero(stateSize,1)); x0.segment(indexes::pos,3) << 0, 0, 0;//-9.8*hrp2::m / (2*hrp2::linKe); // flexibility excited by the weight // To put a well interpretable excitation despite of a rotated axe for the abnkles. std::cout << "hello" << std::endl; // ori << 0;//-2*PI/180, // 0;//2*PI/180, // 0; // h=rotationMatrixFromContactsPositionKine(uk.segment(input::contacts,6),uk.segment(input::contacts+6,6),R0); // x0.segment(kine::ori,3) << R0.transpose()*ori; // x0.segment(kine::ori,3) << ori; // for (i=0;i<x0.size();++i) // { // if(x0(i)<0.1 && x0(i)>-0.1) // { // x0(i)=0.0; // } // } sim.setState(x0,0); for (int k=0;k<10;++k) { u.setValue(uk,k); ///give the input to the simulator ///we only need to give one value and the ///simulator takes automatically the appropriate value sim.setInput(uk,k); } ///set the sampling perdiod to the functor imu.setSamplingPeriod(dt); sim.simulateDynamicsTo(kmax); x = sim.getStateArray(1,kmax); x.writeInFile("state.dat"); u.writeInFile("input.dat"); //std::cout <<x[kmax].norm ()<< " "<< x[kmax].transpose() << std::endl; //imu.test(); // test unitaires return 0; }
int testDerivator() { /// The number of samples const unsigned kmax=3000; ///sampling period const double dt=1e-3; ///Sizes of the states for the state, the measurement, and the input vector const unsigned stateSize=18; const unsigned measurementSize=6; //const unsigned inputSize=6; ///The array containing all the states, the measurements and the inputs IndexedMatrixArray x; IndexedMatrixArray y; IndexedMatrixArray u; ///The covariance matrix of the process noise and the measurement noise Matrix q; Matrix r; { ///simulation of the signal /// the IMU dynamical system functor IMUDynamicalSystem imu; ///The process noise initialization Matrix q1=Matrix::Identity(stateSize,stateSize)*0.00; GaussianWhiteNoise processNoise(imu.getStateSize()); processNoise.setStandardDeviation(q1); imu.setProcessNoise( & processNoise ); q=q1*q1.transpose(); ///The measurement noise initialization Matrix r1=Matrix::Identity(measurementSize,measurementSize)*0.0; GaussianWhiteNoise MeasurementNoise(imu.getMeasurementSize()); MeasurementNoise.setStandardDeviation(r1); imu.setMeasurementNoise( & MeasurementNoise ); r=r1*r1.transpose(); ///the simulator initalization DynamicalSystemSimulator sim; sim.setDynamicsFunctor(&imu); ///initialization of the state vector Vector x0=Vector::Zero(stateSize,1); sim.setState(x0,0); ///construction of the input /// the input is constant over 10 time samples for (unsigned i=0;i<kmax/10;++i) { Vector uk=Vector::Zero(imu.getInputSize(),1); uk[0]=0.4 * sin(M_PI/10*i); uk[1]=0.6 * sin(M_PI/12*i); uk[2]=0.2 * sin(M_PI/5*i); uk[3]=10 * sin(M_PI/12*i); uk[4]=0.07 * sin(M_PI/15*i); uk[5]=0.05 * sin(M_PI/5*i); ///filling the 10 time samples of the constant input for (int j=0;j<10;++j) { u.setValue(uk,i*10+j); } ///give the input to the simulator ///we only need to give one value and the ///simulator takes automatically the appropriate value sim.setInput(uk,10*i); } ///set the sampling perdiod to the functor imu.setSamplingPeriod(dt); ///launched the simulation to the time kmax+1 sim.simulateDynamicsTo(kmax+1); ///extract the array of measurements and states y = sim.getMeasurementArray(1,kmax); x = sim.getStateArray(1,kmax); } IndexedMatrixArray dta; for (unsigned i=x.getFirstIndex() ; i<=x.getLastIndex() ; ++i) { Vector xi = Vector::Zero(6,1); xi.head(3) = Vector(x[i]).segment(kine::pos,3); xi.tail(3) = Vector(x[i]).segment(kine::ori,3); dta.setValue(xi,i); } IndexedMatrixArray state = kine::reconstructStateTrajectory(dta,dt); ///file of output std::ofstream f; f.open("trajectory.dat"); for (unsigned i=x.getFirstIndex() ; i<=x.getLastIndex() ; ++i) { //f<<dta[i].transpose()<<"\t#####\t\t"<<Vector(Vector(x[i]).segment(9,3)).transpose()<<"\t#####\t\t"<<(x[i]-state[i]).transpose()<<std::endl; f<<(x[i]-state[i])<<std::endl<<std::endl; } return 0; }