From 0b189f33fb567f1f4a391812ee6055967d8994bd Mon Sep 17 00:00:00 2001 From: Patrick Geneva Date: Sun, 13 Aug 2023 12:41:47 -0700 Subject: [PATCH 1/7] lets try maplab 2.0 and 20.04 --- .github/workflows/build_ros1.yml | 38 +++++++++++++++++++++++++++++ Dockerfile => Dockerfile_ros1_20_04 | 25 +++++++++++++------ ReadMe.md | 8 +++--- package.xml | 2 ++ 4 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/build_ros1.yml rename Dockerfile => Dockerfile_ros1_20_04 (64%) diff --git a/.github/workflows/build_ros1.yml b/.github/workflows/build_ros1.yml new file mode 100644 index 0000000..c352b6d --- /dev/null +++ b/.github/workflows/build_ros1.yml @@ -0,0 +1,38 @@ +name: ROS 1 Workflow + +on: + push: + branches: [ master ] + pull_request: + +jobs: + build_2004: + name: "ROS1 Ubuntu 20.04" + runs-on: ubuntu-latest + steps: + - name: Code Checkout + uses: actions/checkout@v2 + - name: Create Workspace and Docker Image + run: | + export REPO=$(basename $GITHUB_REPOSITORY) && + cd $GITHUB_WORKSPACE/.. && mkdir src/ && + cd src/ + && git clone https://github.com/rpng/open_vins.git + && git clone https://github.com/ethz-asl/maplab.git --recursive + && cd .. && + mv $REPO/ src/ && mkdir $REPO/ && mv src/ $REPO/ && cd $REPO/ && + docker build -t ov_plane -f $GITHUB_WORKSPACE/src/$REPO/Dockerfile_ros1_20_04 . + - name: Run Build in Docker + run: | + docker run -t --mount type=bind,source=$GITHUB_WORKSPACE,target=/catkin_ws ov_plane /bin/bash -c + "cd /catkin_ws + && catkin init + && catkin config --merge-devel + && catkin config --extend /opt/ros/noetic + && catkin build ov_maplab" + - name: Run Simulation! + run: | + docker run -t --mount type=bind,source=$GITHUB_WORKSPACE,target=/catkin_ws ov_plane /bin/bash -c "cd /catkin_ws && source devel/setup.bash && roslaunch ov_plane simulation.launch verbosity:=WARNING" + + + diff --git a/Dockerfile b/Dockerfile_ros1_20_04 similarity index 64% rename from Dockerfile rename to Dockerfile_ros1_20_04 index bd8961c..7725b7e 100644 --- a/Dockerfile +++ b/Dockerfile_ros1_20_04 @@ -1,4 +1,4 @@ -FROM osrf/ros:melodic-desktop-full +FROM osrf/ros:noetic-desktop-full # ========================================================= # ========================================================= @@ -14,14 +14,25 @@ FROM osrf/ros:melodic-desktop-full # Dependencies we use, catkin tools is very good build system # Also some helper utilities for fast in terminal edits (nano etc) RUN apt-get update && apt-get install -y libeigen3-dev nano git -RUN sudo apt-get install -y python-catkin-tools - -# Seems this has Python 3.6 installed on it... -RUN sudo apt-get install -y python3-dev python3-matplotlib python3-numpy python3-psutil python3-tk +RUN sudo apt-get install -y python3-catkin-tools python3-osrf-pycommon + +# Ceres solver install and setup +RUN sudo apt-get install -y cmake libgoogle-glog-dev libgflags-dev libatlas-base-dev libeigen3-dev libsuitesparse-dev libceres-dev +# ENV CERES_VERSION="2.0.0" +# RUN git clone https://ceres-solver.googlesource.com/ceres-solver && \ +# cd ceres-solver && \ +# git checkout tags/${CERES_VERSION} && \ +# mkdir build && cd build && \ +# cmake .. && \ +# make -j$(nproc) install && \ +# rm -rf ../../ceres-solver + +# Seems this has Python 3.8 installed on it... +RUN apt-get update && apt-get install -y python3-dev python3-matplotlib python3-numpy python3-psutil python3-tk # Maplab dependecies # https://github.com/ethz-asl/maplab/wiki/Installation-Ubuntu -RUN sudo apt install -y autotools-dev ccache doxygen dh-autoreconf git liblapack-dev libblas-dev libgtest-dev libreadline-dev libssh2-1-dev pylint clang-format python-autopep8 python-catkin-tools python-pip python-git python-setuptools python-termcolor python-wstool libatlas3-base +RUN sudo apt install -y autotools-dev ccache doxygen dh-autoreconf git liblapack-dev libblas-dev libgtest-dev libreadline-dev libssh2-1-dev pylint clang-format-6.0 python3-autopep8 python3-catkin-tools python3-pip python3-git python3-setuptools python3-termcolor python3-wstool libatlas3-base libv4l-dev RUN sudo pip install requests # Install CMake 3.13.5 @@ -33,7 +44,7 @@ RUN cmake --version # Install deps needed for clion remote debugging # https://blog.jetbrains.com/clion/2020/01/using-docker-with-clion/ -RUN sed -i '6i\source "/catkin_ws/devel/setup.bash"\' /ros_entrypoint.sh +# RUN sed -i '6i\source "/catkin_ws/devel/setup.bash"\' /ros_entrypoint.sh RUN apt-get update && apt-get install -y ssh build-essential gcc g++ \ gdb clang cmake rsync tar python && apt-get clean RUN ( \ diff --git a/ReadMe.md b/ReadMe.md index b25a028..02ebd67 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -20,11 +20,11 @@ git clone https://github.com/rpng/open_vins.git git clone https://github.com/ethz-asl/maplab.git --recursive # switch open_vins to last tested commit (might build with newer) cd open_vins/ -git checkout 2b506eeedd0b158c014641b9240a62ae80f6d7a0 +git checkout 4534a2f32d4763bdc8c95121b3292c7423e12aca cd .. # switch maplab to last tested commit (might build with newer) cd maplab/ -git checkout 483daf4988a76c15be362fd017ec78581c4f88d9 +git checkout 0b4868efeb292851d71f98d31a1e6bb40ebb244b git submodule update --init --recursive cd .. ``` @@ -52,8 +52,8 @@ ov_docker ov_maplab bash cd catkin_ws/ catkin init catkin config --merge-devel -catkin config --extend /opt/ros/melodic -catkin build maplab ov_maplab ov_data -j4 +catkin config --extend /opt/ros/noetic +catkin build maplab ov_maplab -j4 catkin build ov_maplab -j4 --no-deps # after first build source devel/setup.bash ``` diff --git a/package.xml b/package.xml index d8b1890..246bb4b 100644 --- a/package.xml +++ b/package.xml @@ -29,6 +29,7 @@ visualization_msgs cv_bridge ov_core + ov_data ov_msckf vi_map vio_common @@ -48,6 +49,7 @@ visualization_msgs cv_bridge ov_core + ov_data ov_msckf vi_map vio_common From cb4aeb5833dc24b6faadafc0a54635b455c25648 Mon Sep 17 00:00:00 2001 From: Patrick Geneva Date: Sun, 13 Aug 2023 12:43:44 -0700 Subject: [PATCH 2/7] enable on test branch --- .github/workflows/build_ros1.yml | 2 +- error_on_1804.txt | 55 ++++++ src/ros1_serial_msckf.cpp | 283 +++++++++++++------------------ 3 files changed, 170 insertions(+), 170 deletions(-) create mode 100644 error_on_1804.txt diff --git a/.github/workflows/build_ros1.yml b/.github/workflows/build_ros1.yml index c352b6d..1fea8ef 100644 --- a/.github/workflows/build_ros1.yml +++ b/.github/workflows/build_ros1.yml @@ -2,7 +2,7 @@ name: ROS 1 Workflow on: push: - branches: [ master ] + branches: [ master, test2004 ] pull_request: jobs: diff --git a/error_on_1804.txt b/error_on_1804.txt new file mode 100644 index 0000000..398a6e1 --- /dev/null +++ b/error_on_1804.txt @@ -0,0 +1,55 @@ +Errors << feature_tracking:make /catkin_ws/logs/feature_tracking/build.make.001.log +In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-tracking-types.cc:5:0: +/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-tracking-types.h:50:12: error: ‘ScoreType’ in ‘class cv::ORB’ does not name a type + cv::ORB::ScoreType orb_detector_score_type; + ^~~~~~~~~ +/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-tracking-types.cc: In constructor ‘feature_tracking::FeatureTrackingDetectorSettings::FeatureTrackingDetectorSettings()’: +/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-tracking-types.cc:157:7: error: class ‘feature_tracking::FeatureTrackingDetectorSettings’ does not have any field named ‘orb_detector_score_type’ + orb_detector_score_type(cv::ORB::ScoreType::HARRIS_SCORE), + ^~~~~~~~~~~~~~~~~~~~~~~ +/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-tracking-types.cc:157:40: error: ‘cv::ORB::ScoreType’ has not been declared + orb_detector_score_type(cv::ORB::ScoreType::HARRIS_SCORE), + ^~~~~~~~~ +make[2]: *** [CMakeFiles/feature_tracking.dir/src/feature-tracking-types.cc.o] Error 1 +make[2]: *** Waiting for unfinished jobs.... +In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-detection-extraction.h:12:0, + from /catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-detection-extraction.cc:3: +/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-tracking-types.h:50:12: error: ‘ScoreType’ in ‘class cv::ORB’ does not name a type + cv::ORB::ScoreType orb_detector_score_type; + ^~~~~~~~~ +/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-detection-extraction.cc: In member function ‘void feature_tracking::FeatureDetectorExtractor::initialize()’: +/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-detection-extraction.cc:49:26: error: ‘const struct feature_tracking::FeatureTrackingDetectorSettings’ has no member named ‘orb_detector_score_type’; did you mean ‘orb_detector_scale_factor’? + detector_settings_.orb_detector_score_type, + ^~~~~~~~~~~~~~~~~~~~~~~ + orb_detector_scale_factor +make[2]: *** [CMakeFiles/feature_tracking.dir/src/feature-detection-extraction.cc.o] Error 1 +In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-outlier-rejection-pipeline.h:8:0, + from /catkin_ws/src/maplab/algorithms/feature-tracking/src/vo-outlier-rejection-pipeline.cc:6: +/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-tracking-types.h:50:12: error: ‘ScoreType’ in ‘class cv::ORB’ does not name a type + cv::ORB::ScoreType orb_detector_score_type; + ^~~~~~~~~ +In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/src/vo-outlier-rejection-pipeline.cc:6:0: +/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-outlier-rejection-pipeline.h: In constructor ‘feature_tracking::VOOutlierRejectionPipeline::VOOutlierRejectionPipeline(const ConstPtr&, int, const Quaternion&, vi_map::FeatureType, const feature_tracking::FeatureTrackingOutlierSettings&)’: +/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-outlier-rejection-pipeline.h:55:40: warning: ‘feature_tracking::VOOutlierRejectionPipeline::outlier_settings_’ will be initialized after [-Wreorder] + const FeatureTrackingOutlierSettings outlier_settings_; + ^~~~~~~~~~~~~~~~~ +/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-outlier-rejection-pipeline.h:38:8: warning: ‘bool feature_tracking::VOOutlierRejectionPipeline::initialized_’ [-Wreorder] + bool initialized_; + ^~~~~~~~~~~~ +/catkin_ws/src/maplab/algorithms/feature-tracking/src/vo-outlier-rejection-pipeline.cc:10:1: warning: when initialized here [-Wreorder] + VOOutlierRejectionPipeline::VOOutlierRejectionPipeline( + ^~~~~~~~~~~~~~~~~~~~~~~~~~ +In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-detection-extraction.h:12:0, + from /catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-feature-tracking-pipeline.h:15, + from /catkin_ws/src/maplab/algorithms/feature-tracking/src/vo-feature-tracking-pipeline.cc:10: +/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-tracking-types.h:50:12: error: ‘ScoreType’ in ‘class cv::ORB’ does not name a type + cv::ORB::ScoreType orb_detector_score_type; + ^~~~~~~~~ +make[2]: *** [CMakeFiles/feature_tracking.dir/src/vo-feature-tracking-pipeline.cc.o] Error 1 +make[2]: *** [CMakeFiles/feature_tracking.dir/src/vo-outlier-rejection-pipeline.cc.o] Error 1 +make[1]: *** [CMakeFiles/feature_tracking.dir/all] Error 2 +make: *** [all] Error 2 +cd /catkin_ws/build/feature_tracking; catkin build --get-env feature_tracking | catkin env -si /usr/bin/make --jobserver-fds=6,7 -j; cd - +......................................................................................................................................................... +Failed << feature_tracking:make [ Exited with code 2 ] +Failed <<< feature_tracking [ 15.5 seconds ] \ No newline at end of file diff --git a/src/ros1_serial_msckf.cpp b/src/ros1_serial_msckf.cpp index 85305e8..2b30423 100644 --- a/src/ros1_serial_msckf.cpp +++ b/src/ros1_serial_msckf.cpp @@ -66,6 +66,9 @@ int main(int argc, char **argv) { // Create our VIO system VioManagerOptions params; params.print_and_load(parser); + // params.num_opencv_threads = 0; // uncomment if you want repeatability + // params.use_multi_threading_pubs = 0; // uncomment if you want repeatability + params.use_multi_threading_subs = false; sys = std::make_shared(params); viz = std::make_shared(nh, sys); builder = std::make_shared(nh, sys, params); @@ -84,29 +87,16 @@ int main(int argc, char **argv) { std::string topic_imu; nh->param("topic_imu", topic_imu, "/imu0"); parser->parse_external("relative_config_imu", "imu0", "rostopic", topic_imu); + PRINT_DEBUG("[SERIAL]: imu: %s\n", topic_imu.c_str()); - // Our camera topics (stereo pairs and non-stereo mono) - std::vector> topic_cameras; - if (params.use_stereo && params.state_options.num_cameras == 2) { - // Read in the topics - std::string cam_topic0, cam_topic1; - nh->param("topic_camera" + std::to_string(0), cam_topic0, "/cam" + std::to_string(0) + "/image_raw"); - nh->param("topic_camera" + std::to_string(1), cam_topic1, "/cam" + std::to_string(1) + "/image_raw"); - parser->parse_external("relative_config_imucam", "cam" + std::to_string(0), "rostopic", cam_topic0); - parser->parse_external("relative_config_imucam", "cam" + std::to_string(1), "rostopic", cam_topic1); - topic_cameras.emplace_back(0, cam_topic0); - topic_cameras.emplace_back(1, cam_topic1); - PRINT_DEBUG("serial cam (stereo): %s\n", cam_topic0.c_str()); - PRINT_DEBUG("serial cam (stereo): %s\n", cam_topic1.c_str()); - } else { - for (int i = 0; i < params.state_options.num_cameras; i++) { - // read in the topic - std::string cam_topic; - nh->param("topic_camera" + std::to_string(i), cam_topic, "/cam" + std::to_string(i) + "/image_raw"); - parser->parse_external("relative_config_imucam", "cam" + std::to_string(i), "rostopic", cam_topic); - topic_cameras.emplace_back(i, cam_topic); - PRINT_DEBUG("serial cam (mono): %s\n", cam_topic.c_str()); - } + // Our camera topics + std::vector topic_cameras; + for (int i = 0; i < params.state_options.num_cameras; i++) { + std::string cam_topic; + nh->param("topic_camera" + std::to_string(i), cam_topic, "/cam" + std::to_string(i) + "/image_raw"); + parser->parse_external("relative_config_imucam", "cam" + std::to_string(i), "rostopic", cam_topic); + topic_cameras.emplace_back(cam_topic); + PRINT_DEBUG("[SERIAL]: cam: %s\n", cam_topic.c_str()); } // Location of the ROS bag we want to read in @@ -115,13 +105,14 @@ int main(int argc, char **argv) { PRINT_DEBUG("ros bag path is: %s\n", path_to_bag.c_str()); // Load groundtruth if we have it + // NOTE: needs to be a csv ASL format file std::map> gt_states; if (nh->hasParam("path_gt")) { std::string path_to_gt; nh->param("path_gt", path_to_gt, ""); if (!path_to_gt.empty()) { ov_core::DatasetReader::load_gt_file(path_to_gt, gt_states); - PRINT_DEBUG("gt file path is: %s\n", path_to_gt.c_str()); + PRINT_DEBUG("[SERIAL]: gt file path is: %s\n", path_to_gt.c_str()); } } @@ -163,182 +154,136 @@ int main(int argc, char **argv) { return EXIT_FAILURE; } - // Open our iterators - auto view_imu = std::make_shared(bag, rosbag::TopicQuery(topic_imu), time_init, time_finish); - auto view_imu_iter = view_imu->begin(); - std::vector> view_cameras; - std::vector view_cameras_iterators; - for (const auto &topic : topic_cameras) { - auto view_tmp = std::make_shared(bag, rosbag::TopicQuery(topic.second), time_init, time_finish); - view_cameras.push_back(view_tmp); - view_cameras_iterators.push_back(view_tmp->begin()); - } - - // Record the current measurement timestamps - sensor_msgs::Imu::ConstPtr msg_imu_current; - sensor_msgs::Imu::ConstPtr msg_imu_next; - std::vector msg_images_current; - std::vector msg_images_next; - msg_imu_current = view_imu_iter->instantiate(); - view_imu_iter++; - msg_imu_next = view_imu_iter->instantiate(); - for (int i = 0; i < params.state_options.num_cameras; i++) { - msg_images_current.emplace_back(view_cameras_iterators.at(i)->instantiate()); - view_cameras_iterators.at(i)++; - msg_images_next.emplace_back(view_cameras_iterators.at(i)->instantiate()); + // We going to loop through and collect a list of all messages + // This is done so we can access arbitrary points in the bag + // NOTE: if we instantiate messages here, this requires the whole bag to be read + // NOTE: thus we just check the topic which allows us to quickly loop through the index + // NOTE: see this PR https://github.com/ros/ros_comm/issues/117 + double max_camera_time = -1; + std::vector msgs; + for (const rosbag::MessageInstance &msg : view) { + if (!ros::ok()) + break; + if (msg.getTopic() == topic_imu) { + // if (msg.instantiate() == nullptr) { + // PRINT_ERROR(RED "[SERIAL]: IMU topic has unmatched message types!!\n" RESET); + // PRINT_ERROR(RED "[SERIAL]: Supports: sensor_msgs::Imu\n" RESET); + // return EXIT_FAILURE; + // } + msgs.push_back(msg); + } + for (int i = 0; i < params.state_options.num_cameras; i++) { + if (msg.getTopic() == topic_cameras.at(i)) { + // sensor_msgs::CompressedImage::ConstPtr img_c = msg.instantiate(); + // sensor_msgs::Image::ConstPtr img_i = msg.instantiate(); + // if (img_c == nullptr && img_i == nullptr) { + // PRINT_ERROR(RED "[SERIAL]: Image topic has unmatched message types!!\n" RESET); + // PRINT_ERROR(RED "[SERIAL]: Supports: sensor_msgs::Image and sensor_msgs::CompressedImage\n" RESET); + // return EXIT_FAILURE; + // } + msgs.push_back(msg); + max_camera_time = std::max(max_camera_time, msg.getTime().toSec()); + } + } } + PRINT_DEBUG("[SERIAL]: total of %zu messages!\n", msgs.size()); //=================================================================================== //=================================================================================== //=================================================================================== + + // Loop through our message array, and lets process them + std::set used_index; + for (int m = 0; m < (int)msgs.size(); m++) { - while (ros::ok()) { - - // Check if we should end since we have run out of measurements - bool should_stop = false; - if (view_imu_iter == view_imu->end()) { - should_stop = true; - } - for (int i = 0; i < params.state_options.num_cameras; i++) { - if (view_cameras_iterators.at(i) == view_cameras.at(i)->end()) { - should_stop = true; - } - } - if (should_stop) { + // End once we reach the last time, or skip if before beginning time (shouldn't happen) + if (!ros::ok() || msgs.at(m).getTime() > time_finish || msgs.at(m).getTime().toSec() > max_camera_time) break; - } + if (msgs.at(m).getTime() < time_init) + continue; - // We should process the IMU if all the current cameras are greater then its time - bool should_process_imu = false; - for (int i = 0; i < params.state_options.num_cameras; i++) { - double time_imu = msg_imu_current->header.stamp.toSec(); - double time_cam = msg_images_current.at(i)->header.stamp.toSec(); - if (time_imu <= time_cam) { - should_process_imu = true; - } - } - if (should_process_imu) { - viz->callback_inertial(msg_imu_current); - builder->callback_inertial(msg_imu_current); - msg_imu_current = msg_imu_next; - view_imu_iter++; - if (view_imu_iter == view_imu->end()) - break; - msg_imu_next = view_imu_iter->instantiate(); + // Skip messages that we have already used + if (used_index.find(m) != used_index.end()) { + used_index.erase(m); continue; } - // If we are stereo, then we should collect both the left and right - if (params.state_options.num_cameras == 2) { - - // Now lets do some logic to find two images which are next to each other - // We want to ensure that our stereo pair are very close to occurring at the same time - bool have_found_pair = false; - while (!have_found_pair && view_cameras_iterators.at(0) != view_cameras.at(0)->end() && - view_cameras_iterators.at(1) != view_cameras.at(1)->end()) { - - // Get left and right cameras - auto msg_cam0 = msg_images_current.at(0); - auto msg_cam1 = msg_images_current.at(1); - auto msg_cam0_next = msg_images_next.at(0); - auto msg_cam1_next = msg_images_next.at(1); - - // timestamps - double time0 = msg_cam0->header.stamp.toSec(); - double time1 = msg_cam1->header.stamp.toSec(); - double time0_next = msg_cam0_next->header.stamp.toSec(); - double time1_next = msg_cam1_next->header.stamp.toSec(); - - // We will have a match if the current left and right images are closer then the next one - // Consider the case that we drop an image: - // (L1) L2 (R2) R3 <- current pointers are at L1 and R2 - // In this case, we dropped the R1 image, thus we should skip the L1 image - // We can check to see that L1 is further away compared to L2 from R2 - // Thus we should skip the L1 frame (advance the bag forward) and check this logic again! - if (std::abs(time1 - time0) < std::abs(time1_next - time0) && std::abs(time0 - time1) < std::abs(time0_next - time1)) { - have_found_pair = true; - } else if (std::abs(time1 - time0) >= std::abs(time1_next - time0)) { - // PRINT_WARNING("skipping cam1 (%.4f >= %.4f)",std::abs(time1-time0), std::abs(time1_next-time0)); - msg_images_current.at(1) = msg_images_next.at(1); - view_cameras_iterators.at(1)++; - if(view_cameras_iterators.at(1) != view_cameras.at(1)->end()) { - msg_images_next.at(1) = view_cameras_iterators.at(1)->instantiate(); - } - } else { - // PRINT_WARNING("skipping cam0 (%.4f >= %.4f)",std::abs(time0-time1), std::abs(time0_next-time1)); - msg_images_current.at(0) = msg_images_next.at(0); - view_cameras_iterators.at(0)++; - if(view_cameras_iterators.at(0) != view_cameras.at(0)->end()) { - msg_images_next.at(0) = view_cameras_iterators.at(0)->instantiate(); - } - } - } - // Break out if we have ended - if (view_cameras_iterators.at(0) == view_cameras.at(0)->end() || view_cameras_iterators.at(1) == view_cameras.at(1)->end()) { - break; - } - - // Check if we should initialize using the groundtruth (always use left) - Eigen::Matrix imustate; - if (!gt_states.empty() && !sys->initialized() && - ov_core::DatasetReader::get_gt_state(msg_images_current.at(0)->header.stamp.toSec(), imustate, gt_states)) { - // biases are pretty bad normally, so zero them - // imustate.block(11,0,6,1).setZero(); - sys->initialize_with_gt(imustate); - } + // IMU processing + if (msgs.at(m).getTopic() == topic_imu) { + // PRINT_DEBUG("processing imu = %.3f sec\n", msgs.at(m).getTime().toSec() - time_init.toSec()); + viz->callback_inertial(msgs.at(m).instantiate()); + builder->callback_inertial(msgs.at(m).instantiate()); + } - // Feed it into our system - viz->callback_stereo(msg_images_current.at(0), msg_images_current.at(1), 0, 1); - builder->callback_stereo(msg_images_current.at(0), msg_images_current.at(1), 0, 1); - // Move forward in time - msg_images_current.at(0) = msg_images_next.at(0); - view_cameras_iterators.at(0)++; - if(view_cameras_iterators.at(0) != view_cameras.at(0)->end()) { - msg_images_next.at(0) = view_cameras_iterators.at(0)->instantiate(); - } - msg_images_current.at(1) = msg_images_next.at(1); - view_cameras_iterators.at(1)++; - if(view_cameras_iterators.at(1) != view_cameras.at(1)->end()) { - msg_images_next.at(1) = view_cameras_iterators.at(1)->instantiate(); - } + // Camera processing + for (int cam_id = 0; cam_id < params.state_options.num_cameras; cam_id++) { - } else { + // Skip if this message is not a camera topic + if (msgs.at(m).getTopic() != topic_cameras.at(cam_id)) + continue; - // Find the camera which should be processed (smallest time) - int smallest_cam = 0; - for (int i = 0; i < params.state_options.num_cameras; i++) { - double time_cam0 = msg_images_current.at(smallest_cam)->header.stamp.toSec(); - double time_cam1 = msg_images_current.at(i)->header.stamp.toSec(); - if (time_cam1 < time_cam0) { - smallest_cam = i; + // We have a matching camera topic here, now find the other cameras for this time + // For each camera, we will find the nearest timestamp (within 0.02sec) that is greater than the current + // If we are unable, then this message should just be skipped since it isn't a sync'ed pair! + std::map camid_to_msg_index; + double meas_time = msgs.at(m).getTime().toSec(); + for (int cam_idt = 0; cam_idt < params.state_options.num_cameras; cam_idt++) { + if (cam_idt == cam_id) { + camid_to_msg_index.insert({cam_id, m}); + continue; + } + int cam_idt_idx = -1; + for (int mt = m; mt < (int)msgs.size(); mt++) { + if (msgs.at(mt).getTopic() != topic_cameras.at(cam_idt)) + continue; + if (std::abs(msgs.at(mt).getTime().toSec() - meas_time) < 0.02) + cam_idt_idx = mt; + break; } + if (cam_idt_idx != -1) { + camid_to_msg_index.insert({cam_idt, cam_idt_idx}); + } + } + + // Skip processing if we were unable to find any messages + if ((int)camid_to_msg_index.size() != params.state_options.num_cameras) { + PRINT_DEBUG(YELLOW "[SERIAL]: Unable to find stereo pair for message %d at %.2f into bag (will skip!)\n" RESET, m, + meas_time - time_init.toSec()); + continue; } // Check if we should initialize using the groundtruth - auto msg_camera = msg_images_current.at(smallest_cam); Eigen::Matrix imustate; - if (!gt_states.empty() && !sys->initialized() && - ov_core::DatasetReader::get_gt_state(msg_camera->header.stamp.toSec(), imustate, gt_states)) { + if (!gt_states.empty() && !sys->initialized() && ov_core::DatasetReader::get_gt_state(meas_time, imustate, gt_states)) { // biases are pretty bad normally, so zero them // imustate.block(11,0,6,1).setZero(); sys->initialize_with_gt(imustate); } - // Feed it into our system - viz->callback_monocular(msg_camera, smallest_cam); - builder->callback_monocular(msg_camera, smallest_cam); - - // move forward - msg_images_current.at(smallest_cam) = msg_images_next.at(smallest_cam); - view_cameras_iterators.at(smallest_cam)++; - if(view_cameras_iterators.at(smallest_cam) != view_cameras.at(smallest_cam)->end()) { - msg_images_next.at(smallest_cam) = view_cameras_iterators.at(smallest_cam)->instantiate(); + // Pass our data into our visualizer callbacks! + // PRINT_DEBUG("processing cam = %.3f sec\n", msgs.at(m).getTime().toSec() - time_init.toSec()); + if (params.state_options.num_cameras == 1) { + viz->callback_monocular(msgs.at(camid_to_msg_index.at(0)).instantiate(), 0); + builder->callback_monocular(msgs.at(camid_to_msg_index.at(0)).instantiate(), 0); + } else if (params.state_options.num_cameras == 2) { + auto msg0 = msgs.at(camid_to_msg_index.at(0)); + auto msg1 = msgs.at(camid_to_msg_index.at(1)); + used_index.insert(camid_to_msg_index.at(0)); // skip this message + used_index.insert(camid_to_msg_index.at(1)); // skip this message + viz->callback_stereo(msg0.instantiate(), msg1.instantiate(), 0, 1); + builder->callback_stereo(msg0.instantiate(), msg1.instantiate(), 0, 1); + } else { + PRINT_ERROR(RED "[SERIAL]: We currently only support 1 or 2 camera serial input....\n" RESET); + return EXIT_FAILURE; } + + break; } } + // Final visualization viz->visualize_final(); builder->save_to_disk(); From 031852c164e9663069f043c7483d0e7ee17a492a Mon Sep 17 00:00:00 2001 From: Patrick Geneva Date: Sun, 13 Aug 2023 12:45:34 -0700 Subject: [PATCH 3/7] update --- .github/workflows/build_ros1.yml | 24 +++++++++++------------- CMakeLists.txt | 13 ++++++++++--- ReadMe.md | 2 ++ 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build_ros1.yml b/.github/workflows/build_ros1.yml index 1fea8ef..05cb848 100644 --- a/.github/workflows/build_ros1.yml +++ b/.github/workflows/build_ros1.yml @@ -12,27 +12,25 @@ jobs: steps: - name: Code Checkout uses: actions/checkout@v2 + - name: Reconfigure git to use HTTP authentication + run: | + git config --global url."https://github.com/".insteadOf git@github.com: && + git config --global url."https://".insteadOf git:// - name: Create Workspace and Docker Image run: | export REPO=$(basename $GITHUB_REPOSITORY) && - cd $GITHUB_WORKSPACE/.. && mkdir src/ && - cd src/ - && git clone https://github.com/rpng/open_vins.git - && git clone https://github.com/ethz-asl/maplab.git --recursive - && cd .. && - mv $REPO/ src/ && mkdir $REPO/ && mv src/ $REPO/ && cd $REPO/ && - docker build -t ov_plane -f $GITHUB_WORKSPACE/src/$REPO/Dockerfile_ros1_20_04 . + cd $GITHUB_WORKSPACE/.. && mkdir src/ && cd src/ && + git clone https://github.com/rpng/open_vins.git && + git clone https://github.com/ethz-asl/maplab.git --recursive && + cd .. && mv $REPO/ src/ && mkdir $REPO/ && mv src/ $REPO/ && cd $REPO/ && + docker build -t ov_maplab -f $GITHUB_WORKSPACE/src/$REPO/Dockerfile_ros1_20_04 . - name: Run Build in Docker - run: | - docker run -t --mount type=bind,source=$GITHUB_WORKSPACE,target=/catkin_ws ov_plane /bin/bash -c + run: > + docker run -t --mount type=bind,source=$GITHUB_WORKSPACE,target=/catkin_ws ov_maplab /bin/bash -c "cd /catkin_ws && catkin init && catkin config --merge-devel && catkin config --extend /opt/ros/noetic && catkin build ov_maplab" - - name: Run Simulation! - run: | - docker run -t --mount type=bind,source=$GITHUB_WORKSPACE,target=/catkin_ws ov_plane /bin/bash -c "cd /catkin_ws && source devel/setup.bash && roslaunch ov_plane simulation.launch verbosity:=WARNING" - diff --git a/CMakeLists.txt b/CMakeLists.txt index 6399100..fb86b4a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,11 +7,16 @@ project(ov_maplab) find_package(catkin REQUIRED COMPONENTS roscpp rosbag tf std_msgs geometry_msgs sensor_msgs nav_msgs visualization_msgs cv_bridge ov_core ov_msckf vi_map vio_common feature_tracking online_map_builders console_common) add_definitions(-DROS_AVAILABLE=1) -# Include libraries +# Include libraries (if we don't have opencv 4, then fallback to opencv 3) +# The OpenCV version needs to match the one used by cv_bridge otherwise you will get a segmentation fault! find_package(Eigen3 REQUIRED) -find_package(OpenCV 3 REQUIRED) +find_package(OpenCV 3 QUIET) +if (NOT OpenCV_FOUND) + find_package(OpenCV 4 REQUIRED) +endif () find_package(Boost REQUIRED COMPONENTS system filesystem thread date_time) -message(STATUS "OPENCV: " ${OpenCV_VERSION} " | BOOST: " ${Boost_VERSION}) +find_package(Ceres REQUIRED) +message(STATUS "OPENCV: " ${OpenCV_VERSION} " | BOOST: " ${Boost_VERSION} " | CERES: " ${Ceres_VERSION}) # Describe catkin project catkin_package( @@ -36,6 +41,7 @@ include_directories( src ${EIGEN3_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} + ${CERES_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS} ) @@ -43,6 +49,7 @@ include_directories( list(APPEND thirdparty_libraries ${Boost_LIBRARIES} ${OpenCV_LIBRARIES} + ${CERES_LIBRARIES} ${catkin_LIBRARIES} ) diff --git a/ReadMe.md b/ReadMe.md index 02ebd67..cbab1d5 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,5 +1,7 @@ # OpenVINS Maplab Interface +[![ROS 1 Workflow](https://github.com/rpng/ov_maplab/actions/workflows/build_ros1.yml/badge.svg)](https://github.com/rpng/ov_maplab/actions/workflows/build_ros1.yml) + Here we have our interface wrapper for exporting visual-inertial runs from [OpenVINS](https://github.com/rpng/open_vins) into the ViMap structure taken by [maplab](https://github.com/ethz-asl/maplab). The state estimates and raw images are appended to the ViMap as OpenVINS runs through a dataset. After completion of the dataset, we re-extract features and triangulate them due to the incompatibilities of the two frontends. Maplab requires BRISK or FREAK descriptors, while OpenVINS works with KLT or ORB feature tracking. In the future we will try to only extract descriptors on tracked features from OpenVINS, but for now we just re-detect for simplicity. We have tested this on the [EurocMav](https://docs.openvins.com/gs-datasets.html#gs-data-euroc) and [TUM-VI](https://docs.openvins.com/gs-datasets.html#gs-data-tumvi) datasets and have had good success with merging the different runs and optimizing the resulting graph. To ensure that we are able to compile maplab, we provide a [docker image](Dockerfile) for Ubuntu 18.04 which has all dependencies required. ## Dependencies From 6182b4dcab9ca44c27c8163f0479a703aee82c9a Mon Sep 17 00:00:00 2001 From: Patrick Geneva Date: Sun, 13 Aug 2023 13:55:06 -0700 Subject: [PATCH 4/7] building on 20.04 docker --- ReadMe.md | 2 +- docs/Screenshot from 2023-08-13 13-42-36.png | Bin 0 -> 121370 bytes entrypoint.sh | 7 +++ error_on_1804.txt | 55 ------------------- src/mapper/MapBuilder.cpp | 8 ++- 5 files changed, 14 insertions(+), 58 deletions(-) create mode 100644 docs/Screenshot from 2023-08-13 13-42-36.png create mode 100755 entrypoint.sh delete mode 100644 error_on_1804.txt diff --git a/ReadMe.md b/ReadMe.md index cbab1d5..90b298a 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -7,7 +7,7 @@ Here we have our interface wrapper for exporting visual-inertial runs from [Open ## Dependencies * OpenVINS (v2.7 release) - https://docs.openvins.com/gs-installing.html -* maplab (develop v1, 18.04 release) - https://github.com/ethz-asl/maplab/wiki/Installation-Ubuntu +* maplab (develop v2, 20.04 release) - https://github.com/ethz-asl/maplab/wiki/Installation-Ubuntu * Docker - https://docs.docker.com/get-docker/ ## Installation Guide diff --git a/docs/Screenshot from 2023-08-13 13-42-36.png b/docs/Screenshot from 2023-08-13 13-42-36.png new file mode 100644 index 0000000000000000000000000000000000000000..920c776dad628c1fbd3933add6abdd7ed6b688e5 GIT binary patch literal 121370 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 S$x8$S9g<=)qUB%oeE$!)EPFKo literal 0 HcmV?d00001 diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..290c89c --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -e + +# setup ros environment +# ensure you have already built the workspace! +source "/catkin_ws/devel/setup.bash" -- +exec "$@" diff --git a/error_on_1804.txt b/error_on_1804.txt deleted file mode 100644 index 398a6e1..0000000 --- a/error_on_1804.txt +++ /dev/null @@ -1,55 +0,0 @@ -Errors << feature_tracking:make /catkin_ws/logs/feature_tracking/build.make.001.log -In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-tracking-types.cc:5:0: -/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-tracking-types.h:50:12: error: ‘ScoreType’ in ‘class cv::ORB’ does not name a type - cv::ORB::ScoreType orb_detector_score_type; - ^~~~~~~~~ -/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-tracking-types.cc: In constructor ‘feature_tracking::FeatureTrackingDetectorSettings::FeatureTrackingDetectorSettings()’: -/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-tracking-types.cc:157:7: error: class ‘feature_tracking::FeatureTrackingDetectorSettings’ does not have any field named ‘orb_detector_score_type’ - orb_detector_score_type(cv::ORB::ScoreType::HARRIS_SCORE), - ^~~~~~~~~~~~~~~~~~~~~~~ -/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-tracking-types.cc:157:40: error: ‘cv::ORB::ScoreType’ has not been declared - orb_detector_score_type(cv::ORB::ScoreType::HARRIS_SCORE), - ^~~~~~~~~ -make[2]: *** [CMakeFiles/feature_tracking.dir/src/feature-tracking-types.cc.o] Error 1 -make[2]: *** Waiting for unfinished jobs.... -In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-detection-extraction.h:12:0, - from /catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-detection-extraction.cc:3: -/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-tracking-types.h:50:12: error: ‘ScoreType’ in ‘class cv::ORB’ does not name a type - cv::ORB::ScoreType orb_detector_score_type; - ^~~~~~~~~ -/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-detection-extraction.cc: In member function ‘void feature_tracking::FeatureDetectorExtractor::initialize()’: -/catkin_ws/src/maplab/algorithms/feature-tracking/src/feature-detection-extraction.cc:49:26: error: ‘const struct feature_tracking::FeatureTrackingDetectorSettings’ has no member named ‘orb_detector_score_type’; did you mean ‘orb_detector_scale_factor’? - detector_settings_.orb_detector_score_type, - ^~~~~~~~~~~~~~~~~~~~~~~ - orb_detector_scale_factor -make[2]: *** [CMakeFiles/feature_tracking.dir/src/feature-detection-extraction.cc.o] Error 1 -In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-outlier-rejection-pipeline.h:8:0, - from /catkin_ws/src/maplab/algorithms/feature-tracking/src/vo-outlier-rejection-pipeline.cc:6: -/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-tracking-types.h:50:12: error: ‘ScoreType’ in ‘class cv::ORB’ does not name a type - cv::ORB::ScoreType orb_detector_score_type; - ^~~~~~~~~ -In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/src/vo-outlier-rejection-pipeline.cc:6:0: -/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-outlier-rejection-pipeline.h: In constructor ‘feature_tracking::VOOutlierRejectionPipeline::VOOutlierRejectionPipeline(const ConstPtr&, int, const Quaternion&, vi_map::FeatureType, const feature_tracking::FeatureTrackingOutlierSettings&)’: -/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-outlier-rejection-pipeline.h:55:40: warning: ‘feature_tracking::VOOutlierRejectionPipeline::outlier_settings_’ will be initialized after [-Wreorder] - const FeatureTrackingOutlierSettings outlier_settings_; - ^~~~~~~~~~~~~~~~~ -/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-outlier-rejection-pipeline.h:38:8: warning: ‘bool feature_tracking::VOOutlierRejectionPipeline::initialized_’ [-Wreorder] - bool initialized_; - ^~~~~~~~~~~~ -/catkin_ws/src/maplab/algorithms/feature-tracking/src/vo-outlier-rejection-pipeline.cc:10:1: warning: when initialized here [-Wreorder] - VOOutlierRejectionPipeline::VOOutlierRejectionPipeline( - ^~~~~~~~~~~~~~~~~~~~~~~~~~ -In file included from /catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-detection-extraction.h:12:0, - from /catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/vo-feature-tracking-pipeline.h:15, - from /catkin_ws/src/maplab/algorithms/feature-tracking/src/vo-feature-tracking-pipeline.cc:10: -/catkin_ws/src/maplab/algorithms/feature-tracking/include/feature-tracking/feature-tracking-types.h:50:12: error: ‘ScoreType’ in ‘class cv::ORB’ does not name a type - cv::ORB::ScoreType orb_detector_score_type; - ^~~~~~~~~ -make[2]: *** [CMakeFiles/feature_tracking.dir/src/vo-feature-tracking-pipeline.cc.o] Error 1 -make[2]: *** [CMakeFiles/feature_tracking.dir/src/vo-outlier-rejection-pipeline.cc.o] Error 1 -make[1]: *** [CMakeFiles/feature_tracking.dir/all] Error 2 -make: *** [all] Error 2 -cd /catkin_ws/build/feature_tracking; catkin build --get-env feature_tracking | catkin env -si /usr/bin/make --jobserver-fds=6,7 -j; cd - -......................................................................................................................................................... -Failed << feature_tracking:make [ Exited with code 2 ] -Failed <<< feature_tracking [ 15.5 seconds ] \ No newline at end of file diff --git a/src/mapper/MapBuilder.cpp b/src/mapper/MapBuilder.cpp index 8de32fc..bbac493 100644 --- a/src/mapper/MapBuilder.cpp +++ b/src/mapper/MapBuilder.cpp @@ -111,7 +111,8 @@ MapBuilder::MapBuilder(std::shared_ptr nh, std::shared_ptrinitializeFirstNFrame(nframe.get()); + } else { // First lets construct an IMU vector of measurements we need // TODO: delete old IMU measurements from here From fdabea1d4c97e63a8dfae3f5c991e72d11155db6 Mon Sep 17 00:00:00 2001 From: Patrick Geneva Date: Sun, 13 Aug 2023 17:36:31 -0700 Subject: [PATCH 5/7] small cleanups --- ReadMe.md | 1 + launch/serial.launch | 2 +- package.xml | 1 + scripts/commands_eurocmav.yaml | 30 +++++++++++++++ scripts/commands_rpngplane.yaml | 32 ++++++++++++++++ scripts/process_eurocmav.sh | 66 ++++++++++++++++++++++++++++++++ scripts/process_rpngplane.sh | 68 +++++++++++++++++++++++++++++++++ src/mapper/MapBuilder.cpp | 15 ++++++-- 8 files changed, 211 insertions(+), 4 deletions(-) create mode 100644 scripts/commands_eurocmav.yaml create mode 100644 scripts/commands_rpngplane.yaml create mode 100755 scripts/process_eurocmav.sh create mode 100755 scripts/process_rpngplane.sh diff --git a/ReadMe.md b/ReadMe.md index 90b298a..2230e4b 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -55,6 +55,7 @@ cd catkin_ws/ catkin init catkin config --merge-devel catkin config --extend /opt/ros/noetic +catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release catkin build maplab ov_maplab -j4 catkin build ov_maplab -j4 --no-deps # after first build source devel/setup.bash diff --git a/launch/serial.launch b/launch/serial.launch index 2fb6047..b2be782 100644 --- a/launch/serial.launch +++ b/launch/serial.launch @@ -21,7 +21,7 @@ - + diff --git a/package.xml b/package.xml index 246bb4b..b31513f 100644 --- a/package.xml +++ b/package.xml @@ -50,6 +50,7 @@ cv_bridge ov_core ov_data + ov_eval ov_msckf vi_map vio_common diff --git a/scripts/commands_eurocmav.yaml b/scripts/commands_eurocmav.yaml new file mode 100644 index 0000000..9336002 --- /dev/null +++ b/scripts/commands_eurocmav.yaml @@ -0,0 +1,30 @@ + +vi_map_folder_paths: + - /datasets/euroc_mav/maplab/V1_01_easy + - /datasets/euroc_mav/maplab/V1_02_medium + - /datasets/euroc_mav/maplab/V1_03_difficult + - /datasets/euroc_mav/maplab/V2_01_easy + - /datasets/euroc_mav/maplab/V2_02_medium + - /datasets/euroc_mav/maplab/V2_03_difficult +commands: + - load --map_folder= + - retriangulate_landmarks + - v --vis_color_by_mission + - optvi --ba_num_iterations=5 -ba_visualize_every_n_iterations=1 + - retriangulate_landmarks + - loopclosure_all_missions + - optvi --ba_num_iterations=5 -ba_visualize_every_n_iterations=1 + - retriangulate_landmarks + - loopclosure_all_missions + - optvi --ba_num_iterations=30 -ba_visualize_every_n_iterations=5 + - evaluate_landmark_quality + - remove_bad_landmarks + - save --map_folder=_result + - export_to_openvins --overwrite --export_path=_result + - export_trajectory_to_csv --overwrite --export_path=_result + - keyframe_heuristic + - v --vis_color_by_mission + - save --map_folder=_result_keyframed + - export_to_openvins --overwrite --export_path=_result_keyframed + - export_trajectory_to_csv --overwrite --export_path=_result_keyframed + diff --git a/scripts/commands_rpngplane.yaml b/scripts/commands_rpngplane.yaml new file mode 100644 index 0000000..f8c43fd --- /dev/null +++ b/scripts/commands_rpngplane.yaml @@ -0,0 +1,32 @@ + +vi_map_folder_paths: + - /datasets/rpng_plane/maplab/table_01 + - /datasets/rpng_plane/maplab/table_02 + - /datasets/rpng_plane/maplab/table_03 + - /datasets/rpng_plane/maplab/table_04 + - /datasets/rpng_plane/maplab/table_05 + - /datasets/rpng_plane/maplab/table_06 + - /datasets/rpng_plane/maplab/table_07 + - /datasets/rpng_plane/maplab/table_08 +commands: + - load --map_folder= + - retriangulate_landmarks + - v --vis_color_by_mission + - optvi --ba_num_iterations=5 -ba_visualize_every_n_iterations=1 + - retriangulate_landmarks + - loopclosure_all_missions + - optvi --ba_num_iterations=5 -ba_visualize_every_n_iterations=1 + - retriangulate_landmarks + - loopclosure_all_missions + - optvi --ba_num_iterations=30 -ba_visualize_every_n_iterations=5 + - evaluate_landmark_quality + - remove_bad_landmarks + - save --map_folder=_result + - export_to_openvins --overwrite --export_path=_result + - export_trajectory_to_csv --overwrite --export_path=_result + - keyframe_heuristic + - v --vis_color_by_mission + - save --map_folder=_result_keyframed + - export_to_openvins --overwrite --export_path=_result_keyframed + - export_trajectory_to_csv --overwrite --export_path=_result_keyframed + diff --git a/scripts/process_eurocmav.sh b/scripts/process_eurocmav.sh new file mode 100755 index 0000000..8b6a27c --- /dev/null +++ b/scripts/process_eurocmav.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +# Source our workspace directory to load ENV variables +SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +source ${SCRIPT_DIR}/../../../devel/setup.bash + +#============================================================= +#============================================================= +#============================================================= + +# dataset locations +bagnames=( + "V1_01_easy" + "V1_02_medium" + "V1_03_difficult" + "V2_01_easy" + "V2_02_medium" + "V2_03_difficult" +) + +#============================================================= +#============================================================= +#============================================================= + +big_start_time="$(date -u +%s)" + +# Loop through all datasets +for i in "${!bagnames[@]}"; do + +# start timing +start_time="$(date -u +%s)" + +# run our ROS launch file (note we send console output to terminator) +roslaunch ov_maplab serial.launch \ + max_cameras:="2" \ + use_stereo:="true" \ + config:="euroc_mav" \ + dataset:="${bagnames[i]}" \ + dolivetraj:="true" &> /dev/null + +# print out the time elapsed +end_time="$(date -u +%s)" +elapsed="$(($end_time-$start_time))" +echo "BASH: ${bagnames[i]} - vio took $elapsed seconds"; + +done + +# start timing +start_time="$(date -u +%s)" + +# run our maplab batch processing command +rosrun maplab_console batch_runner --batch_control_file=src/ov_maplab/scripts/commands_eurocmav.yaml + +# print out the time elapsed +end_time="$(date -u +%s)" +elapsed="$(($end_time-$start_time))" +echo "BASH: full maplab opt took $elapsed seconds"; + +# fix our permissions... +sudo chmod -R 777 /datasets/euroc_mav/maplab/ +sudo chown -R patrick /datasets/euroc_mav/maplab/ + +# print out the time elapsed +big_end_time="$(date -u +%s)" +big_elapsed="$(($big_end_time-$big_start_time))" +echo "BASH: script took $big_elapsed seconds in total!!"; \ No newline at end of file diff --git a/scripts/process_rpngplane.sh b/scripts/process_rpngplane.sh new file mode 100755 index 0000000..60b11b5 --- /dev/null +++ b/scripts/process_rpngplane.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +# Source our workspace directory to load ENV variables +SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +source ${SCRIPT_DIR}/../../../devel/setup.bash + +#============================================================= +#============================================================= +#============================================================= + +# dataset locations +bagnames=( + "table_01" + "table_02" + "table_03" + "table_04" + "table_05" + "table_06" + "table_07" + "table_08" +) + +#============================================================= +#============================================================= +#============================================================= + +big_start_time="$(date -u +%s)" + +## Loop through all datasets +#for i in "${!bagnames[@]}"; do +# +## start timing +#start_time="$(date -u +%s)" +# +## run our ROS launch file (note we send console output to terminator) +#roslaunch ov_maplab serial.launch \ +# max_cameras:="1" \ +# use_stereo:="true" \ +# config:="rpng_plane" \ +# dataset:="${bagnames[i]}" \ +# dolivetraj:="true" &> /dev/null +# +## print out the time elapsed +#end_time="$(date -u +%s)" +#elapsed="$(($end_time-$start_time))" +#echo "BASH: ${bagnames[i]} - vio took $elapsed seconds"; +# +#done + +# start timing +start_time="$(date -u +%s)" + +# run our maplab batch processing command +rosrun maplab_console batch_runner --batch_control_file=src/ov_maplab/scripts/commands_rpngplane.yaml + +# print out the time elapsed +end_time="$(date -u +%s)" +elapsed="$(($end_time-$start_time))" +echo "BASH: full maplab opt took $elapsed seconds"; + +# fix our permissions... +sudo chmod -R 777 /datasets/rpng_plane/maplab/ +sudo chown -R patrick /datasets/rpng_plane/maplab/ + +# print out the time elapsed +big_end_time="$(date -u +%s)" +big_elapsed="$(($big_end_time-$big_start_time))" +echo "BASH: script took $big_elapsed seconds in total!!"; \ No newline at end of file diff --git a/src/mapper/MapBuilder.cpp b/src/mapper/MapBuilder.cpp index bbac493..c60b0cb 100644 --- a/src/mapper/MapBuilder.cpp +++ b/src/mapper/MapBuilder.cpp @@ -37,7 +37,7 @@ MapBuilder::MapBuilder(std::shared_ptr nh, std::shared_ptr> cameras; - // Loop through through, and load each of the cameras + // Loop through, and load each of the cameras std::stringstream ss; for (int i = 0; i < _params.state_options.num_cameras; i++) { @@ -94,7 +94,7 @@ MapBuilder::MapBuilder(std::shared_ptr nh, std::shared_ptraddSensorAsBase(std::move(imu_sensor)); - //sensor_manager->addSensor(std::move(ncamera), imu_sensor_id, T_CitoI.at(0)); + // sensor_manager->addSensor(std::move(ncamera), imu_sensor_id, T_CitoI.at(0)); sensor_manager->addSensor(std::move(ncamera), imu_sensor_id, aslam::Transformation()); // Create the master map object @@ -218,7 +218,16 @@ void MapBuilder::feed_measurement_camera(const ov_core::CameraData &message_tmp) return; } ov_core::CameraData message = camera_data.at(_app->get_state()->_timestamp); - camera_data.erase(_app->get_state()->_timestamp); + + // Erase all older camera timestamps from our history + auto it0 = camera_data.begin(); + while (it0 != camera_data.end()) { + if (it0->first <= _app->get_state()->_timestamp) { + it0 = camera_data.erase(it0); + } else { + it0++; + } + } // Get the current timestamp in the imu clock frame of reference double t_ItoC = _app->get_state()->_calib_dt_CAMtoIMU->value()(0); From 37b79d5674f020390be993fda22869649ef48f6d Mon Sep 17 00:00:00 2001 From: Patrick Geneva Date: Sun, 13 Aug 2023 17:37:44 -0700 Subject: [PATCH 6/7] small update --- ReadMe.md | 4 ++-- scripts/process_rpngplane.sh | 40 ++++++++++++++++++------------------ 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 2230e4b..dd0cc42 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -2,12 +2,12 @@ [![ROS 1 Workflow](https://github.com/rpng/ov_maplab/actions/workflows/build_ros1.yml/badge.svg)](https://github.com/rpng/ov_maplab/actions/workflows/build_ros1.yml) -Here we have our interface wrapper for exporting visual-inertial runs from [OpenVINS](https://github.com/rpng/open_vins) into the ViMap structure taken by [maplab](https://github.com/ethz-asl/maplab). The state estimates and raw images are appended to the ViMap as OpenVINS runs through a dataset. After completion of the dataset, we re-extract features and triangulate them due to the incompatibilities of the two frontends. Maplab requires BRISK or FREAK descriptors, while OpenVINS works with KLT or ORB feature tracking. In the future we will try to only extract descriptors on tracked features from OpenVINS, but for now we just re-detect for simplicity. We have tested this on the [EurocMav](https://docs.openvins.com/gs-datasets.html#gs-data-euroc) and [TUM-VI](https://docs.openvins.com/gs-datasets.html#gs-data-tumvi) datasets and have had good success with merging the different runs and optimizing the resulting graph. To ensure that we are able to compile maplab, we provide a [docker image](Dockerfile) for Ubuntu 18.04 which has all dependencies required. +Here we have our interface wrapper for exporting visual-inertial runs from [OpenVINS](https://github.com/rpng/open_vins) into the ViMap structure taken by [maplab](https://github.com/ethz-asl/maplab). The state estimates and raw images are appended to the ViMap as OpenVINS runs through a dataset. After completion of the dataset, we re-extract features and triangulate them due to the incompatibilities of the two frontends. Maplab requires BRISK or FREAK descriptors, while OpenVINS works with KLT or ORB feature tracking. In the future we will try to only extract descriptors on tracked features from OpenVINS, but for now we just re-detect for simplicity. We have tested this on the [EurocMav](https://docs.openvins.com/gs-datasets.html#gs-data-euroc) and [TUM-VI](https://docs.openvins.com/gs-datasets.html#gs-data-tumvi) datasets and have had good success with merging the different runs and optimizing the resulting graph. To ensure that we are able to compile maplab, we provide a [docker image](Dockerfile) for Ubuntu 20.04 which has all dependencies required. ## Dependencies * OpenVINS (v2.7 release) - https://docs.openvins.com/gs-installing.html -* maplab (develop v2, 20.04 release) - https://github.com/ethz-asl/maplab/wiki/Installation-Ubuntu +* maplab (v2.0, 20.04 release) - https://github.com/ethz-asl/maplab/wiki/Installation-Ubuntu * Docker - https://docs.docker.com/get-docker/ ## Installation Guide diff --git a/scripts/process_rpngplane.sh b/scripts/process_rpngplane.sh index 60b11b5..59cfe3d 100755 --- a/scripts/process_rpngplane.sh +++ b/scripts/process_rpngplane.sh @@ -26,26 +26,26 @@ bagnames=( big_start_time="$(date -u +%s)" -## Loop through all datasets -#for i in "${!bagnames[@]}"; do -# -## start timing -#start_time="$(date -u +%s)" -# -## run our ROS launch file (note we send console output to terminator) -#roslaunch ov_maplab serial.launch \ -# max_cameras:="1" \ -# use_stereo:="true" \ -# config:="rpng_plane" \ -# dataset:="${bagnames[i]}" \ -# dolivetraj:="true" &> /dev/null -# -## print out the time elapsed -#end_time="$(date -u +%s)" -#elapsed="$(($end_time-$start_time))" -#echo "BASH: ${bagnames[i]} - vio took $elapsed seconds"; -# -#done +# Loop through all datasets +for i in "${!bagnames[@]}"; do + +# start timing +start_time="$(date -u +%s)" + +# run our ROS launch file (note we send console output to terminator) +roslaunch ov_maplab serial.launch \ + max_cameras:="1" \ + use_stereo:="true" \ + config:="rpng_plane" \ + dataset:="${bagnames[i]}" \ + dolivetraj:="true" &> /dev/null + +# print out the time elapsed +end_time="$(date -u +%s)" +elapsed="$(($end_time-$start_time))" +echo "BASH: ${bagnames[i]} - vio took $elapsed seconds"; + +done # start timing start_time="$(date -u +%s)" From 18f5c908d8eadc77875325b7db4dfbb627dc3fa0 Mon Sep 17 00:00:00 2001 From: Patrick Geneva Date: Sun, 13 Aug 2023 17:39:06 -0700 Subject: [PATCH 7/7] remove temp branch from action file --- .github/workflows/build_ros1.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_ros1.yml b/.github/workflows/build_ros1.yml index 05cb848..24bb384 100644 --- a/.github/workflows/build_ros1.yml +++ b/.github/workflows/build_ros1.yml @@ -2,7 +2,7 @@ name: ROS 1 Workflow on: push: - branches: [ master, test2004 ] + branches: [ master ] pull_request: jobs: