void computeSparseAWpB( double *A, NumericsMatrix *W, double *B, NumericsMatrix *AWpB) { /* unsigned int problemSize = W->size0; */ SparseBlockStructuredMatrix* Wb = W->matrix1; assert((unsigned)W->size0 >= 3); assert((unsigned)W->size0 / 3 >= Wb->filled1 - 1); double Ai[9], Bi[9], tmp[9]; for (unsigned int row = 0, ip9 = 0, i0 = 0; row < Wb->filled1 - 1; ++row, ip9 += 9, i0 += 3) { assert(ip9 < 3 * (unsigned)W->size0 - 8); extract3x3(3, ip9, 0, A, Ai); extract3x3(3, ip9, 0, B, Bi); for (unsigned int blockn = (unsigned int) Wb->index1_data[row]; blockn < Wb->index1_data[row + 1]; ++blockn) { unsigned int col = (unsigned int) Wb->index2_data[blockn]; mm3x3(Ai, Wb->block[blockn], tmp); if (col == row) add3x3(Bi, tmp); cpy3x3(tmp, AWpB->matrix1->block[blockn]); } } /* Invalidation of sparse storage, if any. */ if (AWpB->matrix2) { if (AWpB->matrix2->triplet) { cs_spfree(AWpB->matrix2->triplet); AWpB->matrix2->triplet = NULL; } if (AWpB->matrix2->csc) { cs_spfree(AWpB->matrix2->csc); AWpB->matrix2->csc = NULL; } if (AWpB->matrix2->trans_csc) { cs_spfree(AWpB->matrix2->trans_csc); AWpB->matrix2->trans_csc = NULL; } } }
void computeDenseAWpB( double *A, NumericsMatrix *W, double *B, NumericsMatrix *AWpB) { unsigned problemSize = W->size0; double* result = AWpB->matrix0; double* Wx = W->matrix0; assert(problemSize >= 3); double Wij[9], Ai[9], Bi[9], tmp[9]; for (unsigned int ip3 = 0, ip9 = 0; ip3 < problemSize; ip3 += 3, ip9 += 9) { assert(ip9 < 3 * problemSize - 8); extract3x3(3, ip9, 0, A, Ai); extract3x3(3, ip9, 0, B, Bi); for (unsigned int jp3 = 0; jp3 < problemSize; jp3 += 3) { assert(jp3 < problemSize - 2); assert(ip3 < problemSize - 2); extract3x3(problemSize, ip3, jp3, Wx, Wij); mm3x3(Ai, Wij, tmp); if (jp3 == ip3) add3x3(Bi, tmp); insert3x3(problemSize, ip3, jp3, result, tmp); } } }
int LocalNonsmoothNewtonSolver(FrictionContactProblem* localproblem, double * R, int *iparam, double *dparam) { double mu = localproblem->mu[0]; double * qLocal = localproblem->q; double * MLocal = localproblem->M->matrix0; double Tol = dparam[0]; double itermax = iparam[0]; int i, j, k, inew; // store the increment double dR[3] = {0., 0., 0.}; // store the value fo the function double F[3] = {0., 0., 0.}; // Store the (sub)-gradient of the function double A[9] = {0., 0., 0., 0., 0., 0., 0., 0., 0.}; double B[9] = {0., 0., 0., 0., 0., 0., 0., 0., 0.}; // Value of AW+B double AWplusB[9] = {0., 0., 0., 0., 0., 0., 0., 0., 0.}; // Compute values of Rho (should be here ?) double rho[3] = {1., 1., 1.}; #ifdef OPTI_RHO computerho(localproblem, rho); #endif // compute the velocity double velocity[3] = {0., 0., 0.}; for (i = 0; i < 3; i++) velocity[i] = MLocal[i + 0 * 3] * R[0] + qLocal[i] + MLocal[i + 1 * 3] * R[1] + + MLocal[i + 2 * 3] * R[2] ; for (inew = 0 ; inew < itermax ; ++inew) // Newton iteration { //Update function and gradient Function(R, velocity, mu, rho, F, A, B); #ifndef AC_Generated #ifndef NDEBUG double Fg[3] = {0., 0., 0.}; double Ag[9] = {0., 0., 0., 0., 0., 0., 0., 0., 0.}; double Bg[9] = {0., 0., 0., 0., 0., 0., 0., 0., 0.}; double AWpB[9]; assert(*rho > 0. && *(rho + 1) > 0. && *(rho + 2) > 0.); #ifdef AC_STD frictionContact3D_AlartCurnierFunctionGenerated(R, velocity, mu, rho, Fg, Ag, Bg); #endif #ifdef AC_JeanMoreau frictionContact3D_AlartCurnierJeanMoreauFunctionGenerated(R, velocity, mu, rho, Fg, Ag, Bg); #endif sub3(F, Fg); sub3x3(A, Ag); sub3x3(B, Bg); assert(hypot3(Fg) <= 1e-7); assert(hypot9(Ag) <= 1e-7); assert(hypot9(Bg) <= 1e-7); cpy3x3(A, Ag); cpy3x3(B, Bg); mm3x3(A, MLocal, AWpB); add3x3(B, AWpB); #endif #endif // compute -(A MLocal +B) for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { AWplusB[i + 3 * j] = 0.0; for (k = 0; k < 3; k++) { AWplusB[i + 3 * j] -= A[i + 3 * k] * MLocal[k + j * 3]; } AWplusB[i + 3 * j] -= B[i + 3 * j]; } } #ifdef AC_STD #ifndef NDEBUG scal3x3(-1., AWpB); sub3x3(AWplusB, AWpB); assert(hypot9(AWpB) <= 1e-7); #endif #endif // Solve the linear system solv3x3(AWplusB, dR, F); // upate iterates R[0] += dR[0]; R[1] += dR[1]; R[2] += dR[2]; // compute new residue for (i = 0; i < 3; i++) velocity[i] = MLocal[i + 0 * 3] * R[0] + qLocal[i] + MLocal[i + 1 * 3] * R[1] + + MLocal[i + 2 * 3] * R[2] ; Function(R, velocity, mu, rho, F, NULL, NULL); dparam[1] = 0.5 * (F[0] * F[0] + F[1] * F[1] + F[2] * F[2]) / (1.0 + sqrt(R[0] * R[0] + R[1] * R[1] + R[2] * R[2])) ; // improve with relative tolerance /* dparam[2] =0.0; FrictionContact3D_unitary_compute_and_add_error( R , velocity,mu, &(dparam[2]));*/ if (verbose > 1) printf("----------------------------------- LocalNewtonSolver number of iteration = %i error = %.10e \n", inew, dparam[1]); if (dparam[1] < Tol) { /* printf("----------------------------------- LocalNewtonSolver number of iteration = %i error = %.10e \t error2 = %.10e \n",inew,dparam[1], dparam[2]); */ return 0; } }// End of the Newton iteration /* printf("----------------------------------- LocalNewtonSolver number of iteration = %i error = %.10e \t error2 = %.10e \n",inew,dparam[1], dparam[2]); */ return 1; }
void kf(float prevCov[3][3], algp1_msgs::Pose2DWithCovariance action, algp1_msgs::Pose2DWithCovariance measure){ bool kill = false; if(kalmanIteration > 30){ //Base case death kill = true; } //The initial state prediction goes here float X_o [3]={ 1, 1, 0 }; float Z_n [3]; Z_n[0] = sense_model_.pose2d.x; Z_n[1] = sense_model_.pose2d.y; Z_n[2] = sense_model_.pose2d.theta; float A [3][3] = {{ 1, 0, 0}, { 0, 1, 0}, { 0, 0, 1}}; float A_t [3][3] = {{ 1, 0, 0}, { 0, 1, 0}, { 0, 0, 1}}; float H [3][3] = {{ 1, 0, 0}, //plz make this stay I so everything below works { 0, 1, 0}, { 0, 0, 1}}; float P [3][3]; for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ P[i][j] = prevCov[i][j]; } } float Q [3][3] = {{ 0.01, 0, 0}, { 0, 0.01, 0}, { 0, 0, 0.01}}; float R [3][3] = {{ 1, 0, 0}, { 0, 1, 0}, { 0, 0, 1}}; float I [3][3] = {{ 1, 0, 0}, { 0, 1, 0}, { 0, 0, 1}}; //------ State prediction (from velocity model) float X_p[2]; X_p[0] = action.pose2d.x; X_p[1] = action.pose2d.y; X_p[2] = action.pose2d.theta; //------ Covariance Prediction float APnm1[3][3]; multiply3x3(APnm1, A, P); float APnm1At[3][3]; multiply3x3(APnm1At, APnm1, A_t); float P_p[3][3]; add3x3(P_p, APnm1At, Q); //------Innovation float Y_tilde[3]; sub3x1(Y_tilde, Z_n, X_p); //NOTE: In a fully implemented kalman filter where H is not [I], this step is incorrect. //------Innovation Covariance float HP_p[3][3]; multiply3x3(HP_p, H, P_p); float HP_pHt[3][3]; multiply3x3(HP_pHt, HP_p, H); //NOTE: In this case I assume H = H^T float S[3][3]; add3x3(S, HP_pHt, R); //------Kalman Gain float S_inv[3][3]; try{ InvMatrix(S, S_inv); } catch(const char* errorMessage){ std::cout << errorMessage << "\n"; } float P_pHt [3][3]; multiply3x3(P_pHt, P_p, H);//NOTE: In this case I assume H = H^T float K[3][3]; multiply3x3(K, P_pHt, S_inv); //------State update (yay!) float Ky[3]; multiply3x1and3x3(Ky, K, Y_tilde); float X_n[3]; //New state! add3x1(X_n, X_p, Ky); //------Covariance update (yay yay!) float KH[3][3]; multiply3x3(KH, K, H); float IminusKH[3][3]; sub3x3(IminusKH, I, KH); float P_n[3][3]; multiply3x3(P_n, IminusKH, P_p); //Publish state update algp1_msgs::Pose2DWithCovariance state; geometry_msgs::PoseStamped stamped; state.pose2d.x = X_n[0]; state.pose2d.y = X_n[1]; state.pose2d.theta = X_n[2]; stamped.pose.position.x = X_n[0]; stamped.pose.position.y = X_n[1]; stamped.header.seq = 0; stamped.header.stamp = ros::Time::now(); stamped.header.frame_id = "map_static"; state.covariance[0] = P_n[0][0]; state.covariance[1] = P_n[0][1]; state.covariance[2] = P_n[0][2]; state.covariance[3] = P_n[1][0]; state.covariance[4] = P_n[1][1]; state.covariance[5] = P_n[1][2]; state.covariance[6] = P_n[2][0]; state.covariance[7] = P_n[2][1]; state.covariance[8] = P_n[2][2]; std::cout << "xn"<< std::endl; for (int foo = 0; foo < 3; foo++) { std::cout << X_n[foo] << " "; std::cout << "\n"; } std::cout << std::endl; std::cout << "pn"<< std::endl; print3x3(P_n); pub_state_.publish(state); pub_stamp_.publish(stamped); ROS_INFO("pub'd"); kalmanIteration++; ros::spinOnce(); ros::Duration(.7).sleep(); if(!kill) kf(P_n, vel_model_, sense_model_); //keep repeating until base case has been met }