local m: working version 3
This commit is contained in:
@@ -128,7 +128,7 @@ namespace vio {
|
|||||||
//TODO add 15 degree roll orientation
|
//TODO add 15 degree roll orientation
|
||||||
SE2 inv=T_f_w_.inverse();
|
SE2 inv=T_f_w_.inverse();
|
||||||
Quaterniond q;
|
Quaterniond q;
|
||||||
q = AngleAxisd(0.261799, Vector3d::UnitX())
|
q = AngleAxisd(-0.261799, Vector3d::UnitX())
|
||||||
* AngleAxisd(atan2(inv.so2().unit_complex().imag(),inv.so2().unit_complex().real()), Vector3d::UnitY())
|
* AngleAxisd(atan2(inv.so2().unit_complex().imag(),inv.so2().unit_complex().real()), Vector3d::UnitY())
|
||||||
* AngleAxisd(0.0, Vector3d::UnitZ());
|
* AngleAxisd(0.0, Vector3d::UnitZ());
|
||||||
SE3 out(q.toRotationMatrix(),Vector3d(inv.translation()(0), 0.0,inv.translation()(1)));
|
SE3 out(q.toRotationMatrix(),Vector3d(inv.translation()(0), 0.0,inv.translation()(1)));
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ namespace vio
|
|||||||
SE3 se3() const{
|
SE3 se3() const{
|
||||||
//Todo add 15 roll orientation
|
//Todo add 15 roll orientation
|
||||||
Quaterniond q;
|
Quaterniond q;
|
||||||
q = AngleAxisd(0.261799, Vector3d::UnitX())
|
q = AngleAxisd(-0.261799, Vector3d::UnitX())
|
||||||
* AngleAxisd(pitch(), Vector3d::UnitY())
|
* AngleAxisd(pitch(), Vector3d::UnitY())
|
||||||
* AngleAxisd(0.0, Vector3d::UnitZ());
|
* AngleAxisd(0.0, Vector3d::UnitZ());
|
||||||
return SE3(q.toRotationMatrix(),Vector3d(T2_.translation()(0), 0.0,T2_.translation()(1)));
|
return SE3(q.toRotationMatrix(),Vector3d(T2_.translation()(0), 0.0,T2_.translation()(1)));
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ float3 xyz_cur(float3 cur, float3 ref, float3 ref_feature)
|
|||||||
float3 error=ref+cur;
|
float3 error=ref+cur;
|
||||||
float yaw=0.0;
|
float yaw=0.0;
|
||||||
float pitch=error.z;
|
float pitch=error.z;
|
||||||
float roll=0.26;
|
float roll=-0.26;
|
||||||
float R00=cos(yaw)*cos(pitch);//cos(pitch)
|
float R00=cos(yaw)*cos(pitch);//cos(pitch)
|
||||||
float R01=cos(yaw)*sin(pitch)*sin(roll)-sin(yaw)*cos(roll);//0
|
float R01=cos(yaw)*sin(pitch)*sin(roll)-sin(yaw)*cos(roll);//0
|
||||||
float R02=cos(yaw)*sin(pitch)*cos(roll)+sin(yaw)*sin(roll);//sin(pitch)
|
float R02=cos(yaw)*sin(pitch)*cos(roll)+sin(yaw)*sin(roll);//sin(pitch)
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ namespace vio {
|
|||||||
SE2 T(it->ftr->frame->T_f_w_.pitch()-frame->T_f_w_.pitch(),it->ftr->frame->T_f_w_.se2().translation()- frame->T_f_w_.se2().translation());
|
SE2 T(it->ftr->frame->T_f_w_.pitch()-frame->T_f_w_.pitch(),it->ftr->frame->T_f_w_.se2().translation()- frame->T_f_w_.se2().translation());
|
||||||
///TODO add 15 degrees roll orientation
|
///TODO add 15 degrees roll orientation
|
||||||
Quaterniond q;
|
Quaterniond q;
|
||||||
q = AngleAxisd(0.261799, Vector3d::UnitX())
|
q = AngleAxisd(-0.261799, Vector3d::UnitX())
|
||||||
* AngleAxisd(atan2(T.so2().unit_complex().imag(),T.so2().unit_complex().real()), Vector3d::UnitY())
|
* AngleAxisd(atan2(T.so2().unit_complex().imag(),T.so2().unit_complex().real()), Vector3d::UnitY())
|
||||||
* AngleAxisd(0.0, Vector3d::UnitZ());
|
* AngleAxisd(0.0, Vector3d::UnitZ());
|
||||||
SE3 T_ref_cur(q.toRotationMatrix(),Vector3d(T.translation()(0), 0.0,T.translation()(1)));
|
SE3 T_ref_cur(q.toRotationMatrix(),Vector3d(T.translation()(0), 0.0,T.translation()(1)));
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ void FrameHandlerMono::addImage(const cv::Mat& img, const double timestamp,const
|
|||||||
overlap_kfs_.clear();
|
overlap_kfs_.clear();
|
||||||
|
|
||||||
// create new frame
|
// create new frame
|
||||||
new_frame_.reset(new Frame(cam_, img.clone(), timestamp));
|
new_frame_=boost::make_shared<Frame>(cam_, img.clone(), timestamp);
|
||||||
time_=time;
|
time_=time;
|
||||||
// process frame
|
// process frame
|
||||||
UpdateResult res = RESULT_FAILURE;
|
UpdateResult res = RESULT_FAILURE;
|
||||||
@@ -107,7 +107,6 @@ void FrameHandlerMono::addImage(const cv::Mat& img, const double timestamp,const
|
|||||||
|
|
||||||
// set last frame
|
// set last frame
|
||||||
if(!new_frame_->fts_.empty() || stage_ != STAGE_DEFAULT_FRAME)last_frame_ = new_frame_;
|
if(!new_frame_->fts_.empty() || stage_ != STAGE_DEFAULT_FRAME)last_frame_ = new_frame_;
|
||||||
new_frame_.reset();
|
|
||||||
// finish processing
|
// finish processing
|
||||||
finishFrameProcessingCommon(last_frame_->id_, res, last_frame_->nObs());
|
finishFrameProcessingCommon(last_frame_->id_, res, last_frame_->nObs());
|
||||||
if(stage_ == STAGE_RELOCALIZING){
|
if(stage_ == STAGE_RELOCALIZING){
|
||||||
@@ -168,11 +167,12 @@ FrameHandlerBase::UpdateResult FrameHandlerMono::processFrame()
|
|||||||
new_frame_->Cov_ = init_f.first;
|
new_frame_->Cov_ = init_f.first;
|
||||||
// sparse image align
|
// sparse image align
|
||||||
//SparseImgAlign img_align(Config::kltMaxLevel(), Config::kltMinLevel(),30, SparseImgAlign::LevenbergMarquardt, false, false);
|
//SparseImgAlign img_align(Config::kltMaxLevel(), Config::kltMinLevel(),30, SparseImgAlign::LevenbergMarquardt, false, false);
|
||||||
|
//assert(new_frame_.get()== nullptr);
|
||||||
SparseImgAlignGpu img_align(Config::kltMaxLevel(), Config::kltMinLevel(),30, SparseImgAlignGpu::GaussNewton, false,gpu_fast_);
|
SparseImgAlignGpu img_align(Config::kltMaxLevel(), Config::kltMinLevel(),30, SparseImgAlignGpu::GaussNewton, false,gpu_fast_);
|
||||||
if(img_align.run(last_frame_, new_frame_)==0)return RESULT_FAILURE;
|
if(img_align.run(last_frame_, new_frame_)==0)return RESULT_FAILURE;
|
||||||
// reprojector_.reprojectMap(new_frame_, overlap_kfs_);
|
// reprojector_.reprojectMap(new_frame_, overlap_kfs_);
|
||||||
reprojector_.reprojectMap1(new_frame_, last_frame_, overlap_kfs_);
|
// reprojector_.reprojectMap1(new_frame_, last_frame_, overlap_kfs_);
|
||||||
// reprojector_.reprojectMap2(new_frame_, overlap_kfs_);
|
reprojector_.reprojectMap2(new_frame_, overlap_kfs_);
|
||||||
//assert (false);
|
//assert (false);
|
||||||
|
|
||||||
std::cout<<"Reprojection Map nPoint: "<<overlap_kfs_.back().second
|
std::cout<<"Reprojection Map nPoint: "<<overlap_kfs_.back().second
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ void Map::getCloseKeyframes(
|
|||||||
for(auto kf : keyframes_)
|
for(auto kf : keyframes_)
|
||||||
{
|
{
|
||||||
// check if kf has overlaping field of view with frame, use therefore KeyPoints
|
// check if kf has overlaping field of view with frame, use therefore KeyPoints
|
||||||
|
std::cerr<<kf->key_pts_.size()<<'\t';
|
||||||
for(auto keypoint : kf->key_pts_)
|
for(auto keypoint : kf->key_pts_)
|
||||||
{
|
{
|
||||||
if(keypoint == nullptr)
|
if(keypoint == nullptr)
|
||||||
|
|||||||
@@ -71,18 +71,11 @@ void Reprojector::reprojectMap(
|
|||||||
std::vector< std::pair<FramePtr,std::size_t> >& overlap_kfs)
|
std::vector< std::pair<FramePtr,std::size_t> >& overlap_kfs)
|
||||||
{
|
{
|
||||||
resetGrid();
|
resetGrid();
|
||||||
|
|
||||||
// Identify those Keyframes which share a common field of view.
|
|
||||||
// SVO_START_TIMER("reproject_kfs");
|
|
||||||
list< pair<FramePtr,double> > close_kfs;
|
list< pair<FramePtr,double> > close_kfs;
|
||||||
|
//assert(frame== nullptr);
|
||||||
map_.getCloseKeyframes(frame, close_kfs);
|
map_.getCloseKeyframes(frame, close_kfs);
|
||||||
|
|
||||||
// Sort KFs with overlap according to their closeness
|
|
||||||
close_kfs.sort(boost::bind(&std::pair<FramePtr, double>::second, _1) <
|
close_kfs.sort(boost::bind(&std::pair<FramePtr, double>::second, _1) <
|
||||||
boost::bind(&std::pair<FramePtr, double>::second, _2));
|
boost::bind(&std::pair<FramePtr, double>::second, _2));
|
||||||
|
|
||||||
// Reproject all mappoints of the closest N kfs with overlap. We only store
|
|
||||||
// in which grid cell the points fall.
|
|
||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
overlap_kfs.reserve(options_.max_n_kfs);
|
overlap_kfs.reserve(options_.max_n_kfs);
|
||||||
for(auto it_frame=close_kfs.begin(), ite_frame=close_kfs.end();
|
for(auto it_frame=close_kfs.begin(), ite_frame=close_kfs.end();
|
||||||
@@ -90,16 +83,11 @@ void Reprojector::reprojectMap(
|
|||||||
{
|
{
|
||||||
FramePtr ref_frame = it_frame->first;
|
FramePtr ref_frame = it_frame->first;
|
||||||
overlap_kfs.push_back(pair<FramePtr,size_t>(ref_frame,0));
|
overlap_kfs.push_back(pair<FramePtr,size_t>(ref_frame,0));
|
||||||
|
|
||||||
// Try to reproject each mappoint that the other KF observes
|
|
||||||
for(auto it_ftr=ref_frame->fts_.begin(), ite_ftr=ref_frame->fts_.end();
|
for(auto it_ftr=ref_frame->fts_.begin(), ite_ftr=ref_frame->fts_.end();
|
||||||
it_ftr!=ite_ftr; ++it_ftr)
|
it_ftr!=ite_ftr; ++it_ftr)
|
||||||
{
|
{
|
||||||
// check if the feature has a mappoint assigned
|
|
||||||
if((*it_ftr)->point == NULL)
|
if((*it_ftr)->point == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// make sure we project a point only once
|
|
||||||
if((*it_ftr)->point->last_projected_kf_id_ == frame->id_)
|
if((*it_ftr)->point->last_projected_kf_id_ == frame->id_)
|
||||||
continue;
|
continue;
|
||||||
(*it_ftr)->point->last_projected_kf_id_ = frame->id_;
|
(*it_ftr)->point->last_projected_kf_id_ = frame->id_;
|
||||||
@@ -108,11 +96,6 @@ void Reprojector::reprojectMap(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//SVO_STOP_TIMER("reproject_kfs");
|
|
||||||
|
|
||||||
// Now project all point candidates
|
|
||||||
// SVO_START_TIMER("reproject_candidates");
|
|
||||||
{
|
|
||||||
boost::unique_lock<boost::mutex> lock(map_.point_candidates_.mut_);
|
boost::unique_lock<boost::mutex> lock(map_.point_candidates_.mut_);
|
||||||
auto it=map_.point_candidates_.candidates_.begin();
|
auto it=map_.point_candidates_.candidates_.begin();
|
||||||
while(it!=map_.point_candidates_.candidates_.end())
|
while(it!=map_.point_candidates_.candidates_.end())
|
||||||
@@ -129,21 +112,14 @@ void Reprojector::reprojectMap(
|
|||||||
}
|
}
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
} // unlock the mutex when out of scope
|
|
||||||
//SVO_STOP_TIMER("reproject_candidates");
|
|
||||||
// Now we go through each grid cell and select one point to match.
|
|
||||||
// At the end, we should have at maximum one reprojected point per cell.
|
|
||||||
//SVO_START_TIMER("feature_align");
|
|
||||||
for(size_t i=0; i<grid_.cells.size(); ++i)
|
for(size_t i=0; i<grid_.cells.size(); ++i)
|
||||||
{
|
{
|
||||||
// we prefer good quality points over unkown quality (more likely to match)
|
|
||||||
// and unknown quality over candidates (position not optimized)
|
|
||||||
if(reprojectCell(*grid_.cells.at(grid_.cell_order[i]), frame))
|
if(reprojectCell(*grid_.cells.at(grid_.cell_order[i]), frame))
|
||||||
++n_matches_;
|
++n_matches_;
|
||||||
if(n_matches_ > (size_t) Config::maxFts())
|
if(n_matches_ > (size_t) Config::maxFts())
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// SVO_STOP_TIMER("feature_align");
|
|
||||||
}
|
}
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// TODO - First reimplementation
|
// TODO - First reimplementation
|
||||||
@@ -373,7 +349,7 @@ bool Reprojector::reprojectCell(Cell& cell, FramePtr frame)
|
|||||||
it = cell.erase(it);
|
it = cell.erase(it);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/*bool found_match = true;
|
bool found_match = true;
|
||||||
if(options_.find_match_direct)
|
if(options_.find_match_direct)
|
||||||
found_match = matcher_.findMatchDirect(*it->pt, *frame, it->px);
|
found_match = matcher_.findMatchDirect(*it->pt, *frame, it->px);
|
||||||
if(!found_match)
|
if(!found_match)
|
||||||
@@ -385,7 +361,7 @@ bool Reprojector::reprojectCell(Cell& cell, FramePtr frame)
|
|||||||
map_.point_candidates_.deleteCandidatePoint(it->pt);
|
map_.point_candidates_.deleteCandidatePoint(it->pt);
|
||||||
it = cell.erase(it);
|
it = cell.erase(it);
|
||||||
continue;
|
continue;
|
||||||
}*/
|
}
|
||||||
it->pt->n_succeeded_reproj_++;
|
it->pt->n_succeeded_reproj_++;
|
||||||
if(it->pt->type_ == Point::TYPE_UNKNOWN && it->pt->n_succeeded_reproj_ > 10)
|
if(it->pt->type_ == Point::TYPE_UNKNOWN && it->pt->n_succeeded_reproj_ > 10)
|
||||||
it->pt->type_ = Point::TYPE_GOOD;
|
it->pt->type_ = Point::TYPE_GOOD;
|
||||||
|
|||||||
Reference in New Issue
Block a user