diff --git a/.gitignore b/.gitignore index 57d102ed77ffbf7b97d53b6efb677b2487dcdf4c..b1406042b7bdbb1ddb7812463a34adf9ac74b21e 100644 --- a/.gitignore +++ b/.gitignore @@ -28,7 +28,6 @@ src/examples/map_polyline_example_write.yaml src/CMakeCache.txt src/CMakeFiles/cmake.check_cache -src/examples/map_apriltag_save.yaml vision.found \.vscode/ diff --git a/demos/demo_apriltag.cpp b/demos/demo_apriltag.cpp deleted file mode 100644 index c69ec44b05941a96bf94a1414d9405856f12f215..0000000000000000000000000000000000000000 --- a/demos/demo_apriltag.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/** - * \file test_apriltag.cpp - * - * Created on: Dec 14, 2018 - * \author: Dinesh Atchtuhan - */ - -//Wolf -#include "base/wolf.h" -#include "base/rotations.h" -#include "base/problem.h" -#include "base/ceres_wrapper/solver_ceres.h" -#include "base/sensor/sensor_camera.h" -#include "base/processor/processor_tracker_landmark_apriltag.h" -#include "base/capture/capture_image.h" -#include "base/feature/feature_apriltag.h" - -// opencv -#include <opencv2/imgproc/imgproc.hpp> -#include "opencv2/opencv.hpp" - -// Eigen -#include <Eigen/Core> -#include <Eigen/Geometry> - -// std -#include <iostream> -#include <stdlib.h> - - -void draw_apriltag(cv::Mat image, std::vector<cv::Point2d> corners, int thickness=1, bool draw_corners=false); - - -int main(int argc, char *argv[]) -{ - /* - * HOW TO USE ? - * For now, just call the executable and append the list of images to be processed. - * The images must be placed in the root folder of your wolf project. - * Ex: - * ./test_apriltag frame1.jpg frame2.jpg frame3.jpg - */ - - using namespace wolf; - - - // General execution options - const bool APPLY_CONTRAST = false; - const bool IMAGE_OUTPUT = true; - const bool USEMAP = false; - - - WOLF_INFO( "==================== processor apriltag test ======================" ) - - std::string wolf_root = _WOLF_ROOT_DIR; - // Wolf problem - ProblemPtr problem = Problem::create("PO", 3); - SolverCeresPtr solver = std::make_shared<SolverCeres>(problem); - solver->getSolverOptions().function_tolerance = 1e-6; - solver->getSolverOptions().max_num_iterations = 100; - - - WOLF_INFO( "==================== Configure Problem ======================" ) - Eigen::Vector7d cam_extrinsics; cam_extrinsics << 0,0,0, 0,0,0,1; - SensorBasePtr sen = problem->installSensor("CAMERA", "camera", cam_extrinsics, wolf_root + "/src/examples/camera_logitech_c300_640_480.yaml"); -// SensorBasePtr sen = problem->installSensor("CAMERA", "camera", cam_extrinsics, wolf_root + "/src/examples/camera_Dinesh_LAAS_params_notangentrect.yaml"); - SensorCameraPtr sen_cam = std::static_pointer_cast<SensorCamera>(sen); - ProcessorBasePtr prc = problem->installProcessor("TRACKER LANDMARK APRILTAG", "apriltags", "camera", wolf_root + "/src/examples/processor_tracker_landmark_apriltag.yaml"); - - if (USEMAP){ - problem->loadMap(wolf_root + "/src/examples/maps/map_apriltag_logitech_1234.yaml"); - for (auto lmk : problem->getMap()->getLandmarkList()){ - lmk->fix(); - } - } - - // set prior - Eigen::Matrix6d covariance = Matrix6d::Identity(); - double std_m; - double std_deg; - if (USEMAP){ - std_m = 100; // standard deviation on original translation - std_deg = 180; // standard deviation on original rotation - } - else { - std_m = 0.00001; // standard deviation on original translation - std_deg = 0.00001; // standard deviation on original rotation - } - - covariance.topLeftCorner(3,3) = std_m*std_m * covariance.topLeftCorner(3,3); - covariance.bottomRightCorner(3,3) = (M_TORAD*std_deg)*(M_TORAD*std_deg) * covariance.bottomRightCorner(3,3); - - if (USEMAP){ - FrameBasePtr F1 = problem->setPrior((Vector7d()<<0.08, 0.15, -0.75, 0, 0, 0, 1).finished(), covariance, 0.0, 0.1); - } - else { - FrameBasePtr F1 = problem->setPrior((Vector7d()<<0,0,0,0,0,0,1).finished(), covariance, 0.0, 0.1); - F1->fix(); - } - - // first argument is the name of the program. - // following arguments are path to image (from wolf_root) - const int inputs = argc -1; - WOLF_DEBUG("nb of images: ", inputs); - cv::Mat frame; - double ts(0); - double dt = 1; - - WOLF_INFO( "==================== Main loop ======================" ) - for (int input = 1; input <= inputs; input++) { - std::string path = wolf_root + "/" + argv[input]; - frame = cv::imread(path, CV_LOAD_IMAGE_COLOR); - - if( frame.data ){ //if imread succeeded - - if (APPLY_CONTRAST){ - double alpha = 2.0; // to tune contrast [1-3] - int beta = 0; // to tune lightness [0-100] - // Do the operation new_image(i,j) = alpha*image(i,j) + beta - for( int y = 0; y < frame.rows; y++ ){ - for( int x = 0; x < frame.cols; x++ ){ - for( int c = 0; c < 3; c++ ){ - frame.at<cv::Vec3b>(y,x)[c] = cv::saturate_cast<uchar>( alpha*( frame.at<cv::Vec3b>(y,x)[c] ) + beta ); - } - } - } - } - - CaptureImagePtr cap = std::make_shared<CaptureImage>(ts, sen_cam, frame); - // cap->setType(argv[input]); // only for problem->print() to show img filename - cap->setName(argv[input]); - WOLF_DEBUG("Processing image...", path); - sen->process(cap); - - if (IMAGE_OUTPUT){ - cv::namedWindow( cap->getName(), cv::WINDOW_NORMAL );// Create a window for display. - } - - } - else - WOLF_WARN("could not load image ", path); - - ts += dt; - } - - - if (IMAGE_OUTPUT){ - WOLF_INFO( "==================== Draw all detections ======================" ) - for (auto F : problem->getTrajectory()->getFrameList()) - { - if (F->isKey()) - { - for (auto cap : F->getCaptureList()) - { - if (cap->getType() == "IMAGE") - { - auto img = std::static_pointer_cast<CaptureImage>(cap); - for (FeatureBasePtr f : img->getFeatureList()) - { - FeatureApriltagPtr fa = std::static_pointer_cast<FeatureApriltag>(f); - draw_apriltag(img->getImage(), fa->getTagCorners(), 1); - } - cv::imshow( img->getName(), img->getImage() ); // display original image. - cv::waitKey(1); - } - } - } - } - } - - - -// WOLF_INFO( "==================== Provide perturbed prior ======================" ) -// for (auto kf : problem->getTrajectory()->getFrameList()) -// { -// Vector7d x; -// if (kf->isKey()) -// { -// x.setRandom(); -// x.tail(4).normalize(); -// kf->setState(x); -// } -// } - - WOLF_INFO( "==================== Solve problem ======================" ) - std::string report = solver->solve(SolverManager::ReportVerbosity::FULL); // 0: nothing, 1: BriefReport, 2: FullReport - WOLF_DEBUG(report); - problem->print(3,0,1,1); - - - - WOLF_INFO("============= SOLVED PROBLEM : POS | EULER (DEG) ===============") - for (auto kf : problem->getTrajectory()->getFrameList()) - { - if (kf->isKey()) - for (auto cap : kf->getCaptureList()) - { - if (cap->getType() != "POSE") - { - Vector3d T = kf->getP()->getState(); - Vector4d qv= kf->getO()->getState(); - Vector3d e = M_TODEG * R2e(q2R(qv)); - WOLF_DEBUG("KF", kf->id(), " => ", T.transpose(), " | ", e.transpose()); - } - } - } - for (auto lmk : problem->getMap()->getLandmarkList()) - { - Vector3d T = lmk->getP()->getState(); - Vector4d qv= lmk->getO()->getState(); - Vector3d e = M_TODEG * R2e(q2R(qv)); - WOLF_DEBUG(" L", lmk->id(), " => ", T.transpose(), " | ", e.transpose()); - } - - - // =============================================== - // COVARIANCES =================================== - // =============================================== - // Print COVARIANCES of all states - WOLF_INFO("======== COVARIANCES OF SOLVED PROBLEM : POS | QUAT =======") - solver->computeCovariances(SolverManager::CovarianceBlocksToBeComputed::ALL_MARGINALS); - for (auto kf : problem->getTrajectory()->getFrameList()) - if (kf->isKey()) - { - Eigen::MatrixXd cov = kf->getCovariance(); - WOLF_DEBUG("KF", kf->id(), "_std (sigmas) = ", cov.diagonal().transpose().array().sqrt()); - } - for (auto lmk : problem->getMap()->getLandmarkList()) - { - Eigen::MatrixXd cov = lmk->getCovariance(); - WOLF_DEBUG(" L", lmk->id(), "_std (sigmas) = ", cov.diagonal().transpose().array().sqrt()); - } - std::cout << std::endl; - - - // =============================================== - // SAVE MAP TO YAML ============================== - // =============================================== - // - // problem->saveMap(wolf_root + "/src/examples/map_apriltag_set3_HC.yaml", "set3"); - - if (IMAGE_OUTPUT){ - cv::waitKey(0); - cv::destroyAllWindows(); - } - - return 0; - -} - - -void draw_apriltag(cv::Mat image, std::vector<cv::Point2d> corners, - int thickness, bool draw_corners) { - cv::line(image, corners[0], corners[1], CV_RGB(255, 0, 0), thickness); - cv::line(image, corners[1], corners[2], CV_RGB(0, 255, 0), thickness); - cv::line(image, corners[2], corners[3], CV_RGB(0, 0, 255), thickness); - cv::line(image, corners[3], corners[0], CV_RGB(255, 0, 255), thickness); - - /////// - // Leads to implement other displays - /////// - -// const auto line_type = cv::LINE_AA; -// if (draw_corners) { -// int r = thickness; -// cv::circle(image, cv::Point2i(p[0].x, p[0].y), r, CV_RGB(255, 0, 0), -1, -// line_type); -// cv::circle(image, cv::Point2i(p[1].x, p[1].y), r, CV_RGB(0, 255, 0), -1, -// line_type); -// cv::circle(image, cv::Point2i(p[2].x, p[2].y), r, CV_RGB(0, 0, 255), -1, -// line_type); -// cv::circle(image, cv::Point2i(p[3].x, p[3].y), r, CV_RGB(255, 0, 255), -1, -// line_type); -// } - -// cv::putText(image, std::to_string(apriltag.id), -// cv::Point2f(apriltag.center.x - 5, apriltag.center.y + 5), -// cv::FONT_HERSHEY_SIMPLEX, 1, CV_RGB(255, 0, 255), 2, line_type); - - -} - -//void DrawApriltags(cv::Mat &image, const ApriltagVec &apriltags) { -// for (const auto &apriltag : apriltags) { -//// DrawApriltag(image, apriltag); -// DrawApriltag(image, apriltag, 1); -// } -//} - diff --git a/demos/maps/map_apriltag_logitech_1234.yaml b/demos/maps/map_apriltag_logitech_1234.yaml deleted file mode 100644 index f313d1a11a3f2b4fa239f710cbbea7372747677d..0000000000000000000000000000000000000000 --- a/demos/maps/map_apriltag_logitech_1234.yaml +++ /dev/null @@ -1,46 +0,0 @@ -map name: "4 tags printed on a A4 sheet vertical recorded at IRI with logitech webcam." - -nlandmarks: 4 # This must match the number of landmarks in the list that follows. Otherwise it is an error. - -###################### -# World frame is considered to be the top left corner of tag id 0. Reference frame is corherent with a camera -# looking straight at the sheet with RBF convention. -###################### -landmarks: - - - id : 0 # use same as tag id - type: "APRILTAG" # This must match the KEY used in the LandmarkFactory. Otherwise it is an error. - tag id: 0 - tag width: 0.055 - position: [0.0225, 0.0225, 0] - orientation: [0, 0, 0] # roll pitch yaw in degrees - position fixed: true - orientation fixed: true - - - id : 1 # use same as tag id - type: "APRILTAG" # This must match the KEY used in the LandmarkFactory. Otherwise it is an error. - tag id: 1 - tag width: 0.055 - position: [0.1525, 0.0225, 0] - orientation: [0, 0, 0] # roll pitch yaw in degrees - position fixed: true - orientation fixed: true - - - id : 2 # use same as tag id - type: "APRILTAG" # This must match the KEY used in the LandmarkFactory. Otherwise it is an error. - tag id: 2 - tag width: 0.055 - position: [0.0225, 0.2125, 0] - orientation: [0, 0, 0] # roll pitch yaw in degrees - position fixed: true - orientation fixed: true - - - id : 3 # use same as tag id - type: "APRILTAG" # This must match the KEY used in the LandmarkFactory. Otherwise it is an error. - tag id: 3 - tag width: 0.055 - position: [0.1525, 0.2125, 0] - orientation: [0, 0, 0] # roll pitch yaw in degrees - position fixed: true - orientation fixed: true -