Introducing NoDL: the Node Definition Language (ROSCon recap)

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:

  1. Thin nodes - your node is an interface adapter, it should not contain robot logic
  2. 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

LINKS

6 Likes

Thanks for the excellent presentation and write-up. I’m very excited about the topics that the working group is thinking about over this next cycle.

As a friendly reminder to all, working groups like these are an excellent venue for exploring new ideas and connecting with the PMC members who are guiding these efforts.