{"repo":"MichaelGrupp/evo","free":true,"listed":false,"github":"https://github.com/MichaelGrupp/evo","clone":"git clone https://github.com/MichaelGrupp/evo.git","description":"Python package for the evaluation of odometry and SLAM","language":"Python","stars":4298,"topics":["benchmark","euroc","evaluation","kitti","mapping","metrics","odometry","robotics","ros","ros2","slam","trajectory","trajectory-analysis","trajectory-evaluation","tum"],"license":"GPL-3.0","category":"dev_tool","readme_excerpt":"# evo \n\n***Python package for the evaluation of odometry and SLAM***\n\n| Linux / macOS / Windows / ROS / ROS2 |\n| :---: |\n| [![CI](https://github.com/MichaelGrupp/evo/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/MichaelGrupp/evo/actions/workflows/ci.yml) |\n\nThis package provides executables and a small library for handling, evaluating and comparing the trajectory output of odometry and SLAM algorithms.\n\nSupported trajectory formats:\n\n* 'TUM' trajectory files\n* 'KITTI' pose files\n* 'EuRoC MAV' (.csv groundtruth and TUM trajectory file)\n* ROS and ROS2 bagfile with `geometry_msgs/PoseStamped`, `geometry_msgs/TransformStamped`, `geometry_msgs/PoseWithCovarianceStamped`, `geometry_msgs/PointStamped` or `nav_msgs/Odometry` topics or [TF messages](https://github.com/MichaelGrupp/evo/wiki/Formats#bag---ros-bagfile)\n\nSee [here](https://github.com/MichaelGrupp/evo/wiki/Formats) for more infos about the formats.\n\n<a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_ORB_map.png\" target=\"_blank\">\n  <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_ORB_map.png\" alt=\"evo\" height=\"175\" border=\"5\" />\n</a>\n<a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/markers.png\" target=\"_blank\">\n  <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/markers.png\" alt=\"evo\" height=\"175\" border=\"5\" />\n</a>\n<a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/map_tile_osm.png\" target=\"_blank\">\n  <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/map_tile_osm.png\" alt=\"evo\" height=\"175\" border=\"5\" />\n</a>\n<a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/traj_rerun.gif\" target=\"_blank\">\n  <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/traj_rerun.gif\" alt=\"evo\" height=\"175\" border=\"5\" />\n</a>\n\n---\n\n## Why?\n\nevo has several advantages over other public benchmarking tools:\n\n* common tools for different formats\n* algorithmic options for association, alignment, scale adjustment for monocular SLAM etc.\n* flexible options for output, [plotting](https://github.com/MichaelGrupp/evo/wiki/Plotting), [visualization](https://github.com/MichaelGrupp/evo/wiki/Rerun-integration) or export (e.g. LaTeX plots or Excel tables)\n* a powerful, configurable CLI that can cover many use cases\n* modular `core` and `tools` libraries for custom extensions\n* faster than other established Python-based tools ([see here](https://github.com/MichaelGrupp/evo/blob/master/doc/performance.md))\n\n**What it's not:** a 1-to-1 re-implementation of a particular evaluation protocol tailored to a specific dataset. \n\n---\n\n## Installation / Upgrade\n\nInstallation is easy-peasy if you're familiar with this: https://xkcd.com/1987/#\n\nThe latest version of evo supports **Python 3.10+**.\n\nPlease use `pip` only in a proper environment (e.g. `uv`/`uvx`, `pipx`, `venv`, Pixi or a classic [virtual environment](https://github.com/MichaelGrupp/evo/blob/master/doc/install_in_virtualenv.md)).\n> ⚠️ ☠️☠️☠️ ⚠️\n>\n> Whatever you do, don't use: `pip install --user` / anything with `--break-system-packages` / or worst: `sudo pip install`\n\n### From PyPi\nIf you just want to use the executables of the latest release version, the easiest way is to run:\n```bash\npip install evo\n```\nThis will download the package and its dependencies from [PyPI](https://pypi.org/project/evo/) and install or upgrade them. If you want, you can subscribe to new releases via https://libraries.io/pypi/evo.\n\nTo upgrade to a newer version: `pip install --upgrade evo`\n\n### From Source\nRun this in the repository's base folder:\n```bash\npip install --editable .\n```\n\n### Pixi\n\n[Pixi](https://prefix.dev) is an easy-to-use alternative if you want to have an isolated development environment. Run `pixi add evo` if you have an existing environment, or clone this repository and run `pixi shell` to open a dev shell.\n\n### Tab completion\n\nTab completion is supported via the [argcomplete](https://github.com/kislyuk/argcomplete/) package. Run `activate-global-python-argcomplete` after the installation to use it.\n\n### Dependencies\n\n**Python packages**\n\nevo has some required dependencies that are ***automatically resolved*** during installation with pip.\nSee the `pyproject.toml` file for all details.\n\n**PyQt6 (optional)**\n\n[PyQt6](https://pypi.org/project/PyQt6/) will give you the enhanced GUI for plot figures from the \"*qtagg*\" matplotlib backend (otherwise: \"*TkAgg*\"). If PyQt6 is already installed when installing this package, it will be used as a default (see `evo_config show`). To change the plot backend afterwards, run `evo_config set plot_backend qtagg`.\n\nIf you run into issues with installing tkinter, trying PyQt6 is a good idea. \n\n**ROS (optional)**\n\nSome ROS-related features require a ROS installation, see [here](http://www.ros.org/). We are testing this package with ROS Lyrical.\n\n> Reading ROS bag files works also without a ROS installation thanks to the great [rosbags](https://pypi.org/project/rosbags/) package that is installed together with evo. This allows you also to read ROS 1 & 2 bags even if you don't have one of those ROS distros installed. (except for reading `/tf` topics, because there we need the buffer implementation from ROS)\n\n**contextily (optional)**\n\n[contextily](https://contextily.readthedocs.io/en/latest/index.html) is required for [adding map tiles](https://github.com/MichaelGrupp/evo/wiki/Plotting#geographic-map-tiles) to plots of geo-referenced data.\n\n**Rerun (optional)**\n\nYou can send data also to the [rerun](https://rerun.io/) viewer. Just `pip install rerun-sdk` and add `--rerun` to your command. See the related [Wiki page](https://github.com/MichaelGrupp/evo/wiki/Rerun-integration) for more details.\n\n<a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/traj_rerun.gif\" target=\"_blank\">\n  <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/traj_rerun.gif\" alt=\"evo\" width=\"350\" border=\"5\" />\n</a>\n<a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_rerun.gif\" target=\"_blank\">\n  <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_rerun.gif\" alt=\"evo\" width=\"350\" border=\"5\" />\n</a>\n\n---\n\n## Command Line Interface\n\nAfter installation with pip, the following executables can be called globally from your command-line:\n\n**Metrics:**\n\n* `evo_ape` - absolute pose error\n* `evo_rpe` - relative pose error\n\n**Tools:**\n\n* `evo_traj` - tool for analyzing, plotting or exporting one or more trajectories\n* `evo_res` - tool for comparing one or multiple result files from `evo_ape` or `evo_rpe`\n* `evo_config` - tool for global settings and config file manipulation\n\nCall the commands with `--help` to see the options, e.g. `evo_ape --help`. Tab-completion of command line parameters is available on UNIX-like systems.\n\n**More documentation**\nCheck out the [Wiki on GitHub](https://github.com/MichaelGrupp/evo/wiki).\n\n---\n\n## Example Workflow\n\nThere are some example trajectories in the source folder in `test/data`.\n\n\n### 1.) Plot multiple trajectories\n\n  Here, we plot two KITTI pose files and the ground truth using `evo_traj`:\n  ```\n  cd test/data\n  evo_traj kitti KITTI_00_ORB.txt KITTI_00_SPTAM.txt --ref=KITTI_00_gt.txt -p --plot_mode=xz\n  ```\n\n  <a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/traj_demo.png\" target=\"_blank\">\n    <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/traj_demo.png\" alt=\"evo\" height=\"200\" border=\"5\" />\n  </a>\n  <a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/traj_demo_xyz.png\" target=\"_blank\">\n    <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/traj_demo_xyz.png\" alt=\"evo\" height=\"200\" border=\"5\" />\n  </a>\n\n### 2.) Run a metric on trajectories\n\n  For example, here we calculate the absolute pose error for two trajectories from ORB-SLAM and S-PTAM using `evo_ape` (`KITTI_00_gt.txt` is the reference (ground truth)) and plot and save the individual results to .zip files for `evo_res`:\n\n  *First trajectory (ORB Stereo):*\n\n  ```\n  mkdir results\n  evo_ape kitti KITTI_00_gt.txt KITTI_00_ORB.txt -va --plot --plot_mode xz --save_results results/ORB.zip\n  ```\n\n  <a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_ORB_raw.png\" target=\"_blank\">\n    <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_ORB_raw.png\" alt=\"evo\" height=\"200\" border=\"5\" />\n  </a>\n  <a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_ORB_map.png\" target=\"_blank\">\n    <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_ORB_map.png\" alt=\"evo\" height=\"200\" border=\"5\" />\n  </a>\n\n  *Second trajectory (S-PTAM):*\n  \n  ```\n  evo_ape kitti KITTI_00_gt.txt KITTI_00_SPTAM.txt -va --plot --plot_mode xz --save_results results/SPTAM.zip\n  ```\n\n  <a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_S-PTAM_raw.png\" target=\"_blank\">\n    <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_S-PTAM_raw.png\" alt=\"evo\" height=\"200\" border=\"5\" />\n  </a>\n  <a href=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_S-PTAM_map.png\" target=\"_blank\">\n    <img src=\"https://raw.githubusercontent.com/MichaelGrupp/evo/master/doc/assets/ape_demo_S-PTAM_map.png\" alt=\"evo\" height=\"200\" border=\"5\" />\n  </a>\n\n\n### 3.) Process multiple results from a metric\n\n  `evo_res` can be used to compare multiple result files from the metrics, i.e.:\n  * print infos and statistics (default)\n  * plot the results\n  * save the statistics in a table\n\n  Here, we use the results from above to generate a plot and a table:\n  ```\n  evo_res results/*.zip -p --save_table results/table.csv\n  ```\n\n  <a hr","default_branch":"master","files":199,"tree":[".ci/debian_install_pip3.sh",".ci/release.sh",".ci/ros_entrypoint.sh",".ci/ros_run_tests.sh",".dockerignore",".git-blame-ignore-revs",".gitattributes",".github/ISSUE_TEMPLATE/error-report.md",".github/ISSUE_TEMPLATE/feature_request.md",".github/ISSUE_TEMPLATE/question-about-a-concept.md",".github/stale.yaml",".github/workflows/ci.yml",".gitignore",".pylintrc","Dockerfile.ros-lyrical","LICENSE","README.md","_config.yml","contrib/README.md","contrib/kitti_poses_and_timestamps_to_trajectory.py","contrib/multiply_timestamps.py","contrib/print_duplicate_timestamps.sh","contrib/record_tf_as_posestamped_bag.py","contrib/rename_est_name.py","doc/README.md","doc/assets/ape_demo_ORB_map.png","doc/assets/ape_demo_ORB_raw.png","doc/assets/ape_demo_S-PTAM_map.png","doc/assets/ape_demo_S-PTAM_raw.png","doc/assets/ape_rerun.gif","doc/assets/keep_unchanged.png","doc/assets/length_unit_km.png","doc/assets/length_unit_km_xyz.png","doc/assets/map_tile_osm.png","doc/assets/markers.png","doc/assets/pose_corr_markers.png","doc/assets/projection_demo_projected.png","doc/assets/projection_demo_unprojected.png","doc/assets/res_box.png","doc/assets/res_dist.png","doc/assets/res_raw.png","doc/assets/res_stats.png","doc/assets/res_violin.png","doc/assets/ros_map.png","doc/assets/start_end_markers.png","doc/assets/traj_demo.png","doc/assets/traj_demo_xyz.png","doc/assets/traj_rerun.gif","doc/assets/update.png","doc/assets/zoom_to_map.png","doc/install_in_virtualenv.md","doc/jupyter_notebook.md","doc/performance.md","evo/LICENSE","evo/__init__.py","evo/cli/__init__.py","evo/cli/ape.py","evo/cli/ape_parser.py","evo/cli/common_ape_rpe.py","evo/cli/config.py","evo/cli/entry_points.py","evo/cli/evo_main.py","evo/cli/ipython.py","evo/cli/res.py","evo/cli/res_parser.py","evo/cli/rpe.py","evo/cli/rpe_parser.py","evo/cli/traj.py","evo/cli/traj_parser.py","evo/cli/traj_plot.py","evo/cli/traj_rerun.py","evo/core/__init__.py","evo/core/filters.py","evo/core/geometry.py","evo/core/lie_algebra.py","evo/core/metrics.py","evo/core/pose_cache.py","evo/core/result.py","evo/core/sync.py","evo/core/trajectory.py","evo/core/trajectory_bundle.py","evo/core/transformations.py","evo/core/units.py","evo/ipython_config.py","evo/main_ape.py","evo/main_rpe.py","evo/tools/__init__.py","evo/tools/_typing.py","evo/tools/contextily_helper.py","evo/tools/file_interface.py","evo/tools/log.py","evo/tools/pandas_bridge.py","evo/tools/plot.py","evo/tools/rerun_bridge.py","evo/tools/settings.py","evo/tools/settings_template.py","evo/tools/tf_cache.py","evo/tools/tf_id.py","evo/tools/user.py","examples/alignment_demo.py","examples/custom_app.py","examples/rerun_example/README.md","examples/rerun_example/__init__.py","examples/rerun_example/rerun_example.py","notebooks/metrics.py_API_Documentation.ipynb","notebooks/metrics_interactive.ipynb","notebooks/metrics_tutorial.ipynb","notebooks/pandas_bridge.ipynb","pixi.lock","pyproject.toml","test/ape_rpe_smoke_test.py","test/cfg/ape_rpe/all_pairs_deg.json","test/cfg/ape_rpe/all_pairs_frames.json","test/cfg/ape_rpe/all_pairs_meters.json","test/cfg/ape_rpe/all_pairs_plot.json","test/cfg/ape_rpe/all_pairs_rad.json","test/cfg/ape_rpe/n_to_align.json","test/cfg/ape_rpe/not_aligned.json","test/cfg/ape_rpe/origin_aligned.json","test/cfg/ape_rpe/pairs_from_reference.json","test/cfg/ape_rpe/se3_aligned.json","test/cfg/ape_rpe/sim3_aligned.json","test/cfg/ape_rpe/t_offset.json","test/cfg/ape_rpe/write_assets_xy.json","test/cfg/ape_rpe/write_assets_xyz.json","test/cfg/res/merge.json","test/cfg/res/use_filenames.json","test/cfg/res/use_rel_time.json","test/cfg/res/write_assets.json","test/cfg/tf/tf.json","test/cfg/traj/bag/export.json","test/cfg/traj/bag/merge.json","test/cfg/traj/common/align_100.json","test/cfg/traj/common/full_check.json","test/cfg/traj/common/not_aligned.json","test/cfg/traj/common/origin_aligned.json","test/cfg/traj/common/plot_specialities.json","test/cfg/traj/common/se3_aligned.json","test/cfg/traj/common/sim3_aligned.json","test/cfg/traj/common/sync.json","test/cfg/traj/common/write_assets_xy.json","test/cfg/traj/common/write_assets_xyz.json","test/cfg/traj/euroc/export.json","test/cfg/traj/kitti/export.json","test/cfg/traj/tum/export.json","test/cfg/traj/tum/merge.json","test/data/.gitignore","test/data/KITTI_00_ORB.txt","test/data/KITTI_00_SPTAM.txt","test/data/KITTI_00_gt.txt","test/data/KITTI_00_gt_times.txt","test/data/ROS_example.bag","test/data/V102.txt","test/data/V102_groundtruth.csv","test/data/fr2_desk_ORB.txt","test/data/fr2_desk_ORB_kf_mono.txt","test/data/fr2_desk_groundtruth.txt","test/data/freiburg1_xyz-ORB_kf_mono.txt","test/data/freiburg1_xyz-groundtruth.txt","test/data/freiburg1_xyz-rgbdslam.txt","test/data/freiburg1_xyz-rgbdslam_drift.txt","test/data/freiburg1_xyz-rgbdslam_drift_short.txt","test/data/georeferenced.tum","test/data/nav2_turtlebot.mcap","test/data/res_files/orb_ape.zip","test/data/res_files/orb_rpe-for-each.zip","test/data/res_files/orb_rpe.zip","test/data/res_files/sptam_ape.zip","test/data/res_files/sptam_rpe-for-each.zip","test/data/res_files/sptam_rpe.zip","test/data/tf_example.bag","test/data/tf_example/metadata.yaml","test/data/tf_example/tf_example.db3","test/demos/.gitignore","test/demos/ape_demo.sh","test/demos/clean.sh","test/demos/config_demo.sh","test/demos/example.tex","test/demos/latex_demo.sh","test/demos/res_demo.sh","test/demos/rpe_demo.sh","test/demos/traj_demo.sh","test/helpers.py","test/res_smoke_test.py","test/run_all_demos.sh","test/test_file_interface.py","test/test_filters.py","test/test_lie_algebra.py","test/test_pandas_bridge.py","test/test_pose_cache.py","test/test_result.py","test/test_sync.py","test/test_trajectory.py","test/test_trajectory_bundle.py","test/traj_smoke_test.py","test/tum_benchmark_tools/README.md","test/tum_benchmark_tools/associate.py","test/tum_benchmark_tools/evaluate_ate.py","test/tum_benchmark_tools/evaluate_rpe.py"],"storefront":"/r/MichaelGrupp","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/MichaelGrupp/evo/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}