ROS2中的参数

ROS2 中没有一个像ROS 1 那样的集中式参数服务器。==ROS 2 的参数是与每个节点绑定的,每个节点都有自己的参数管理系统==。也就是说 节点私有: 参数与节点相关联,而不是全局共享。节点可以声明、获取和更新自己的参数,也可以通过客户端库(SyncParametersClientAsyncParametersClient)访问和修改其他节点的参数,从而实现参数共享。参数可以在节点运行时动态地获取和更新,方便配置和调试.

ROS 2 提供了参数接口,可以用于在节点之间共享参数,实现参数的动态更新和访问。

  • ros2 param list
  • ros2 param describe
1
2
3
4
5
6
7
8
ros2 param describe /turtlesim background_r
Parameter name: background_r
Type: integer
Description: Red channel of the background color
Constraints:
Min value: 0
Max value: 255
Step: 1
  • ros2 param get node_name parameter_name
1
2
ros2 param get /turtlesim background_r
Integer value is: 69
  • ros2 param set (省略)

  • ros2 run + param

  • ros2 run —ros-args —params-file


  • 设置参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
node->declare_parameter("my_string_param", "default_value");

// nav2_util里实现了先判断参数是否存在,再设置
template<typename NodeT>
void declare_parameter_if_not_declared(
NodeT node,
const std::string & parameter_name,
const rclcpp::ParameterValue & default_value,
const ParameterDescriptor & parameter_descriptor = ParameterDescriptor())
{
if (!node->has_parameter(parameter_name)) {
node->declare_parameter(parameter_name, default_value, parameter_descriptor);
}
}
  • 获得参数
1
2
3
4
5
6
// Retrieve the parameter
rclcpp::Parameter param_obj = this->get_parameter("my_string_param");
printf("type name: %s\n", param_obj.get_type_name().c_str() );
// Extract the value
std::string param_value = param_obj.as_string();
std::vector<std::string> param_value = param_obj.as_string_array();

但是有时候参数类型不一定就是string,可能是string的vector,可以用get_type_name查看类型。

如果是vector<std::string>,其size仅为1,实际不如就让类型为string,这应当是ROS2的一个缺陷。

1
2
3
4
template<typename ParameterT >
bool rclcpp::Node::get_parameter_or(const std::string& name,
ParameterT& value, const ParameterT& alternative_value
) const

获取参数值,如果未设置,则获取alternative_value,并将其赋给value

  • 删除参数
1
this->remove_parameter("example_param");