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
1. ROS 2 Explorer (Sidebar)
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.xmlsearch) - Inline action: open folder in VS Code Explorer
- Context menu: open
CMakeLists.txt· openpackage.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 DIEDmarker 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
rclpydependency required - The
ros2CLI must be reachable from the shell
Auto-detection: the extension sources
/opt/ros/<distro>/setup.bashautomatically. VS Code does not need to be launched from a sourced terminal. Override withros2.setupScriptif 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 runrather than callingvscedirectly. The project pins@vscode/[email protected]locally to stay compatible with Node 18. The globally installedvscebundles a newerundicithat requires Node ≥ 20 and will crash withReferenceError: 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