removed resizing not correcting for photometric info, added N as global variable

This commit is contained in:
Raphael Maenle 2019-04-26 09:44:19 +02:00
parent e2e936ff01
commit e8489dbd06
4 changed files with 33 additions and 46 deletions

View File

@ -126,7 +126,7 @@ struct Feature {
*/ */
bool initializeAnchor( bool initializeAnchor(
const CameraCalibration& cam); const CameraCalibration& cam, int N);
/* /*
@ -491,12 +491,10 @@ Eigen::Vector3d Feature::projectPixelToPosition(cv::Point2f in_p,
//@test center projection must always be initial feature projection //@test center projection must always be initial feature projection
bool Feature::initializeAnchor( bool Feature::initializeAnchor(
const CameraCalibration& cam) const CameraCalibration& cam, int N)
{ {
//initialize patch Size //initialize patch Size
//TODO make N size a ros parameter
int N = 3;
int n = (int)(N-1)/2; int n = (int)(N-1)/2;
auto anchor = observations.begin(); auto anchor = observations.begin();

View File

@ -206,6 +206,9 @@ class MsckfVio {
bool nan_flag; bool nan_flag;
// Patch size for Photometry
int N;
// Chi squared test table. // Chi squared test table.
static std::map<int, double> chi_squared_test_table; static std::map<int, double> chi_squared_test_table;

View File

@ -20,6 +20,7 @@
<!-- Photometry Flag--> <!-- Photometry Flag-->
<param name="PHOTOMETRIC" value="true"/> <param name="PHOTOMETRIC" value="true"/>
<param name="patch_size_n" value="5"/>
<!-- Calibration parameters --> <!-- Calibration parameters -->
<rosparam command="load" file="$(arg calibration_file)"/> <rosparam command="load" file="$(arg calibration_file)"/>

View File

@ -127,6 +127,10 @@ bool MsckfVio::loadParameters() {
nh.param<double>("initial_covariance/irradiance_frame_bias", nh.param<double>("initial_covariance/irradiance_frame_bias",
irradiance_frame_bias, 0.1); irradiance_frame_bias, 0.1);
// Get the photometric patch size
nh.param<int>("patch_size_n",
N, 3);
// get camera information (used for back projection) // get camera information (used for back projection)
nh.param<string>("cam0/distortion_model", nh.param<string>("cam0/distortion_model",
cam0.distortion_model, string("radtan")); cam0.distortion_model, string("radtan"));
@ -288,7 +292,7 @@ bool MsckfVio::initialize() {
for (int i = 1; i < 100; ++i) { for (int i = 1; i < 100; ++i) {
boost::math::chi_squared chi_squared_dist(i); boost::math::chi_squared chi_squared_dist(i);
chi_squared_test_table[i] = chi_squared_test_table[i] =
boost::math::quantile(chi_squared_dist, 0.05); boost::math::quantile(chi_squared_dist, 0.2);
} }
if (!createRosIO()) return false; if (!createRosIO()) return false;
@ -979,9 +983,6 @@ void MsckfVio::PhotometricMeasurementJacobian(
Matrix3d R_w_c0 = quaternionToRotation(cam_state.orientation); Matrix3d R_w_c0 = quaternionToRotation(cam_state.orientation);
const Vector3d& t_c0_w = cam_state.position; const Vector3d& t_c0_w = cam_state.position;
//temp N
const int N = 3;
// Cam1 pose. // Cam1 pose.
Matrix3d R_c0_c1 = CAMState::T_cam0_cam1.linear(); Matrix3d R_c0_c1 = CAMState::T_cam0_cam1.linear();
Matrix3d R_w_c1 = CAMState::T_cam0_cam1.linear() * R_w_c0; Matrix3d R_w_c1 = CAMState::T_cam0_cam1.linear() * R_w_c0;
@ -1128,7 +1129,6 @@ void MsckfVio::PhotometricFeatureJacobian(
const auto& feature = map_server[feature_id]; const auto& feature = map_server[feature_id];
int N = 3;
// Check how many camera states in the provided camera // Check how many camera states in the provided camera
// id camera has actually seen this feature. // id camera has actually seen this feature.
vector<StateIDType> valid_cam_state_ids(0); vector<StateIDType> valid_cam_state_ids(0);
@ -1346,7 +1346,7 @@ void MsckfVio::measurementUpdate(const MatrixXd& H, const VectorXd& r) {
if (H.rows() == 0 || r.rows() == 0) return; if (H.rows() == 0 || r.rows() == 0) return;
cout << "decomposition..."; cout << "Updating...";
// Decompose the final Jacobian matrix to reduce computational // Decompose the final Jacobian matrix to reduce computational
// complexity as in Equation (28), (29). // complexity as in Equation (28), (29).
MatrixXd H_thin; MatrixXd H_thin;
@ -1379,8 +1379,7 @@ void MsckfVio::measurementUpdate(const MatrixXd& H, const VectorXd& r) {
H_thin = H; H_thin = H;
r_thin = r; r_thin = r;
} }
cout << "done" << endl;
cout << "computing K...";
// Compute the Kalman gain. // Compute the Kalman gain.
const MatrixXd& P = state_server.state_cov; const MatrixXd& P = state_server.state_cov;
MatrixXd S = H_thin*P*H_thin.transpose() + MatrixXd S = H_thin*P*H_thin.transpose() +
@ -1390,8 +1389,6 @@ void MsckfVio::measurementUpdate(const MatrixXd& H, const VectorXd& r) {
MatrixXd K_transpose = S.ldlt().solve(H_thin*P); MatrixXd K_transpose = S.ldlt().solve(H_thin*P);
MatrixXd K = K_transpose.transpose(); MatrixXd K = K_transpose.transpose();
cout << "done" << endl;
// Compute the error of the state. // Compute the error of the state.
VectorXd delta_x = K * r_thin; VectorXd delta_x = K * r_thin;
@ -1457,15 +1454,10 @@ bool MsckfVio::gatingTest(const MatrixXd& H, const VectorXd& r, const int& dof)
MatrixXd P2 = Feature::observation_noise * MatrixXd P2 = Feature::observation_noise *
MatrixXd::Identity(H.rows(), H.rows()); MatrixXd::Identity(H.rows(), H.rows());
//cout << "H: \n" << H << endl;
//cout << "cov: \n" << state_server.state_cov << endl;
//cout << "P1: \n" << P1 << endl;
//cout << "solv: \n" << (P1+P2).ldlt().solve(r) << endl;
double gamma = r.transpose() * (P1+P2).ldlt().solve(r); double gamma = r.transpose() * (P1+P2).ldlt().solve(r);
cout << dof << " " << gamma << " " << cout << dof << " " << gamma << " " <<
chi_squared_test_table[dof] << " "; chi_squared_test_table[dof] << endl;
if (gamma < chi_squared_test_table[dof]) { if (gamma < chi_squared_test_table[dof]) {
//cout << "passed" << endl; //cout << "passed" << endl;
@ -1480,11 +1472,14 @@ void MsckfVio::removeLostFeatures() {
// Remove the features that lost track. // Remove the features that lost track.
// BTW, find the size the final Jacobian matrix and residual vector. // BTW, find the size the final Jacobian matrix and residual vector.
int jacobian_row_size = 0; int jacobian_row_size = 0;
int augmentationSize = 6;
if(PHOTOMETRIC)
augmentationSize = 7;
vector<FeatureIDType> invalid_feature_ids(0); vector<FeatureIDType> invalid_feature_ids(0);
vector<FeatureIDType> processed_feature_ids(0); vector<FeatureIDType> processed_feature_ids(0);
int N = 3;
for (auto iter = map_server.begin(); for (auto iter = map_server.begin();
iter != map_server.end(); ++iter) { iter != map_server.end(); ++iter) {
// Rename the feature to be checked. // Rename the feature to be checked.
@ -1513,7 +1508,7 @@ void MsckfVio::removeLostFeatures() {
} }
if(!feature.is_anchored) if(!feature.is_anchored)
{ {
if(!feature.initializeAnchor(cam0)) if(!feature.initializeAnchor(cam0, N))
{ {
invalid_feature_ids.push_back(feature.id); invalid_feature_ids.push_back(feature.id);
continue; continue;
@ -1540,10 +1535,6 @@ void MsckfVio::removeLostFeatures() {
// Return if there is no lost feature to be processed. // Return if there is no lost feature to be processed.
if (processed_feature_ids.size() == 0) return; if (processed_feature_ids.size() == 0) return;
int augmentationSize = 6;
if(PHOTOMETRIC)
augmentationSize = 7;
MatrixXd H_x = MatrixXd::Zero(jacobian_row_size, MatrixXd H_x = MatrixXd::Zero(jacobian_row_size,
21+augmentationSize*state_server.cam_states.size()); 21+augmentationSize*state_server.cam_states.size());
VectorXd r = VectorXd::Zero(jacobian_row_size); VectorXd r = VectorXd::Zero(jacobian_row_size);
@ -1569,11 +1560,11 @@ void MsckfVio::removeLostFeatures() {
H_x.block(stack_cntr, 0, H_xj.rows(), H_xj.cols()) = H_xj; H_x.block(stack_cntr, 0, H_xj.rows(), H_xj.cols()) = H_xj;
r.segment(stack_cntr, r_j.rows()) = r_j; r.segment(stack_cntr, r_j.rows()) = r_j;
stack_cntr += H_xj.rows(); stack_cntr += H_xj.rows();
cout << "approved chi" << endl; cout << "passed" << endl;
} }
else else
{ {
cout << "rejected chi" << endl; cout << "rejected" << endl;
} }
// Put an upper bound on the row size of measurement Jacobian, // Put an upper bound on the row size of measurement Jacobian,
@ -1647,10 +1638,12 @@ void MsckfVio::pruneCamStateBuffer() {
vector<StateIDType> rm_cam_state_ids(0); vector<StateIDType> rm_cam_state_ids(0);
findRedundantCamStates(rm_cam_state_ids); findRedundantCamStates(rm_cam_state_ids);
int N = 3;
// Find the size of the Jacobian matrix. // Find the size of the Jacobian matrix.
int jacobian_row_size = 0; int jacobian_row_size = 0;
int augmentationSize = 6;
if(PHOTOMETRIC)
augmentationSize = 7;
for (auto& item : map_server) { for (auto& item : map_server) {
auto& feature = item.second; auto& feature = item.second;
// Check how many camera states to be removed are associated // Check how many camera states to be removed are associated
@ -1686,7 +1679,7 @@ void MsckfVio::pruneCamStateBuffer() {
} }
if(!feature.is_anchored) if(!feature.is_anchored)
{ {
if(!feature.initializeAnchor(cam0)) if(!feature.initializeAnchor(cam0, N))
{ {
for (const auto& cam_id : involved_cam_state_ids) for (const auto& cam_id : involved_cam_state_ids)
feature.observations.erase(cam_id); feature.observations.erase(cam_id);
@ -1702,8 +1695,9 @@ void MsckfVio::pruneCamStateBuffer() {
//cout << "jacobian row #: " << jacobian_row_size << endl; //cout << "jacobian row #: " << jacobian_row_size << endl;
// Compute the Jacobian and residual. // Compute the Jacobian and residual.
MatrixXd H_x = MatrixXd::Zero(jacobian_row_size, MatrixXd H_xj;
21+6*state_server.cam_states.size()); VectorXd r_j;
MatrixXd H_x = MatrixXd::Zero(jacobian_row_size, 21+augmentationSize*state_server.cam_states.size());
VectorXd r = VectorXd::Zero(jacobian_row_size); VectorXd r = VectorXd::Zero(jacobian_row_size);
int stack_cntr = 0; int stack_cntr = 0;
for (auto& item : map_server) { for (auto& item : map_server) {
@ -1719,9 +1713,6 @@ void MsckfVio::pruneCamStateBuffer() {
if (involved_cam_state_ids.size() == 0) continue; if (involved_cam_state_ids.size() == 0) continue;
MatrixXd H_xj;
VectorXd r_j;
if(PHOTOMETRIC) if(PHOTOMETRIC)
PhotometricFeatureJacobian(feature.id, involved_cam_state_ids, H_xj, r_j); PhotometricFeatureJacobian(feature.id, involved_cam_state_ids, H_xj, r_j);
else else
@ -1731,29 +1722,23 @@ void MsckfVio::pruneCamStateBuffer() {
H_x.block(stack_cntr, 0, H_xj.rows(), H_xj.cols()) = H_xj; H_x.block(stack_cntr, 0, H_xj.rows(), H_xj.cols()) = H_xj;
r.segment(stack_cntr, r_j.rows()) = r_j; r.segment(stack_cntr, r_j.rows()) = r_j;
stack_cntr += H_xj.rows(); stack_cntr += H_xj.rows();
cout << "made gating test" << endl; cout << "passed" << endl;
} }
else else
{ {
cout << "failed gating test" << endl; cout << "rejected" << endl;
} }
for (const auto& cam_id : involved_cam_state_ids) for (const auto& cam_id : involved_cam_state_ids)
feature.observations.erase(cam_id); feature.observations.erase(cam_id);
} }
cout << "resize" << endl;
H_x.conservativeResize(stack_cntr, H_x.cols()); H_x.conservativeResize(stack_cntr, H_x.cols());
r.conservativeResize(stack_cntr); r.conservativeResize(stack_cntr);
cout << "done" << endl;
// Perform measurement update. // Perform measurement update.
measurementUpdate(H_x, r); measurementUpdate(H_x, r);
int augmentationSize = 6;
if(PHOTOMETRIC)
augmentationSize = 7;
//reduction
for (const auto& cam_id : rm_cam_state_ids) { for (const auto& cam_id : rm_cam_state_ids) {
int cam_sequence = std::distance(state_server.cam_states.begin(), int cam_sequence = std::distance(state_server.cam_states.begin(),
state_server.cam_states.find(cam_id)); state_server.cam_states.find(cam_id));