Skip to main content

ros2-launch

Write and debug ROS 2 Python launch files — substitutions, OpaqueFunction, composable containers, lifecycle events, namespaces. Use when editing launch.py, IncludeLaunchDescription, LaunchConfiguration, or bringup.

Source facts

Repository
guilyx/dotfiles
Last source activity
August 12, 2026 at 19:39
Detected SKILL.md language
English
Stars
0
Forks
0

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
ros2-launch
description
Write and debug ROS 2 Python launch files — substitutions, OpaqueFunction, composable containers, lifecycle events, namespaces. Use when editing launch.py, IncludeLaunchDescription, LaunchConfiguration, or bringup.
# ROS 2 Python Launch ## Substitutions vs Python values `LaunchConfiguration('foo')` is **not** a `str` at declaration time. You cannot `if LaunchConfiguration('sim') == 'true'` in plain Python. Use: - `IfCondition` / `UnlessCondition` / `PythonExpression` - `OpaqueFunction` when you need real Python after substitutions resolve ```python def launch_setup(context, *args, **kwargs): sim = LaunchConfiguration('sim').perform(context) == 'true' # now branch, load YAML, compute remaps return [nodes...] # in generate_launch_description: OpaqueFunction(function=launch_setup) ``` ## Composition vs processes | Action | Process | |--------|---------| | `Node(...)` | New process | | `ComposableNode` in `ComposableNodeContainer` | Same process (intra-process possible) | | `LoadComposableNode` | Load into an existing container | Do not wrap a composable plugin with `Node(executable=...)` unless there is a standalone main. ## Namespaces and remaps - `PushRosNamespace` / `GroupAction` for multi-robot (`/uav1/imu`). - Remaps are **unresolved names** relative to the node's namespace unless absolute (`/tf`). - `/tf` and `/tf_static` are usually **global** — remap carefully or you split the tree. ## Timing anti-patterns - `TimerAction(period=3.0)` to wait for a driver is a race. Prefer lifecycle events or a lifecycle manager. - `RegisterEventHandler(OnProcessExit(...))` for shutdown chains; `OnStateTransition` for managed nodes (`ros2-lifecycle`). ## Parameters in launch ```python parameters=[config.yaml, {'use_sim_time': sim, 'foo': 1}] ``` Later dicts override earlier YAML keys for that node. Wildcard YAML (`/**:`) is easy to apply to the wrong node — see `ros2-parameters`. ## Debug ```bash ros2 launch pkg file.launch.py --show-args ros2 launch pkg file.launch.py --debug ``` Print the resolved `Node` kwargs from `OpaqueFunction` when remaps look wrong.
View on GitHub