前言
在前期的一些章节里我们体验过设置参数、查看参数、保存参数,我们可能在启动节点时希望能在launch文件中增加设置一些参数,这些就是今天所要学习的。
动动手
创建一个功能包
打开一个终端,先激活下ROS 2的安装环境变量(source /opt/ros/iron/setup.bash)使其能使用ROS 命令,然后进入工作空间的src路径(ros2_ws/src),按下面命令创建一个功能包cpp_parameters:
$ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_parameters --dependencies rclcpp
--dependencies rclcpp代表自动添加rclcpp这个依赖项到package.xml和CMakeLists.txt文件中去。
别忘了更新下package.xml里面的一些信息,如下:
<description>C++ parameter tutorial</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>
编写节点代码
在功能包下的src路径下,创建cpp_parameters_node.cpp(解释见注释):
#include <chrono>
#include <functional>
#include <string>
#include <rclcpp/rclcpp.hpp>
using namespace std::chrono_literals;
class MinimalParam : public rclcpp::Node
{
public:
MinimalParam()
: Node("minimal_param_node")
{
//minimal_param_node节点构造函数内声明一名为my_parameter的参数,初值为“world”
this->declare_parameter("my_parameter", "world");
//创建一个周期为1s的定时器,并绑定回调函数timer_callback,到达时间即执行该回调函数
timer_ = this->create_wall_timer(
1000ms, std::bind(&MinimalParam::timer_callback, this));
}
//回调函数的定义
void timer_callback()
{
//获取参数my_parameter的值(string类型)赋给变量my_param
std::string my_param = this->get_parameter("my_parameter").as_string();
//打印变量my_param
RCLCPP_INFO(this->get_logger(), "Hello %s!", my_param.c_str());
//创建了一个名为all_new_parameters的std::vector模板类,其中包含一个rclcpp::Parameter对象,该对象的名称为"my_parameter",值为"world"
std::vector<rclcpp::Parameter> all_new_parameters{rclcpp::Parameter("my_parameter", "world")};
//将向量all_new_parameters作为参数传给set_parameters函数
this->set_parameters(all_new_parameters);
}
private:
rclcpp::TimerBase::SharedPtr timer_;
};
int main(int argc, char ** argv)
{
//初始化ROS 2
rclcpp::init(argc, argv);
//开始实例化MinimalParam并开始循环处理逻辑
rclcpp::spin(std::make_shared<MinimalParam>());
rclcpp::shutdown();
return 0;
}
增加参数描述符(可选项)
如果你想对某个参数进行补充说明(比如功能说明、取值范围说明、读写属性说明等),我们可以通过rcl_interfaces::msg::ParameterDescriptor{}来创建一个参数描述符对象,并在其成员变量description(string类型)中将说明内容填充进去即可,我们可以采用下面的代码使得参数能有个说明(可以替换掉原先的构造函数内容,我们的代码可以换掉试试):
// ...
class MinimalParam : public rclcpp::Node
{
public:
MinimalParam()
: Node("minimal_param_node")
{
auto param_desc = rcl_interfaces::msg::ParameterDescriptor{};
param_desc.description = "This parameter is mine!";
this->declare_parameter("my_parameter", "world", param_desc);
timer_ = this->create_wall_timer(
1000ms, std::bind(&MinimalParam::timer_callback, this));
}
当我们启动节点后,我们可以通过:
ros2 param describe /minimal_param_node my_parameter
看看参数my_parameter的说明内容。
修改CMakeLists.txt
在find_package(rclcpp REQUIRED)
语句下面增加如下内容:
add_executable(minimal_param_node src/cpp_parameters_node.cpp)
ament_target_dependencies(minimal_param_node rclcpp)
install(TARGETS
minimal_param_node
DESTINATION lib/${PROJECT_NAME}
)
构建运行
构建之前我们最好先检查下依赖项有没有缺失:
$rosdep install -i --from-path src --rosdistro iron -y
正常后我们回到工作空间根路径(ros2_ws)进行构建:
$colcon build --packages-select cpp_parameters
完成后我们来启动运行下cpp_parameters节点:
$ros2 run cpp_parameters minimal_param_node
不出意外的话,节点终端会每秒返回一条下面的信息(设置的默认参数值):
[INFO] [minimal_param_node]: Hello world!
但是这种被安排好的日子是不是没啥意思,我们要自己主动设置参数值!别说还真有两个途径可以让我们玩玩。
通过控制台修改参数
这个我们之前同样体验过啦,今天再温故一下,不坏。首先得确保节点是处于活动状态,其次我们利用下面的命令查看下这个节点支持哪些参数:
$ros2 param list
看到有我们关心的my_parameter这个参数后,ok,我们将它的值由“world”改为“earth”:
$ros2 param set /minimal_param_node my_parameter earth
当这条命令成功执行之后,它会提示Set parameter successful,我们再看看运行节点的那个终端打印的内容(大家来找茬):
通过launch文件修改参数
默认情况,这个launch文件是不存在的,我们需要手动创建,通过下面命令新建(ros2_ws根路径下):
$mkdir src/cpp_parameters/launch
$gedit src/cpp_parameters/launch/cpp_parameters_launch.py
将下面内容复制到paunch文件中:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package="cpp_parameters",
executable="minimal_param_node",
name="custom_minimal_param_node",
output="screen",
emulate_tty=True,
parameters=[
{"my_parameter": "earth"}
]
)
])
output="screen" emulate_tty=True这两句是将信息输出到终端控制台。
我们还需添加launch安装选项到CMakeLists.txt中,增加下面内容:
install(
DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
)
再来构建包:
$colcon build --packages-select cpp_parameters
打开另外一个终端,进入ros2_ws根路径,激活下环境变量:
$source install/setup.bash
再启动节点试试(通过launch文件):
$ros2 launch cpp_parameters cpp_parameters_launch.py
效果如下:
各种命令及流程还是要及时温故知新啊,否则很容易就忘了。
本篇完。