Note: This tutorial assumes that you have completed the previous tutorials: Understanding Topics, Understanding ServicesParams.

Using Parameters in roscpp

Description: This tutorial will show you the NodeHandle parameter API, allowing you to manipulate parameters from the Parameter Server.

Tutorial Level: BEGINNER

Next Tutorial: Accessing Private Names with NodeHandle

Retrieving Parameters

There are two methods to retrieve parameters with NodeHandle. In the following example code, n is an instance of NodeHandle.

getParam()

getParam() has a number of overloads which all follow the same basic form:

   1 bool getParam (const std::string& key, parameter_type& output_value) const 
  • key is a Graph Resource Name

  • output_value is the place to put the retrieved data, where parameter_type is one of bool, int, double, string, or a special XmlRpcValue type which can represent any type and also lists/maps.

Use of getParam() is fairly simple:

   1     std::string s;
   2     n.getParam("my_param", s);

Note that getParam() returns a bool, which provides the ability to check if retrieving the parameter succeeded or not:

   1     std::string s;
   2     if (n.getParam("my_param", s))
   3     {
   4       ROS_INFO("Got param: %s", s.c_str());
   5     }
   6     else
   7     {
   8       ROS_ERROR("Failed to get param 'my_param'");
   9     }

param()

param() is similar to getParam(), but allows you to specify a default value in the case that the parameter could not be retrieved:

   1   int i;
   2   n.param("my_num", i, 42);

Sometimes the compiler requires a hint for the string type.

   1   std::string s;
   2   n.param<std::string>("my_param", s, "default_value");

Setting Parameters

Setting parameters is done through the setParam() methods:

   1   n.setParam("my_param", "hello there");

setParam(), like getParam(), can take bool, int, double, string, and a special XmlRpcValue type

Deleting Parameters

Deleting parameters is done through the deleteParam() method:

   1   n.deleteParam("my_param");

Checking for Existence

This is not usually necessary, but there is a hasParam() method that allows you to check for a parameter's existence:

   1   if (!n.hasParam("my_param"))
   2   {
   3     ROS_INFO("No param named 'my_param'");
   4   }

Searching for Parameters

The Parameter Server allows you to "search" for parameters, starting at your namespace and working through your parent namespaces.

For example, if the parameter /a/b exists in the parameter server, and your NodeHandle is in the /a/c namespace, searchParam() for b will yield /a/b. However, if parameter /a/c/b is added, searchParam() for b will now yield /a/c/b.

   1   std::string param_name;
   2   if (n.searchParam("b", param_name))
   3   {
   4     // Found parameter, can now query it using param_name
   5     int i = 0;
   6     n.getParam(param_name, i);
   7   }
   8   else
   9   {
  10     ROS_INFO("No param 'b' found in an upward search");
  11   }

Next Tutorial: Accessing Private Names with NodeHandle

Wiki: roscpp_tutorials/Tutorials/Parameters (last edited 2010-09-08 21:29:27 by AndrewSomerville)