### Build and Run ROS 1 Simulation Source: https://docs.openvins.com/dev-docker.html Inside the Docker bash environment, navigate to the workspace, build the OpenVINS codebase using catkin, source the setup, and run an example simulation. ```bash cd catkin_ws catkin build source devel/setup.bash rosrun ov_eval plot_trajectories none src/open_vins/ov_data/sim/udel_gore.txt roslaunch ov_msckf simulation.launch ``` -------------------------------- ### Install Python 3.6 and Dependencies for m.css Source: https://docs.openvins.com/dev-docs.html Installs Python 3.6 and necessary packages (jinja2, Pygments) for building the documentation site with m.css. Also installs texlive base packages. ```bash sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-get update sudo apt-get install python3.6 python3.6-distutils curl https://bootstrap.pypa.io/pip/3.6/get-pip.py | sudo python3.6 sudo -H pip3.6 install jinja2 Pygments sudo apt install texlive-base texlive-latex-extra texlive-fonts-extra texlive-fonts-recommended ``` -------------------------------- ### Install ROS2 and Dependencies Source: https://docs.openvins.com/gs-installing.html Installs ROS2, necessary packages, and development libraries for building OpenVINS. ```bash sudo apt update && sudo apt install curl gnupg lsb-release sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null sudo apt-get update export ROS2_DISTRO=galactic # dashing=18.04, galactic=20.04 sudo apt install ros-$ROS2_DISTRO-desktop sudo apt-get install ros-$ROS2_DISTRO-ros2bag ros-$ROS2_DISTRO-rosbag2* # rosbag utilities (seems to be separate) sudo apt-get install libeigen3-dev libboost-all-dev libceres-dev ``` -------------------------------- ### Install Visualization Tools and Process Profiling Data Source: https://docs.openvins.com/dev-profiling.html Installs necessary visualization programs and then processes the callgrind output file into a format suitable for visualization, followed by opening the visualization. ```bash // install viz programs apt-get install python3 graphviz apt-get install gir1.2-gtk-3.0 python3-gi python3-gi-cairo graphviz pip install gprof2dot xdot // actually process and then viz call file gprof2dot --format callgrind --strip /tmp/callgrind.txt --output /tmp/callgrind.xdot xdot /tmp/callgrind.xdot ``` -------------------------------- ### Install System Dependencies (Ubuntu) Source: https://docs.openvins.com/gs-installing-free.html Installs essential libraries required for building OpenVINS on Ubuntu systems. Ensure you have OpenCV, Eigen3, and Ceres installed. ```bash sudo apt-get install libeigen3-dev libboost-all-dev libceres-dev ``` -------------------------------- ### Install ROS1 Noetic Desktop Full Source: https://docs.openvins.com/gs-installing.html Installs the ROS1 Noetic desktop-full package and catkin tools. This is for Ubuntu 20.04 systems. Adjust `ROS1_DISTRO` for other Ubuntu versions. ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' ``` ```bash sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 ``` ```bash sudo apt-get update ``` ```bash export ROS1_DISTRO=noetic # kinetic=16.04, melodic=18.04, noetic=20.04 ``` ```bash sudo apt-get install ros-$ROS1_DISTRO-desktop-full ``` ```bash sudo apt-get install python-catkin-tools # ubuntu 16.04, 18.04 ``` ```bash sudo apt-get install python3-catkin-tools python3-osrf-pycommon # ubuntu 20.04 ``` ```bash sudo apt-get install libeigen3-dev libboost-all-dev libceres-dev ``` -------------------------------- ### Install Valgrind and Launch ROS Node Source: https://docs.openvins.com/dev-profiling.html Installs the valgrind tool and launches a ROS node with valgrind enabled for profiling processing time. Ensure the launch file is edited to include the valgrind prefix. ```bash sudo apt install valgrind roslaunch ov_msckf pgeneva_serial_eth.launch ``` -------------------------------- ### Install Docker CE on Ubuntu Source: https://docs.openvins.com/dev-docker.html Installs Docker Community Edition, Docker CLI, and containerd.io on Ubuntu systems. ```bash curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io ``` -------------------------------- ### Install NVIDIA Container Toolkit and Verify GPU Access Source: https://docs.openvins.com/dev-docker.html Installs NVIDIA Docker 2 for GPU support and verifies the installation by running nvidia-smi within a CUDA container. ```bash distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \ && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-docker2 sudo systemctl restart docker sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi ``` -------------------------------- ### Build and Install OpenVINS (ROS-Free) Source: https://docs.openvins.com/gs-installing-free.html Clones the OpenVINS repository and builds the ov_msckf library in a ROS-free configuration. This process includes setting up the build directory, configuring CMake, compiling, and installing the library. ```bash cd ~/github/ git clone https://github.com/rpng/open_vins/ cd open_vins/ov_msckf/ mkdir build && cd build cmake -DENABLE_ROS=OFF .. make -j4 sudo make install ``` -------------------------------- ### Install Latest Clang Compiler Source: https://docs.openvins.com/dev-profiling.html Installs the latest Clang compiler version using an automated script and sets the CC and CXX environment variables. Ensure you have sudo privileges. ```bash sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" export CC=/usr/bin/clang-11 export CXX=/usr/bin/clang++-11 ``` -------------------------------- ### Install Doxygen and Texlive Source: https://docs.openvins.com/dev-docs.html Installs doxygen and texlive with all packages required for building the PDF reference manual. Ensure you have doxygen version 1.9.4 or newer to avoid ghostscript errors. ```bash sudo apt-get update sudo apt-get install doxygen texlive-full ``` -------------------------------- ### Build and Run ROS 2 Simulation Source: https://docs.openvins.com/dev-docker.html Inside the Docker bash environment, build the OpenVINS codebase using colcon for ROS 2, source the setup, and run an example simulation with the specified configuration. ```bash cd catkin_ws colcon build --event-handlers console_cohesion+ source install/setup.bash ros2 run ov_eval plot_trajectories none src/open_vins/ov_data/sim/udel_gore.txt ros2 run ov_msckf run_simulation src/open_vins/config/rpng_sim/estimator_config.yaml ``` -------------------------------- ### Example Compile Time Analysis Results Source: https://docs.openvins.com/dev-profiling.html An example of the output generated in timing_results.txt after analyzing the build trace. It shows time summaries for compilation, parsing, codegen, and lists files and functions that took the longest to compile. ```text Analyzing build trace from 'capture_file.bin'... Time summary: Compilation (86 times): Parsing (frontend): 313.9 s Codegen & opts (backend): 222.9 s Files that took longest to parse (compiler frontend): 13139 ms: /build//ov_msckf/CMakeFiles/ov_msckf_lib.dir/src/update/UpdaterSLAM.cpp.o 12843 ms: /build//ov_msckf/CMakeFiles/run_serial_msckf.dir/src/ros_serial_msckf.cpp.o ... Functions that took longest to compile: 1639 ms: main (/src/open_vins/ov_eval/src/error_comparison.cpp) 1337 ms: ov_core::BsplineSE3::get_acceleration(double, Eigen::Matrix InertialInitializerOptions ``` -------------------------------- ### Clone OpenVINS and Build Docker Image Source: https://docs.openvins.com/dev-docker.html Prepare a ROS workspace, clone the OpenVINS repository, and build the Docker image. Ensure you select the correct version tag for your ROS and Ubuntu setup. ```bash mkdir -p ~/workspace/catkin_ws_ov/src cd ~/workspace/catkin_ws_ov/src git clone https://github.com/rpng/open_vins.git cd open_vins export VERSION=ros1_20_04 # which docker file version you want (ROS1 vs ROS2 and ubuntu version) docker build -t ov_$VERSION -f Dockerfile_$VERSION . ``` -------------------------------- ### Build OpenCV from Source Source: https://docs.openvins.com/gs-installing.html Clone OpenCV and its contrib modules, then build and install them. Ensure the contrib modules are included during the CMake configuration step. ```bash git clone https://github.com/opencv/opencv/ git clone https://github.com/opencv/opencv_contrib/ mkdir opencv/build/ cd opencv/build/ cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules .. make -j8 sudo make install ``` -------------------------------- ### Configure ROS1 and ROS2 Aliases for Bash Source: https://docs.openvins.com/gs-installing.html Sets up bash aliases for sourcing ROS1 and ROS2 environments, and for sourcing the install directory within a workspace. ```bash echo "alias ros2_source=\"source /opt/ros/$ROS2_DISTRO/setup.bash\"" >> ~/.bashrc echo "alias source_install=\"source install/setup.bash\"" >> ~/.bashrc source ~/.bashrc ``` -------------------------------- ### Example Output of Error Comparison Source: https://docs.openvins.com/eval-error.html Illustrates the console output generated by the error_comparison script, showing dataset processing, algorithm evaluation, and the final ATE and RPE LaTeX tables. ```text [ INFO] [1583425216.054023187]: [COMP]: 2895 poses in V1_01_easy.txt => length of 58.35 meters [ INFO] [1583425216.092355692]: [COMP]: 16702 poses in V1_02_medium.txt => length of 75.89 meters [ INFO] [1583425216.133532429]: [COMP]: 20932 poses in V1_03_difficult.txt => length of 78.98 meters [ INFO] [1583425216.179616651]: [COMP]: 22401 poses in V2_01_easy.txt => length of 36.50 meters [ INFO] [1583425216.225299463]: [COMP]: 23091 poses in V2_02_medium.txt => length of 83.23 meters [ INFO] [1583425216.225660364]: ====================================== [ INFO] [1583425223.560550101]: [COMP]: processing mono_ov_vio algorithm [ INFO] [1583425223.560632706]: [COMP]: processing mono_ov_vio algorithm => V1_01_easy dataset [ INFO] [1583425224.236769465]: [COMP]: processing mono_ov_vio algorithm => V1_02_medium dataset [ INFO] [1583425224.855489521]: [COMP]: processing mono_ov_vio algorithm => V1_03_difficult dataset [ INFO] [1583425225.659183593]: [COMP]: processing mono_ov_vio algorithm => V2_01_easy dataset [ INFO] [1583425226.442217424]: [COMP]: processing mono_ov_vio algorithm => V2_02_medium dataset [ INFO] [1583425227.366004330]: ====================================== .... [ INFO] [1583425261.724448413]: ============================================ [ INFO] [1583425261.724469372]: ATE LATEX TABLE [ INFO] [1583425261.724481841]: ============================================ & \textbf{V1_01_easy} & \textbf{V1_02_medium} & \textbf{V1_03_difficult} & \textbf{V2_01_easy} & \textbf{V2_02_medium} & \textbf{Average} \\hline mono_ov_slam & 0.699 / 0.058 & 1.675 / 0.076 & 2.542 / 0.063 & 0.773 / 0.124 & 1.538 / 0.074 & 1.445 / 0.079 \ mono_ov_vio & 0.642 / 0.076 & 1.766 / 0.096 & 2.391 / 0.344 & 1.164 / 0.121 & 1.248 / 0.106 & 1.442 / 0.148 \ .... [ INFO] [1583425261.724647970]: ============================================ [ INFO] [1583425261.724655060]: ============================================ [ INFO] [1583425261.724661046]: RPE LATEX TABLE [ INFO] [1583425261.724666910]: ============================================ & \textbf{8m} & \textbf{16m} & \textbf{24m} & \textbf{32m} & \textbf{40m} & \textbf{48m} \\hline mono_ov_slam & 0.661 / 0.074 & 0.802 / 0.086 & 0.979 / 0.097 & 1.061 / 0.105 & 1.145 / 0.120 & 1.289 / 0.122 \ mono_ov_vio & 0.826 / 0.094 & 1.039 / 0.106 & 1.215 / 0.111 & 1.283 / 0.132 & 1.342 / 0.151 & 1.425 / 0.184 \ .... [ INFO] [1583425262.514587296]: ============================================ ``` -------------------------------- ### compute_comparison_indices_length Source: https://docs.openvins.com/classov__eval_1_1ResultTrajectory.html Gets the indices at the end of subtractories of a given length when starting at each index. ```APIDOC ## compute_comparison_indices_length ### Description Gets the indices at the end of subtractories of a given length when starting at each index. For each starting pose, find the end pose index which is the desired distance away. ### Parameters - **distances** (std::vector&) - Total distance travelled from start at each index - **distance** (double) - Distance of subtrajectory - **max_dist_diff** (double) - Maximum error between current trajectory length and the desired ### Returns std::vector - End indices for each subtrajectory ``` -------------------------------- ### Build Documentation Site with m.css Source: https://docs.openvins.com/dev-docs.html Builds the documentation website using the m.css scripts. Requires cloning the m.css repository and running the doxygen.py script with the path to the Doxyfile. ```bash cd m.css/documentation/ python3.6 doxygen.py python3.6 doxygen.py ~/catkin_ws/src/open_vins/Doxyfile-mcss ``` -------------------------------- ### Alias ROS1 and Workspace Sourcing (Bashrc) Source: https://docs.openvins.com/gs-installing.html Creates bash aliases for sourcing ROS1 environment variables and local workspace setup. Useful when both ROS1 and ROS2 are installed. ```bash echo "alias ros1_source=\"source /opt/ros/$ROS1_DISTRO/setup.bash\"" >> ~/.bashrc ``` ```bash echo "alias source_devel=\"source devel/setup.bash\"" >> ~/.bashrc ``` ```bash source ~/.bashrc ``` -------------------------------- ### initialize Method Source: https://docs.openvins.com/classov__init_1_1DynamicInitializer.html Attempts to initialize the visual-inertial system, recovering initial conditions and system covariance. ```APIDOC ## initialize Method ### Description Try to get the initialized system. This method attempts to recover the initial conditions and covariance of the visual-inertial system. ### Parameters * **timestamp** (double&) - Output parameter for the Timestamp we have initialized the state at (last imu state). * **covariance** (Eigen::MatrixXd&) - Output parameter for the Calculated covariance of the returned state. * **order** (std::vector>&) - Output parameter for the Order of the covariance matrix. * **_imu** (std::shared_ptr&) - Pointer to the "active" IMU state (q_GtoI, p_IinG, v_IinG, bg, ba). * **_clones_IMU** (std::map>&) - Map between imaging times and clone poses (q_GtoIi, p_IiinG). * **_features_SLAM** (std::unordered_map>&) - Our current set of SLAM features (3d positions). ### Returns * **bool** - True if we have successfully initialized our system. ``` -------------------------------- ### setup_subscribers Source: https://docs.openvins.com/classov__msckf_1_1ROS2Visualizer.html Sets up ROS subscribers and their corresponding callbacks. ```APIDOC ## void setup_subscribers(std::shared_ptr parser) ### Description Will setup ROS subscribers and callbacks. ### Parameters * **parser** (std::shared_ptr) - Configuration file parser ``` -------------------------------- ### SimulatorInit Constructor Source: https://docs.openvins.com/classov__init_1_1SimulatorInit.html Initializes the SimulatorInit class, loading all configuration variables from the provided parameters. ```APIDOC ## SimulatorInit(InertialInitializerOptions& params_) ### Description Default constructor, will load all configuration variables. ### Parameters - **params_** (InertialInitializerOptions&) - Required - InertialInitializer parameters. Should have already been loaded from cmd. ``` -------------------------------- ### Install Python Dependencies for Matplotlib and psutil Source: https://docs.openvins.com/gs-installing.html Installs Python development headers and libraries required for matplotlib-cpp visualization and psutil for system monitoring. ```bash sudo apt-get install python2.7-dev python-matplotlib python-numpy python-psutil # for python2 systems sudo apt-get install python3-dev python3-matplotlib python3-numpy python3-psutil python3-tk # for python3 systems ``` -------------------------------- ### Example Output of error_singlerun Source: https://docs.openvins.com/eval-error.html This is an example of the detailed output generated by the 'error_singlerun' script, showing Absolute Trajectory Error and Relative Pose Error statistics. ```text [ INFO] [1583422165.069376426]: [COMP]: 2813 poses in 1565371553_estimate => length of 57.36 meters [ INFO] [1583422165.091423722]: ====================================== [ INFO] [1583422165.091438299]: Absolute Trajectory Error [ INFO] [1583422165.091453099]: ====================================== [ INFO] [1583422165.091459679]: rmse_ori = 0.677 | rmse_pos = 0.055 [ INFO] [1583422165.091466321]: mean_ori = 0.606 | mean_pos = 0.051 [ INFO] [1583422165.091474211]: min_ori = 0.044 | min_pos = 0.001 [ INFO] [1583422165.091481730]: max_ori = 1.856 | max_pos = 0.121 [ INFO] [1583422165.091481730]: std_ori = 0.302 | std_pos = 0.021 [ INFO] [1583422165.127869924]: ====================================== [ INFO] [1583422165.127891080]: Relative Pose Error [ INFO] [1583422165.127898322]: ====================================== [ INFO] [1583422165.127908551]: seg 8 - median_ori = 0.566 | median_pos = 0.068 (2484 samples) [ INFO] [1583422165.127919603]: seg 16 - median_ori = 0.791 | median_pos = 0.060 (2280 samples) [ INFO] [1583422165.127927646]: seg 24 - median_ori = 0.736 | median_pos = 0.070 (2108 samples) [ INFO] [1583422165.127934904]: seg 32 - median_ori = 0.715 | median_pos = 0.071 (1943 samples) [ INFO] [1583422165.127942178]: seg 40 - median_ori = 0.540 | median_pos = 0.063 (1792 samples) ``` -------------------------------- ### sim_distance_threshold Source: https://docs.openvins.com/structov__msckf_1_1VioManagerOptions.html Distance threshold for starting simulation. Simulation will commence after moving this distance along the b-spline, preventing static starts when initializing from ground truth in simulation. ```APIDOC ## double ov_msckf::VioManagerOptions::sim_distance_threshold ### Description We will start simulating after we have moved this much along the b-spline. This prevents static starts as we init from groundtruth in simulation. ``` -------------------------------- ### initialize_with_gt Source: https://docs.openvins.com/classov__msckf_1_1VioManager.html Initializes the IMU state of the system using provided ground truth data. ```APIDOC ## initialize_with_gt ### Description Given a state, this will initialize our IMU state. ### Method void ### Parameters #### Path Parameters - **imustate** (Eigen::Matrix) - Required - The ground truth IMU state to initialize with ``` -------------------------------- ### Valgrind Memory Leak Report Example Source: https://docs.openvins.com/dev-profiling.html An example of a memory leak report generated by valgrind's memcheck tool, indicating bytes lost and the call stack leading to the leak. ```text ==5512== 1,578,860 (24 direct, 1,578,836 indirect) bytes in 1 blocks are definitely lost in loss record 6,585 of 6,589 ==5512== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) .... ==5512== by 0x543F868: operator[] (unordered_map.h:973) ==5512== by 0x543F868: ov_core::TrackKLT::feed_stereo(double, cv::Mat&, cv::Mat&, unsigned long, unsigned long) (TrackKLT.cpp:165) ==5512== by 0x4EF8C52: ov_msckf::VioManager::feed_measurement_stereo(double, cv::Mat&, cv::Mat&, unsigned long, unsigned long) (VioManager.cpp:245) ==5512== by 0x1238A9: main (ros_serial_msckf.cpp:247) ``` -------------------------------- ### Recorder Constructor Source: https://docs.openvins.com/classov__eval_1_1Recorder.html Initializes the Recorder by opening a specified file for output. It automatically creates the directory path if it does not exist. ```APIDOC ## Recorder(std::string filename) ### Description Default constructor that will open the specified file on disk. If the output directory does not exist, this will also create the directory path to this file. ### Parameters #### Path Parameters - **filename** (std::string) - Required - Desired file we want to "record" into ``` -------------------------------- ### Run Gazebo GUI within Docker with GPU Support Source: https://docs.openvins.com/dev-docker.html Launches the Gazebo GUI from within a Docker container, enabling GPU acceleration and X11 forwarding for GUI display on the host. ```bash docker run -it --net=host --gpus all \ --env="NVIDIA_DRIVER_CAPABILITIES=all" \ --env="DISPLAY" \ --env="QT_X11_NO_MITSHM=1" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ osrf/ros:noetic-desktop-full \ bash -it -c "roslaunch gazebo_ros empty_world.launch" ``` -------------------------------- ### Example Output of error_dataset script Source: https://docs.openvins.com/eval-error.html This is an example of the console output generated by the error_dataset script. It includes detailed metrics such as ATE (Absolute Trajectory Error) and RPE (Relative Pose Error) for each processed algorithm. ```text [ INFO] [1583422654.333642977]: ====================================== [ INFO] [1583422654.333915102]: [COMP]: processing mono_ov_slam algorithm [ INFO] [1583422654.362655719]: [TRAJ]: q_ESTtoGT = 0.000, 0.000, -0.129, 0.992 | p_ESTinGT = 0.978, 2.185, 0.932 | s = 1.00 .... [ INFO] [1583422654.996859432]: [TRAJ]: q_ESTtoGT = 0.000, 0.000, -0.137, 0.991 | p_ESTinGT = 0.928, 2.166, 0.957 | s = 1.00 [ INFO] [1583422655.041009388]: ATE: mean_ori = 0.684 | mean_pos = 0.057 [ INFO] [1583422655.041031730]: ATE: std_ori = 0.14938 | std_pos = 0.01309 [ INFO] [1583422655.041039552]: ATE 2D: mean_ori = 0.552 | mean_pos = 0.053 [ INFO] [1583422655.041046362]: ATE 2D: std_ori = 0.17786 | std_pos = 0.01421 [ INFO] [1583422655.044187033]: RPE: seg 7 - mean_ori = 0.543 | mean_pos = 0.065 (25160 samples) [ INFO] [1583422655.047047771]: RPE: seg 14 - mean_ori = 0.593 | mean_pos = 0.060 (23470 samples) [ INFO] [1583422655.049672955]: RPE: seg 21 - mean_ori = 0.664 | mean_pos = 0.081 (22050 samples) [ INFO] [1583422655.052090494]: RPE: seg 28 - mean_ori = 0.732 | mean_pos = 0.083 (20520 samples) [ INFO] [1583422655.054294322]: RPE: seg 35 - mean_ori = 0.793 | mean_pos = 0.090 (18960 samples) [ INFO] [1583422655.055676035]: RMSE: mean_ori = 0.644 | mean_pos = 0.056 [ INFO] [1583422655.056987984]: RMSE 2D: mean_ori = 0.516 | mean_pos = 0.052 [ INFO] [1583422655.058269163]: NEES: mean_ori = 793.646 | mean_pos = 13.095 [ INFO] [1583422656.182660653]: ====================================== [ INFO] [1583422656.183065588]: [COMP]: processing mono_ov_vio algorithm [ INFO] [1583422656.209545279]: [TRAJ]: q_ESTtoGT = 0.000, 0.000, -0.148, 0.989 | p_ESTinGT = 0.931, 2.169, 0.971 | s = 1.00 .... [ INFO] [1583422656.791523636]: [TRAJ]: q_ESTtoGT = 0.000, 0.000, -0.149, 0.989 | p_ESTinGT = 0.941, 2.163, 0.974 | s = 1.00 [ INFO] [1583422656.835407991]: ATE: mean_ori = 0.639 | mean_pos = 0.076 [ INFO] [1583422656.835433475]: ATE: std_ori = 0.05800 | std_pos = 0.00430 [ INFO] [1583422656.835446222]: ATE 2D: mean_ori = 0.514 | mean_pos = 0.070 [ INFO] [1583422656.835457020]: ATE 2D: std_ori = 0.07102 | std_pos = 0.00492 [ INFO] [1583422656.838656567]: RPE: seg 7 - mean_ori = 0.614 | mean_pos = 0.092 (25160 samples) [ INFO] [1583422656.841540191]: RPE: seg 14 - mean_ori = 0.634 | mean_pos = 0.092 (23470 samples) [ INFO] [1583422656.844219466]: RPE: seg 21 - mean_ori = 0.632 | mean_pos = 0.115 (22050 samples) [ INFO] [1583422656.846646272]: RPE: seg 28 - mean_ori = 0.696 | mean_pos = 0.119 (20520 samples) [ INFO] [1583422656.848862913]: RPE: seg 35 - mean_ori = 0.663 | mean_pos = 0.154 (18960 samples) [ INFO] [1583422656.850321777]: RMSE: mean_ori = 0.600 | mean_pos = 0.067 [ INFO] [1583422656.851673985]: RMSE 2D: mean_ori = 0.479 | mean_pos = 0.060 [ INFO] [1583422656.853037942]: NEES: mean_ori = 625.447 | mean_pos = 10.629 [ INFO] [1583422658.194763413]: ====================================== .... ``` -------------------------------- ### ROS2Visualizer Constructor Source: https://docs.openvins.com/classov__msckf_1_1ROS2Visualizer.html Initializes the ROS2Visualizer with ROS node, VIO manager, and an optional simulator. ```APIDOC ## ROS2Visualizer(std::shared_ptr node, std::shared_ptr app, std::shared_ptr sim = nullptr) ### Description Default constructor. ### Parameters * **node** (std::shared_ptr) - ROS node pointer * **app** (std::shared_ptr) - Core estimator manager * **sim** (std::shared_ptr) - Simulator if we are simulating ``` -------------------------------- ### current_timestamp Source: https://docs.openvins.com/classov__init_1_1SimulatorInit.html Gets the current timestamp of the simulation. ```APIDOC ## double current_timestamp() ### Description Gets the timestamp we have simulated up too. ### Returns - **double** - Timestamp ``` -------------------------------- ### ov_core::CamBase Constructor Source: https://docs.openvins.com/classov__core_1_1CamBase.html Initializes the base camera model with specified image dimensions. ```APIDOC ## ov_core::CamBase::CamBase(int width, int height) ### Description Default constructor. ### Parameters #### Path Parameters - **width** (int) - Required - Width of the camera (raw pixels) - **height** (int) - Required - Height of the camera (raw pixels) ``` -------------------------------- ### Get Current Timestamp Source: https://docs.openvins.com/classov__init_1_1SimulatorInit.html Retrieves the current timestamp of the simulation. ```cpp auto current_timestamp() -> double ``` -------------------------------- ### Perturb Parameters Source: https://docs.openvins.com/classov__init_1_1SimulatorInit.html Gets a set of perturbed parameters for simulation. ```cpp void perturb_parameters(InertialInitializerOptions& params_) ``` -------------------------------- ### get_num_features Source: https://docs.openvins.com/classov__core_1_1TrackBase.html Gets the current number of active features being tracked. ```APIDOC ## auto get_num_features() -> int ### Description Getter method for number of active features. ### Returns - int: The number of active features. ``` -------------------------------- ### initialized Source: https://docs.openvins.com/classov__msckf_1_1VioManager.html Checks if the VIO system has been initialized. ```APIDOC ## initialized ### Description If we are initialized or not. ### Method auto -> bool ### Returns - bool - True if the system is initialized, false otherwise. ``` -------------------------------- ### ROS1Visualizer Constructor Source: https://docs.openvins.com/classov__msckf_1_1ROS1Visualizer.html Initializes the ROS1Visualizer with ROS node handle, VIO manager, and an optional simulator. ```APIDOC ## ROS1Visualizer(std::shared_ptr nh, std::shared_ptr app, std::shared_ptr sim = nullptr) ### Description Default constructor. ### Parameters * **nh** (std::shared_ptr) - ROS node handler * **app** (std::shared_ptr) - Core estimator manager * **sim** (std::shared_ptr) - Simulator if we are simulating ``` -------------------------------- ### get_start_time Source: https://docs.openvins.com/classov__core_1_1BsplineSE3.html Returns the simulation start time from which the spline should be considered valid. ```APIDOC ## auto get_start_time() -> double ### Description Returns the simulation start time that we should start simulating from. ### Returns - **double** - The simulation start time. ### Method `get_start_time` ``` -------------------------------- ### successful Source: https://docs.openvins.com/classov__core_1_1YamlParser.html Checks if all parameters were successfully read from the configuration files. ```APIDOC ## successful ### Description Check to see if all parameters were read succesfully. ### Returns - **bool** - True if all parameters were found, false otherwise. ``` -------------------------------- ### get_last_ids Source: https://docs.openvins.com/classov__core_1_1TrackBase.html Gets the IDs of active features in the last frame, per camera. ```APIDOC ## auto get_last_ids() -> std::unordered_map> ### Description Getter method for active features in the last frame (ids per camera). ### Returns - std::unordered_map>: A map where keys are camera IDs and values are vectors of feature IDs. ``` -------------------------------- ### YamlParser Constructor Source: https://docs.openvins.com/classov__core_1_1YamlParser.html Initializes the YamlParser by loading configuration files from the specified path. It can optionally fail the program if the configuration file is not found. ```APIDOC ## YamlParser Constructor ### Description Constructor that loads all three configuration files. ### Parameters - **config_path** (string) - Required - Path to the YAML file we will parse. - **fail_if_not_found** (bool) - Optional - If we should terminate the program if we can't open the config file. Defaults to true. ``` -------------------------------- ### get_last_obs Source: https://docs.openvins.com/classov__core_1_1TrackBase.html Gets the observations (KeyPoints) of active features in the last frame, per camera. ```APIDOC ## auto get_last_obs() -> std::unordered_map> ### Description Getter method for active features in the last frame (observations per camera). ### Returns - std::unordered_map>: A map where keys are camera IDs and values are vectors of KeyPoints. ``` -------------------------------- ### Get True Feature Map Source: https://docs.openvins.com/classov__init_1_1SimulatorInit.html Returns the ground truth 3D map of features used in the simulation. ```cpp auto get_map() -> std::unordered_map ``` -------------------------------- ### InertialInitializerOptions::print_and_load_initializer Source: https://docs.openvins.com/structov__init_1_1InertialInitializerOptions.html Prints all initializer settings that have been loaded. This is useful for visually verifying that parameters were loaded correctly from ROS or command-line parsers. ```APIDOC ## void ov_init::InertialInitializerOptions::print_and_load_initializer(const std::shared_ptr& parser = nullptr) ### Description This function will load print out all initializer settings loaded. This allows for visual checking that everything was loaded properly from ROS/CMD parsers. ### Parameters * **parser** (std::shared_ptr) - If not null, this parser will be used to load our parameters. ``` -------------------------------- ### Get Next Camera Measurement Source: https://docs.openvins.com/classov__init_1_1SimulatorInit.html Retrieves the next camera measurement, including timestamp, camera IDs, and feature observations. ```cpp auto get_next_cam(double& time_cam, std::vector& camids, std::vector>>& feats) -> bool ``` -------------------------------- ### config Source: https://docs.openvins.com/classov__core_1_1FeatureInitializer.html Retrieves the current configuration settings of the feature initializer. ```APIDOC ## config ### Description Gets the current configuration of the feature initializer. ### Method N/A (This is a class method) ### Returns - **const FeatureInitializerOptions** - Const feature initializer config ``` -------------------------------- ### Configure ROS2 Environment for Bash Source: https://docs.openvins.com/gs-installing.html Appends the ROS2 setup script to your bashrc for automatic environment loading in new terminals. ```bash echo "source /opt/ros/$ROS2_DISTRO/setup.bash" >> ~/.bashrc source ~/.bashrc ``` -------------------------------- ### print_and_load_initializer Source: https://docs.openvins.com/structov__init_1_1InertialInitializerOptions.html Loads and prints all initializer settings. This function aids in visual verification of loaded settings from ROS/CMD parsers. ```APIDOC ## void print_and_load_initializer(const std::shared_ptr& parser = nullptr) ### Description This function will load and print out all initializer settings. This allows for visual checking that everything was loaded properly from ROS/CMD parsers. ### Parameters * **parser** (std::shared_ptr) - Optional - A shared pointer to a YamlParser object to load parameters from. ``` -------------------------------- ### ROS 1 Launch File Configuration Source: https://docs.openvins.com/gs-tutorial.html This ROS 1 launch file configures the MSCKF estimation node, setting parameters like verbosity, configuration path, stereo usage, and maximum cameras. It's used to launch the `run_subscribe_msckf` node. ```xml ``` -------------------------------- ### initialize_with_gt Source: https://docs.openvins.com/classov__msckf_1_1VioManager.html Initializes the IMU state using a provided ground truth state. The state includes time, IMU to world rotation, position, velocity, gyroscope bias, and accelerometer bias. ```APIDOC ## initialize_with_gt ### Description Given a state, this will initialize our IMU state. ### Method void ### Parameters #### Path Parameters - **imustate** (Eigen::Matrix) - Required - State in the MSCKF ordering: [time(sec),q_GtoI,p_IinG,v_IinG,b_gyro,b_accel] ``` -------------------------------- ### Clone KAIST Datasets Repositories Source: https://docs.openvins.com/gs-datasets.html Clone the necessary repositories for processing KAIST dataset formats into ROS bags. Ensure you have git installed. ```bash git clone https://github.com/irapkaist/irp_sen_msgs.git git clone https://github.com/rpng/kaist2bag.git ``` -------------------------------- ### StaticInitializer Constructor Source: https://docs.openvins.com/classov__init_1_1StaticInitializer.html Initializes the StaticInitializer. This constructor assumes the IMU starts from a standstill and uses inertial measurements to set up the initial orientation and biases. ```APIDOC ## StaticInitializer(InertialInitializerOptions& params_, std::shared_ptr db, std::shared_ptr> imu_data_) explicit ### Description Default constructor. ### Parameters * **params_** (InertialInitializerOptions&) - Parameters loaded from either ROS or CMDLINE. * **db** (std::shared_ptr) - Feature tracker database with all features in it. * **imu_data_** (std::shared_ptr>) - Shared pointer to our IMU vector of historical information. ``` -------------------------------- ### Get Next IMU Reading Source: https://docs.openvins.com/classov__init_1_1SimulatorInit.html Fetches the next available IMU reading, including time, angular velocity (wm), and linear acceleration (am). ```cpp auto get_next_imu(double& time_imu, Eigen::Vector3d& wm, Eigen::Vector3d& am) -> bool ``` -------------------------------- ### ov_core::TrackBase::TrackBase Source: https://docs.openvins.com/classov__core_1_1TrackBase.html Initializes the TrackBase with specified camera configurations, feature counts, and tracking modes. ```APIDOC ## ov_core::TrackBase::TrackBase ### Description Public constructor with configuration variables. ### Parameters - **cameras** (std::unordered_map>) - camera calibration object which has all camera intrinsics in it - **numfeats** (int) - number of features we want want to track (i.e. track 200 points from frame to frame) - **numaruco** (int) - the max id of the arucotags, so we ensure that we start our non-auroc features above this value - **stereo** (bool) - if we should do stereo feature tracking or binocular - **histmethod** (HistogramMethod) - what type of histogram pre-processing should be done (histogram eq?) ``` -------------------------------- ### ov_core::CamEqui::CamEqui Source: https://docs.openvins.com/classov__core_1_1CamEqui.html Default constructor for the CamEqui camera model. Initializes the camera with specified width and height. ```APIDOC ## ov_core::CamEqui::CamEqui(int width, int height) ### Description Default constructor. ### Parameters - **width** (int) - Required - Width of the camera (raw pixels) - **height** (int) - Required - Height of the camera (raw pixels) ``` -------------------------------- ### CpiBase Constructor Source: https://docs.openvins.com/classov__core_1_1CpiBase.html Initializes the CpiBase with specified noise densities for gyroscope and accelerometer, and an option for averaging IMU measurements. ```APIDOC ## CpiBase Constructor ### Description Default constructor. Initializes the preintegration with gyroscope and accelerometer noise parameters. ### Parameters - **sigma_w** (double) - gyroscope white noise density (rad/s/sqrt(hz)) - **sigma_wb** (double) - gyroscope random walk (rad/s^2/sqrt(hz)) - **sigma_a** (double) - accelerometer white noise density (m/s^2/sqrt(hz)) - **sigma_ab** (double) - accelerometer random walk (m/s^3/sqrt(hz)) - **imu_avg_** (bool) - Optional. If true, averages IMU measurements. Defaults to false. ``` -------------------------------- ### Get Simulation State at Desired Time Source: https://docs.openvins.com/classov__init_1_1SimulatorInit.html Retrieves the simulation state at a specified timestep. The state includes time, rotation, position, velocity, and biases. ```cpp auto get_state(double desired_time, Eigen::Matrix& imustate) -> bool ```