The ROS Parameter Server serves as a shared data repository for nodes in a ROS system, enabling data exchange between different components. It stores configuraton parameters and global settings that multiple nodes can access and modify.
Parameter Server Communication Model
The parameter server follows a simple client-server model with three roles:
- Master: Maintains the parameter database
- Clients: Nodes that either set or get parameters
Communication occurs through RPC calls:
-
Setting Parameters:
- Client sends parameter name/value pairs to the Master via RPC
- Master stores the parameters in its database
-
Getting Parameters:
- Client requests a parameter by name via RPC
- Master responds with the parameter value if it exists
The server supports various data types including integers, booleans, strings, doubles, lists, and binary data.
Parameter Operations in C++
ROS provides two approaches for parameter operations in C++:
1. Using NodeHandle
ros::NodeHandle nh;
// Setting parameters
nh.setParam("robot_name", "explorer");
nh.setParam("max_speed", 2.5);
// Getting parameters
std::string name;
double speed;
nh.getParam("robot_name", name);
nh.getParam("max_speed", speed);
2. Using ros::param Namespace
// Setting parameters
ros::param::set("robot_name", "explorer");
ros::param::set("max_speed", 2.5);
// Getting parameters
std::string name = ros::param::param<std::string>("robot_name", "default");
double speed = ros::param::param<double>("max_speed", 1.0);
Parameter Operations in Python
Python provides a unified API for parameter operations:
import rospy
# Setting parameters
rospy.set_param('robot_name', 'explorer')
rospy.set_param('max_speed', 2.5)
# Getting parameters
name = rospy.get_param('robot_name', 'default')
speed = rospy.get_param('max_speed', 1.0)
Additional Parameter Operations
- Checking Parameter Existence:
if (nh.hasParam("robot_name")) {
// Parameter exists
}
- Deleting Parameters:
rospy.delete_param('max_speed')
- Listing All Parameters:
std::vector<std::string> param_names;
nh.getParamNames(param_names);