{"id":19855235,"url":"https://github.com/leggedrobotics/graph_msf","last_synced_at":"2025-04-09T12:05:01.624Z","repository":{"id":43037536,"uuid":"406636516","full_name":"leggedrobotics/graph_msf","owner":"leggedrobotics","description":"A graph-based multi-sensor fusion framework. It can be used to fuse various relative or absolute measurments with IMU readings in real-time.","archived":false,"fork":false,"pushed_at":"2023-07-04T15:33:32.000Z","size":12472,"stargazers_count":286,"open_issues_count":6,"forks_count":44,"subscribers_count":45,"default_branch":"main","last_synced_at":"2025-04-02T09:08:42.726Z","etag":null,"topics":["factor-graph","gnss","imu","lidar","localization","sensor-fusion","state-estimation"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leggedrobotics.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-15T06:16:42.000Z","updated_at":"2025-03-22T01:10:37.000Z","dependencies_parsed_at":"2024-11-12T14:12:14.571Z","dependency_job_id":"7a550fa7-daef-4b29-bee7-854691e0a540","html_url":"https://github.com/leggedrobotics/graph_msf","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leggedrobotics%2Fgraph_msf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leggedrobotics%2Fgraph_msf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leggedrobotics%2Fgraph_msf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leggedrobotics%2Fgraph_msf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leggedrobotics","download_url":"https://codeload.github.com/leggedrobotics/graph_msf/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248036063,"owners_count":21037092,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["factor-graph","gnss","imu","lidar","localization","sensor-fusion","state-estimation"],"created_at":"2024-11-12T14:12:05.704Z","updated_at":"2025-04-09T12:05:01.606Z","avatar_url":"https://github.com/leggedrobotics.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Graph-MSF: Graph-based Multi-sensor Fusion for Consistent Localization and State Estimation\n\n**Authors:** [Julian Nubert](https://juliannubert.com/) ([nubertj@ethz.ch](mailto:nubertj@ethz.ch?subject=[GitHub]))\n, [Shehryar Khattak](https://www.linkedin.com/in/shehryar-khattak/)\n, [Marco Hutter](https://rsl.ethz.ch/the-lab/people/person-detail.MTIxOTEx.TGlzdC8yNDQxLC0xNDI1MTk1NzM1.html)\n\n\u003cimg src=\"doc/graph_msf.gif\" width=\"100%\" height=\"60%\"\u003e\n\n## Resources \n**[1] ICRA2022, Philadelphia**\n* [project page](https://sites.google.com/leggedrobotics.com/gmfcl).\n* [paper](https://arxiv.org/pdf/2203.01389.pdf)\n* [video](https://youtu.be/syTV7Ui36jg)\n\n## Overview\nThe presented framework aims for a flexible and fast fusion of multiple sensor modalities. The state estimate is \npublished at **imu frequency** through IMU pre-integration with a multi-threaded implementation and book-keeping. \nThe adding of the measurements and the optimization of the graph are performed in different threads. \nIn contrast to classical filtering-based approaches this graph-based structure also allows for a simple incorporation of\ndelayed sensor measurements up to the smoothingLag.\n\nThere are two intended **use-cases**:\n\n1. Using the dual graph formulation as proosed in [1]. In this part of the implementation there are hard-coded \ncomponents for this specific use-case.\n2. A more general graph-based multi-sensor fusion. An example for fusing LiDAR odometry and IMU on the dataset of the \n[ETH Zurich Robotic Summer School](https://ethz-robotx.github.io/SuperMegaBot/) will follow shortly.\n\n\u003cimg src=\"doc/titleimg.png\" width=\"50%\" height=\"50%\"\u003e\n\n**© IEEE**\n\n**Disclaimer:** The framework is still under development and will be updated, extended, and more generalized in the future.\n\n## Modules and Packages\nThis repository contains the following modules:\n\n1. _graph_msf_: The core library for the sensor fusion. This library is only dependant on Eigen and GTSAM.\n2. _graph_msf_ros_: This package provides a basic class for using GraphMsf in ROS. It is dependant on GraphMsf and ROS.\n3. _examples_: Examples on how to use GraphMsf and GraphMsfRos.\n   - [./examples/excavator_dual_graph](./examples/excavator_dual_graph) from [1]. This is the implementation as presented in the paper.\n   - Single-graph standalone fusion example following soon.\n\n## Installation\nFor the installation instructions please refer to the [./doc/installation.md](./doc/installation.md).\n\n## Example Usage\nInstructions on how to use and run the examples can be found in the [./examples/README.md](./examples/README.md).\n\n## Data\nWe provide some example datasets from our excavator HEAP. The data contains\n* IMU measurements,\n* LiDAR odometry from CompSLAM,\n* Left and Right GNSS measurements,\n* and an (arm-)filtered point cloud.\n\nThe datasets can be found here: [Google Drive Link](https://drive.google.com/drive/folders/1qZg_DNH3wXnQu4tNIcqY925KZFDu8y0M?usp=sharing).\n\n## Custom Usage\nFor custom usage, such as the fusion of more sensor measurements, an own class with the desired functionality can be implemented.\nThis class only has to inherit from the **GraphMsfInterface** base-class.\n\nFor usage three functionalities have to be implemented by the user:\n\n1. (ROS)-callbacks or other code snippets can be used to add measurements through the given interface as \nspecified [here](graph_msf/include/graph_msf/GraphMsfInterface.h). Examples for this can be seen in the\n[excavator_dual_graph](./examples/excavator_dual_graph), where ROS subscribers are used to add the measurements to the graph.\n2. Furthermore, the purely virtual functions _publishState_ needs to be implemented. This method is called after each \narrival of an IMU measurement to publish the state in the desired format.\n3. Lastly, _readParams__ is called during initialization, and is needed to load extrinsic parameters inside the \n[StaticTransforms](graph_msf/include/graph_msf/StaticTransforms.h) required for coordinate transformations.\nNote that the _StaticTransforms_ class can contain arbitrary extrinsic transformation pairs.\n\nThe measurements can be passed to the interface using the _measurements_ specified in \n[./graph_msf/include/measurements](./graph_msf/include/measurements). More measurements can be easily added for\ncustom usage.\n\n## Paper\nIf you find this code useful, please consider citing\n```\n@inproceedings{nubert2022graph,\n  title={Graph-based Multi-sensor Fusion for Consistent Localization of Autonomous Construction Robots},\n  author={Nubert, Julian and Khattak, Shehryar and Hutter, Marco},\n  booktitle={IEEE International Conference on Robotics and Automation (ICRA)},\n  year={2022},\n  organization={IEEE}\n}\n```\n\n## Acknowledgements\nThe authors thank Marco Tranzatto, Simon Kerscher, Dominic Jud, Lorenzo Terenzi, Timo Schoenegg and the remaining HEAP \nteam for patiently testing parts of this framework during their experiments. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleggedrobotics%2Fgraph_msf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleggedrobotics%2Fgraph_msf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleggedrobotics%2Fgraph_msf/lists"}