Parameters
Creating ROS nodes is nice but sometimes we want to have configurable settings for our nodes.
This is where Parameters come in.
For example, say we have a camera on our robot and we want to set how zoomed in it is. We would create a ROS node and ideally, we could have that node take a parameter that asks for how zoomed in the camera should be.
Later when we go run the node we can just input it into the command line saving us from manually changing it in the code.
Let’s create a simple ROS node that takes in a string as its input:
import the ROS libraries and create a class called MinimalParam
import rclpy
from rclpy.node import Node
class MinimalParam(Node):
In the constructor, we call the parent classes constructor and create a timer object.
Then to declare a parameter we run self.declare_parameter()
which takes in the parameter name and a default argument
def __init__(self):
super().__init__("minimal_param_node")
self.declare_parameter("my_parameter", "world")
self.timer = self.create_timer(1, self.timer_callback)
def timer_callback(self):
my_param = self.get_parameter("my_parameter").get_parameter_value().string_value
self.get_logger().info("Hello " + my_param)
my_new_param = rclpy.parameter.Parameter("my_parameter", rclpy.Parameter.Type.STRING, "world")
all_new_parameters = [my_new_param]
self.set_parameters(all_new_parameters)
rclpy.init()
node = MinimalParam()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
Solution
import rclpy
from rclpy.node import Node
class MinimalParam(Node):
def __init__(self):
super().__init__("minimal_param_node")
self.declare_parameter("my_parameter", "world")
self.timer = self.create_timer(1, self.timer_callback)
def timer_callback(self):
my_param = self.get_parameter("my_parameter").get_parameter_value().string_value
self.get_logger().info("Hello " + my_param)
my_new_param = rclpy.parameter.Parameter("my_parameter", rclpy.Parameter.Type.STRING, "world")
all_new_parameters = [my_new_param]
self.set_parameters(all_new_parameters)
rclpy.init()
node = MinimalParam()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
To run:
ros2 param set <node_name> <parameter_name> <value>