自学内容网 自学内容网

【ROS2笔记七】ROS中的参数通信

7.ROS中的参数通信

ROS2中的参数是由键值对组成的,参数可以实现动态调整。

7.1使用CLI工具调整参数

启动turtlesim功能包的环境

ros2 run  turtlesim turtlesim_node
  • 查看当前节点下的参数
ros2 param list

Output:

/turtlesim:
  background_b
  background_g
  background_r
  qos_overrides./parameter_events.publisher.depth
  qos_overrides./parameter_events.publisher.durability
  qos_overrides./parameter_events.publisher.history
  qos_overrides./parameter_events.publisher.reliability
  use_sim_time
  • 可以详细查看每一个参数的含义
ros2 param describe <node_name> <param_name>
ros2 param describe /turtlesim background_r

Output:

Parameter name: background_r
  Type: integer
  Description: Red channel of the background color
  Constraints:
    Min value: 0
    Max value: 255
    Step: 1
  • 查看每个参数的值
ros2 param get <node_name> <param_name>
ros2 param get /turtlesim background_r

Output:

Integer value is: 69
  • 设置参数的值
ros2 param set <node_name> <param_name> <value>
ros2 param set /turtlesim background_r 10

Output:

Set parameter successful
  • 存储当前的所有参数
ros2 param dump <node_name>

会保存一个<node_name>.yaml文件到当前终端的路径中,然后我们载入这个文件就能够加载所有的参数了。

  • 加载参数文件
ros2 param load <node_name> <param_path>

7.2参数通信之rclcpp实现

7.2.1创建节点

ROS2中的日志类型分为5个等级,分别是

RCLCPP_DEBUG(this->get_logger(), "This is DEBUG info!");
RCLCPP_INFO(this->get_logger(), "This is INFO info!");
RCLCPP_WARN(this->get_logger(), "This is WARN info!");
RCLCPP_ERROR(this->get_logger(), "This is ERROR info!");
RCLCPP_FATAL(this->get_logger(), "This is FATAL info!");

我们可以对日志的级别进行过滤,从而查看我们想看的信息

this->get_logger().set_level(log_level);

我们可以通过参数通信来控制查看日志的等级,从而实现日志消息的过滤。

首先创建一个功能包和测试节点,

ros2 pkg create example_service_rclcpp --build-type ament_cmake --dependencies rclcpp --license Apache-2.0

parameters_basic.cpp

#include "rclcpp/rclcpp.hpp"

class ParametersBasicNode: public rclcpp::Node{
public:
    ParametersBasicNode(std::string name): Node(name){
        // 启动节点
        RCLCPP_INFO(this->get_logger(), "Node: %s has been launched", name.c_str());
    }
private:

};


int main(int argc, char * argv[]){
    // 初始化rclcpp
    rclcpp::init(argc, argv);

    // 创建节点
    auto node = std::make_shared<ParametersBasicNode>("parameters_basic");

    // 关闭节点
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

CMakeLists.txt

add_executable(parameters_basic src/parameters_basic.cpp)
ament_target_dependencies(parameters_basic rclcpp)

install(TARGETS 
  parameters_basic 
  DESTINATION lib/${PROJECT_NAME}
)

7.2.2rclcpp参数API

相关的API可以参考:rclcpp: rclcpp: ROS Client Library for C++ (ros2.org)

Image

使用参数来控制日志的级别,完整程序

parameters_basic.cpp

#include "rclcpp/rclcpp.hpp"

/*
    # declare_parameter            声明和初始化一个参数
    # describe_parameter(name)  通过参数名字获取参数的描述
    # get_parameter                通过参数名字获取一个参数
    # set_parameter                设置参数的值
*/

class ParametersBasicNode: public rclcpp::Node{
public:
    ParametersBasicNode(std::string name): Node(name){
        // 启动节点
        RCLCPP_INFO(this->get_logger(), "Node: %s has been launched", name.c_str());
        this->declare_parameter("rcl_log_level", 0);
        this->get_parameter("rcl_log_level", log_level);

        this->get_logger().set_level((rclcpp::Logger::Level)log_level);

        using namespace std::literals::chrono_literals;
        timer_ = this->create_wall_timer(
            500ms, std::bind(&ParametersBasicNode::timer_callback, this));
    }
private:
    int log_level;
    rclcpp::TimerBase::SharedPtr timer_;
    void timer_callback(){
        this->get_parameter("rcl_log_level", log_level);
        this->get_logger().set_level(rclcpp::Logger::Level(log_level));
        std::cout << "=========================================" << std::endl;
        RCLCPP_DEBUG(this->get_logger(), "This is DEBUG!");
        RCLCPP_INFO(this->get_logger(), "This is INFO!");
        RCLCPP_WARN(this->get_logger(), "This is WARN!");
        RCLCPP_ERROR(this->get_logger(), "This is ERROR!");
        RCLCPP_FATAL(this->get_logger(), "This is FATAL!");
        std::cout << "=========================================" << std::endl;
    }

};


int main(int argc, char * argv[]){
    // 初始化rclcpp
    rclcpp::init(argc, argv);

    // 创建节点
    auto node = std::make_shared<ParametersBasicNode>("parameters_basic");

    // 关闭节点
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}
source ./install/setup.bash
ros2 run example_parameters_rclcpp parameters_basic --ros-args -p rcl_log_level:=10

运行效果如下:

Image

也可以动态设置参数

ros2 param list
ros2 param set /parameters_basic rcl_log_level 20

如下:

Image

Reference

[1]d2lros2
[2]ROS2 Tutorial Official


原文地址:https://blog.csdn.net/qq_44940689/article/details/137878309

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!