![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |
System Dependencies
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged better_launch at Robotics Stack Exchange
![]() |
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
Tags | No category tags. |
Version | 1.0.1 |
License | MIT |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/dfki-ric/better_launch.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-08-01 |
Dev Status | DEVELOPED |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn
About | Why? | Features | Usage | TUI | Differences | Performance | Installation | ROS2 | Contributors |
[!TIP] Just looking for the documentation? We also have multiple examples!
🧠About
Let’s face it: ROS2 has been a severe downgrade in terms of usability compared to ROS1. While there are many considerable improvements, the current launch system is borderline unusable. I’ve listed my personal gripes below, but if you’re here you likely feel the same. This is why I wrote better_launch.
Instead of dozens of imports and class instances for even the most basic tasks, your launch files could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this(ui=True)
def my_main(enable_x: bool = True):
"""
This is how nice your launch files could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launch files, even regular ROS2 launch files!
bl.include("better_launch", "ros2_turtlesim.launch.py")
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🤔 Why not improve the existing ROS2 launch?
Because I think it is beyond redemption and no amount of refactoring and REPs (ROS enhancement proposals) will turn the sails. Tools like the highly rated simple_launch or launch-generator exist, but still use ROS2 launch under the hood and so inherit much of its clunkiness. Rather than fixing an inherently broken solution, I decided to make a RAP - a ROS abandonment proposal :)
Essentially, better_launch is what I wish ROS2 launch would be: intuitive to use, simple to understand, easy to remember. This is why better_launch is not yet another abstraction layer over ROS2 launch; it is a full replacement with no required dependencies on the existing launch system.
🧩 Okay, what can I do with it?
Everything you would expect and a little more! The BetterLaunch
instance allows you to
- create subscribers, publishers, services, service clients, action servers and action clients on the fly
- start and stop nodes
- start and stop lifecycle nodes and manage their lifecycle stage
- start and stop composers and load components into them
- organize your nodes in groups
- define hasslefree topic remaps for nodes and groups
- pass any arguments from the command line without having to declare them
- easily load parameters from yaml files
- locate files based on filenames and package names
- use string substitutions to resolve e.g. paths
- include other better_launch launch files
- include other ROS2 launch files
- let regular ROS2 launch files include your better_launch launch files
- configure logging just as you would in ROS2, yet have much more readable output
- manage your node using a nice terminal UI reminiscent of rosmon
For a quick comparison, bravely unfold the sections below:
ROS2
```python # Taken from https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Launch/Using-Substitutions.html from launch_ros.actions import Node from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration, PythonExpression def generate_launch_description(): turtlesim_ns = LaunchConfiguration('turtlesim_ns') use_provided_red = LaunchConfiguration('use_provided_red') new_background_r = LaunchConfiguration('new_background_r') turtlesim_ns_launch_arg = DeclareLaunchArgument( 'turtlesim_ns', default_value='turtlesim1' ) use_provided_red_launch_arg = DeclareLaunchArgument( 'use_provided_red', default_value='False' ) new_background_r_launch_arg = DeclareLaunchArgument( 'new_background_r', default_value='200' ) File truncated at 100 lines [see the full file](https://github.com/dfki-ric/better_launch/tree/main/./README.md)Changelog for package better_launch
1.0.1 (2025-07-31)
- Minor changes and adjustments for the first official release
- All examples are working, performance is good, documentation is complete, cats are happy
- Contributors: Nikolas Dahn, Prithvi Sanghamreddy, Sebastian Kasperski, Tom Creutz
Package Dependencies
Deps | Name |
---|---|
ament_cmake_python | |
ament_cmake_pytest | |
ament_index_python | |
rcl_interfaces | |
lifecycle_msgs | |
composition_interfaces | |
rclpy |