|
better_launch package from better_launch repobetter_launch |
ROS Distro
|
Package Summary
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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
| Version | 1.0.2 |
| 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 | 2026-02-01 |
| Dev Status | DEVELOPED |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Nikolas Dahn
Authors
- Nikolas Dahn

[!TIP] Just looking for the documentation? We also have various 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.
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.
Instead of dozens of imports and class instances for even the most basic tasks, your launchfiles could look as simple and beautiful as this:
from better_launch import BetterLaunch, launch_this
@launch_this
def my_main(enable_x: bool = True):
"""This is how nice your launchfiles could be!
"""
bl = BetterLaunch()
if enable_x:
bl.node(
"examples_rclpy_minimal_publisher",
"publisher_local_function",
"example_publisher",
)
# Include other launchfiles, even regular ROS2 launchfiles!
bl.include("better_launch", "ros2_turtlesim.launch.py")
# You can use `ros2 launch`, too, but `bl` is better :)
$> bl my_package my_launch_file.py --enable_x True
Do I have your attention? Read on to learn more!
🧞♀️ Everything you need to know
⛲ Highlights
📟 The TUI
[!NOTE] Using the TUI
better_launch comes with an optional, unobstrusive TUI (terminal user interface) based on prompt_toolkit, which will hover below the log output.

See the single line of shortcuts at the bottom? That’s the TUI, and it will never take up more than 3 lines! Despite its simplicity, the TUI allows you a comfortable degree of control over all nodes managed by the better_launch process it is running in:
- listing a node’s services and topics
- starting and stopping nodes
- triggering lifecycle transitions
- changing the log level
- etc.
# Run this line to see it in action!
bl better_launch 02_ui.launch.py
⛱️ TOML launchfiles
[!NOTE] Specification
For those with aversions against using a turing-complete programming language to specify system startup - fear not! better_launch introduces a new launchfile format based on TOML.
enable = true
[a_simple_cube]
if = "${enable}"
func = "find"
package = "better_launch"
filename = "cube.sdf"
[print_me_baby]
func = "log"
severity = "info"
message = "Found cube at ${a_simple_cube}"
Under the hood, TOML launchfiles result in calls to the BetterLaunch singleton, but offer a more focused and constrained feature set. If you are still missing ROS1 XML launchfiles (and substitutions like ${arg my_arg}!), these are for you!
🌱 Contributions
File truncated at 100 lines see the full file
Changelog for package better_launch
Forthcoming
- Fixed nodes not capturing all process output
- Fixed rare race condition in ros2_launch_wrapper
1.0 (2025-07-29)
- All examples are working, performance is good, documentation is complete, cats are happy
- Author: Nikolas Dahn
- Original contributors: 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 |