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

7.ROS中的参数通信

文章目录

  • 7.ROS中的参数通信
    • 7.1使用CLI工具调整参数
    • 7.2参数通信之rclcpp实现
      • 7.2.1创建节点
      • 7.2.2rclcpp参数API
    • Reference

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/555019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java算法day56 | 动态规划part15 ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 动规五部曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]。确定递推公式 在确定递推公式的时候&#xff0c;…

第21天:信息打点-公众号服务Github监控供应链网盘泄漏证书图标邮箱资产

第二十一天 一、开发泄漏-Github监控 1.短期查看 1.密码搜索 根据攻击目标的域名在GitHub上进行搜索密码&#xff0c;如果目标网站的文件与搜索到的源码相关&#xff0c;那就可以联想目标网站是否使用这套源码进行开发 原理就是开发者在上传文件的时候忘记更改敏感文件或者…

探索VR数字展厅,对企业未来展示新模式

在数字化浪潮的推动下&#xff0c;企业展示也在经历着一场革命&#xff0c;VR数字展厅正在以一种全新的方式重塑我们的生活和工作空间&#xff0c;不仅重塑了客户的观展体验&#xff0c;也为企业营销打开了新的渠道。 VR数字展厅作为实体展厅的数字化延伸&#xff0c;正以其沉浸…

SpringBoot框架——7.整合MybatisPlus

这篇主要介绍Springboot整合MybatisPlus&#xff0c;另外介绍一个插件JBLSpringbootAppGen,以及一个经常用于测试的基于内存的h2数据库。 Mybatisplus是mybatis的增强工具&#xff0c;和tk-mybatis相似&#xff0c;但功能更强大&#xff0c;可避免重复CRUD语句&#xff0c;先来…

JWT的使用

0、JWT原理 header JWT第一部分是header,header主要包含两个部分,alg指加密类型&#xff0c;可选值为HS256、RSA等等&#xff0c;typJWT为固定值&#xff0c;表示token的类型。 Payload JWT第二部分是payload,payload是token的详细内容,一般包括iss (发行者), exp (过期时间),…

速看!2024中国(厦门)国际康复医疗展览会

2024中国&#xff08;厦门&#xff09;国际康复医疗展览会 2024 China (Xiamen) International Rehabilitation Medical Exhibition 时 间&#xff1a;2024年8月13-15日 August 13-15, 2024 地 点&#xff1a;厦门国际会展中心 Xiamen International Conference & Exh…

分布式调度器timer和spring task

1. Timer&#xff08;了解&#xff09; 一、Timer使用方式 Task1 public class Task1 extends TimerTask {Overridepublic void run(){System.out.println("com.aware.Task run");} } Task2 public class Task2 extends TimerTask {Overridepublic void run(){…

外包干了18天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

【研发管理】产品经理知识体系-产品创新管理

导读&#xff1a; 产品创新管理对企业的发展具有深远的影响&#xff0c;它不仅是企业保持竞争优势的关键&#xff0c;也是推动企业持续稳定发展的重要动力。因此&#xff0c;企业应高度重视产品创新管理&#xff0c;并采取有效的策略和方法来推动产品创新活动的开展。对于产品经…

开关原理(验证码开关、IP开关)

开关原理&#xff08;验证码开关&#xff09; 我们的项目具有验证码功能&#xff0c;旧版不支持关闭&#xff0c;新版已经支持关闭了。 我们打开页面“参数管理”&#xff0c;所谓参数管理&#xff0c;就是在系统运行起来的时候&#xff0c;可以动态修改一些值&#xff0c;这些…

java体育馆使用预约平台的设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的体育馆使用预约平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 体育馆使用预约平台的…

IDEA中SVN 的使用

文章目录 前言一、svn安装二、IDEA集成SVN总结 前言 svn可以老牌的代码仓库了 说实话svn还是和git无法相比的,毕竟git有本地仓库的概念,可以很好的处理冲突,然而svn是没有本地仓库的概念的,所以只能拉取别人的代码,然后处理冲突后,才能提交代码; 由于最近的工作换成了用svn仓…

找不到api-ms-win-crt-runtime-l1-1-0.dll文件5种解决方法

在日常使用计算机的过程中&#xff0c;我们时常会遭遇各类意想不到的问题&#xff0c;其中之一就是“api-ms-win-crt-runtime-l1-1-0.dll丢失”。这个错误通常发生在Windows操作系统中&#xff0c;它表示一个动态链接库文件丢失或损坏。这个问题可能会导致某些应用程序无法正常…

LLamaSharp加载llama.cpp转化好的模型

新建.net8控制台项目 安装依赖包 LLamaSharp和LLamaSharp.Backend.Cpu 准备好转化好的模型 没有的话参考这篇文章https://blog.csdn.net/qq_36437991/article/details/137248622 编写代码 using LLama; using LLama.Common; using LLama.Native;namespace llamasharpstu…

【Java开发指南 | 第十三篇】Java条件语句

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 if 语句if...else 语句if...else if...else 语句嵌套的 if…else 语句switch 语句 Java 中的条件语句用于根据条件来执行不同的代码块。条件语句允许程序根据表达式的结果选择性地执行代码。 条件语句分为if 语…

中拔出溜的公司如何实施DEVOPS

虽然推进起来很艰难&#xff0c;但在这类公司也并非一无是处&#xff1a;只要让各方尤其是领导曾看到了成效&#xff0c;大范围铺开很容易&#xff0c;你也非常容易因此变得出众。 0. 标题 1. 中拔出溜公司的特点2. 循序渐进2.1 从研发团队开始2.2 先CI&#xff08;持续集成&am…

vim使用指南:指令、配置、插件、异常

文章目录 vi / vim命令模式插入模式光标定位复制粘贴删除撤销替换删除查找 底行模式保存退出行号查找多开其他 视图模式注释 异常vim配置vim插件 vi / vim vim的本质是一个编辑器&#xff0c;是一种多模式的编辑器&#xff0c;只能进行读写操作&#xff0c;不能进行编译编辑器…

前端JS必用工具【js-tool-big-box】,时间日期转换学习一

这一小节&#xff0c;我们学习一下 js-tool-big-box 这个npm 前端工具库&#xff0c;关于时间日期格式转换的一部分&#xff0c;后续还会有。 目录 1 安装 2 项目中引入 3 工具使用 3.1 年月日时分秒的单独处理 3.2 以上方法中第一个参数 3.3 日期时间的转换 3.4 更个…

Ollama、FastGPT大模型RAG知识库结合使用案例

参考: https://ollama.com/download/linux https://doc.fastai.site/docs/intro/ https://blog.csdn.net/m0_71142057/article/details/136738997 https://doc.fastgpt.run/docs/development/custom-models/m3e/ https://concise-eater-d47.notion.site/Ollama-Fastgpt-b170…

编程入门(四)【计算机网络基础(由一根网线连接两个电脑开始)】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言两个电脑如何互连呢&#xff1f;集线器、交换机与路由器总结 前言 当你有…