ROS2——Parameters

节点可以使用参数来配置各项操作,这些参数可以说布尔值、整数、字符串等类型。节点在启动时会读取参数。我们将参数单独列出来,而不是写在源文件中,这样做可以方便我们调试,因为在不同的机器人、环境中,我们需要的参数不同

#include <vector>
#include <string>#include "rclcpp/rclcpp.hpp"class LocalizationNode : public rclcpp::Node
{
public:LocalizationNode(): Node("localization_node"){declare_parameter("number_particles", 200);declare_parameter("topics", std::vector<std::string>());declare_parameter("topic_types", std::vector<std::string>());get_parameter("number_particles", num_particles_);RCLCPP_INFO_STREAM(get_logger(), "Number of particles: " << num_particles_);get_parameter("topics", topics_);get_parameter("topic_types", topic_types_);if (topics_.size() != topic_types_.size()) {RCLCPP_ERROR(get_logger(), "Number of topics (%zu) != number of types (%zu)",topics_.size(), topic_types_.size());} else {RCLCPP_INFO_STREAM(get_logger(), "Number of topics: " << topics_.size());for (size_t i = 0; i < topics_.size(); i++) {RCLCPP_INFO_STREAM(get_logger(), "\t" << topics_[i] << "\t - " << topic_types_[i]);}}}private:int num_particles_;std::vector<std::string> topics_;std::vector<std::string> topic_types_;
};int main(int argc, char * argv[])
{rclcpp::init(argc, argv);auto node = std::make_shared<LocalizationNode>();rclcpp::spin(node);rclcpp::shutdown();return 0;
}

通过观察上面的代码,我们可以发现

  • 节点的所有参数都必须使用类似declare parameter的方法声明。在声明中,我们指定参数名称和默认值。
  • 我们使用getparameter这样的函数来获取它的值,指定参数的名称和存储它的值的位置。

使用命令行配置参数

我们可以不使用任何参数启动配置文件,可以观察程序运行后的效果

ros2 run br2_basics param_reader

打印出默认值200,由于topics的默认值为空字符串,所以长度为0

image.png

停止程序后,我们使用 --ros-args-p 来设置参数

ros2 run br2_basics param_reader --ros-args -p number_particles:=300 -p topics:='[scan,image]' -p topic_types:='[sensor_msgs/msg/LaserScan,sensor_msgs/msg/Image]'

image.png

使用Launch文件配置参数

使用launch文件可以使用两种方法

from launch import LaunchDescription
from launch_ros.actions import Nodedef generate_launch_description():param_reader_cmd = Node(package='br2_basics',executable='param_reader',parameters=[{'number_particles': 300,'topics': ['scan', 'image'],'topic_types': ['sensor_msgs/msg/LaserScan', 'sensor_msgs/msg/Image']}],output='screen')ld = LaunchDescription()ld.add_action(param_reader_cmd)return ld

