{"id":30368527,"url":"https://github.com/tumftm/tsl","last_synced_at":"2026-03-04T07:05:36.587Z","repository":{"id":275271337,"uuid":"865296311","full_name":"TUMFTM/tsl","owner":"TUMFTM","description":"Time Series Logging (TSL) Library","archived":false,"fork":false,"pushed_at":"2025-10-04T19:10:33.000Z","size":528,"stargazers_count":17,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-04T21:22:08.858Z","etag":null,"topics":["abstraction","logging","realtime","ros2","tools"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TUMFTM.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-30T09:53:21.000Z","updated_at":"2025-10-04T19:10:22.000Z","dependencies_parsed_at":"2025-04-11T21:21:56.198Z","dependency_job_id":"8d3f6979-2275-4169-b958-19ea7285e176","html_url":"https://github.com/TUMFTM/tsl","commit_stats":null,"previous_names":["tumftm/tsl"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/TUMFTM/tsl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TUMFTM%2Ftsl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TUMFTM%2Ftsl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TUMFTM%2Ftsl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TUMFTM%2Ftsl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TUMFTM","download_url":"https://codeload.github.com/TUMFTM/tsl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TUMFTM%2Ftsl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30075425,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T05:31:57.858Z","status":"ssl_error","status_checked_at":"2026-03-04T05:31:38.462Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["abstraction","logging","realtime","ros2","tools"],"created_at":"2025-08-20T01:34:46.973Z","updated_at":"2026-03-04T07:05:36.573Z","avatar_url":"https://github.com/TUMFTM.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"![TSL Logo](./docs/tsl_logo.svg)\n\nTSL is a package that is designed for cyclically logging time values representing a huge amount of different time series.\nHigh efficiency and low computational overhead was a main priority during the development. Because of this, a **huge number of signals** can be logged with a very **low overhead**. \n\nA special use case can be internal debug signals of algorithms. These usually change frequently during the development of the algorithm.\nTherefore using a standard ROS 2 msg definition can be a challenging, since modifying the message definition breaks compatiblity with older previously recorded rosbags.\n\nYou should also check out the other 2 excellent libaries ([Data Tamer](https://github.com/PickNikRobotics/data_tamer) | [pal_statistics](https://github.com/pal-robotics/pal_statistics)) libraries that try to tackle exactly this problem. However, none of those exactly suited our requirements (see features below).\n\n## Features\n- **Python | Cpp**: While being written in CPP, TSL is the only library that support both logging from Python and CPP. Therefore it allows for consistent logging in a mixed language ROS 2 Stack.\n- **Cyclic Publish of Definition**: While other libraries use the transient_local qos setting to publish their definition message, we publish them continously. This is mainly because there are a few problems with transient_local:\n    - No IPC Support\n    - After a BagSplit in a ROS 2 bag recorder, the newly created mcap files do not contain the msg definitions any more required to parse the logged signals.\n- Logs any numeric data type\n- Possibility for registering **custom types**: See this [Example](./tsl_logger_cpp/examples/log_custom_types.cpp).\n- **No custom serialization format**: Therefore no dependency to open and deserialize the ROS 2 bags \n- Preserialization of Definition Message: Saves CPU Resources since the definition is preserialized and cached before it is sent out.\n- Allows modules to stay **ROS 2 independent**: Because of a clear separation of logger and publisher, using the logger does not introduce a ROS 2 dependency in your code.\n- **Signal Compression**: Use custom compression strategies in order to reduce bandwidth and storage requirements for your logged signals. See this [Example](./tsl_ros2_publisher_cpp/examples/compression.cpp).\n- **PlotJuggler** Support: PlotJuggler automatically parses all logged time series signals. At the moment, this requires a custom version of PlotJuggler ([get it here](https://github.com/simonsag96/PlotJuggler/tree/add_support_tsl_messages)). However, a merge request to integrate this in the official version of PlotJuggler is pending.\n- **Different Logging Strategies**: You can either log values explicitly by value or by just storing their memory address. Consider these examples: [Reference Logger](./tsl_logger_cpp/examples/reference_logger.cpp) | [Value Logger](./tsl_logger_cpp/examples/value_logger.cpp)\n\n\n## Limitations\n - Currently, you can't log additional logging signals after the first publish of the ROS 2 publisher. This is a limitation of the current implementation and will be changed in a future release. \n - Regularly publishing the signal definition creates more traffic. However, since we publish with a low frequency and use preserialized definition messages this is not a big problem.\n\n\n## Architecture\n\n![TSL Scheme](./docs/tsl_scheme.drawio.svg)\n\nThe logger is completely independent from the publisher and allows to keep your function code independent from ROS 2. It is that independent, that one could write the logged signals into a csv instead of publishing them in ROS 2.\nHowever, since writing to disk is a bad idea in real-time applications, we haven't bothered implementing a csv-writer on top of the ROS 2 publisher.\n\nThe ROS 2 publisher just takes the reference to the logger in order retrieve the logged values. These are then published to the topic `/tsl/\u003cfully_qualified_node_name\u003e` along with a definition (the signal names in the same order as they are represented in the values msg) to `/tsl/\u003cfully_qualified_node_name\u003e/def`. In order to save bandwidth, by default the definition is only published once every 4 seconds.\n\n\n## Minimum Working Example\n\nFor a minimum example of using the logger in a ROS 2 environment, consider [this example](./tsl_ros2_publisher_cpp/examples/node_integration.cpp)\n\n## Performance Benchmarks\n\nThese performance numbers were generated using an 11th Gen Intel(R) Core(TM) i7-11850H Mobile CPU.\nYou can generate this benchmark report yourself using [this executable](./tsl_ros2_publisher_cpp/examples/benchmark.cpp).\n\n```\nLogging signals:\n=======================================\nLogging 1000 signals 10000 times took 696161852 ns\nAverage time per signal: 69 ns\n\nCreating messages:\n=======================================\nCreating a message for the first time took on average: 220044 ns | Average time per signal: 220 ns\nCreating a message for the subsequent times took on average: 34737 ns | Average time per signal: 34 ns\n\nMessage sizes:\n=======================================\nDefinition message size: 28024 bytes\nValues message size: 4064 bytes\n```\n\n## Package Overview\n\n| Package Name | Usage Examples | Description  |\n| ------------ | ----------- | --------------- |\n| [`tsl_logger_cpp`](./tsl_logger_cpp/) | [`Examples`](./tsl_logger_cpp/examples) | Contains the different tsl loggers. | \n| [`tsl_logger_py`](./tsl_logger_py/) | [`Examples`](./tsl_logger_py/examples) | Python Binding | \n| [`tsl_msgs`](./tsl_msgs/) | - | Message set for the tsl_ros2_publisher | \n| [`tsl_ros2_publisher_cpp`](./tsl_ros2_publisher_cpp/) | [`Examples`](./tsl_ros2_publisher_cpp/examples) | Implementation of the ROS 2 publisher | \n| [`tsl_ros2_publisher_py`](./tsl_ros2_publisher_py/) | [`Examples`](./tsl_ros2_publisher_py/examples) | Python Binding | \n\n\nFurthermore, there are additional packages can be found under `./experimental`. \nThese experimental packages are not as well documented and tested as the other packages in this repository.\nTherefore, using these packages at your own discretion.\n\n## Compilation\n\nEverything should just compile using colcon. The packages `tsl_logger_cpp` and `tsl_logger_py` should compile without ROS 2 installed. \nFor the other packages, having a installation of ROS 2 is required.\n\n**Disclaimer**: This package was developed using Ubuntu 22.04 and ROS 2 Humble. \nIt is expected to work also for future Ubuntu and ROS 2 releases. \nHowever, if you experience problems with compilation, please open an Issue.  \n\n\n## Core Developers\n - [Simon Sagmeister](https://github.com/simonsag96)\n\n## Acknowledgments\n\nSpecial thanks to my colleagues for the regular technical feedback and talks during the development phase of this package.:\n- [Simon Hoffmann](https://github.com/simonh92)\n\n\nWe gratefully acknowledge financial support by:\n - Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) | Project Number - 469341384\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftumftm%2Ftsl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftumftm%2Ftsl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftumftm%2Ftsl/lists"}