- 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.
在 GitHub 查看