ROS2 launch: required nodes

Kyle Fazzari

Kyle Fazzari

on 11 March 2019

When using the Robot Operating System (ROS), it’s fairly common to want to shut down a launched system if a specific node (or set of nodes) exits. This is pretty easy in ROS1, because launch files support the required attribute on each node. As a result, crafting a two-node system where one of the nodes is required is straightforward:

<launch>
<node name = "talker" pkg = "talker" type = "talker_node" />
<node name = "listener" pkg = "listener" type = "talker_node" required = "true" />
</launch>

This launch file creates a talker/listener system where, if the talker exits the system continues trucking along, but if the listener exits the entire launched system is shut down.

In ROS2 Crystal’s launch system, getting similar functionality involves a lot more boilerplate:

import launch
import launch_ros.actions

def generate_launch_description():
talker = launch_ros.actions.Node(
package="demo_nodes_py",
node_executable="talker",
node_name="talker",
output="screen")

listener = launch_ros.actions.Node(
package="demo_nodes_py",
node_executable="listener_qos",
node_name="listener",
output="screen",
arguments=["--number_of_cycles", "1"])

return launch.LaunchDescription([
talker,
listener,
launch.actions.RegisterEventHandler(
event_handler=launch.event_handlers.OnProcessExit(
target_action=listener,
on_exit=[
launch.actions.LogInfo(
msg="Listener exited; tearing down entire system."),
launch.actions.EmitEvent(
event=launch.events.Shutdown())]))
])
t

This also creates a talker/listener system where, if the talker exits the system continues, but if the listener exits the launched system is shut down. However, you can see that, unlike the ROS1 example, there are a few steps required to get there. Specifically, it requires the LaunchDescription to include an event handler to listen for an exit event for every required node which then emits a Shutdown event, which then FINALLY causes the launched system to shut down. That doesn’t scale particularly well to a real system where a large number of nodes may be required to run successfully.

We went through a few design iterations for how to best solve this, and decided that both the scaling and the boilerplate issues could be solved if the Node definitions could specify somehow that they were required. Rather than carry over that language from ROS1, though, we decided to keep some commonality with OnProcessExit and simply add an on_exit action list directly to the Node definition. We also added a new action called Shutdown. Using these two new features together allows one to very simply specify that, if a given node exits, it should shut the entire launched system down. This greatly reduces boilerplate and scales far better than adding an event handler for each node. Take a look:

import launch
import launch_ros.actions

def generate_launch_description():
return launch.LaunchDescription([
launch_ros.actions.Node(
package="demo_nodes_py",
node_executable="talker",
node_name="talker",
output="screen"),

launch_ros.actions.Node(
package="demo_nodes_py",
node_executable="listener_qos",
node_name="listener",
output="screen",
arguments=["--number_of_cycles", "1"],
on_exit=launch.actions.Shutdown())
])

This functionality is already available in master, and will of course be included in Dashing (scheduled for June).

This article originally appeared on Kyle Fazzari’s blog.

Ubuntu desktop

Learn how the Ubuntu desktop operating system powers millions of PCs and laptops around the world.

Newsletter signup

Select topics you’re interested in

In submitting this form, I confirm that I have read and agree to Canonical’s Privacy Notice and Privacy Policy.

Related posts

Building ROS2 snaps with Colcon

The snapcraft CLI has supported building ROS1 snaps for a while via the catkin plugin. We supported the ROS2 betas via the ament plugin, but that was before Open Robotics had a ROS2 package repository setup, which meant that the ament…

The forecast is robots

Robots are an increasingly important part of our lives, in more ways than we realise. I’m not talking just about Roombas, or the toy robots that inhabit the wish lists of the world’s children (and the young at heart). Robots are…

Apellix engineers safer work environments with Ubuntu powered aerial robotics

In 2016, 16% of all workplace deaths in the US were attributed to falls. Apellix, a Florida-based start up, who specialise in aerial robotics aims to reduce this number by using their drones in place of workers to complete tasks in…