ROS2入门教程—在类中使用ROS2参数
当我们自己编写节点功能时,有时候需要添加一些能够在launch文件中配置好的参数。本教程将向您展示如何在C++类中创建这些参数,以及如何在launch文件中设置这些参数。
1 创建功能包
首先打开一个新终端,并且设置环境变量,以便ros2命令能够正常工作。然后进入到dev_ws/src
文件夹,运行创建功能包的指令创建一个新的功能包cpp_parameters
,
cd ~/dev_ws/src
ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp
由于在创建功能包时,使用了--dependencies
参数,会自动添加一些依赖项在 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>
2 编写C++节点代码
在dev_ws/src/cpp_parameters/src
路径下,创建一个名为cpp_parameters_node.cpp
的代码文件,然后复制粘贴如下代码内容:
#include <rclcpp/rclcpp.hpp>
#include <chrono>
#include <string>
#include <functional>
using namespace std::chrono_literals;
class ParametersClass: public rclcpp::Node
{
public:
ParametersClass(): Node("parameter_node")
{
this->declare_parameter<std::string>("my_parameter", "world");
timer_ = this->create_wall_timer(1000ms, std::bind(&ParametersClass::respond, this));
}
void respond()
{
this->get_parameter("my_parameter", parameter_string_);
RCLCPP_INFO(this->get_logger(), "Hello %s", parameter_string_.c_str());
}
private:
std::string parameter_string_;
rclcpp::TimerBase::SharedPtr timer_;
};
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<ParametersClass>());
rclcpp::shutdown();
return 0;
}
2.1 代码解释
我们来解释一下以上代码的关键部分。
ParametersClass(): Node("parameter_node")
{
this->declare_parameter<std::string>("my_parameter", "world");
timer_ = this->create_wall_timer(1000ms, std::bind(&ParametersClass::respond, this));
}
这段代码是ParametersClass
类的构造函数,其中第一行就创建了一个ROS参数,参数名为my_parameter
,参数值为“world”
,数据类型是string
。接下来的第二行创建了一个1s周期的定时器,触发respond
函数。
void respond()
{
this->get_parameter("my_parameter", parameter_string_);
RCLCPP_INFO(this->get_logger(), "Hello %s", parameter_string_.c_str());
}
在respond
函数中,第一行会查询“my_parameter”
参数,并且保存在parameter_string_
这个私有变量中,紧接着第二行就把查询到的参数值打印出来了。
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<ParametersClass>());
rclcpp::shutdown();
return 0;
}
main
函数是以上定义类的具体实例化调用过程,先是初始了节点,接下来就开始处理类的构建和启动定时器。
2.2 添加编译配置
打开CMakeLists.txt
文件,添加如下编译选项的配置内容:
add_executable(parameter_node src/cpp_parameters_node.cpp)
ament_target_dependencies(parameter_node rclcpp)
install(TARGETS
parameter_node
DESTINATION lib/${PROJECT_NAME}
)
3 编译运行
首先确认功能包的依赖是否有安装完成,如果有缺少的依赖则会自动安装:
rosdep install -i --from-path src --rosdistro eloquent -y
在终端中回到dev_ws
工作空间的根目录下,使用如下命令编译工作空间:
colcon build --packages-select cpp_parameters
打开一个新的终端,还是进入到dev_ws
工作空间根目录下,先设置工作空间的环境变量,接下来就可以运行编译完成的节点了。
. install/setup.bash
ros2 run cpp_parameters parameter_node
在终端中就可以看到每秒会有一个参数值的输出日志了。
[INFO] [parameter_node]: Hello world
3.1 通过终端修改参数值
不要关闭刚才运行的参数功能节点,打开一个新终端,使用如下命令查询当前所有参数列表。
ros2 param list
在列表中可以看到my_parameter
这个参数:
/parameter_node:
my_parameter
use_sim_time
接下来就可以通过如下命令行来修改这个参数的值了:
ros2 param set /parameter_node my_parameter earth
这样,我们就将my_parameter
参数的值修改为“earth”
了,此时刚才运行节点的终端中,也会变成如下日志输出:
[INFO] [parameter_node]: Hello earth
3.2 通过Launch文件修改参数值
也可以通过Launch
文件来设置参数值。在dev_ws/src/cpp_parameters/
文件夹中,创建一个launch
文件夹,并在其中创建cpp_parameters_launch.py
,复制粘贴如下内容:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package="cpp_parameters",
node_executable="parameter_node",
node_name="custom_parameter_node",
output="screen",
emulate_tty=True,
parameters=[
{"my_parameter": "earth"}
]
)
])
在这里您可以看到,当我们启动节点parameter_node
时,我们将my_parameter
设置为earth
。通过添加下面的两行,我们可以确保在终端中打印输出。
output="screen",
emulate_tty=True,
要运行launch
文件,还需要在CMakeLists.txt
文件中配置一下:
install(
DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
)
在终端中回到dev_ws
工作空间根目录下,然后重新编译一下:
colcon build --packages-select cpp_parameters
接下来一样的操作,打开一个新终端,设置工作空间环境变量,再运行launch
文件:
. install/setup.bash
ros2 launch cpp_parameters cpp_parameters_launch.py
终端中就可以看到参数修改之后的日志输出了:
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [parameter_node-1]: process started with pid [65991]
[parameter_node-1] [INFO] [custom_parameter_node]: Hello earth
在本教程中,您学习了使用自定义参数创建一个节点,并且通过终端命令行或者launch文件的方式对C++代买内的参数进行重新设置。