一、ROS2参数基本概念
参数是节点的配置值。您可以将参数视为节点设置。节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。在 ROS 2 中,每个节点都维护自己的参数。有关参数的更多背景信息,请参阅概念文档。
要说ROS2的参数,最好需要对照ROS1的参数管理,比较两者,才能彻底搞清楚各自的参数特点。
二、开启演示方式
启动两个 turtlesim 节点,/turtlesim 和 /teleop_turtle。
打开一个新终端并运行:
ros2 run turtlesim turtlesim_node
打开另一个终端并运行:
ros2 run turtlesim turtle_teleop_key
2.1 指令列出参数
要查看属于您的节点的参数,请打开一个新终端并输入命令:
ros2 param list
您将看到节点命名空间 /teleop_turtle 和 /turtlesim,后面是每个节点的参数:
/teleop_turtle:
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
scale_angular
scale_linear
use_sim_time
/turtlesim:
background_b
background_g
background_r
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
use_sim_time
每个节点都有参数use_sim_time;这不是turtlesim独有的。
根据它们的名称,看起来 /turtlesim 的参数使用 RGB 颜色值确定了 turtlesim 窗口的背景颜色。
要确定参数的类型,可以使用 ros2 param get。
ros2 param get
2.2 参数信息显示语句
显示当前参数的类型和值,用下列语句:
ros2 param get <node_name> <parameter_name>
让我们找出 /turtlesim 的参数 background_g 的当前值:
ros2 param get /turtlesim background_g
返回:
Integer value is: 86
现在您知道 background_g 包含一个整数值。
如果您在 background_r 和 background_b 上运行相同的命令,您将分别获得值 69 和 255。
2.3 设置参数值
本文指出,设定参数有两个方式:
- 用set命令运行中改变
- 在服务调用时传入
在运行中改变参数值,用如下指令:
ros2 param set <node_name> <parameter_name> <value>
比如:这里我们改变 /turtlesim
的背景颜色:
ros2 param set /turtlesim background_r 150
返回执行后结果:
Set parameter successful
目标的背景颜色已经改变如下:
三、 在程序内部定义参数
class TeleopTurtle
{
... ...
rclcpp::Node::SharedPtr nh_; 定义节点指针
double linear_, angular_, l_scale_, a_scale_; 定义本地变量()
TeleopTurtle::TeleopTurtle():
linear_(0), angular_(0), l_scale_(2.0), a_scale_(2.0)
{
nh_ = rclcpp::Node::make_shared("teleop_turtle");
nh_->declare_parameter("scale_angular", rclcpp::ParameterValue(2.0));
nh_->declare_parameter("scale_linear", rclcpp::ParameterValue(2.0));
nh_->get_parameter("scale_angular", a_scale_);
nh_->get_parameter("scale_linear", l_scale_);
}
(一)以上代码的第一层解读,包含以下信息:
1)class TeleopTurtle是一个封装类,是我们与未来的节点交换数据的中心。
2) rclcpp::Node::SharedPtr nh_;在class TeleopTurtle内部,至少有一个Node结构,将来可以与之通话。
3) nh_ = rclcpp::Node::make_shared("teleop_turtle");这句话将节点实例化,注意,千万别把class TeleopTurtle误认为是节点。
(二)以上代码的第二层解读:
1)double linear_, angular_, l_scale_, a_scale_;接口变量,这些变量有两个好处:其一、外界可以改变它们,其二、class TeleopTurtle封装类可以将它们传递到Node节点中。
2)nh_->declare_parameter("scale_angular", rclcpp::ParameterValue(2.0));将接口类内的属性变量,传递到Node节点内部。
(三)以上代码的第三层解读:
1)nh_->set_parameter("scale_angular", a_scale_);通过get_parameter语句,将接口类中的属性变量值,传递给节点Node内的参数变量。
2)nh_->get_parameter("scale_angular", a_scale_)同样的语法,可以获取节点内参数到接口类的对象中。
四、ros2 参数转储
您可以使用以下命令查看节点的所有当前参数值:
ros2 param dump <node_name>
该命令默认打印到标准输出 (stdout),也可以将参数值重定向到文件中以保存。要将您当前的 /turtlesim 参数配置保存到文件 turtlesim.yaml 中,请输入命令:
ros2 param dump /turtlesim > turtlesim.yaml
您将在运行 shell 的工作目录中找到一个新文件。如果打开此文件,您将看到以下内容:
/turtlesim:
ros__parameters:
background_b: 255
background_g: 86
background_r: 150
qos_overrides:
/parameter_events:
publisher:
depth: 1000
durability: volatile
history: keep_last
reliability: reliable
use_sim_time: false
如果您想在将来重新加载具有相同参数的节点,则转储参数会派上用场。
五、ros2 参数加载
您可以使用以下命令将参数从文件加载到当前运行的节点:
ros2 param load <node_name> <parameter_file>
要将使用 ros2 param dump 生成的 turtlesim.yaml 文件加载到 /turtlesim 节点的参数中,请输入命令:
ros2 param load /turtlesim turtlesim.yaml
您的终端将返回消息:
Set parameter background_b successful
Set parameter background_g successful
Set parameter background_r successful
Set parameter qos_overrides./parameter_events.publisher.depth failed: parameter 'qos_overrides./parameter_events.publisher.depth' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.durability failed: parameter 'qos_overrides./parameter_events.publisher.durability' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.history failed: parameter 'qos_overrides./parameter_events.publisher.history' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.reliability failed: parameter 'qos_overrides./parameter_events.publisher.reliability' cannot be set because it is read-only
Set parameter use_sim_time successful
重要提示:只读参数只能在启动时修改,之后不能修改,这就是“qos_overrides”参数出现警告的原因。
六、在节点启动时加载参数文件
要使用您保存的参数值启动同一个节点,请使用:
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
这与你启动turtlesim 时使用的命令相同,添加了标志--ros-args 和--params-file,后跟要加载的文件。
停止正在运行的 turtlesim 节点,以便您可以尝试使用保存的参数重新加载它,使用:
ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml
turtlesim 窗口应该像往常一样出现,但带有您之前设置的紫色背景。
在这种情况下,参数在启动时被修改,因此指定的只读参数也将生效。
七、总结
ROS2的参数机制,与ROS1有重大不同。ROS2的参数不再是【全局变量】、【参数服务】的概念,而是所有参数都归属于具体节点,访问的时候一定是带节点namespace进行访问。