【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_directory

from 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_pub
        rclcpp
        sensor_msgs
        cv_bridge
        )
# ------------------------------------------------------
# 安装可执行文件
install(TARGETS
         demo_pub
        DESTINATION lib/${PROJECT_NAME}
        )
# 安装其他文件,如参数文件、启动文件等
install(DIRECTORY
        launch
        config
        DESTINATION 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 os

from ament_index_python.packages import get_package_share_directory

from 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中的一样


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

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

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

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

相关文章

pyspark中使用mysql jdbc报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决

报错信息&#xff1a; py4j.protocol.Py4JJavaError: An error occurred while calling o33.load. : java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 我的解决方法&#xff1a; 这个报错就是提示你找不到jar包&#xff0c;所以你需要去下载一个和你mysql版本匹配的j…

什么是突发性耳聋?

72小时内突然发生、原因不明的感音神经性听力损失&#xff0c;至少在相邻的两个频率听力下降≥20dBHL。 特点&#xff1a; 1发生在数分钟、数小时或3天以内的听力下降&#xff1b; 2原因不明&#xff1b; 3多发生于单侧&#xff0c;可伴有耳鸣、耳堵塞感及耳周麻木感&#…

CSS - 说一说什么是脱离文档流

说脱离文档流之前呢&#xff0c;我们得知道什么是文档流吧。人们常说你脱离组织了&#xff0c;脱离大部队了&#xff0c;你连大部队都没有加入&#xff0c;还脱离个啥呀&#xff0c;是吧。 文档流 我们知道HTML中有盒模型&#xff0c;有行内元素&#xff0c;有块元素&#xf…

牛客网刷题 | BC117 逆序输出

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 输入10个整数&…

统计学研硕大数据统计练手11

统计学论文练手作业 题目AI绘图仅供欣赏 题目 2024年的《政府工作报告》中提出“深化大数据、人工智能等研发应用,开展“人工智能+”行动,打造具有国际竞争力的数字产业集群”,请同学们结合自己工作的所在行业或领域谈一谈大数据技术在人工智能时代下的应用现状、存在的问…

人体部位眼耳手腿分类数据集4376张4类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;4376 分类类别数&#xff1a;4 类别名称:["Ears","Eyes&quo…

【PL理论】(11) F#:标准库之 Set | 标准库之 Map

&#x1f4ad; 写在前面&#xff1a;本章我们将简要的介绍一下 Set 和 Map &#xff08;非常简要&#xff0c;简要至极&#xff09; 目录 0x00 标准库之集合&#xff08;Set&#xff09; 0x01 标准库之 Map 0x00 标准库之集合&#xff08;Set&#xff09; 集合中的元素具有…

【全开源】Workerman在线客服系统(ThinkPHP+FastAdmin+Workerman)

Workerman在线客服系统&#xff1a;高效沟通的新选择 基于ThinkPHPFastAdminWorkerman开发的一款实时在线客服系统&#xff0c;支持多客服(不限座席)、知识库、离线留言板、离线消息、历史会话、微信小程序接入、Uni-app接入(高级授权)、用户轨迹等功能。​ &#x1f4e2; 一…

牛客网刷题 | BC118 N个数之和

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 输入数字N&#xf…

PyTorch学习6:多维特征输入

文章目录 前言一、模型说明二、示例1.求解步骤2.示例代码 总结 前言 介绍了如何处理多维特征的输入问题 一、模型说明 多维问题分类模型 二、示例 1.求解步骤 1.载入数据集&#xff1a;数据集用路径D:\anaconda\Lib\site-packages\sklearn\datasets\data下的diabetes.cs…

LeetCode | 1470.重新排列数组

class Solution(object):def shuffle(self, nums, n):""":type nums: List[int]:type n: int:rtype: List[int]"""result []for i in range(n):result.append(nums[i])result.append(nums[i n])return result这题很容易想到的就是遍历整个数组…

微信小程序学习笔记(2)

文章目录 1、view2、scroll-view3、swiper 和 swiper-item4、text5、button6、image-------------------------------------------------------------1、< movable-view>2、cover-view3、icon4、text5、rich-text6、progress7、lable8、form9、picker普通选择&#xff1a…

Llama模型家族之Stanford NLP ReFT源代码探索 (一)数据预干预

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

基于JSP的医院远程诊断系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; JSP Servlet JSPBean 工具&#xff1a; IDEA/Eclipse、Navica…

前端生成海报图技术选型与问题解决

作者&#xff1a;vivo 互联网大前端团队 - Tian Yuhan 本篇文章主要聚焦海报图分享这个形式&#xff0c;探讨纯前端在H5&小程序内&#xff0c;合成海报到下载到本地、分享至社交平台整个流程中可能遇到的问题&#xff0c;以及如何解决。 一、引言 绝大多数的电商平台都会…

持续监控和优化的简单介绍

DevOps 监控提供了有关生产环境状况的全面且最新的信息&#xff0c;以及有关其服务、基础设施和应用程序的详细信息。通过从日志和指标中收集数据&#xff0c;您可以在软件开发生命周期的每个步骤中监控合规性和性能。 监控不仅仅针对生产问题&#xff0c;它涵盖了规划、开发、…

USB (2)

USB transaction 以2.0的枚举过程为例。 首先是TOKEN TRANSACTION&#xff0c;其次是DATA TRANSACTION&#xff0c;再次是Handshake Transaction。 上面的SETUP TRANSACTION是TOKEN TRANSACTION的一种。另外三种是OUT, IN, SOF。 在每个TRANSACTION中又包含了3个STAGE&#x…

【学术小白成长之路】02三方演化博弈(基于复制动态方程)期望与复制动态方程

从本专栏开始&#xff0c;笔者正式研究演化博弈分析&#xff0c;其中涉及到双方演化博弈分析&#xff0c;三方演化博弈分析&#xff0c;复杂网络博弈分析等等。 先阅读了大量相关的博弈分析的文献&#xff0c;总结了现有的研究常用的研究流程&#xff0c;针对每个流程进行拆解。…

Responder工具

简介 Responder是一种网络安全工具&#xff0c;用于嗅探和抓取网络流量中的凭证信息&#xff08;如用户名、密码等&#xff09;。它可以在本地网络中创建一个伪造的服务&#xff08;如HTTP、SMB等&#xff09;&#xff0c;并捕获客户端与该服务的通信中的凭证信息。 Responder工…

PD线与Type C

大家的iPhone10以上是否把充电器使用正确啦&#xff0c;这里特指iPhone使用的接口(口子&#xff09;。而通常的pd接口指的是电源传输协议&#xff0c;苹果有快充线或者快充头和线&#xff0c;指的就是这个传输协议。有人用错的地方是&#xff0c;充电线使用错方向了&#xff0c…