parameters.svg

Steps to Add a Parameter

  1. Declare the parameter in the constructor.
  2. Retrieve the parameter value using get_parameter().
  3. Modify send_request() to use the parameter value.
  4. Allow overriding the parameter at runtime using the ros2 run command.

using CLI

Modify the node

def __init__(self):
    super().__init__("fibonacci_client_with_param")  # Change node name
    self.declare_parameter("number", 10)  # Declare parameter with default value 10
    self.number = self.get_parameter("number").value  # Get parameter value
    self.get_logger().info(f"Using Fibonacci number: {self.number}")

Use Parameter Instead of Hardcoded Value):

def send_request(self):
    req = Fibonacci.Request()
    req.number = self.number  # Use parameter value instead of argument

No Hardcoded Value, Uses Parameter Instead):

def main(args=None):
    rclpy.init(args=args)
    node = FibonacciClient()
    node.send_request()  # No hardcoded value
    rclpy.spin(node)
    rclpy.shutdown()

complete code

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from my_robot_interfaces.srv import Fibonacci  # Import your custom service interface

class FibonacciClient(Node):
    def __init__(self):
        super().__init__("fibonacci_client_with_param")          #change name **important**
        # 1. Declare a parameter named "number" with a default value of 10.
        self.declare_parameter("number", 10)

        # 2. Retrieve the parameter value.
        self.number = self.get_parameter("number").value
        self.get_logger().info(f"Using Fibonacci number: {self.number}")

        # 3. Create the service client.
        self.client = self.create_client(Fibonacci, "fibonacci")
        while not self.client.wait_for_service(timeout_sec=1.0):
            self.get_logger().info("Fibonacci Service not available, waiting...")
        self.get_logger().info("Fibonacci Service available")

    def send_request(self):
        req = Fibonacci.Request()
        # 4. Use the parameter value in the request.
        req.number = self.number
        future = self.client.call_async(req)
        while rclpy.ok():
            rclpy.spin_once(self)
            if future.done():
                try:
                    response = future.result()
                except Exception as e:
                    self.get_logger().error(f"Service call failed: {e}")
                else:
                    self.get_logger().info(f"Fibonacci of {self.number} is {response.fibonacci_number}")
                break

def main(args=None):
    rclpy.init(args=args)
    node = FibonacciClient()
    node.send_request()
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == "__main__":
    main()