Skip to main content
⚙️ Parameters GuideUpdated June 2026

ROS 2 Parameters Guide 2026declare · YAML · Callbacks · CLI

Complete 2026 guide to ROS 2 parameters. Covers declaring parameters with defaults and descriptors, getting and setting values at runtime, parameter change callbacks with validation, YAML config files with the ros__parameters namespace, loading YAML in Python launch files, and all CLI tools (ros2 param list/get/set/dump/load).

declare_parameterYAML configparameter callbacksros2 paramParameterDescriptor

Parameter Types Reference

TypePython valueYAML valueCommon use
boolTrue / Falsetrue / falseuse_sim_time, enabled
int4242queue_size, num_particles
double0.50.5speed, kp, update_frequency
string"base_link""base_link"frame_id, robot_name
bool[][True, False][true, false]channel_mask
int[][1, 2, 3][1, 2, 3]port_list, ids
double[][0.1, 0.2][0.1, 0.2]pid_gains
string[]["a", "b"]["a", "b"]sensor_list, topics

Declare & Get Parameters

Declare and Get Parameters

All parameters must be declared before use. Undeclared parameter access raises ParameterNotDeclaredException.

python
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from rcl_interfaces.msg import ParameterDescriptor, ParameterType


class MyNode(Node):
    def __init__(self):
        super().__init__("my_node")

        # Declare with default value (type inferred from default)
        self.declare_parameter("speed", 0.5)
        self.declare_parameter("frame_id", "base_link")
        self.declare_parameter("use_sim_time", False)
        self.declare_parameter("sensor_list", ["lidar", "camera"])

        # Declare with descriptor (adds type enforcement + description)
        self.declare_parameter(
            "max_linear_vel",
            0.8,
            ParameterDescriptor(
                type=ParameterType.PARAMETER_DOUBLE,
                description="Maximum forward velocity in m/s",
                read_only=False,
            ),
        )

        # Declare read-only (cannot be changed at runtime)
        self.declare_parameter(
            "robot_name",
            "my_robot",
            ParameterDescriptor(read_only=True),
        )

        # Get parameter values
        speed = self.get_parameter("speed").value
        frame_id = self.get_parameter("frame_id").value
        sensor_list = self.get_parameter("sensor_list").value

        self.get_logger().info(f"speed={speed}, frame={frame_id}")
        self.get_logger().info(f"sensors={sensor_list}")

        # Get multiple parameters at once
        params = self.get_parameters(["speed", "frame_id", "use_sim_time"])
        for p in params:
            self.get_logger().info(f"  {p.name} = {p.value}")


def main():
    rclpy.init()
    node = MyNode()
    rclpy.spin(node)
    rclpy.shutdown()


if __name__ == "__main__":
    main()

💡 Parameter types: BOOL, INTEGER, DOUBLE, STRING, BYTE_ARRAY, BOOL_ARRAY, INTEGER_ARRAY, DOUBLE_ARRAY, STRING_ARRAY.

Parameter Change Callback

Register a callback to be notified when a parameter is changed at runtime. Validate and apply the new value.

python
from rclpy.node import Node
from rcl_interfaces.msg import SetParametersResult


class MyNode(Node):
    def __init__(self):
        super().__init__("my_node")
        self.declare_parameter("speed", 0.5)
        self.declare_parameter("enabled", True)

        # Register callback — fires on every parameter change
        self.add_on_set_parameters_callback(self._parameter_callback)

    def _parameter_callback(self, params):
        """Validate new parameter values before they take effect."""
        for param in params:
            if param.name == "speed":
                if param.value < 0.0 or param.value > 2.0:
                    return SetParametersResult(
                        successful=False,
                        reason=f"speed must be in [0.0, 2.0], got {param.value}"
                    )
                self.get_logger().info(f"Speed updated to {param.value}")

            if param.name == "enabled":
                self.get_logger().info(
                    f"Node {'enabled' if param.value else 'disabled'}"
                )

        return SetParametersResult(successful=True)

💡 Return SetParametersResult(successful=False) to REJECT the change. Return successful=True to ACCEPT it.

YAML Parameter Files

YAML Parameter File

Store parameters in a YAML file. Structure: node_name → ros__parameters → key: value.

yaml
# config/my_robot_params.yaml
my_node:
  ros__parameters:
    speed: 0.5
    frame_id: "base_link"
    use_sim_time: false
    max_linear_vel: 0.8
    sensor_list:
      - "lidar"
      - "camera"
      - "imu"

    # Nested parameters (use dot notation at runtime)
    controller:
      kp: 1.0
      ki: 0.1
      kd: 0.05

nav2_controller:
  ros__parameters:
    controller_frequency: 20.0
    min_x_velocity_threshold: 0.001

# Wildcard — applies to ALL nodes in this YAML
/**:
  ros__parameters:
    use_sim_time: false

The node name in the YAML must match the node's name exactly, including namespace (e.g. /my_namespace/my_node).

Load YAML in a Launch File

Pass the YAML file path to a Node as the parameters argument in a Python launch file.

python
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare


def generate_launch_description():
    params_file = PathJoinSubstitution([
        FindPackageShare("my_robot_bringup"),
        "config",
        "my_robot_params.yaml",
    ])

    return LaunchDescription([
        # Allow overriding config at launch time
        DeclareLaunchArgument(
            "params_file",
            default_value=params_file,
            description="Path to parameter YAML file",
        ),

        Node(
            package="my_robot",
            executable="my_node",
            name="my_node",
            output="screen",
            parameters=[
                LaunchConfiguration("params_file"),
                # Inline overrides (applied after YAML)
                {"use_sim_time": False},
            ],
        ),
    ])

CLI Tools

Parameter CLI Tools

List, get, set, dump, and load parameters from the terminal.

bash
# List all parameters of a node
ros2 param list /my_node

# Get a specific parameter value
ros2 param get /my_node speed

# Set a parameter at runtime
ros2 param set /my_node speed 1.2

# Set multiple parameters
ros2 param set /my_node speed 1.2 frame_id base_footprint

# Dump all parameters to YAML
ros2 param dump /my_node

# Dump to a file
ros2 param dump /my_node --output-dir /tmp/

# Load parameters from a YAML file at runtime
ros2 param load /my_node /path/to/params.yaml

# Delete a parameter (if deletable)
ros2 param delete /my_node speed

Override from CLI / Launch

Override Parameters from CLI

Pass --ros-args -p to override any parameter when launching a node.

bash
# Override parameters at node launch
ros2 run my_robot my_node \
  --ros-args \
  -p speed:=1.5 \
  -p frame_id:=odom \
  -p use_sim_time:=true \
  -p sensor_list:="['lidar', 'imu']"

# Load YAML file and then override one value
ros2 run my_robot my_node \
  --ros-args \
  --params-file /path/to/params.yaml \
  -p speed:=0.2

# In a launch file, override with args
ros2 launch my_robot_bringup bringup.launch.py \
  params_file:=/custom/params.yaml \
  use_sim_time:=true

Related Guides