ros-utility-board-interface 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. ros_utility_board_interface-2.0.0/LICENSE +21 -0
  2. ros_utility_board_interface-2.0.0/MANIFEST.in +8 -0
  3. ros_utility_board_interface-2.0.0/PKG-INFO +158 -0
  4. ros_utility_board_interface-2.0.0/README.md +117 -0
  5. ros_utility_board_interface-2.0.0/RELEASING.md +127 -0
  6. ros_utility_board_interface-2.0.0/package.xml +34 -0
  7. ros_utility_board_interface-2.0.0/pyproject.toml +7 -0
  8. ros_utility_board_interface-2.0.0/requirements.txt +3 -0
  9. ros_utility_board_interface-2.0.0/resource/ros_utility_board_interface +0 -0
  10. ros_utility_board_interface-2.0.0/ros_utility_board_interface/__init__.py +3 -0
  11. ros_utility_board_interface-2.0.0/ros_utility_board_interface/__main__.py +6 -0
  12. ros_utility_board_interface-2.0.0/ros_utility_board_interface/app.py +964 -0
  13. ros_utility_board_interface-2.0.0/ros_utility_board_interface/node.py +303 -0
  14. ros_utility_board_interface-2.0.0/ros_utility_board_interface/ops.py +740 -0
  15. ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/PKG-INFO +158 -0
  16. ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/SOURCES.txt +24 -0
  17. ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/dependency_links.txt +1 -0
  18. ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/entry_points.txt +2 -0
  19. ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/requires.txt +4 -0
  20. ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/top_level.txt +1 -0
  21. ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/zip-safe +1 -0
  22. ros_utility_board_interface-2.0.0/rubi.py +12 -0
  23. ros_utility_board_interface-2.0.0/rubi_rules.yaml +24 -0
  24. ros_utility_board_interface-2.0.0/setup.cfg +10 -0
  25. ros_utility_board_interface-2.0.0/setup.py +53 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ali Pahlevani
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,8 @@
1
+ include README.md
2
+ include LICENSE
3
+ include package.xml
4
+ include rubi_rules.yaml
5
+ include requirements.txt
6
+ include RELEASING.md
7
+ include rubi.py
8
+ include resource/ros_utility_board_interface
@@ -0,0 +1,158 @@
1
+ Metadata-Version: 2.4
2
+ Name: ros_utility_board_interface
3
+ Version: 2.0.0
4
+ Summary: RUBI - ROS Utility Board Interface: a lightweight single-window ROS 2 control board.
5
+ Home-page: https://github.com/ali-pahlevani/ROS_Utility_Board_Interface
6
+ Author: Ali Pahlevani
7
+ Author-email: a.pahlevani1998@gmail.com
8
+ Maintainer: Ali Pahlevani
9
+ Maintainer-email: a.pahlevani1998@gmail.com
10
+ License: MIT
11
+ Project-URL: Source, https://github.com/ali-pahlevani/ROS_Utility_Board_Interface
12
+ Project-URL: Website, https://www.SLAMbotics.org
13
+ Keywords: ros2 ros monitoring introspection robotics dashboard qos rosbag
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Topic :: Scientific/Engineering
19
+ Requires-Python: >=3.8
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: setuptools
23
+ Requires-Dist: dearpygui
24
+ Requires-Dist: pyyaml
25
+ Requires-Dist: psutil
26
+ Dynamic: author
27
+ Dynamic: author-email
28
+ Dynamic: classifier
29
+ Dynamic: description
30
+ Dynamic: description-content-type
31
+ Dynamic: home-page
32
+ Dynamic: keywords
33
+ Dynamic: license
34
+ Dynamic: license-file
35
+ Dynamic: maintainer
36
+ Dynamic: maintainer-email
37
+ Dynamic: project-url
38
+ Dynamic: requires-dist
39
+ Dynamic: requires-python
40
+ Dynamic: summary
41
+
42
+ # RUBI (ROS_Utility_Board_Interface) (V2)
43
+ **RUBI v2**: A single-window ROS 2 *control board* — not just a monitor:
44
+ - **Live topic rates/bandwidth/delays** | **QoS mismatch detection** | **Health watchdog**
45
+ - **Message inspection** | **Live plotting** | **Logs** | **Parameters** | **TF health** | **Exports**
46
+ - **Lifecycle control** | **Service/Action caller** | **Rosbag record/play** | **Graph snapshot/diff**
47
+
48
+ ![RUBI Banner](https://github.com/user-attachments/assets/429bd575-41b3-4508-8a38-fa521a028bad)
49
+
50
+
51
+ ### What is RUBI?
52
+
53
+ **RUBI** gives you a single, clean window to understand *and operate* your ROS 2 robot at a glance — no web server, no heavy stack. Runs fast even on embedded systems.
54
+
55
+ ### Features
56
+
57
+ **Observe**
58
+ - **Realtime monitoring** — topic rates, delays, and a per-topic **rate sparkline** (trend) updated continuously
59
+ - **Live bandwidth** — per-topic throughput in human-readable B/s, like `ros2 topic bw` but for everything at once
60
+ - **QoS mismatch detector** — shows each topic's QoS and flags incompatible publisher/subscriber pairs (reliability & durability) right in the table — the #1 cause of silent "no data"
61
+ - **Health watchdog** — expected `min_hz` / `max_hz` / `max_delay` per topic (YAML + glob patterns) → instant ✓/✗ status and an alert banner
62
+ - **Message inspector** — peek the latest message of any topic as YAML (with a *live* toggle)
63
+ - **Live plotter** — select a topic, drill into its numeric fields (including array elements like `position[0]` for `/joint_states`), and plot them live vs time; overlay multiple signals with legend, pan/zoom, scrolling window and auto-Y
64
+ - **/rosout log pane** — severity-filtered, color-coded, searchable
65
+ - **Node process metrics** — best-effort PID / CPU% / memory per node (psutil)
66
+ - **TF health** — frame tree (child → parent), per-frame rate, and **stale-transform** detection
67
+ - **Lifecycle states** — detects lifecycle nodes and shows their current state
68
+
69
+ **Operate**
70
+ - **Parameter browser & live edit** — pick a node, choose a parameter from a dropdown, and set it (the value box shows the expected type)
71
+ - **Lifecycle control** — trigger configure / activate / deactivate / cleanup / shutdown
72
+ - **Service & Action caller** — pick any service/action from a dropdown; its request/goal form is pre-filled from the type, edit and call
73
+ - **Rosbag** — record, play (rate/loop), and inspect bags (`ros2 bag info`); recordings are saved under `Bag/`
74
+
75
+ **Analyze & share**
76
+ - **Graph snapshot & diff** — capture the graph and diff later to catch intermittent nodes/topics
77
+ - **Export** — topic table to CSV / Markdown, or the node graph to Graphviz `.dot` (saved under `CSV/`, `MD/`, `DOT/`)
78
+ - **Multi-domain** — switch `ROS_DOMAIN_ID` from the header (relaunches on the chosen domain)
79
+
80
+ **Polish**
81
+ - Flicker-free tables (in-place updates, preserved scroll), 60 FPS, clean dark theme, global search, freeze mode.
82
+
83
+ ### Requirements
84
+
85
+ - **ROS 2 Humble or Jazzy**, installed and **sourced**. RUBI uses `rclpy` and
86
+ ROS interface packages that come from your ROS install — they are *not* on
87
+ PyPI, so ROS 2 must be present and sourced however you run RUBI.
88
+ - Python 3.8+ and three non-ROS Python packages: `dearpygui`, `pyyaml`, `psutil`.
89
+
90
+ ```bash
91
+ source /opt/ros/humble/setup.bash # or: source /opt/ros/jazzy/setup.bash
92
+ pip install dearpygui pyyaml psutil
93
+ ```
94
+
95
+ ### Installation
96
+
97
+ **Option A — run directly (quickest):**
98
+ ```bash
99
+ git clone https://github.com/ali-pahlevani/ROS_Utility_Board_Interface.git
100
+ cd ROS_Utility_Board_Interface
101
+ python3 rubi.py # or: python3 rubi.py --rules rubi_rules.yaml --domain 0
102
+ ```
103
+
104
+ **Option B — colcon (recommended for ROS users; enables `ros2 run`):**
105
+ ```bash
106
+ mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src
107
+ git clone https://github.com/ali-pahlevani/ROS_Utility_Board_Interface.git
108
+ cd ~/ros2_ws && colcon build --packages-select ros_utility_board_interface
109
+ source install/setup.bash
110
+ ros2 run ros_utility_board_interface rubi
111
+ ```
112
+
113
+ **Option C — pip (adds a `rubi` command):**
114
+ ```bash
115
+ pip install ros-utility-board-interface # from PyPI
116
+ # or, from a clone for development:
117
+ # git clone https://github.com/ali-pahlevani/ROS_Utility_Board_Interface.git
118
+ # cd ROS_Utility_Board_Interface && pip install .
119
+ rubi # run inside a shell where ROS 2 is sourced
120
+ ```
121
+
122
+ > However you install it (pip, PyPI, or colcon), ROS 2 must still be sourced at
123
+ > runtime — `rclpy` is provided by ROS, not pip.
124
+
125
+ ### Outputs
126
+
127
+ RUBI writes into folders next to where it runs: exports under `CSV/`, `MD/`,
128
+ `DOT/`, and rosbag recordings under `Bag/`.
129
+
130
+ ### Health watchdog rules
131
+
132
+ Create a `rubi_rules.yaml` (a sample ships with the repo):
133
+
134
+ ```yaml
135
+ topics:
136
+ "/scan": { min_hz: 8, max_hz: 12 }
137
+ "/odom": { min_hz: 20, max_delay: 0.1 }
138
+ "/camera/*/image_raw": { min_hz: 25 } # glob patterns supported
139
+ ```
140
+
141
+ Topics outside their bounds turn **✗ FAIL** (red) in the Health column, with a running count in the status bar. Topics without a rule simply show `—`.
142
+
143
+ I’d **love collaborations**! Contribute via pull requests on *GitHub* for bug fixes, new features, or documentation improvements. Reach out via *GitHub Issues* for questions, suggestions, or partnership ideas.
144
+
145
+ ### Contributing
146
+
147
+ Contributions are welcome! To contribute:
148
+
149
+ 1. Fork the repository.
150
+ 2. Create a branch (`git checkout -b feature/your-feature`).
151
+ 3. Commit changes (`git commit -m "Add your feature"`).
152
+ 4. Push to the branch (`git push origin feature/your-feature`).
153
+ 5. Open a pull request.
154
+
155
+ ---
156
+
157
+ + Questions? Reach out: **a.pahlevani1998@gmail.com**
158
+ + LinkedIn: **https://www.linkedin.com/in/ali-pahlevani/**
@@ -0,0 +1,117 @@
1
+ # RUBI (ROS_Utility_Board_Interface) (V2)
2
+ **RUBI v2**: A single-window ROS 2 *control board* — not just a monitor:
3
+ - **Live topic rates/bandwidth/delays** | **QoS mismatch detection** | **Health watchdog**
4
+ - **Message inspection** | **Live plotting** | **Logs** | **Parameters** | **TF health** | **Exports**
5
+ - **Lifecycle control** | **Service/Action caller** | **Rosbag record/play** | **Graph snapshot/diff**
6
+
7
+ ![RUBI Banner](https://github.com/user-attachments/assets/429bd575-41b3-4508-8a38-fa521a028bad)
8
+
9
+
10
+ ### What is RUBI?
11
+
12
+ **RUBI** gives you a single, clean window to understand *and operate* your ROS 2 robot at a glance — no web server, no heavy stack. Runs fast even on embedded systems.
13
+
14
+ ### Features
15
+
16
+ **Observe**
17
+ - **Realtime monitoring** — topic rates, delays, and a per-topic **rate sparkline** (trend) updated continuously
18
+ - **Live bandwidth** — per-topic throughput in human-readable B/s, like `ros2 topic bw` but for everything at once
19
+ - **QoS mismatch detector** — shows each topic's QoS and flags incompatible publisher/subscriber pairs (reliability & durability) right in the table — the #1 cause of silent "no data"
20
+ - **Health watchdog** — expected `min_hz` / `max_hz` / `max_delay` per topic (YAML + glob patterns) → instant ✓/✗ status and an alert banner
21
+ - **Message inspector** — peek the latest message of any topic as YAML (with a *live* toggle)
22
+ - **Live plotter** — select a topic, drill into its numeric fields (including array elements like `position[0]` for `/joint_states`), and plot them live vs time; overlay multiple signals with legend, pan/zoom, scrolling window and auto-Y
23
+ - **/rosout log pane** — severity-filtered, color-coded, searchable
24
+ - **Node process metrics** — best-effort PID / CPU% / memory per node (psutil)
25
+ - **TF health** — frame tree (child → parent), per-frame rate, and **stale-transform** detection
26
+ - **Lifecycle states** — detects lifecycle nodes and shows their current state
27
+
28
+ **Operate**
29
+ - **Parameter browser & live edit** — pick a node, choose a parameter from a dropdown, and set it (the value box shows the expected type)
30
+ - **Lifecycle control** — trigger configure / activate / deactivate / cleanup / shutdown
31
+ - **Service & Action caller** — pick any service/action from a dropdown; its request/goal form is pre-filled from the type, edit and call
32
+ - **Rosbag** — record, play (rate/loop), and inspect bags (`ros2 bag info`); recordings are saved under `Bag/`
33
+
34
+ **Analyze & share**
35
+ - **Graph snapshot & diff** — capture the graph and diff later to catch intermittent nodes/topics
36
+ - **Export** — topic table to CSV / Markdown, or the node graph to Graphviz `.dot` (saved under `CSV/`, `MD/`, `DOT/`)
37
+ - **Multi-domain** — switch `ROS_DOMAIN_ID` from the header (relaunches on the chosen domain)
38
+
39
+ **Polish**
40
+ - Flicker-free tables (in-place updates, preserved scroll), 60 FPS, clean dark theme, global search, freeze mode.
41
+
42
+ ### Requirements
43
+
44
+ - **ROS 2 Humble or Jazzy**, installed and **sourced**. RUBI uses `rclpy` and
45
+ ROS interface packages that come from your ROS install — they are *not* on
46
+ PyPI, so ROS 2 must be present and sourced however you run RUBI.
47
+ - Python 3.8+ and three non-ROS Python packages: `dearpygui`, `pyyaml`, `psutil`.
48
+
49
+ ```bash
50
+ source /opt/ros/humble/setup.bash # or: source /opt/ros/jazzy/setup.bash
51
+ pip install dearpygui pyyaml psutil
52
+ ```
53
+
54
+ ### Installation
55
+
56
+ **Option A — run directly (quickest):**
57
+ ```bash
58
+ git clone https://github.com/ali-pahlevani/ROS_Utility_Board_Interface.git
59
+ cd ROS_Utility_Board_Interface
60
+ python3 rubi.py # or: python3 rubi.py --rules rubi_rules.yaml --domain 0
61
+ ```
62
+
63
+ **Option B — colcon (recommended for ROS users; enables `ros2 run`):**
64
+ ```bash
65
+ mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src
66
+ git clone https://github.com/ali-pahlevani/ROS_Utility_Board_Interface.git
67
+ cd ~/ros2_ws && colcon build --packages-select ros_utility_board_interface
68
+ source install/setup.bash
69
+ ros2 run ros_utility_board_interface rubi
70
+ ```
71
+
72
+ **Option C — pip (adds a `rubi` command):**
73
+ ```bash
74
+ pip install ros-utility-board-interface # from PyPI
75
+ # or, from a clone for development:
76
+ # git clone https://github.com/ali-pahlevani/ROS_Utility_Board_Interface.git
77
+ # cd ROS_Utility_Board_Interface && pip install .
78
+ rubi # run inside a shell where ROS 2 is sourced
79
+ ```
80
+
81
+ > However you install it (pip, PyPI, or colcon), ROS 2 must still be sourced at
82
+ > runtime — `rclpy` is provided by ROS, not pip.
83
+
84
+ ### Outputs
85
+
86
+ RUBI writes into folders next to where it runs: exports under `CSV/`, `MD/`,
87
+ `DOT/`, and rosbag recordings under `Bag/`.
88
+
89
+ ### Health watchdog rules
90
+
91
+ Create a `rubi_rules.yaml` (a sample ships with the repo):
92
+
93
+ ```yaml
94
+ topics:
95
+ "/scan": { min_hz: 8, max_hz: 12 }
96
+ "/odom": { min_hz: 20, max_delay: 0.1 }
97
+ "/camera/*/image_raw": { min_hz: 25 } # glob patterns supported
98
+ ```
99
+
100
+ Topics outside their bounds turn **✗ FAIL** (red) in the Health column, with a running count in the status bar. Topics without a rule simply show `—`.
101
+
102
+ I’d **love collaborations**! Contribute via pull requests on *GitHub* for bug fixes, new features, or documentation improvements. Reach out via *GitHub Issues* for questions, suggestions, or partnership ideas.
103
+
104
+ ### Contributing
105
+
106
+ Contributions are welcome! To contribute:
107
+
108
+ 1. Fork the repository.
109
+ 2. Create a branch (`git checkout -b feature/your-feature`).
110
+ 3. Commit changes (`git commit -m "Add your feature"`).
111
+ 4. Push to the branch (`git push origin feature/your-feature`).
112
+ 5. Open a pull request.
113
+
114
+ ---
115
+
116
+ + Questions? Reach out: **a.pahlevani1998@gmail.com**
117
+ + LinkedIn: **https://www.linkedin.com/in/ali-pahlevani/**
@@ -0,0 +1,127 @@
1
+ # Releasing RUBI
2
+
3
+ RUBI can be distributed two ways. Both are independent — you can do either or
4
+ both.
5
+
6
+ | Target | Users install with | Effort | Resolves ROS deps |
7
+ |--------|--------------------|--------|-------------------|
8
+ | **PyPI** (pip) | `pip install <name>` | low | ❌ (ROS must already be sourced) |
9
+ | **ROS index** (apt) | `sudo apt install ros-<distro>-ros-utility-board-interface` | higher | ✅ via rosdep |
10
+
11
+ > Reminder: `rclpy` and the ROS message/service packages are **not** on PyPI.
12
+ > However RUBI is installed, ROS 2 (Humble or Jazzy) must be installed and
13
+ > sourced at runtime.
14
+
15
+ ---
16
+
17
+ ## 0. Before any release
18
+
19
+ 1. **Bump the version in both files so they match** (single source of truth is
20
+ manual today):
21
+ - `setup.py` → `version='X.Y.Z'`
22
+ - `package.xml` → `<version>X.Y.Z</version>`
23
+ 2. Commit, then tag:
24
+ ```bash
25
+ git commit -am "Release X.Y.Z"
26
+ git tag X.Y.Z
27
+ git push && git push --tags
28
+ ```
29
+ 3. Sanity-check the build artifacts are clean (no stray `CSV/ MD/ DOT/ Bag/`
30
+ folders — they are git-ignored).
31
+
32
+ ---
33
+
34
+ ## 1. PyPI (pip install)
35
+
36
+ Lets anyone run `pip install <name>` (they still need ROS 2 sourced to *run* it).
37
+
38
+ ```bash
39
+ pip install build twine
40
+
41
+ # Build sdist + wheel into dist/
42
+ python3 -m build
43
+
44
+ # Validate metadata renders on PyPI
45
+ twine check dist/*
46
+
47
+ # (optional) dry-run on TestPyPI first
48
+ twine upload --repository testpypi dist/*
49
+
50
+ # Publish for real
51
+ twine upload dist/*
52
+ ```
53
+
54
+ Notes:
55
+ - You need a **PyPI account** and an **API token** (store it in `~/.pypirc` or
56
+ pass `-u __token__ -p pypi-...`).
57
+ - **Pick a free, valid name.** `setup.py` currently uses
58
+ `ros_utility_board_interface` → normalized to
59
+ `ros-utility-board-interface` on PyPI. Check availability at
60
+ <https://pypi.org/project/ros-utility-board-interface/>. If taken, change
61
+ `name=` in `setup.py` (e.g. `rubi-ros2`) and rebuild.
62
+ - A version can only be uploaded **once** — bump the version to re-upload.
63
+
64
+ ---
65
+
66
+ ## 2. ROS index / apt (via bloom)
67
+
68
+ Gets RUBI into the official ROS 2 index so the build farm produces
69
+ `ros-humble-...` / `ros-jazzy-...` Debian packages and `ros2 run` works out of
70
+ the box. This is the idiomatic path for a ROS tool, but it is reviewed by the
71
+ rosdistro maintainers and has stricter requirements.
72
+
73
+ ### One-time prerequisites
74
+ - Public source repo with a **release tag** matching `package.xml` (step 0).
75
+ - A **CHANGELOG.rst** per package (bloom can scaffold it):
76
+ ```bash
77
+ pip install bloom # or: sudo apt install python3-bloom
78
+ catkin_generate_changelog --all # creates/updates CHANGELOG.rst
79
+ # edit CHANGELOG.rst, then commit
80
+ ```
81
+ - **Every `<depend>` in `package.xml` must have a valid rosdep key.** RUBI's
82
+ ROS deps (`rclpy`, `rcl_interfaces`, `lifecycle_msgs`, `tf2_msgs`,
83
+ `rosidl_runtime_py`, `ros2bag`, `python3-yaml`, `python3-psutil`) already
84
+ resolve. **`dearpygui` does not have a rosdep key** — for an official apt
85
+ release you must either:
86
+ 1. add a rosdep key for it (PR to `ros/rosdistro` → `rosdep/python.yaml`), or
87
+ 2. keep it as a documented `pip install dearpygui` step and not list it as a
88
+ `<depend>`.
89
+
90
+ ### Release
91
+ ```bash
92
+ # First release on a distro creates a "track" and a release repository.
93
+ bloom-release --new-track --rosdistro humble --track humble ros_utility_board_interface
94
+ # Subsequent releases:
95
+ bloom-release --rosdistro humble --track humble ros_utility_board_interface
96
+ # Repeat for jazzy:
97
+ bloom-release --rosdistro jazzy --track jazzy ros_utility_board_interface
98
+ ```
99
+
100
+ `bloom-release` will:
101
+ 1. ask for a **release repository** (e.g. a GitHub repo named
102
+ `ros_utility_board_interface-release`),
103
+ 2. generate the Debian/`rosdistro` metadata, and
104
+ 3. open a **pull request to `ros/rosdistro`**.
105
+
106
+ After that PR is merged, the ROS build farm builds the binaries (can take a
107
+ day or two), and users can:
108
+ ```bash
109
+ sudo apt update
110
+ sudo apt install ros-humble-ros-utility-board-interface
111
+ ros2 run ros_utility_board_interface rubi
112
+ ```
113
+
114
+ ### Don't want the official index?
115
+ You can host your **own apt repo** (build debs locally with
116
+ `bloom-generate rosdebian` + `fakeroot debian/rules binary`, then serve with
117
+ `reprepro`/`aptly`). More maintenance, full control.
118
+
119
+ ---
120
+
121
+ ## Recommended path
122
+
123
+ - **Today, zero extra infra:** colcon from source (`README` Option B) — already
124
+ works.
125
+ - **Quick wide reach:** publish to **PyPI** (section 1).
126
+ - **Best long-term for a ROS tool:** **bloom → apt** (section 2), ideally after
127
+ sorting the `dearpygui` rosdep key.
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0"?>
2
+ <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
3
+ <package format="3">
4
+ <name>ros_utility_board_interface</name>
5
+ <version>2.0.0</version>
6
+ <description>RUBI - a lightweight single-window ROS 2 control board: live topic
7
+ rates, bandwidth, delays, QoS mismatch detection, health watchdog, message
8
+ inspector, /rosout logs, parameters, lifecycle control, TF health,
9
+ service/action caller, bag recording, graph snapshot/diff and exports.</description>
10
+
11
+ <maintainer email="a.pahlevani1998@gmail.com">Ali Pahlevani</maintainer>
12
+ <license>MIT</license>
13
+ <url type="website">https://www.SLAMbotics.org</url>
14
+ <url type="repository">https://github.com/ali-pahlevani/ROS_Utility_Board_Interface</url>
15
+
16
+ <exec_depend>rclpy</exec_depend>
17
+ <exec_depend>rcl_interfaces</exec_depend>
18
+ <exec_depend>lifecycle_msgs</exec_depend>
19
+ <exec_depend>tf2_msgs</exec_depend>
20
+ <exec_depend>rosidl_runtime_py</exec_depend>
21
+ <exec_depend>ros2bag</exec_depend>
22
+ <exec_depend>python3-yaml</exec_depend>
23
+ <exec_depend>python3-psutil</exec_depend>
24
+ <!-- dearpygui has no rosdep key: install with `pip install dearpygui` -->
25
+
26
+ <test_depend>ament_copyright</test_depend>
27
+ <test_depend>ament_flake8</test_depend>
28
+ <test_depend>ament_pep257</test_depend>
29
+ <test_depend>python3-pytest</test_depend>
30
+
31
+ <export>
32
+ <build_type>ament_python</build_type>
33
+ </export>
34
+ </package>
@@ -0,0 +1,7 @@
1
+ # Build-system declaration so `python -m build` / pip produce clean
2
+ # sdists and wheels for PyPI. Project metadata still lives in setup.py
3
+ # (kept as the single source of truth, which the ROS 2 ament_python /
4
+ # colcon build also reads directly).
5
+ [build-system]
6
+ requires = ["setuptools>=61.0", "wheel"]
7
+ build-backend = "setuptools.build_meta"
@@ -0,0 +1,3 @@
1
+ dearpygui>=1.10
2
+ pyyaml>=5.0
3
+ psutil>=5.0
@@ -0,0 +1,3 @@
1
+ """RUBI - ROS Utility Board Interface."""
2
+
3
+ __version__ = '2.0.0'
@@ -0,0 +1,6 @@
1
+ """Enables `python -m ros_utility_board_interface`."""
2
+
3
+ from .app import main
4
+
5
+ if __name__ == '__main__':
6
+ main()