diff --git a/demos/cosyslam.cpp b/demos/cosyslam.cpp index 0b67d3e7cfdaf9ac73eb72a033e1da745b819459..be0615e194aaf1105b726da831f28b7d105dcae6 100644 --- a/demos/cosyslam.cpp +++ b/demos/cosyslam.cpp @@ -5,6 +5,7 @@ #include <utility> #include <string> #include <Eigen/Dense> +#include <yaml-cpp/yaml.h> #include "core/problem/problem.h" #include <core/ceres_wrapper/solver_ceres.h> @@ -64,7 +65,7 @@ int main() ParamsSensorPosePtr params_sp = std::make_shared<ParamsSensorPose>(); auto sen = problem->installSensor("SensorPose", "sensor_pose", (Vector7d() << 0, 0, 0, 0, 0, 0, 1).finished(), params_sp); - auto prc = problem->installProcessor("ProcessorTrackerLandmarkObject", "objects_wrapper", "sensor_pose", wolf_root + "/demos/processor_tracker_landmark_object.yaml"); + auto prc = problem->installProcessor("ProcessorTrackerLandmarkObject", "objects_wrapper", "sensor_pose", wolf_root + "/demos/yaml/processor_tracker_landmark_object.yaml"); auto prc_obj = std::static_pointer_cast<ProcessorTrackerLandmarkObject>(prc); VectorComposite x0("PO", {Vector3d(0, 0, 0), Quaterniond::Identity().coeffs()}); diff --git a/demos/cosyslam_imu.cpp b/demos/cosyslam_imu.cpp index a0d76e2d299eeea83fcb9e41daa7d80466d17501..4532e5436415fd1030e7a7dedfd14a2ea90f854c 100644 --- a/demos/cosyslam_imu.cpp +++ b/demos/cosyslam_imu.cpp @@ -59,10 +59,12 @@ int main() // Retrieve parameters from config file std::string bagfile = config["bag"].as<std::string>(); bool unfix_extrinsic = config["unfix_extrinsic"].as<bool>(); - std::vector<double> c_p_i_vec = config["c_p_i"].as<std::vector<double>>(); - std::vector<double> c_q_i_vec = config["c_q_i"].as<std::vector<double>>(); - Eigen::Map<Vector3d> c_p_i(c_p_i_vec.data()); - Eigen::Map<Vector4d> c_q_i(c_q_i_vec.data()); + std::vector<double> i_p_c_vec = config["i_p_c"].as<std::vector<double>>(); + std::vector<double> i_q_c_vec = config["i_q_c"].as<std::vector<double>>(); + std::vector<double> i_q_w_vec = config["i_q_w"].as<std::vector<double>>(); + Eigen::Map<Vector3d> i_p_c(i_p_c_vec.data()); + Eigen::Map<Vector4d> i_q_c(i_q_c_vec.data()); + Eigen::Map<Vector4d> i_q_w(i_q_w_vec.data()); // Rosbag opening rosbag::Bag bag; @@ -79,25 +81,26 @@ int main() // Cosypose processor ParamsSensorPosePtr params_sp = std::make_shared<ParamsSensorPose>(); - auto sen = problem->installSensor("SensorPose", "sensor_pose", (Vector7d() << 0, 0, 0, 0, 0, 0, 1).finished(), params_sp); + Vector7d extr_cam; extr_cam << i_p_c, i_q_c; + auto sen = problem->installSensor("SensorPose", "sensor_pose", extr_cam, params_sp); + if (unfix_extrinsic){ + sen->unfixExtrinsics(); + } + else{ + sen->fixExtrinsics(); + } auto prc = problem->installProcessor("ProcessorTrackerLandmarkObject", "objects_wrapper", "sensor_pose", wolf_root + "/demos/yaml/processor_tracker_landmark_object.yaml"); auto prc_obj = std::static_pointer_cast<ProcessorTrackerLandmarkObject>(prc); // IMU processor - Vector7d extr_imu; extr_imu << c_p_i, c_q_i; - SensorBasePtr sen_imu_base = problem->installSensor("SensorImu", "SenImu", extr_imu, wolf_root + "/demos/yaml/realsense_imu.yaml"); + SensorBasePtr sen_imu_base = problem->installSensor("SensorImu", "SenImu",(Vector7d() << 0, 0, 0, 0, 0, 0, 1).finished(), wolf_root + "/demos/yaml/realsense_imu.yaml"); SensorImuPtr sen_imu = std::static_pointer_cast<SensorImu>(sen_imu_base); - if (unfix_extrinsic){ - sen_imu->unfixExtrinsics(); - } - else{ - sen_imu->fixExtrinsics(); - } ProcessorBasePtr proc_imu_base = problem->installProcessor("ProcessorImu", "imu pre-integrator", "SenImu", wolf_root + "/demos/yaml/processor_imu.yaml"); ProcessorImuPtr proc_imu = std::static_pointer_cast<ProcessorImu>(proc_imu_base); - VectorComposite x0("POV", { Vector3d::Zero(), Quaterniond::Identity().coeffs(), Vector3d::Zero()}); - VectorComposite sig0("POV", {Vector3d::Ones(), Vector3d::Ones(), Vector3d::Ones()}); + // The initial orientation is given in the config file + VectorComposite x0("POV", { Vector3d::Zero(), i_q_w, Vector3d::Zero()}); + VectorComposite sig0("POV", {Vector3d::Ones()*0.001, Vector3d::Ones(), Vector3d::Ones()*0.05}); ObjectDetections dets; @@ -106,8 +109,8 @@ int main() /////////////// std::vector<std::string> topics; - topics.push_back(std::string("/cosypose")); topics.push_back(std::string("/imu")); + topics.push_back(std::string("/cosypose")); rosbag::View view(bag, rosbag::TopicQuery(topics)); ros::Time bag_begin_time = view.getBeginTime(); TimeStamp init_ts(bag_begin_time.toSec()); @@ -143,7 +146,7 @@ int main() ObjectDetection det = {.measurement = poseVec, .detection_score = object.score, .meas_cov = cov, .object_type = object.name}; dets.push_back(det); } - TimeStamp ts(cosyArray->header.stamp.sec, cosyArray->header.stamp.nsec); + TimeStamp ts(m.getTime().toSec()); CaptureObjectPtr cap_obj = std::make_shared<CaptureObject>(ts, sen, dets); cap_obj->process(); dets.clear(); @@ -159,7 +162,7 @@ int main() cosyIMU->angular_velocity.y, cosyIMU->angular_velocity.z; Matrix6d acc_gyr_cov = sen_imu->getNoiseCov(); - TimeStamp ts(cosyIMU->header.stamp.sec, cosyIMU->header.stamp.nsec); + TimeStamp ts(m.getTime().toSec()); CaptureImuPtr cap_imu = std::make_shared<CaptureImu>(ts, sen_imu, acc_gyr_meas, acc_gyr_cov); cap_imu->process(); } diff --git a/demos/yaml/cosyslam_imu.yaml b/demos/yaml/cosyslam_imu.yaml index 7ff2f0ce3bb909749fa29383c543cef260c155e6..12d73da8dff4b126fdbf45c9292f3be9081fb63c 100644 --- a/demos/yaml/cosyslam_imu.yaml +++ b/demos/yaml/cosyslam_imu.yaml @@ -1,7 +1,8 @@ # rosbag name -bag: "/demos/bag/shortIMU.bag" +bag: "/demos/bag/shortIMU_positiveShift.bag" # Camera to IMU transformation -unfix_extrinsic: True -c_p_i: [-0.00772693, -0.00208873, -0.00794716] -c_q_i: [0.01048408, 0.01594998, 0.00134348, 0.99981692] \ No newline at end of file +unfix_extrinsic: false +i_p_c: [-0.0111433, 0.00260534, 0.00542655] +i_q_c: [ 0.01424561, -0.00273651, 0.00528824, 0.9998808 ] +i_q_w: [ 0.00112227, -0.01527152, -0.03007937, 0.99943021] \ No newline at end of file diff --git a/demos/yaml/processor_imu.yaml b/demos/yaml/processor_imu.yaml index f92b74c06167c96ef4294e00600c7270bd0d20e2..b67f8597746ce9c580fb4a01d5082a1387c6a446 100644 --- a/demos/yaml/processor_imu.yaml +++ b/demos/yaml/processor_imu.yaml @@ -4,7 +4,7 @@ keyframe_vote: max_buff_length: 100000000000 max_time_span: 0.19999 voting_active: true -name: Main imu +name: SenImu time_tolerance: 0.0005 type: ProcessorImu unmeasured_perturbation_std: 1.0e-06 diff --git a/demos/yaml/processor_tracker_landmark_object.yaml b/demos/yaml/processor_tracker_landmark_object.yaml index 85e125df3de29d4d4b77eb9489f5d9966277b90d..d7e3ec645423f8e14db7b03ceed70fedb077b558 100644 --- a/demos/yaml/processor_tracker_landmark_object.yaml +++ b/demos/yaml/processor_tracker_landmark_object.yaml @@ -15,9 +15,9 @@ intrinsic: fx: 951.15435791 fy: 951.40795898 -lmk_score_thr: 4.0 -e_pos_thr: 0.1 -e_rot_thr: 0.3 +lmk_score_thr: 0.0 +e_pos_thr: 10 +e_rot_thr: 20 fps: 30 reestimate_last_frame: false # for a better prior on the new keyframe: use only if no motion processor add_3d_cstr: false # add 3D constraints between the KF so that they do not jump when using apriltag only diff --git a/src/processor/processor_tracker_landmark_object.cpp b/src/processor/processor_tracker_landmark_object.cpp index a5c33ede44d7cedf4fdf2809d90fbedb8f36cbc9..6d0a7ed2f09e5a6b69d8301b2d27558a55851e85 100644 --- a/src/processor/processor_tracker_landmark_object.cpp +++ b/src/processor/processor_tracker_landmark_object.cpp @@ -171,6 +171,7 @@ unsigned int ProcessorTrackerLandmarkObject::detectNewFeatures(const int& _max_n // max_new_features reached if (_max_new_features != -1 && _features_out.size() == _max_new_features) break; + bool feature_already_found = false; auto feat_obj = std::static_pointer_cast<FeatureObject>(feat); @@ -223,7 +224,6 @@ unsigned int ProcessorTrackerLandmarkObject::detectNewFeatures(const int& _max_n if (!feature_already_found) { - std::cout << feat_obj->getObjectType() << std::endl; // If the feature is not in the map & not in the list of newly detected features yet, then we add it. _features_out.push_back(feat);