ROS2机器人编程简述humble-第二章-Parameters .3.4

news2024/9/28 19:26:12

ROS2机器人编程简述humble-第二章-Launchers .3.3

机器人程序通常需要配置各类参数,官网和一些书中都有介绍。

概述

ROS中的参数与各个节点相关。参数用于在启动时(以及运行时)配置节点,而无需更改代码。参数的生存期与节点的生存期相关联(尽管节点可以实现某种持久性以在重新启动后重新加载值)。

参数由节点名称、节点名称空间、参数名称和参数名称空间寻址。提供参数命名空间是可选的。

每个参数由一个键、一个值和一个描述符组成。键是字符串,值是以下类型之一:bool、int64、float64、string、byte[]、bool[]、int64[]、float64[]或string[]。默认情况下,所有描述符都为空,但可以包含参数描述、值范围、类型信息和其他约束。

声明参数

默认情况下,节点需要声明在其生存期内将接受的所有参数。这样,在节点启动时就可以定义参数的类型和名称,这减少了以后错误配置的机会。有关从节点声明和使用参数的教程,请参阅在类(C++)中使用参数或在类(Python)中使用参数。

对于某些类型的节点,并非所有参数都会提前知道。在这些情况下,可以将allow_undeclaed_parameters设置为true来实例化节点,这将允许在节点上获取和设置参数,即使它们尚未声明。

参数类型

ROS 2节点上的每个参数都具有概述中提到的预定义参数类型之一。默认情况下,在运行时更改声明参数类型的尝试将失败。这可以防止常见错误,例如将布尔值放入整数参数。

如果参数需要是多个不同的类型,并且使用该参数的代码可以处理它,则可以更改此默认行为。声明参数时,应使用dynamic_typeing成员变量设置为true的ParameterDescriptor声明该参数。

示例:

#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等方法声明节点的所有参数。在声明中,指定参数名称和默认值。

•使用get parameter等函数获取其值,指定参数的名称和存储其值的位置。

•有一些方法可以分块实现。

•可以随时读取参数,甚至可以实时订阅修改。然而,在启动时读取它们会使代码更容易预测。


所有ROS节点都采用一组参数,允许重新配置各种属性。示例包括配置节点的名称/命名空间、使用的主题/服务名称以及节点上的参数。必须在--ROS args标志之后指定所有ROS特定参数:

ros2 run my_package node_executable --ros-args ...
  • ros2 run br2 basics param reader

  • ros2 run br2 basics param reader --ros-args -p number_particles:=300

  • 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]’

使用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

使用YAML文件配置参数:

install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME})

localization_node:
  ros__parameters:
    number_particles: 300
    topics: [scan, image]
    topic_types: [sensor_msgs/msg/LaserScan, sensor_msgs/msg/Image]

加载:

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

或者:

ros2 run br2 basics param reader --ros-args --params-file install/basics/share/basics/config/params.yaml

更多案例如下:

  1. ros2 run demo_nodes_cpp talker --ros-args -r __ns:=/demo -r __node:=my_talker -r chatter:=my_topic

  1. ros2 run composition manual_composition --ros-args -r talker:__node:=my_talker -r listener:__node:=my_listener

  1. ros2 run composition manual_composition --ros-args -r talker:__node:=my_talker -r my_talker:chatter:=my_topic -r listener:__node:=my_listener -r my_listener:chatter:=my_topic

  1. ros2 run package_name executable_name --ros-args -p param_name:=param_value

  1. ros2 run demo_nodes_cpp parameter_blackboard --ros-args -p some_int:=42 -p "a_string:=Hello world" -p "some_lists.some_integers:=[1, 2, 3, 4]" -p "some_lists.some_doubles:=[3.14, 2.718]"

  1. ros2 run demo_nodes_cpp parameter_blackboard --ros-args --params-file demo_params.yaml

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

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

相关文章

【区块链】深入剖析免费赚钱app的本质

你对免费赚钱软件好奇吗&#xff1f;前言一、揭开“免费赚钱app”神秘面纱1.常见的赚钱app2.app真的在做慈善吗&#xff1f;3.羊毛党的价值4.真正的游戏规则二、区块链1.哈希算法2.互联网挖矿三、深入探讨“区块链”的套路1.免费赚钱app真正的价值2.虚拟货币的本质3.虚拟货币泡…

Java设计模式-观察者模式/观察者模式适合那些场景?怎么使用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.7 观察者模式 6.7.1 定义 又称发布-订阅模式&#xff0c;定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象主体对象在状态变化…

[前端笔记——CSS] 9.CSS处理文件的标准流程+DOM

[前端笔记——CSS] 9.CSS处理文件的标准流程DOM1.CSS处理文件的标准流程2.关于DOM2.1 举个例子2.2 应用 CSS 到 DOM1.CSS处理文件的标准流程 当浏览器展示一个文件的时候&#xff0c;它必须兼顾文件的内容和文件的样式信息&#xff0c;CSS处理文件的标准流程如下&#xff1a; …

06_FreeRTOS临界区代码保护

目录 临界段代码保护简介 临界段代码保护函数介绍 任务级临界区函数详解 中断级临界区函数详解 临界段代码保护简介 什么是临界段:临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段 适用场合如: 1.外设:需严格按照时序初始化的外设:IIC、SPI等等 2.系统…

国家发明专利:基于改进型黏菌优化算法的业务资源分配方法

国家发明专利&#xff1a;基于改进型黏菌优化算法的业务资源分配方法 摘要 本发明公开了一种基于改进型黏菌优化算法的业务资源分配方法&#xff0c;其步骤包括&#xff1a;1将生产任务分成若干个环节&#xff0c;构建有向环状分配网络&#xff1b;2构建工厂参数矩阵并归一化&…

