创建自己的节点时,有时需要添加可从启动文件设置的参数。本教程将向您展示如何在C++类中创建这些参数,以及如何在启动文件中设置它们。
功能包创建
mkdir -p demo2_ws/src
cd src
ros2 pkt create --build-type ament_cmake cpp_parameters --dependencies rclcpp
cd cpp_parameters
在src目录下进行创建参数文件
#include <chrono>
#include <functional>
#include <string>
#include <rclcpp/rclcpp.hpp>
using namespace std::chrono_literals;
using namespace rclcpp;
class MinimalParam:public Node{
rclcpp::TimerBase::SharedPtr timer_;
public:
MinimalParam():Node("MinimalParam"){
// 定义对应文件的参数,声明文件参数的参数名,和参数的默认值
this->declare_parameter("my_parameter","world");
timer_ = this->create_wall_timer(1000ms,std::bind(&MinimalParam::timer_callback,this));
}
void timer_callback(){
// 获得对应的参数值
std::string my_param = this->get_parameter("my_parameter").get_parameter_value().get<std::string>();
RCLCPP_INFO(this->get_logger(),"Hello %s ",my_param.c_str());
std::vector<rclcpp::Parameter> all_new_parameters{rclcpp::Parameter("my_parameter", "lala")};
this->set_parameters(all_new_parameters);
}
};
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalParam>());
rclcpp::shutdown();
return 0;
}
timer_callback函数的第一行从节点获取参数my_parameter,并将其存储在my_param中。接下来,RCLCPP_INFO函数确保消息被记录。set_parameters函数然后将参数my_parameter设置回默认字符串值world。在用户从外部更改参数的情况下,这可确保参数始终重置回原始值。
修改对应的CMakeLists.txt文件
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 foxy -y
colcon build --packages-select cpp_parameters
配置launch文件
您也可以在启动文件中设置该参数,但首先需要添加启动目录。在ros2_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="minimal_param_node",
name="custom_minimal_param_node",
output="screen",
emulate_tty=True,
parameters=[
{"my_parameter": "earth"}
]
)
])
修改CMakeList.txt文件
install(
DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
)
编译之后可以通过启动对应的launch文件得到对应功能包