TLDR: come work on NoDL in the rosgraph-wg. Join the mailing list for automatic calendar invites to meetings: https://groups.google.com/u/1/g/rosgraph-wg
Hi everyone!
@emersonknapp and I presented “The Legible Node” at ROSCon last week. We talked about two things:
- Thin nodes - your node is an interface adapter, it should not contain robot logic
- NoDL - the node definition language that allows you to statically declare your node interfaces
If you didnt catch it, here are the slides (the_legible_node_slides.pdf) (5.4 MB) - go check out the recording once its up. Working example code here too.
We had a great response from everyone at the conference, and we’re really excited to keep building NoDL with the community.
NoDL Recap
A NoDL document looks like this:
nodl_version: 2
description: Drives a differential-base robot along a sequence of waypoints.
include:
- ref: nodl://rclcpp/node
parameters:
max_linear_speed:
type: double
default_value: 0.8
description: Upper bound on commanded forward speed, in m/s.
publishers:
- name: ~/status
type: std_msgs/msg/String
qos: {history: KEEP_LAST, depth: 1, reliability: RELIABLE}
description: Human-readable status of the waypoint follower.
subscriptions:
- name: odom
type: nav_msgs/msg/Odometry
qos: {history: KEEP_LAST, depth: 10, reliability: BEST_EFFORT}
description: Wheel/inertial odometry used to track pose.
service_servers:
- name: ~/cancel
type: std_srvs/srv/Trigger
description: Drops any queued waypoints and stops the robot.
service_clients:
- name: /global_costmap/clear_entirely
type: std_srvs/srv/Trigger
description: Asks the costmap server to clear itself before a retry.
action_servers:
- name: ~/follow_waypoints
type: nav2_msgs/action/FollowWaypoints
description: Follows an ordered list of waypoints to completion.
action_clients:
- name: /navigate_to_pose
type: nav2_msgs/action/NavigateToPose
description: Delegates single-goal navigation to the planner stack.
You write this as part of your source code to declare the interface of your node (pub, sub, service, action, clients, params).
You can manually write a nodl document, or you can scrape an existing interface from a running node, using ros2 nodl describe <node_name>.
Once you have a nodl document you can:
- assert that a running node conforms to the spec
- generate node documentation
- generate node boilerplate
- (currently working on it) map out your application rosgraph statically
All of these concepts are covered in our documentation here: https://nodl.readthedocs.io - go read it
Come work with us
We are building NoDL in the ROSGraph Working Group (link). Currently, its @emersonknapp, Luke Sy and myself - we would love more friends!
You can check out what we’re working on in our current milestone. Exciting ones:
- Pluggable code generator system, and more code generation features
- Library-based node extension/mixin features
- Graph analysis through launchfiles
We meet fornightly, next meeting is 2026-10-13T20:00:00Z→2026-10-13T21:00:00Z The meeting link is open to anyone: Google Meet meeting
How to get involved
- Join the mailing list and you’ll automatically get a meeting calendar invite: https://groups.google.com/u/1/g/rosgraph-wg
- say hi in Zulip - Public view of Open Source Robotics Foundation | Zulip team chat
- read the docs: https://nodl.readthedocs.io
- check out the repo: GitHub - ros-tooling/nodl: ROS 2 Node Definition Lanaguage (NoDL) · GitHub
- have a look at our milestones and project board
LINKS
- ROSCon Presentation materials (slides and working examples)
- NoDL
- ROSGraph-wg
-
Info page: ROSGraph Working Group - Google Docs
-
Meeting link: Google Meet meeting
-
Mailing list: https://groups.google.com/u/1/g/rosgraph-wg
-
Zulip channel: Public view of Open Source Robotics Foundation | Zulip team chat
-
Project board: ROSGraph WG · GitHub
-
Current milestone: GitHub · Where software is built
-