ROS2——Parameters

news2024/11/20 18:33:09

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

#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 Node


def 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: 300
    topics: [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 os

from ament_index_python.packages import get_package_share_directory

from launch import LaunchDescription
from launch_ros.actions import Node


def 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.coloradmin.cn/o/1375198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应用案例 | 基于三维机器视觉的焊接件上料解决方案

在制造业中&#xff0c;还有许多传统的焊接自动化设备主要是通过人工来进行上料。 传统的上料过程中&#xff0c;主要是通过人工来进行的。上料过程中会收到人为因素的影响&#xff0c;如操作人员的技能水平、工作态度等&#xff0c;导致上料不准确&#xff0c;不稳定&#xff…

面试宝典之JVM优化

J01、类加载的几个过程&#xff1f; 加载、验证、准备、解析、初始化。然后是使用和卸载了 J02、Minor GC 与 Full GC 分别在什么时候发生&#xff1f; 新生代内存不够用时候发生 MGC 也叫 YGC&#xff0c;JVM 内存不够的时候发生 FGC J03、java 中垃圾收集的方法有哪些? …

计算机速成课Crash Course - 18. 操作系统

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 17. 集成电路&摩尔定律 18. 操作系统 1940,1950 年代的电脑&#…

【PaperReading】3. PTP

Category Content 论文题目 Position-guided Text Prompt for Vision-Language Pre-training Code: ptp 作者 Alex Jinpeng Wang (Sea AI Lab), Pan Zhou (Sea AI Lab), Mike Zheng Shou (Show Lab, National University of Singapore), Shuicheng Yan (Sea AI Lab) 另一篇…

Elasticsearch安装Windows版

目录 1.&#xff1a;下载安装包&#xff0c;选择指定的版本&#xff0c;这里选择了7.8.0&#xff0c;官网下载地址&#xff1a; ​编辑 2&#xff1a;下载好之后解压&#xff0c;解压之后是这样的&#xff1a; 3&#xff1a;配置环境变量&#xff0c;跟JDK一样&#xff0c;…

odoo16 销售中订单价格的设置

odoo16 销售中订单价格的设置 产品设置好销售价格后&#xff0c;在建销售订单时&#xff0c;却不显价格&#xff0c;需在设置中把价格表选上 不选客户时&#xff0c;价格表显示空白 每次如何设置默认价格呢&#xff0c;如你去改程序或其它法&#xff0c;就不对了&#xff0c…

String有没有最大长度限制?

大家都用过String字符串&#xff0c;有的人可能还不知道它的长度在某些方面是有一些限制。 public String(byte bytes[], int offset, int length);这是java.lang.String中的一个构造函数&#xff0c;可以看到它的长度是int类型&#xff0c;int的最大取值是2^31-1.但是我们却不…

RK3399平台入门到精通系列讲解(基础篇)__LITTLE_ENDIAN_BITFIELD 宏的使用

🚀返回总目录 文章目录 一、什么是字节序二、小端模式(Little-Endian)三、大端模式(Big-Endian)四、__LITTLE_ENDIAN_BITFIELD 使用案例一、什么是字节序 在计算机中,数据是以最原始的二进制 0 和 1 的方式被存储的。在大多数现代计算机体系架构中,计算机的最小可寻址数…

Java人脸识别

Java人脸识别 一.提出问题&#xff0c;引入SDK的概念 什么是SDK&#xff1f; 我们并不具备开发人脸识别的能力&#xff0c;但我们可以用大公司已经开发好的工具或者功能&#xff0c;来实现人脸识别&#xff0c;而大公司提供的就叫SDK(Software Development Kit)软件开发工具包…

【Docker】Linux中Docker技术入门与实战及实用的常规命令

目录 一、引言 1. 说明&#xff1a; 2. Linux介绍 3. Docker简介 二、Docker三要素 1. 镜像&#xff08;Image&#xff09; 2. 容器&#xff08;Container&#xff09; 3. 仓库&#xff08;Repository&#xff09; 三、实现案例 1. 创建 2. 设置镜像 3. 开启设置 …

Linux最常用的几个时间日期命令

文章目录 Linux最常用的几个时间日期命令一日难再晨及时当勉励 date默认输入显示时区世界协调时格式化日期 时光总是催人老 time语法示例 休息一会 sleep休息5分钟1小时后提醒我时分秒搭配使用倒计时计时器结合脚本 更多信息 Linux最常用的几个时间日期命令 桃花谢了春红&…

The Sandbox 线下联动|「友邦嘉年华」地主专享门票免费放送

我们很高兴与票务合作伙伴 0xMoongate 合作&#xff0c; 为各位地主们准备了免费的“友邦嘉年华”门票&#xff01; “友邦嘉年华”介绍&#xff1a; The Sandbox 是香港最大户外盛事之一“友邦嘉年华”的荣誉合作伙伴&#xff01; 我们将这份兴奋延伸到现实世界&#xff0c…

哈希-力扣454.四数相加Ⅱ

题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 [1…

Realm Management Extension领域管理扩展之SMMU架构

SMMU架构已经扩展以支持颗粒保护检查。在本指南的本节中,我们描述了在启用RME的系统中如何使用SMMU以及对SMMU架构的主要更改。 RME启用的系统中的SMMU 一个系统包括几个可以独立访问内存的设备,例如DMA控制器或GPU。下面的简化系统示意图显示了这一点: 任何可以访问内存的…

RT-Thread 线程间通信 信号

信号 信号&#xff08;又称为软中断信号&#xff09;&#xff0c;在软件层次上是对中断机制的一种模拟&#xff0c;在原理上&#xff0c;一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。 信号的工作机制 信号在RT-Thread中用作异步通信&#xff0c;POSIX标准…

Airtest-Selenium实操小课

1. 前言 上一课我们讲到用Airtest-Selenium爬取网站上我们需要的信息数据&#xff0c;还没看的同学可以戳这里看看~ 那么今天的推文&#xff0c;我们就来说说看&#xff0c;怎么实现看b站、刷b站的日常操作&#xff0c;包括点击暂停&#xff0c;发弹幕&#xff0c;点赞&#…

Python基础(二十四、JSON和pyecharts)

文章目录 一、JSON1.JSON介绍2.JSON格式数据转化3.示例 二、pyecharts1.安装pyecharts包2.查看官方示例 三、开发示例 一、JSON 1.JSON介绍 JSON是一种轻量级的数据交互格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据&#xff08;就是字符串&#xff09;…

使用MySQL的过程中,有没有遇到过count()比较慢的情况?

count(*)的实现方式 MyISAM引擎把一个表的总行数存在了磁盘上&#xff0c;执行count(*)的时候直接返回这个数&#xff0c;效率很高&#xff1b; InnoDB引擎执行count(*)的时候&#xff0c;需要把数据一行一行地从引擎里面读出来&#xff0c;然后累积计数。 上述说明是在没有…

03.C++内存管理笔记

1、C/C内存分布 ①内存分那么多区的原因&#xff1a;不同的数据&#xff0c;有不同的存储需求&#xff0c;各区域满足了不同的需求。 ②存放&#xff1a; 临时变量等临时用的变量&#xff1a;栈区&#xff1b; 动态申请的变量&#xff1a;堆区&#xff1b; 全局变量和静态变…

[渗透测试学习] Surveillance -HackTheBox

文章目录 信息搜集getshell提权信息搜集 nmap扫描端口 nmap -sV -sC -v -p- --min-rate 1000 10.10.11.245扫出来两个端口,其中80端口有http服务并且重定向到surveillance.htb 那么我们添加下域名然后访问80端口,发现是企业网站尝试扫描子域名和目录无果后,用Wappalyzer插…