当前位置: 首页 > news >正文

【ROS2大白话】四、ROS2非常简单的传参方式

系列文章目录

【ROS2大白话】一、ROS2 humble及cartorgrapher安装
【ROS2大白话】二、turtlebot3安装
【ROS2大白话】三、给turtlebot3安装realsense深度相机
【ROS2大白话】四、ROS2非常简单的传参方式


文章目录

  • 系列文章目录
  • 前言
  • 一、launch文件传参的demo
    • 1. 编写launch.py文件
    • 2. 编写C++代码
    • 3. 编写CMakeLists.txt
    • 4. 编写package.xml
  • 二、yaml文件传参的demo
    • 1. 编写launch.py文件
    • 2. 编写config.yaml文件
    • 3. 编写C++代码
    • 4. 同上


前言

很多时候,我们需要给ros节点传参数,参数一般写在launch文件或者yaml文件中,不会写在应用开发代码中,原因主要是编译比较费时。本节提供两种非常简便适用的传参方法,一个是launch文件写参数,一个是yaml文件写参数。一看就会,一学就废。


一、launch文件传参的demo

  • package名:hello_ros
  • executable名: demo_pub
  • node名: demo_pub

注意,你自己创建包的时候如果没有按照上述名字来写的话,那你记得拷贝代码时改成自己的名称

这个demo中,我们是直接在launch文件中写入了一个rgb_topic的参数,赋值为’/camera/color/image_raw’

然后通过node节点来读取参数rgb_topic。读取的方法用的是rclcpp::NodeOptions方法。这个声明参数的方法相较于传统的declare_parameter、get_parameter操作更加简单,大家可以尝试一下。

1. 编写launch.py文件

import os
from ament_index_python.packages import get_package_share_directoryfrom launch import LaunchDescription
from launch_ros.actions import Node# 方法一、直接在launch文件中写参数
def generate_launch_description():return LaunchDescription([Node(package='hello_ros',executable='demo_pub',name='demo_pub',output='screen',parameters=[{'rgb_topic':'/camera/color/image_raw'},{'depth_topic':'/camera/depth/image_raw'}])])

2. 编写C++代码

#include <rclcpp/rclcpp.hpp>
#include "std_msgs/msg/string.hpp"int main(int argc, char **argv)
{rclcpp::init(argc, argv);// 传参 方法一rclcpp::NodeOptions nodeOptions;nodeOptions.automatically_declare_parameters_from_overrides(true);auto node2 = rclcpp::Node::make_shared("node2", nodeOptions);std::string rgb_topic;node2->get_parameter("rgb_topic", rgb_topic);printf("===> %s \n", rgb_topic.c_str());// 单线程执行器 灵活管理node节点,非堵塞rclcpp::executors::SingleThreadedExecutor executor;executor.add_node(node2);std::thread([&executor](){ executor.spin(); }).detach();// rclcpp::spin(node2);std::cout << "1111111111111" << std::endl;rclcpp::shutdown();return 0;
}

代码里用了ros2的单线程执行器SingleThreadedExecutor,它可以解决传统的spin阻塞问题。假如你用

rclcpp::spin(node2);

那么后续的1111111111111打印就一直不会执行。

3. 编写CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(hello_ros)
# 启用C++14
add_compile_options(-std=c++14)# 查找ROS2包
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)# 包含头文件目录
include_directories(include)
# ------------------------------------------------------# 添加可执行文件
add_executable(demo_pub src/demo_pub.cpp)# 链接依赖库
ament_target_dependencies(demo_pubrclcppsensor_msgscv_bridge)
# ------------------------------------------------------
# 安装可执行文件
install(TARGETSdemo_pubDESTINATION lib/${PROJECT_NAME})
# 安装其他文件,如参数文件、启动文件等
install(DIRECTORYlaunchconfigDESTINATION share/${PROJECT_NAME})
# 导出依赖信息
ament_package()

4. 编写package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>hello_ros</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="yab@todo.todo">yab</maintainer><license>TODO: License declaration</license><buildtool_depend>ament_cmake</buildtool_depend><depend>rclcpp</depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

在这里插入图片描述

运行结果跟launch文件里的参数一致。

二、yaml文件传参的demo

代码文件结构跟上个demo的区别就是新增了一个config文件夹和config.yaml文件

1. 编写launch.py文件

