new benchmark for synthetic datasets. sets the first frame and initializes features from the ground-truth depth-map. NOT TESTED

This commit is contained in:
Christian Forster
2014-03-21 20:23:18 +01:00
parent e9404c4ed8
commit b25f7c3f5b
+94 -23
View File
@@ -25,10 +25,14 @@
#include <vikit/params_helper.h>
#include <vikit/camera_loader.h>
#include <vikit/abstract_camera.h>
#include <vikit/blender_utils.h>
#include <svo/config.h>
#include <svo/frame.h>
#include <svo/feature.h>
#include <svo/map.h>
#include <svo/point.h>
#include <svo/frame_handler_mono.h>
#include <svo/feature_detection.h>
#include <svo_ros/visualizer.h>
#include <svo_ros/dataset_img.h>
@@ -46,7 +50,8 @@ public:
BenchmarkNode(ros::NodeHandle& nh);
~BenchmarkNode();
void tracePose(const SE3& T_w_f, const double timestamp);
void runBenchmark(const std::string& benchmark_dir);
void runBenchmark(const std::string& dataset_dir);
void runBlenderBenchmark(const std::string& dataset_dir);
};
BenchmarkNode::BenchmarkNode(ros::NodeHandle& nh) :
@@ -57,6 +62,12 @@ BenchmarkNode::BenchmarkNode(ros::NodeHandle& nh) :
if(!vk::camera_loader::loadFromRosNs("svo", cam_))
throw std::runtime_error("Camera model not correctly specified.");
// create pose tracefile
std::string trace_est_name(Config::traceDir() + "/traj_estimate.txt");
trace_est_pose_.open(trace_est_name.c_str());
if(trace_est_pose_.fail())
throw std::runtime_error("Could not create tracefile. Does folder exist?");
// Initialize VO
vo_ = new svo::FrameHandlerMono(cam_);
vo_->start();
@@ -80,46 +91,106 @@ void BenchmarkNode::tracePose(const SE3& T_w_f, const double timestamp)
<< q.x() << " " << q.y() << " " << q.z() << " " << q.w() << endl;
}
void BenchmarkNode::runBenchmark(const std::string& benchmark_dir)
void BenchmarkNode::runBenchmark(const std::string& dataset_dir)
{
// create image reader and load dataset
std::string filename_benchmark(benchmark_dir + "/images.txt");
std::string filename_benchmark(dataset_dir + "/images.txt");
vk::FileReader<FileType::DatasetImg> dataset_reader(filename_benchmark);
dataset_reader.skipComments();
if(!dataset_reader.next())
std::runtime_error("Failed to open images file");
if(!dataset_reader.next()) {
SVO_ERROR_STREAM("Failed opening dataset: "<<filename_benchmark);
return;
}
std::vector<FileType::DatasetImg> dataset;
dataset_reader.readAllEntries(dataset);
// create pose tracefile
std::string trace_est_name(Config::traceDir() + "/traj_estimate.txt");
trace_est_pose_.open(trace_est_name.c_str());
if(trace_est_pose_.fail())
throw std::runtime_error("Could not create tracefile. Does folder exist?");
// process dataset
for(vk::vector<FileType::DatasetImg>::iterator it = dataset.begin();
it != dataset.end(); ++it, ++frame_count_)
for(auto it = dataset.begin(); it != dataset.end() && ros::ok(); ++it, ++frame_count_)
{
// Read image
std::string img_filename(benchmark_dir + "/" + it->imgname_);
std::string img_filename(dataset_dir + "/" + it->image_name_);
cv::Mat img(cv::imread(img_filename, 0));
if(frame_count_ == 0)
SVO_INFO_STREAM("Reading image "<<img_filename);
if(img.empty())
throw std::runtime_error("Image could not be loaded.");
if(img.empty()) {
SVO_ERROR_STREAM("Reading image "<<img_filename<<" failed.");
return;
}
// Add image to VO
vo_->addImage(img, it->stamp_);
vo_->addImage(img, it->timestamp_);
// Visualize
visualizer_.publishMinimal(img, vo_->lastFrame(), *vo_, it->stamp_);
visualizer_.publishMinimal(img, vo_->lastFrame(), *vo_, it->timestamp_);
// write pose to tracefile
if(vo_->stage() == svo::FrameHandlerMono::DEFAULT_FRAME)
tracePose(vo_->lastFrame()->T_f_w_.inverse(), it->stamp_);
if (!ros::ok())
break;
tracePose(vo_->lastFrame()->T_f_w_.inverse(), it->timestamp_);
}
}
void BenchmarkNode::runBlenderBenchmark(const std::string& dataset_dir)
{
// create image reader and load dataset
std::string filename_benchmark(dataset_dir + "/images.txt");
vk::FileReader<vk::blender_utils::file_format::ImageNameAndPose> dataset_reader(filename_benchmark);
dataset_reader.skipComments();
if(!dataset_reader.next()) {
SVO_ERROR_STREAM("Failed opening dataset: "<<filename_benchmark);
return;
}
std::vector<vk::blender_utils::file_format::ImageNameAndPose> dataset;
dataset_reader.readAllEntries(dataset);
// process dataset
for(auto it = dataset.begin(); it != dataset.end() && ros::ok(); ++it, ++frame_count_)
{
// Read image
std::string img_filename(dataset_dir + "/" + it->image_name_ + "_0.png");
cv::Mat img(cv::imread(img_filename, 0));
if(img.empty()) {
SVO_ERROR_STREAM("Reading image "<<img_filename<<" failed.");
return;
}
// Set reference frame with depth
if(frame_count_ == 0)
{
// set reference frame at ground-truth pose
FramePtr frame_ref(new Frame(cam_, img, it->timestamp_));
frame_ref->T_f_w_ = Sophus::SE3(it->q_, it->t_).inverse();
// load ground-truth depth
cv::Mat depthmap;
vk::blender_utils::loadBlenderDepthmap(
dataset_dir+"/depth/"+it->image_name_+"_0.depth", *cam_, depthmap);
// extract features, generate features with 3D points
svo::feature_detection::FastDetector detector;
svo::feature_detection::Corners corners;
detector.detect(frame_ref->img_pyr_, frame_ref->fts_, svo::Config::gridSize(),
svo::Config::nPyrLevels(), svo::Config::triangMinCornerScore(), &corners);
for(auto corner=corners.begin(); corner!=corners.end(); ++corner)
{
if(corner->score < Config::triangMinCornerScore())
continue;
svo::Feature* ftr = new svo::Feature(frame_ref.get(), Eigen::Vector2d(corner->x, corner->y), corner->level);
Eigen::Vector3d pt_pos_cur = ftr->f*depthmap.at<float>(corner->y, corner->x);
Eigen::Vector3d pt_pos_world = frame_ref->T_f_w_.inverse()*pt_pos_cur;
svo::Point* point = new svo::Point(pt_pos_world, svo::Point::DEPTH);
ftr->point = point;
frame_ref->addFeature(ftr);
}
SVO_INFO_STREAM("Added "<<corners.size()<<" 3d pts to the reference frame.");
vo_->setFirstFrame(frame_ref);
SVO_INFO_STREAM("Set reference frame.");
continue;
}
// Add image to VO
vo_->addImage(img, it->timestamp_);
// write pose to tracefile
if(vo_->stage() == svo::FrameHandlerMono::DEFAULT_FRAME)
tracePose(vo_->lastFrame()->T_f_w_.inverse(), it->timestamp_);
}
}