力扣98.验证二叉搜索树

文章目录力扣98.验证二叉搜索树题目描述算法思路代码实现力扣98.验证二叉搜索树 题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 …

领域驱动设计(DDD)的几种典型架构介绍

我们生活中都听说了DDD&#xff0c;也了解了DDD&#xff0c;那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢&#xff1f; 一、专业术语 各种服务 IAAS&#xff1a;基础设施服务&#xff0c;Infrastructure-as-a-service PAAS&#xff1a;平台服务&#xff0c…

【Java寒假打卡】JavaWeb-Servlet基础

【Java寒假打卡】JavaWeb-Servlet基础介绍servlet快速入门servlet的执行过程servlet关系视图Servlet实现方式-继承HTTPSERVLETServlet的生命周期线程安全问题servlet的映射方式案例-多路径映射问题-指定名称的方式Servlet的创建时机默认Servlet介绍 servlet是运行在Java服务器…

免费分享一套 SpringBoot + Vue + ElementUI 的人力资源管理系统,挺漂亮的

大家好&#xff0c;我是锋哥&#xff0c;看到一个不错的SpringBoot Vue ElementUI 的人力资源管理系统&#xff0c;分享下哈。 项目介绍 项目背景 人力资源管理是企业运营中必不可少的一环&#xff0c;它关系到企业的前途与发展。尤其对于中小微企业来说&#xff0c;对企业…

积分分离PID控制算法及仿真-1

在普通 PID 控制中引入积分环节的目的&#xff0c;主要是为了消除静差&#xff0c;提高控制精度。但在过程的启动、结束或大幅度增减设定时&#xff0c;短时间内系统输出有很大的偏差&#xff0c;会造成PID运算的积分积累&#xff0c;致使控制量超过执行机构可能允许的最大动作…

Vue项目基础环境搭建完整步骤

使用vue官方脚手架(vue-cli) vue-cli简介 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统&#xff0c;是一个官方脚手架&#xff0c;可以帮助我们快速创建vue项目工程目录&#xff0c;目前最新版本4.x。 Vue CLI 致力于将 Vue 生态中的工具基础标准化。它确保了各种构建…

第三天总结 之 商品管理界面的实现 之 模糊查询 与 数据在页面展示

商品管理界面的实现 模糊查询 第一步&#xff1a; 明确 查询时 需要的 条件 即sql语句中 where 后的条件 如 &#xff1a; 根据前端 可以发现 模糊查询可以通过 商品名称 日期 商品类型 来查询 所以在对应的controller层下的GoodsFuzzySelectServlet中首先要获取这三个属性的…

《深入浅出计算机组成原理》学习笔记 Day6

二进制编码1. “逢二进一”2. 字符串的表示参考1. “逢二进一” 把一个二进制数对应到十进制&#xff0c;就是把从右到左的第 N 位&#xff0c;乘上一个2 的 N 次方&#xff0c;然后加起来&#xff0c;就成了一个十进制数。从右到左的位置&#xff0c;是从 0 开始的。 例如&a…

初识C语言:IDE的选择与使用【C语言】

本文是本专栏【C语言】的第一篇文章&#xff0c;也是博主最近半年以来的更新第一篇文章&#xff0c;如果觉得有帮助&#xff0c;可以点赞支持一下&#xff01;另外本专栏最后会做一篇类似于【python爬虫】专栏最后的那篇整合的文章&#xff0c;把C语言的所有基础知识用一篇文章…

深度学习 GNN图神经网络(三)模型思想及文献分类案例实战

如果你有一定神经网络的知识基础&#xff0c;想学习GNN图神经网络&#xff0c;可以按顺序参考系列文章&#xff1a; 深度学习 GNN图神经网络&#xff08;一&#xff09;图的基本知识 深度学习 GNN图神经网络&#xff08;二&#xff09;PyTorch Geometric&#xff08;PyG&#x…

Nginx入门与应用

NginxNginx概述Nginx介绍Nginx下载和安装windowsLinuxNginx目录结构Nginx命令查看版本检查配置文件正确性启动和停止重新加载配置文件Nginx环境变量&#xff08;Linux&#xff09;Nginx配置文件结构Nginx具体应用部署静态资源反向代理负载均衡Nginx概述 Nginx介绍 Nginx是一款…

Linux系统——基础IO

要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累&#xff0c;都需要过程&#xff01; 目录 1.文件基础必备概念 2.文件系统调用接口 1.open && close 2.write 3.read 3.文件描述符fd 3.1什么是文件描述符 3.2文件描述符意义 3.3文件描述符的分配…

【C++】map和set的模拟实现

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;红黑树的…

一个线程如何处理多个连接?(非阻塞IO)

从BIO到NIO的转变 五种IO模型BIO的缺陷非阻塞非阻塞IO&#xff08;NIO&#xff09;非阻塞读非阻塞写非阻塞IO模型php NIO 实现适用场景什么是C10k问题&#xff1f;C10K问题的由来五种IO模型 在《UNIX 网络编程》一书中介绍了五种IO模型&#xff1a; 分别是 BIO&#xff0c;NIO…

无线电基础电路 > RLC阻尼系数计算仿真

随机搭建电路如下图所示&#xff1a; 阻尼系数的希腊字母符号“ ζ ”读作泽塔。 阻尼系数ζ (R/2) * √C/L 1000/2 * √0.00001 1.58 包括三种情况&#xff1a; ζ>1&#xff1a;过阻尼&#xff0c;频响不利落&#xff0c;需要较长时间才能消失。 ζ<1&#xff…