ROS 2 Dev Suite
A comprehensive VS Code extension for ROS 2 development: unified explorer, live parameter tuner, service/topic/action caller, log viewer, and syntax highlighting for interface files.
Features
A dedicated side panel accessible via the ROS 2 icon in the activity bar. Section headers are highlighted in blue for quick scanning.
Namespace Filter
Filter all sections (nodes, topics, services, actions) by namespace at once.
- Click the $(filter) filter icon in the panel title bar
- Available namespaces are detected automatically from live node and topic names — click one to apply
- The active filter is shown as a badge in the panel title (
• /my_robot)
- Click the $(filter-filled) filled filter icon to clear the filter
Nodes
- Lists all active ROS 2 nodes
- Inline actions: attach tuner · node info · copy name
Topics
- Lists all active topics with their message type
- Inline actions: echo (start/stop) · publish · topic info · copy name
- A spinning icon marks topics currently being echoed, each in its own Output Channel
- Configurable capture limit:
ros2.topicEchoCount (default 10, 0 = continuous)
Services
- Lists all active services with their type
- Inline actions: call · show type
Actions
- Lists all active actions with their type
- Inline actions: send goal · action info
Packages
- Detects all ROS 2 packages in the workspace (recursive
package.xml search)
- Inline action: open folder in VS Code Explorer
- Context menu: open
CMakeLists.txt · open package.xml · search in package
2. Log Viewer
A read-only, filterable ROS 2 log stream displayed in the VS Code Output panel.
- Click $(output) Log Viewer in the panel title bar (or run
ROS 2: Open Log Viewer)
- A multi-select QuickPick lets you choose which nodes to monitor; leave it empty to monitor all nodes
- Log lines are formatted as
HH:MM:SS [LEVEL] /node message
- Node death detection: when a monitored node disappears, a red popup notification is shown and a
✖ NODE DIED marker is written to the log
- Stop the stream with
ROS 2: Stop Log Viewer
3. Service / Topic / Action Caller
WebView panels to interact with ROS 2 interfaces without leaving VS Code. Each panel is a singleton — reopening the same name reveals the existing panel.
- The interface definition is displayed automatically
- The YAML editor is pre-filled with default values derived from the interface (nested types are correctly indented)
| Panel |
Trigger |
Command |
| Service Caller |
▶ on a service |
ros2 service call |
| Topic Publisher |
send icon on a topic |
ros2 topic pub with full QoS controls (reliability, durability, depth, rate, message count) |
| Action Goal Sender |
rocket icon on an action |
ros2 action send_goal with real-time feedback |
4. Parameter Tuner
Real-time parameter editing with two entry points:
Node-first — click ✏️ on a node in the explorer: parameters are fetched via ros2 param dump, opened in a YAML editor with live ghost-text decorations (↔ live: X).
File-first — open any YAML file with ros__parameters blocks and use the push commands directly.
my_node:
ros__parameters:
max_speed: 1.5
gains:
p: 0.8
i: 0.01
active: true
/namespace/other_node:
ros__parameters:
output_topic: "/cmd_vel"
Commands (editor toolbar + keyboard shortcuts):
| Shortcut |
Action |
Shift+Enter |
Push all parameters |
Ctrl+Enter / Cmd+Enter |
Push parameter at cursor |
Ctrl+I / Cmd+I |
IntelliSense hover (describe parameter) |
Ctrl+Shift+P / Cmd+Shift+P |
Inject missing parameters from live node |
Ctrl+Shift+S / Cmd+Shift+S |
Refresh live value decorations |
Status bar indicators: ◉ ROS 2 → ✏ Editing… (orange) → ⟳ Sending… → ✓ Synchronized (green) / ✗ Failed (red)
5. Interface Syntax Highlighting
Native support for .msg, .srv, and .action files:
- Primitive types, bounded strings, package types, arrays, constants, default values, comments,
--- separators
6. Interface Browser
Ctrl+Shift+I / Cmd+Shift+I (or the button in the panel title bar): QuickPick listing all ROS 2 interfaces; selecting one displays its definition via ros2 interface show.
Configuration
| Setting |
Default |
Description |
ros2.topicEchoCount |
10 |
Messages captured per echo (0 = continuous) |
ros2.refreshInterval |
0 |
Auto-refresh interval in seconds (0 = disabled) |
ros2.workspaceRoot |
"" |
Workspace root (auto-detected from VS Code workspace if empty) |
ros2.tunerPullMissing |
false |
Inject missing parameters automatically when attaching the tuner |
ros2.setupScript |
"" |
Path to setup.bash (auto-detected in /opt/ros/* if empty) |
Requirements
- ROS 2 (Humble, Iron, Jazzy or later)
- Python 3 — no
rclpy dependency required
- The
ros2 CLI must be reachable from the shell
Auto-detection: the extension sources /opt/ros/<distro>/setup.bash automatically. VS Code does not need to be launched from a sourced terminal. Override with ros2.setupScript if needed.
Architecture
ros2-dev-suite/
├── src/
│ ├── extension.ts # Entry point, command registration
│ ├── ros2/
│ │ ├── api.ts # Async wrappers for the ros2 CLI
│ │ ├── explorerProvider.ts # Unified TreeView: nodes, topics, services, actions, packages
│ │ └── logViewer.ts # /rosout stream, node-filter, death detection
│ ├── param/
│ │ ├── paramEditor.ts # YAML push, history, diff, hover IntelliSense
│ │ └── tuner.ts # Node attachment, param pull, live decorations
│ └── caller/
│ └── callerPanel.ts # WebView caller: service call, topic pub, action send_goal
├── scripts/
│ └── live_param_editor.py # Python backend for ros2 param set (no rclpy)
├── syntaxes/
│ └── ros2-interface.tmLanguage.json
├── resources/
│ └── ros2.svg # Activity bar icon
└── language-configuration.json
Developer Guide
Prerequisites
| Tool |
Version |
| Node.js |
≥ 18 |
| npm |
≥ 9 |
@vscode/vsce |
bundled as dev dependency |
Setup
cd ros2-dev-suite
npm install
Compile
npm run compile # one-shot build → out/
npm run watch # incremental watch mode
Package (VSIX)
npm run package:vsix
The VSIX is written to dist/ros2-dev-suite-<version>.vsix.
Note: always use npm run rather than calling vsce directly. The project pins @vscode/vsce@2.22.0 locally to stay compatible with Node 18. The globally installed vsce bundles a newer undici that requires Node ≥ 20 and will crash with ReferenceError: File is not defined.
Publish
# VS Code Marketplace
npm run publish:vsce
# Open VSX (VSCodium)
OVSX_PAT=<token> npm run publish:ovsx
Run in VS Code (debug)
Open the ros2-dev-suite/ folder in VS Code and press F5 — this launches an Extension Development Host with the extension loaded.
License
MIT — tanneguydv