2.参数之RCLCPP实现 上节我们通过参数控制了小乌龟模拟器的背景色,但是我们并不知道小乌龟模拟器是如何接收到参数并将其应用的,本节我们就学习使用ROS2的RCLCPP中参数相关的API实现对ROS2打印的日志级别控制。 ROS2将日志分为五个级别,在CPP中通过不同的宏可以实现不同日志级别日志的打印,例程如下: ```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 #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("parameters_basic"); /* 运行节点,并检测退出信号*/ rclcpp::spin(node); rclcpp::shutdown(); return 0; } ``` 2.RCLCPP参数API 3.使用参数控制节点日志级别 4.总结