【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

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值