segmentation fault errors

This commit is contained in:
gfuse
2021-09-01 15:07:55 +02:00
parent 933cfce1da
commit fb23169978
6 changed files with 40 additions and 28 deletions
+2 -1
View File
@@ -119,7 +119,8 @@ namespace vio {
/// Return the pose of the frame in the (w)orld coordinate frame.
inline Vector2d pos() const {
return T_f_w_.se2().translation();
Vector2d tem=T_f_w_.se2().translation();
return tem;
}
inline SE3 se3() const{
+3 -1
View File
@@ -99,7 +99,9 @@ namespace vio
return SE3(q.toRotationMatrix(),Vector3d(T2_->translation()(0), 0.0,T2_->translation()(1)));
}
~SE2_5(){
// delete T2_;
}
bool empty(){
return T2_ == nullptr ? true : false;
}
private:
+1
View File
@@ -99,6 +99,7 @@ public:
double h_inv_; //!< hessian of 1d image alignment along epipolar line
int search_level_;
bool reject_;
Feature* ref_ftr_;
Vector2d px_cur_;
Matcher() = default;
-1
View File
@@ -140,7 +140,6 @@ bool Matcher::findMatchDirect(
const Frame& cur_frame,
Vector2d& px_cur)
{
Feature* ref_ftr_= nullptr;
if(!pt.getCloseViewObs(cur_frame.pos(), ref_ftr_))return false;
//if(ref_ftr_->frame->cam_== nullptr)return false;
assert(ref_ftr_->frame!= nullptr);
+1 -1
View File
@@ -102,7 +102,7 @@ bool Point::getCloseViewObs(const Vector2d& framepos, Feature*& ftr) const
double max_cos_angle = 1.0;
if(obs_.empty())return false;
for(auto&& ob:obs_){
assert(ob->frame!= nullptr);
if(ob->frame->T_f_w_.empty())continue;
Vector2d t=ob->frame->pos();
Vector3d dir(Vector3d(t.x(),1e-9,t.y()) + pos_);
double cos_angle = obs_dir.dot(dir.normalized());
+32 -23
View File
@@ -189,41 +189,50 @@ namespace vio {
bool Reprojector::reprojectCell(Cell &cell, FramePtr frame) {
cell.sort(boost::bind(&Reprojector::pointQualityComparator, _1, _2));
for(auto&& it : cell) {
Cell::iterator it=cell.begin();
while(it!=cell.end())
{
++n_trials_;
if (it.pt->type_ == Point::TYPE_DELETED) {
// cell.erase(it.index);
continue;
}
if (!matcher_.findMatchDirect(*it.pt, *frame, it.px)) {
it.pt->n_failed_reproj_++;
if (it.pt->type_ == Point::TYPE_UNKNOWN && it.pt->n_failed_reproj_ > 15)
map_.safeDeletePoint(it.pt);
if (it.pt->type_ == Point::TYPE_CANDIDATE && it.pt->n_failed_reproj_ > 30)
map_.point_candidates_.deleteCandidatePoint(it.pt);
//it = cell.erase(it);
continue;
}
it.pt->n_succeeded_reproj_++;
if (it.pt->type_ == Point::TYPE_UNKNOWN && it.pt->n_succeeded_reproj_ > 10)
it.pt->type_ = Point::TYPE_GOOD;
Feature *new_feature = new Feature(frame.get(), it.px, matcher_.search_level_);
if(it->pt->type_ == Point::TYPE_DELETED)
{
it = cell.erase(it);
continue;
}
bool found_match = true;
if(options_.find_match_direct)
found_match = matcher_.findMatchDirect(*it->pt, *frame, it->px);
if(!found_match)
{
it->pt->n_failed_reproj_++;
if(it->pt->type_ == Point::TYPE_UNKNOWN && it->pt->n_failed_reproj_ > 15)
map_.safeDeletePoint(it->pt);
if(it->pt->type_ == Point::TYPE_CANDIDATE && it->pt->n_failed_reproj_ > 30)
map_.point_candidates_.deleteCandidatePoint(it->pt);
it = cell.erase(it);
continue;
}
it->pt->n_succeeded_reproj_++;
if(it->pt->type_ == Point::TYPE_UNKNOWN && it->pt->n_succeeded_reproj_ > 10)
it->pt->type_ = Point::TYPE_GOOD;
Feature* new_feature = new Feature(frame.get(), it->px, matcher_.search_level_);
frame->addFeature(new_feature);
// Here we add a reference in the feature to the 3D point, the other way
// round is only done if this frame is selected as keyframe.
new_feature->point = it.pt;
/*
if (matcher_.ref_ftr_->type == Feature::EDGELET) {
new_feature->point = it->pt;
if(matcher_.ref_ftr_->type == Feature::EDGELET)
{
new_feature->type = Feature::EDGELET;
new_feature->grad = matcher_.A_cur_ref_*matcher_.ref_ftr_->grad;
new_feature->grad.normalize();
}
*/
// If the keyframe is selected and we reproject the rest, we don't have to
// check this point anymore.
//it = cell.erase(it);
it = cell.erase(it);
// Maximum one point per cell.
return true;