在cmake文件中对launch文件进行配置```cmake
install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME})

image.png

使用YAML文件启动

在YAML文件中,可以配置参数便于我们进行调试。我们可以通过命令行,使程序能读到配置的参数

localization_node:ros__parameters:number_particles: 300topics: [scan, image]topic_types: [sensor_msgs/msg/LaserScan, sensor_msgs/msg/Image]
ros2 run br2_basics param_reader --ros-args --params-file install/br2_basics/share/br2_basics/config/params.yaml

image.png

launch+yaml

使用下列程序,可以读取指定路径下yaml的参数,进行参数的配置

import osfrom ament_index_python.packages import get_package_share_directoryfrom launch import LaunchDescription
from launch_ros.actions import Nodedef generate_launch_description():pkg_dir = get_package_share_directory('br2_basics')param_file = os.path.join(pkg_dir, 'config', 'params.yaml')param_reader_cmd = Node(package='br2_basics',executable='param_reader',parameters=[param_file],output='screen')ld = LaunchDescription()ld.add_action(param_reader_cmd)return ld

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI副业拆解:文字生成图文绘本,赋予你的故事生命,Story Agent智能绘本创作神器震撼登场!

大家好我是在看&#xff0c;记录普通人学习探索AI之路。 对话即创作&#xff0c;颠覆传统&#xff01;&#x1f680; Story Agent&#xff0c;一款前所未有的开源故事绘本生成智能体&#xff0c;让你与科技的边界交融&#xff0c;以对话的形式轻松唤醒内心深处的故事精灵。&…

SpringBoot中使用LocalDateTime踩坑记录

文章目录 前言一、为什么推荐使用java.time包的LocalDateTime而不是java.util的Date&#xff1f;二、使用LocalDateTime和LocalDate时遇到了哪些坑&#xff1f;2.1 Redis序列化报错2.1.1 问题现象2.1.2 问题分析2.1.3 解决方案 2.2 LocalDateTime和LocalDate类型的属性返回给前…

Vue3:使用解构赋值来读取对象里的键-值对(值也是对象)

一、前言 在Vue3中&#xff0c;想要读取一个对象的“键—值”对&#xff08;值也是一个对象&#xff09;&#xff0c;数据格式如下&#xff1a; {1:{courseName: 课程1, study: 951526, visit: 3785553}&#xff0c;2:{courseName: 课程2, study: 181630, visit: 380830}&…

超实用的公众号内容制作流程,小白也能轻松学会

公众号是以内容为王的平台&#xff0c;保持优质原创内容发布可以给公众号带来源源不断的流量&#xff0c;稳定输出内容&#xff0c;会获得平台的流量扶持。 很多小伙伴运营公众号都没有什么阅读量&#xff0c;一方面是公众号内容同质化越来越严重&#xff0c;另外一方面是公众…

NetSuite 收入管理模块与总账的数据一致性检查

收入管理模块是NetSuite的一个艰深功能领域&#xff0c;能够有所实践&#xff0c;知原理懂变化的实施顾问少之又少。很高兴&#xff0c;我们的财务顾问Chris在23年底经历了一次深入的NetSuite收入管理模块的实践&#xff0c;对收入管理模块与总账递延收入和收入数据的一致性检查…

2023年第三届【金铲奖】重磅发布!

出品|产业家 第三届金铲奖来了&#xff01; 在过去的一年时间里&#xff0c;我们清晰地看到&#xff0c;产业数字化的潮水更加汹涌澎湃且势不可挡&#xff0c;越来越多的企业开始寻求数字化转型&#xff0c;它们来自金融、工业、农业、医疗、能源、教育等等。 产业数字化&am…

Modern C++ std::mutex底层原理

前言 我时常有这样的疑问&#xff1a; std::mutex怎么就能保证后面的语句100%安全哪&#xff1f;CPU reordering就不会把这些语句重排到mutex前面执行&#xff1f;而且各个CPU都是有L1、L2缓存的&#xff0c;如果mutex后面要访问的的变量在这些缓存中怎么办&#xff1f; 带着…

中央处理器CPU(1)----指令周期和微程序

前言&#xff1a;由于期末复习计算机组成效率太慢所以抽时间写一下文章总结一下思路&#xff0c;理解不是很深&#xff0c;欢迎各位不吝赐教。 由于时间不是很充分&#xff0c;所以有些考点由于我们不考试&#xff0c;一笔带过了。 我这是期末复习总结&#xff0c;不是考研知识…

开源C语言库Melon:数据恢复算法

本文讲述开源C语言库Melon中的里德所罗门纠错码的使用。 关于 Melon 库&#xff0c;这是一个开源的 C 语言库&#xff0c;它具有&#xff1a;开箱即用、无第三方依赖、安装部署简单、中英文文档齐全等优势。 Github repo 简介 里德所罗门编码是一种纠错码技术&#xff0c;…

如何理解线程池中的参数设计

如何理解线程池中的参数设计 你的线程池的参数怎么配置&#xff1f;线程数量设置多少合理&#xff1f;如何确定一个线程池中的人物已经完成了为什么不建议使用java自带的Executors创建线程池线程池里面的阻塞队列设置多少合理&#xff1f; 考察&#xff1a;了解你对技术的掌握…

k8s-调度 13

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器&#xff0c;并且是集群控制面的一部分。 如果你真的希望或者有…

printk的使用与理解

文章目录 一、理清printk二、printk的使用三、printk的打印级别1、基本解释2、详细解释3、如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel的值 四、printk的输出地方五、其它 一、理清printk printk如何使用&#…