// // Created by ivan on 17.01.2022. // #include "processing_functions.h" vector operator + (vector& lhs, vector& rhs){ for (int i=0; i < lhs.size(); i++){ lhs[i] += rhs[i]; } return lhs; } vector operator + (vector& lhs, float rhs){ for (float & lh : lhs){ lh += rhs; } return lhs; } vector operator - (vector& lhs, float rhs){ for (float & lh : lhs){ lh -= rhs; } return lhs; } vector operator - (vector& arg){ for (auto& el : arg){ el = -el; } return arg; } vector operator - (vector& lhs, vector& rhs){ for (int i=0; i operator * (vector& lhs, float rhs){ for (float & lh : lhs){ lh *= rhs; } return lhs; } bool operator == (vector& lhs, float rhs){ bool flag = true; for (auto& lh : lhs){ if (lh != rhs){ flag = false; } } return flag; } void calc_avg_velocity(const vector>& recent_velocities, vector& avg_velocity){ float avgX = 0, avgY = 0, avgZ = 0; for (const auto & recent_velocitie : recent_velocities){ avgX += recent_velocitie[0]; avgY += recent_velocitie[1]; avgZ += recent_velocitie[2]; } auto mysize = recent_velocities.size(); cout << "mysize is: " << mysize; avgX /= (float)mysize; avgY /= (float)mysize; avgZ /= (float)mysize; avg_velocity[0] = avgX; avg_velocity[1] = avgY; avg_velocity[2] = avgZ; cout << "calc_avg_velocity success" << endl; } // avg_velocity is a vector, since we need the average speed for axes XYZ. void calculate_velocity(const vector>& recent_values, vector& avg_velocity){ vector> recent_velocities; cout << "recent_values size: " << recent_values.size() << " recent_velocities size: " << recent_velocities.size() << endl; for (int i=(int)recent_values.size()-1; i>0; i--){ vector lhs = recent_values[i]; vector rhs = recent_values[i-1]; vector diff = lhs - rhs; recent_velocities.push_back(diff); } cout << "for loop success" << endl; cout << "recent_values size: " << recent_values.size() << " recent_velocities size: " << recent_velocities.size() << endl; // cout << "recent_velocities are: " << recent_velocities[0][0] << recent_velocities[1][0] << recent_velocities[2][0]; calc_avg_velocity(recent_velocities, avg_velocity); cout << "calculate_velocity success" << endl; } void process_lost_euler(vector& euler_prev, vector& euler_now, int recent_values_desired_length, const vector>& recent_values, vector& avg_velocity){ // Если каждый элемент вектора равен нулю. bool empty_velocity = avg_velocity == 0.0; float epsilon = 0.2; cout << "compar_result success" << endl; if (recent_values.size() == recent_values_desired_length and empty_velocity){ cout << "Entered first if" << endl; calculate_velocity(recent_values, avg_velocity); cout << "calculate_velocity success" << endl; } if (!empty_velocity){ cout << "entered second if" << endl; if ( abs((recent_values[recent_values.size() - 1][1] - recent_values[recent_values.size() - 2][1])) < epsilon ){ euler_now = euler_prev; } else{ euler_now = euler_prev + avg_velocity; } cout << "vector summation success" << endl; } euler_prev = euler_now; cout << "process_lost_euler success" << endl; } void fill_recent_values(const vector& value, vector>& recent_values, int length){ if (recent_values.size() != length) { recent_values.push_back(value); } else{ recent_values.erase(recent_values.begin()); recent_values.push_back(value); } cout << "fill_recent_values success" << endl; } void process_euler(std::vector& euler_prev, std::vector& euler_now, std::vector& skew_angle, std::vector& all_maps_id, int& prevID, int& currID, vector& avg_velocity){ if (currID != prevID){ if ( std::find(all_maps_id.begin(), all_maps_id.end(), currID) == all_maps_id.end() ){ skew_angle = euler_prev; euler_now = euler_now + skew_angle; all_maps_id.push_back(currID); } else{ euler_now = euler_now + skew_angle; } } else{ euler_now = euler_now + skew_angle; } euler_prev = euler_now; prevID = currID; bool compar_result = avg_velocity == 0.0; if (!compar_result){ avg_velocity[0] = 0.0; avg_velocity[1] = 0.0; avg_velocity[2] = 0.0; } cout << "process_euler success" << endl; } // For Monocular and Monocular-Inertial processing. 10.02.2022. Podmogilnyi Ivan cv::Mat& extract_rot(cv::Mat& rot, const cv::Mat& trans) { // cv::Mat rot(3, 3, CV_32F, 0.0); for (int row = 0; row < 3; ++row) { for (int col = 0; col < 3; ++col) { rot.at(row, col) = trans.at(row, col); } } return rot; } vector& extract_translation(vector& transl, const cv::Mat& tcw) { for (int row=0; row<3; ++row){ transl[row] = tcw.at(row, 3); } return transl; } bool isMatEmpty(const cv::Mat& mat){ for (int i=0; i(i, j) != 0.0f ){ return false; } } } return true; } bool isMatEye(const cv::Mat& mat){ cv::Mat eye = cv::Mat::eye(mat.rows, mat.cols, CV_32F); for (int i=0; i(i, j) != eye.at(i, j) ){ return false; } } } return true; }