2.参数之RCLCPP实现
上节我们通过参数控制了小乌龟模拟器的背景色,但是我们并不知道小乌龟模拟器是如何接收到参数并将其应用的,本节我们就学习使用ROS2的RCLCPP中参数相关的API实现对ROS2打印的日志级别控制。
ROS2将日志分为五个级别,在CPP中通过不同的宏可以实现不同日志级别日志的打印,例程如下:
RCLCPP_DEBUG(this->get_logger(), "我是DEBUG级别的日志,我被打印出来了!");
RCLCPP_INFO(this->get_logger(), "我是INFO级别的日志,我被打印出来了!");
RCLCPP_WARN(this->get_logger(), "我是WARN级别的日志,我被打印出来了!");
RCLCPP_ERROR(this->get_logger(), "我是ERROR级别的日志,我被打印出来了!");
RCLCPP_FATAL(this->get_logger(), "我是FATAL级别的日志,我被打印出来了!");
有时候日志太多,会让人眼花缭乱找不到重要信息,所以我们需要对日志的级别进行过滤,比如只看INFO以上级别的,ROS2中可以通过已有的API设置日志的级别,RCLCPP中API如下:
this->get_logger().set_level(log_level);
1.创建功能包和节点
我们创建一个功能包和测试节点,声明参数并实现动态修改打印的日志级别功能。
mkdir -p chapt4/chapt4_ws/
ros2 pkg create example_parameters_rclcpp --build-type ament_cmake --dependencies rclcpp --destination-directory src --node-name parameters_basic --maintainer-name "fishros" --maintainer-email "fishros@foxmail.com"
#include <chrono>
#include "rclcpp/rclcpp.hpp"
/*
# 声明
# declare_parameter 声明和初始化一个参数
# declare_parameters 声明和初始化一堆参数
# 获取
# describe_parameter(name) 通过参数名字获取参数的描述
# get_parameter 通过参数名字获取一个参数
# get_parameters 通过多个参数名字获取多个参数
# 设置
# set_parameters 设置一组参数的值
#
# has_parameter 参数是否被声明
*/
class ParametersBasicNode : public rclcpp::Node {
public:
// 构造函数,有一个参数为节点名称
explicit ParametersBasicNode(std::string name) : Node(name) {
// 打印一句
RCLCPP_INFO(this->get_logger(), "节点已启动:%s.", name.c_str());
this->declare_parameter("rcl_log_level", 0);
this->get_parameter("rcl_log_level", log_level);
RCLCPP_INFO(this->get_logger(), "设置%s节点日志级别 %d .", name.c_str(),
log_level);
this->get_logger().set_level((rclcpp::Logger::Level)log_level);
RCLCPP_INFO(this->get_logger(), "设置%s节点日志级别完成 %d .", name.c_str(),
log_level);
using namespace std::literals::chrono_literals;
timer_ = this->create_wall_timer(
500ms, std::bind(&ParametersBasicNode::timer_callback, this));
}
private:
};
int main(int argc, char** argv) {
rclcpp::init(argc, argv);
/*产生一个的节点*/
auto node = std::make_shared<ParametersBasicNode>("parameters_basic");
/* 运行节点,并检测退出信号*/
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
2.RCLCPP参数API
3.使用参数控制节点日志级别
4.总结