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.
- ros_utility_board_interface-2.0.0/LICENSE +21 -0
- ros_utility_board_interface-2.0.0/MANIFEST.in +8 -0
- ros_utility_board_interface-2.0.0/PKG-INFO +158 -0
- ros_utility_board_interface-2.0.0/README.md +117 -0
- ros_utility_board_interface-2.0.0/RELEASING.md +127 -0
- ros_utility_board_interface-2.0.0/package.xml +34 -0
- ros_utility_board_interface-2.0.0/pyproject.toml +7 -0
- ros_utility_board_interface-2.0.0/requirements.txt +3 -0
- ros_utility_board_interface-2.0.0/resource/ros_utility_board_interface +0 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface/__init__.py +3 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface/__main__.py +6 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface/app.py +964 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface/node.py +303 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface/ops.py +740 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/PKG-INFO +158 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/SOURCES.txt +24 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/dependency_links.txt +1 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/entry_points.txt +2 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/requires.txt +4 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/top_level.txt +1 -0
- ros_utility_board_interface-2.0.0/ros_utility_board_interface.egg-info/zip-safe +1 -0
- ros_utility_board_interface-2.0.0/rubi.py +12 -0
- ros_utility_board_interface-2.0.0/rubi_rules.yaml +24 -0
- ros_utility_board_interface-2.0.0/setup.cfg +10 -0
- 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,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
|
+

|
|
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
|
+

|
|
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"
|
|
File without changes
|