import osfrom ament_index_python.packages import get_package_share_directoryfrom launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node# 方法二、在yaml文件中写参数,利用launch文件来加载yaml文件
def generate_launch_description():config_path = os.path.join(get_package_share_directory('hello_ros'),'config','config.yaml')declare_param_file_cmd=DeclareLaunchArgument('param_file',default_value= config_path# 'Full path to the ROS2 parameters file')return LaunchDescription([declare_param_file_cmd,Node(package='hello_ros',executable='demo_pub',name='demo_pub',output='screen',parameters=[LaunchConfiguration('param_file')])])

为了读取yaml文件,所以launch文件中增加了几个配置,分别是DeclareLaunchArgumentLaunchConfiguration

  • DeclareLaunchArgument是加载yaml配置文件路径
  • LaunchConfiguration是把加载完的yaml文件进行解析

2. 编写config.yaml文件

yaml文件内容结构是 node名称、ros__parameters、自定义的参数名。其中ros__parameters的下划线是两个下划线组合,千万要注意,不然会报错。(我就是被这个小问题困扰了很久)

特别注意:yaml文件结构一定要完全一样

demo_pub:ros__parameters:rgb_topic: "ryan"

3. 编写C++代码

#include <rclcpp/rclcpp.hpp>
#include "std_msgs/msg/string.hpp"int main(int argc, char **argv)
{rclcpp::init(argc, argv);// 传参 方法二rclcpp::NodeOptions nodeOptions;nodeOptions.automatically_declare_parameters_from_overrides(true);auto node_parameter=rclcpp::Node::make_shared("demo_pub", nodeOptions);std::string rgb_topic;node_parameter->get_parameter("rgb_topic", rgb_topic);printf("===> %s \n", rgb_topic.c_str());// 单线程执行器 灵活管理node节点,非堵塞rclcpp::executors::SingleThreadedExecutor executor;executor.add_node(node_parameter);std::thread([&executor](){ executor.spin(); }).detach();rclcpp::shutdown();return 0;
}

4. 同上

CMakeLists.txt和package.xml跟上一个demo完全一样,这里就不贴了。

在这里插入图片描述
运行结果跟config.yaml中的一样


觉得对您有帮助的,可以点个赞👍支持一下,谢谢各位!

因为淋过雨,所以想为别人撑把伞;因为踩过太多坑,所以想让喜欢机器人的同学们减少试错成本!

相关文章:

【ROS2大白话】四、ROS2非常简单的传参方式

系列文章目录 【ROS2大白话】一、ROS2 humble及cartorgrapher安装 【ROS2大白话】二、turtlebot3安装 【ROS2大白话】三、给turtlebot3安装realsense深度相机 【ROS2大白话】四、ROS2非常简单的传参方式 文章目录 系列文章目录前言一、launch文件传参的demo1. 编写launch.py文…...

浅谈mysql 的批量delete 和 使用in条件批量删除问题

在考虑这两个DELETE语句的性能时&#xff0c;我们需要考虑数据库如何执行这些查询以及它们背后可能涉及的索引和数据结构。 1.执行多个单独的DELETE语句&#xff1a; DELETE FROM a WHERE b 1 AND c 1; ... DELETE FROM a WHERE b 1000 AND c 1000; 这种方法的优点是每…...

【Spring Boot】过滤敏感词的两种实现

文章目录 项目场景前置知识前缀树 实现方式解决方案一&#xff1a;读取敏感词文件生成前缀树构建敏感词过滤器1. 导入敏感词文件 src/main/resources/sensitive_words.txt2. 构建敏感词过滤器 SensitiveFilter3. 测试与使用 解决方案二&#xff1a;使用第三方插件 houbb/sensit…...

在 Zustand 中管理状态能使用类(Class)吗

在 Zustand 中&#xff0c;通常不推荐使用类&#xff08;Class&#xff09;来管理状态&#xff0c;因为 Zustand 的设计理念是基于函数式编程和 React Hooks 的。然而&#xff0c;仍然可以在 Zustand 中间接地使用类&#xff0c;但这并不是 Zustand 的典型用法。 如果确实想要…...

MoreTable 方法selectWithFun,count 使用实例

ORM Bee, example for MoreTable methods:selectWithFun,count ORM Bee时, MoreTable 方法selectWithFun,count 使用实例 package org.teasoft.exam.bee.osql;import org.teasoft.bee.osql.BeeException; import org.teasoft.bee.osql.FunctionType; import org.teasoft.be…...

【SpringBoot】在Spring中使用自定义条件类在Java声明Bean时实现条件注入

在Spring框架中&#xff0c;通过实现org.springframework.context.annotation.Condition接口并重写matches()方法&#xff0c;可以根据自定义条件来控制Bean的注入。这种机制非常灵活&#xff0c;可以帮助开发人员根据环境或配置来有选择地启用或禁用某些Bean。本文将详细介绍如…...

网卡聚合链路配置

创建名为mybond0的绑定&#xff0c;使用示例如下&#xff1a; # nmcli con add type bond con-name mybond0 ifname mybond0 mode active-backup添加从属接口&#xff0c;使用示例如下&#xff1a; # nmcli con add type bond-slave ifname enp3s0 master mybond0要添加其他从…...

PlantSimulation导入cad图作为背景

PlantSimulation导入cad图作为背景 首先要整理cad文件&#xff0c;正常的工艺规划总图中存在较多杂乱文件&#xff0c;这些信息是不需要的&#xff0c;如果直接导入&#xff0c;会非常卡。 1、打开cad软件&#xff0c;使用layon命令打开所有的隐藏图层&#xff0c;删除不需要…...

【大模型】个人对大模型选择的见解

选择大模型产品时&#xff0c;需要考虑多个因素&#xff0c;包括但不限于以下几点&#xff1a; 需求匹配度&#xff1a;首先&#xff0c;要明确你的需求是什么。不同的大模型产品可能在功能、性能、应用场景等方面有所侧重。例如&#xff0c;有的模型擅长自然语言处理&#xff…...

java的反射和python的鸭子类型

Java的反射&#xff08;Reflection&#xff09;和Python的鸭子类型&#xff08;Duck Typing&#xff09;感觉相似但又说不出具体的细节&#xff0c;本文借助kimi试图给出总结。 相似之处&#xff1a; 动态性&#xff1a;Java的反射允许程序在运行时查询、创建和修改类和对象的…...

爬虫工具yt-dlp

yt-dlp是youtube-dlp的一个fork&#xff0c;youtube-dlp曾经也较为活跃&#xff0c;但后来被众多网站屏蔽&#xff0c;于是大家转而在其基础上开发yt-dlp。yt-dlp的github项目地址为&#xff1a;GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloaderA …...

【代码随想录训练营】【Day 50】【动态规划-9】| Leetcode 198, 213, 337

【代码随想录训练营】【Day 50】【动态规划-9】【需二刷】| Leetcode 198, 213, 337 需强化知识点 需二刷&#xff0c;打家劫舍系列 题目 198. 打家劫舍 class Solution:def rob(self, nums: List[int]) -> int:if len(nums) 1:return nums[0]dp [0] * (len(nums))dp…...

源码讲解kafka 如何使用零拷贝技术(zero-copy)

前言 kafka 作为一个高吞吐量的分布式消息系统,广泛应用与实时应用场景中。为了实现高效的数据传输,kafka使用了零拷贝技术(zero-copy)显著提高了性能。本文将详细讲解 Kafka 如何利用零拷贝技术优化数据传输。 什么是零拷贝 零拷贝技术目的是减少数据传输的效率。在传统…...

Ubuntu20.04配置qwen0.5B记录

环境简介 Ubuntu20.04、 NVIDIA-SMI 545.29.06、 Cuda 11.4、 python3.10、 pytorch1.11.0 开始搭建 python环境设置 创建虚拟环境 conda create --name qewn python3.10预安装modelscope和transformers pip install modelscope pip install transformers安装pytorch co…...

java自学阶段二:JavaWeb开发--day80(项目实战2之苍穹外卖)

《项目案例—黑马苍穹外卖》 目录&#xff1a; 学习目标项目介绍前端环境搭建(前期直接导入老师的项目&#xff0c;后期自己敲&#xff09;后端环境搭建&#xff08;导入初始项目&#xff0c;新建仓库使用git管理项目&#xff0c;新建数据库&#xff0c;修改登录功能&#xff…...

HPUX系统Oracle RAC如何添加ASM磁盘

前言 HPUX简介 HP-UX (Hewlett-Packard Unix) 是惠普公司开发的类 Unix 操作系统。自 1980 年代问世以来&#xff0c;HP-UX 在技术和功能上不断发展&#xff0c;适应了多种硬件平台和企业计算需求。以下是 HP-UX 的发展历史概述&#xff1a; 1980 年代&#xff1a;起源与早期…...

Jmeter 压力测测试的简单入门

下载安装 官方网站&#xff1a;Apache JMeter - Download Apache JMeter 下载完成解压即可。 配置 1. 找到 bin 目录下的 ApacheJMeter.jar 包&#xff0c;直接打开 如果向图片这样不能直接打开&#xff0c;就在此路径运行 CMD&#xff0c;然后输入下面的命令即可启动。 ja…...

N叉树的层序遍历-力扣

本题同样是二叉树的层序遍历的扩展&#xff0c;只不过二叉树每个节点的子节点只有左右节点&#xff0c;而N叉树的子节点是一个数组&#xff0c;层序遍历到一个节点时&#xff0c;需要将这个节点的子节点数组的每个节点都入队。 代码如下&#xff1a; /* // Definition for a N…...

解决阿里云的端口添加安全组仍然无法扫描到

发现用线上的网站扫不到这个端口&#xff0c;这个端口关了&#xff0c;但是没有更详细信息了 我用nmap扫了一下我的这个端口&#xff0c;发现主机是活跃的&#xff0c;但是有防火墙&#xff0c;我们列出云服务器上面的这个防火墙list&#xff0c;发现确实没有5566端口 参考&a…...

【因果推断python】26_双重稳健估计1

目录 不要把所有的鸡蛋放在一个篮子里 双重稳健估计 关键思想 不要把所有的鸡蛋放在一个篮子里 我们已经学会了如何使用线性回归和倾向得分加权来估计 。但是我们应该在什么时候使用哪一个呢&#xff1f;在不明确的情况下&#xff0c;请同时使用两者&#xff01;双重稳健估计…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...