ROS2学习之旅(18)——在类中使用参数(C++)
在创建自己的节点时,有时需要添加可以从启动文件中设置的参数。
本文将向您展示如何在c++类中创建这些参数,以及如何在启动文件中设置它们。
1.创建功能包
在工作空间src
目录下,运行:
ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp
更新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代码解释
顶部的#include语句是包依赖项。
下一段代码创建类和构造函数。在构造函数的第一行创建参数,参数名为my_parameter
,并被赋值为默认值world
。接下来,初始化timer_
,这将导致每秒钟执行一次respond
函数。
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));
}
respond
函数的第一行从节点获取参数my_parameter
,并将其存储在parameter_string_
中,RCLCPP_INFO
函数确保该消息被记录。
void respond()
{
this->get_parameter("my_parameter", parameter_string_);
RCLCPP_INFO(this->get_logger(), "Hello %s", parameter_string_.c_str());
}
最后是timer_
和parameter_string_
的声明:
private:
std::string parameter_string_;
rclcpp::TimerBase::SharedPtr timer_;
在ParametersClass
后面是main
函数。这里初始化了ROS 2, rclcpp::spin
开始处理来自该节点的数据。
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<ParametersClass>());
rclcpp::shutdown();
return 0;
}
2.2添加可执行文件
打开 CMakeLists.txt
,在 find_package(rclcpp REQUIRED)
下面添加:
add_executable(parameter_node src/cpp_parameters_node.cpp)
ament_target_dependencies(parameter_node rclcpp)
install(TARGETS
parameter_node
DESTINATION lib/${PROJECT_NAME}
)
3.编译和运行
工作空间根目录下,运行:
colcon build --packages-select cpp_parameters
source:
. install/setup.bash
运行:
ros2 run cpp_parameters parameter_node
终端每秒返回消息:
[INFO] [parameter_node]: Hello world
可以看到参数的默认值,但是希望能够自己设置它,有两种方法可以实现这一点。
3.1通过consle控制台改变
确保节点正在运行:
ros2 run cpp_parameters parameter_node
打开另一终端,再次source环境,运行以下命令:
ros2 param list
终端返回,自定义参数:my_parameter
,可以在终端通过简单的命令行改变:
ros2 param set /parameter_node my_parameter earth
此时,终端输出Set parameter successful
表示设置参数成功。此时,运行parameter_node
节点的终端输出:
[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",
executable="parameter_node",
name="custom_parameter_node",
output="screen",
emulate_tty=True,
parameters=[
{"my_parameter": "earth"}
]
)
])
当启动节点parameter_node
时,将my_parameter
设置为earth
,并·通过添加下面的两行代码,确保在控制台中打印输出:
output="screen",
emulate_tty=True,
打开CMakeLists.txt
文件,添加:
install(
DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
)
在工作空间根目录下,编译包:
colcon build --packages-select cpp_parameters
source:
. install/setup.bash
启动launch文件:
ros2 launch cpp_parameters cpp_parameters_launch.py
此时终端每秒返回信息:
[parameter_node-1] [INFO] [custom_parameter_node]: Hello earth
4.总结
本文创建了一个带有自定义参数的节点,该参数可以从launch文件或命令行进行设置。将依赖项、可执行文件和启动文件添加到包配置文件中,以便可以编译和运行它们。
如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。
都看到这了,点个推荐再走吧~
未经允许,禁止转载。