【ROS入门篇·五】launch文件使用 & 向节点传递参数

2023-05-16

快速链接:【ROS入门篇】ROS学习简介

一、launch文件使用

1.1 launch文件简介

·launch文件能够同时启动一个ROS Master和多个Node

·launch文件的标签

<launch>      <!--根标签-->
<node>        <!--需要启动的node及其参数-->
<include>     <!--包含其他launch-->
<machine>     <!--指定运行的机器-->
<arg>         <!--定义变量-->
<param>       <!--定义参数到参数服务器-->
<rosparam>    <!--启动yaml文件参数到参数服务器-->
<remap>       <!--设定参数映射-->
<group>       <!--设定命名空间-->
<env-loader>  <!--设置环境变量-->
</launch>     <!--根标签-->

1.2 launch文件基本示例

<launch>
    <!--arg是launch标签中的变量声明,arg的name为变量名,default或者value为值-->
    <arg name="robot" default="xbot2"/>
    <arg name="debug" default="false"/>
    <arg name="gui" default="true"/>
    <arg name="headless" default="false"/>
    <arg name="velodyne_frame_id" default="velodyne"/>

    <!--从xx.yaml文件中加载参数到参数服务器,ns声明工作空间,可以省略-->
    <rosparam command="load" file="$(find test01)/launch/params.yaml" ns="hello"/>  

    <!-- Start Gazebo with a blank world --> <!--include用来嵌套仿真场景的launch文件-->
    <include file="$(find gazebo_ros)/launch/empty_world.launch"> 
        <arg name="world_name" value="$(find robot_sim_demo)/worlds/ROS-Academy.world"/>
        <arg name="debug" value="$(arg debug)" />
        <arg name="gui" value="$(arg gui)" />
        <arg name="paused" value="false"/>
        <arg name="use_sim_time" value="true"/>
        <arg name="headless" value="$(arg headless)"/>
    </include>

    <!-- 启动process_sub_pub节点 -->
    <node pkg="process_velodyne" type="velodyne_sub_pub" name="velodyne_sub_pub" output="screen" >
        <param name="velodyne_frame_id" type="string" value="$(arg velodyne_frame_id)"/>
        <remap from="velodyne_points" to="processed_points"/remap>
    </node>

    <!--如果你想连同RViz一起启动,可以按照以下方式加入RViz这个node-->
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find robot_sim_demo)/urdf_gazebo.rviz" />
</launch>

二、ROS中Parameter server机制

  •  用于存储节点参数,以键值对的形式存储,全局共享

2.1 Parameter server中参数维护方式

1) 命令行维护

2) launch文件进行读写

  • 写入单个参数到参数服务器 <param>
<!--直接定义参数并赋值-->
<param name="velodyne_frame_id" type="string" value="velodyne"/>

<!--定义参数并通过arg给参数赋值-->
<arg name="velodyne_frame_id" default="velodyne"/>
<param name="velodyne_frame_id" type="string" value="$(arg velodyne_frame_id)"/>
  • 从.yaml文件批量写入参数到参数服务器 <rosparam>
<!--从../config/params.yaml文件中加载参数 -->
<rosparam command="load" file="$(find *package_name)/config/params.yaml" />

3) 节点源码内进行读写(C++)

C++节点中实现参数服务器的读写有两套API系统:

  • ros::NodeHandle
/**
 * C++中分别通过ros::NodeHandle实现参数服务器中参数的读写  
 **/

#include "ros/ros.h"

int main(int argc, char *argv[])
{
    //初始化ros节点
    ros::init(argc,argv,"param_demo_node");
    
    //创建ros节点句柄
    ros::NodeHandle nh;
    string node_param;
    std::vector<std::string> param_names;
    
    // 新增参数到参数服务器中
    nh.setParam("param_1", 1.0);

    // 读取参数
    // 如果参数服务器中参数"param_2"存在, 把"param_2"的值传递给变量node_param;如果"param_2"不存在,就传递默认值"hahaha"
    nh.param<std::string>("param_2",node_param,"hahaha");

    // 如果参数"param_2"存在,返回true,并赋值给变量node_param;如果"param_2"不存在,返回false,不赋值
    nh.getParam("param_2", node_param);

    //其他功能
    nh.getParamNames(param_names);
    nh.hasParam("param_2");
    nh.searchParam("param_2",node_param);
}
  • ros::param
/**
 * C++中分别通过ros::param实现参数服务器中参数的读写  
 **/

#include "ros/ros.h"

int main(int argc, char *argv[])
{
    //初始化ros节点
    ros::init(argc,argv,"param_demo_node");
    
    string node_param;
    std::vector<std::string> param_names;
    
    // 新增参数到参数服务器中
    ros::param::set("param_1", 1.0);

    // 读取参数
    // 如果参数服务器中参数"param_2"存在, 把"param_2"的值传递给变量node_param;如果"param_2"不存在,就传递默认值"hahaha"
    node_param = ros::param::param("param_2","hahaha");

    // 如果参数"param_2"存在,返回true,并赋值给变量node_param;如果"param_2"不存在,返回false,不赋值
   ros::param::get("param_2", node_param);

    //其他功能
    ros::param::getParamNames(param_names);
    ros::param::has("param_2");
    ros::param::search("param_2",node_param);
}

三、向ROS节点传递参数的多种方法(C++)

3.1 通过参数服务器的方式传递

  • 通过launch文件启动节点
<launch>
    <node pkg="process_velodyne" type="velodyne_sub_pub" name="velodyne_sub_pub" output="screen" >
        <param name="velodyne_frame_id" type="string" value="$(arg velodyne_frame_id)"/>
    </node>
</launch>
  • 通过rosrun启动节点,参数前面加_,用:=的方式来赋值
rosrun process_velodyne velodyne_sub_pub _velodyne_frame_id:="velodyne"
  • 节点中读取参数(见2.1节内容)

3.2 通过main()函数参数的形式传递

  • 通过launch文件启动节点
<launch>
    <node pkg="process_velodyne" type="velodyne_sub_pub" name="velodyne_sub_pub" args="arg1 arg2" output="screen"/>
</launch>
  • 通过rosrun启动节点,参数通过空格隔开
rosrun proess_velodyne velodyne_sub_pub arg1 arg2
  • 节点中读取参数

在节点中main()函数内,argv[0]是节点名称,argv[1], argv[2]...依次是输入的参数

tips:

1、终端动态设置参数(通过终端运行launch文件/运行节点)

·使用rosrun启动节点设置参数,需要添加_velodyne_frame_id:="velodyne",参数名前面有下划线,表示当前节点下设置私有参数

rosrun process_velodyne velodyne_sub_pub _velodyne_frame_id:="velodyne"

·使用roslaunch启动launch文件,参数名前不需要下划线

roslaunch process_velodyne velodyne_sub_pub velodyne_frame_id:="velodyne"

Q:在使用rosrun/launch向main()函数传递参数时,-d, -r, --hz这类是什么意思?是指定名名称的参数么?

<launch>
    <node name="rosplay"pkg="rosbag"type="play"args="−s 5 −r 1 −−clock −−hz=10 (find costmap_2d)/test/simple_driving_test_indexed.bag" />
</launch>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ROS入门篇·五】launch文件使用 & 向节点传递参数 的相关文章

  • 中断与DMA

    中断 Cortex M3256 个优先级和 128 个抢占级悬起pending 中断中断的类型中断结构 DMA通道映射源传输和目标传输寄存器中断状态寄存器和中断标志清除寄存器通道x配置DMA stream x configuration r
  • keil编译时候出现function “ ” declared implicitly的解决方法

    在警告信息function declared implicitly双引号中的 表示的是所调用函数 xff0c 在调用该函数的前加 extern 声明即可
  • 2022年高教社杯全国大学生数学建模国赛B题思路详解

    1 比赛报名与思路解析 xff08 持续更新750967193 xff09 2 比赛时间 xff1a 2022年9月15日18点到2022年9月18日20点 如下为B题思路 xff1a 先贴题目 xff1a 如下是初步分析 xff1a 无人
  • 旋转矩阵、欧拉角之间转换

    学习过程中涉及欧拉角和旋转矩阵的转换 xff0c 索性整理学习一下欧拉角四元数和旋转矩阵的概念以及matlab中的互相转换 本文摘自各大课本 xff0c 博客 xff0c 自己学习整理使用 xff0c 侵删 MATLAB矩阵乘法从左到右依次
  • ROS中C++ boost编程,类内回调函数

    首先熟悉boost bind 定义如下函数 xff1a span class token keyword int span span class token function f span span class token punctuat
  • 理解头文件(.h)、库文件(.lib)、和动态链接库文件(.dll),Fortran中的预处理及Fortran中function的简单使用

    文章目录 问题来源我的问题头文件 库文件和动态链接库头文件 h库文件 lib动态链接库 dll三者的关系静态链接动态链接 初识 Fortran 预处理包含文件 include Fortran中function简单使用声明interface调
  • OpenCV计算机视觉库,Tensorflow深度学习框架

    OpenCV是计算机视觉库 xff0c 包含了大量的图像处理和计算机视觉的算法 xff0c 但是在机器学习方面明显不足 xff0c ML模块只有SVM xff0c MLP xff0c kNN等有限的几种算法 dnn模块也是调用别的框架 Te
  • 动态库和静态库

    概念 什么是库 库是写好的 xff0c 现有的 xff0c 成熟的 xff0c 可以复用的代码 现实中每个程序都要依赖很多基础的底层库 xff0c 不可能每个人的代码都从零开始 xff0c 因此库的存在意义非同寻常 本质上来说 xff0c
  • Linux 内核设计与实现 —— 1.内核简介

    文章目录 操作系统和内核简介内核包括 xff1a 内核与应用程序 xff1a 内核与硬件设备 xff1a 内核的运行模式 xff1a Linux内核与Unix内核比较单内核与微内核设计之比较Linux内核与Unix内核差异 操作系统和内核简
  • VIM基础操作

    方向键 xff1a hjkl输入 向后输入 xff1a a shift最前向前输入 xff1a i shift最后向下新生成一行输入 xff1a o shift上一行删掉当前字符并写入 xff1a s 撤销 xff1a u键盘重映设 vim
  • Git基础操作

    Git基础操作 仓库配置初始化仓库查看当前所在仓库修改远端仓库 代码提交基础操作tag操作删除最后N次提交储藏 代码管理分支操作patch操作查看指定文件的修改历史统计代码量 仓库配置 初始化仓库 1 xff0c 安装 sudo apt g
  • Google SRE 自我评分——《Google SRE: How Google runs production systems》

    Google SRE How Google runs production systems 0 xff1a you are unfamiliar with the subject area 0 xff1a 不熟悉的领域 也就是说对相关的领域
  • java基础之byte转换工具类

    1 Byte 转 byte public static byte toPrimitives Byte oBytes byte bytes 61 new byte oBytes length for int i 61 0 i lt oByte
  • VLAN技术

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是VLAN技术 介绍VLAN之前先来了解一下广播风暴 xff1a 在交换式以太网出现后 xff0c 同一个交换机下不同的端口处于不同的冲
  • shell基础操作

    shell基础操作 有待补充基础操作基础素养 使用需要转译的字符休眠账户密码权限管道清屏让命令在后台运行黑洞 硬件查看显示分辨率 软件删除软件和配置文件 文件操作复制 目录返回上一次目录 查找findgrep 文件夹大小对比文件类型删除文件
  • makefile基础

    makefile基础 编译和链接makefile基础格式clean的写法makefile构成使用其他的makefile引用其他的makefile引用方式makefile 查找方式 make 的工作方式添加define警告编译不过 编译和链接
  • DHCP协议

    DHCP协议 动态主机设置协议 xff0c 使用UDP协议工作用途 自动分配IP管理 服务器端使用67 udp xff0c 客户端使用68 udp基本过程 请求IP租约 xff08 discover xff09 客户端广播 xff0c 服务
  • Linux驱动程序概述

    怎么写驱动 看原理图写驱动写测试程序 流程 分配file operations结构体设置结构体成员 open 61 led open 配置为输出引脚 wirte 61 led write 设置引脚状态 注册 xff08 告诉内核 xff09
  • Linux boot API

    Linux boot API 代码主控头文件U BOOT CMD 终端命令sf nand xff08 nor nand flash xff09 具体用法使用范例 setenv 命令 代码 主控头文件 boot主逻辑在此 xff0c 以Ing
  • dash与bash

    dash与bash 背景dash与bash的区别shell配置错误的可能特征坑 xff01 xff01 xff01 查看shell真实配置切换 背景 平台Linux编译 xff0c 可能会遇到脚本设置类型不同 xff08 如 xff1a 芯

随机推荐

  • Linux 基础概念

    文章目录 POSIX动态库和静态库ioctl MCU架构RISC与CISCx86 ARM MIPS架构 U bootBootloader 两种模式主机和板子的传输方式启动顺序bootloader两个阶段U Boot 移植 分区Linux s
  • rosdep update遇到ERROR: error loading sources list: The read operation timed out问题

    链接 xff1a https blog csdn net DDonggggg article details 115798335
  • C++ HTTP实现

    文章目录 一 HTTP基础知识1 什么是Http协议 xff1a 2 常见HTTP头3 HTTP请求头概述 xff08 HttpServletRequest xff09 4 URL格式详解 xff1a 二 WinHttp入门及实战1 介绍2
  • ros+ Optitrack控制bebop2无人机

    准备工作 xff1a Motive的安装及使用 xff1a https blog csdn net weixin 41536025 article details 89913961 ros订阅 OptiTrack 的消息通过vrpn cli
  • stm32中typedef的用法

    C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称 xff0c 来替代系统默认的基本类型名称 数组类型名称 指针类型名称与用户自定义的结构型名称 共用型名称 枚举型名称等 一旦用户在程序中定义了自己的数据类型名称 xff
  • Python系列 49 内置模块:subprocess

    subprocess简介 subprocess模块最早在Python2 4中引入 xff0c 它会生成一个子进程 xff0c 该子进程可以执行shell命令 xff0c 并且会监听系统的标准输入管道 标准输出管道 标准错误管道 xff0c
  • python使用serial模块,通过串口控制云台(基于PELCO-D协议)

    一 需求描述 通过python实现对云台的控制 xff0c 使用到的相关模块 xff1a 1 pyserial xff0c 串口模块 xff0c 用于连接串口 xff0c 并通过串口发送指令 2 bytes xff0c 内置模块 xff0c
  • TP-LINK路由器如何设置上网

    1 登陆 xff0c 网址192 168 1 1 xff0c 登陆 xff0c 一般在路由器背后 xff0c 没有或者忘记就重置 2 设置导向 3 输入拨号 xff08 以太网 xff09 的账号密码 4 设置wifi账号密码 xff0c
  • (1+x)^(1/x)的导数

  • 电脑待机久了没有声音,需要重启才行

    这种原因一般是唤醒电脑后 xff0c 声卡驱动没有跟着苏醒导致 xff1b 方法一 xff1a 重启电脑 xff0c 简单粗暴 xff1b 方法二 xff1a 在设备器里面重启声音设备 xff0c 先禁用 xff0c 再重新 xff1b 也
  • Pycharm 中安装pywin32报错

    1 在pycharm的寻找并安装插件pywin32时报错 xff1b 大致意思是安装失败 xff0c 建议的解决方案 xff1a 尝试从系统终端运行此命令 确保使用正确的 pip 版本 xff0c 该版本已为位于如下地址 xff1a F p
  • win10下关闭笔记本自带键盘以及解锁

    win10下关闭笔记本自带键盘 管理员运行cmd sc config i8042prt start 61 disabled 重启 解除自带键盘锁定 1 sc config i8042prt start 61 auto xff0c 重启 xf
  • chatra无法注册

    chatra用QQ邮箱注册显示邮箱无法访问 xff0c 不知道是不是邮箱设置了还是这个网站不支持 xff1b 用163邮箱注册就成功了
  • 打开回收站提示“回收站已损坏是否清空该驱动器上的回收站“解决方法

    我们一般需要删除的文件或者文件夹都是删除在电脑系统中的回收站中的 xff0c 但是最近有一个网友在打开Win10系统的回收站的时候 xff0c 忽然弹出了提示 D xff1a 上的回收站已损坏 是否清空该驱动上的回收站 xff0c 一般遇到
  • C++之迭代器(Iterator)篇

    迭代器 xff08 Iterator xff09 的介绍 背景 xff1a 指针可以用来遍历存储空间连续的数据结构 xff0c 但是对于存储空间费连续的 xff0c 就需要寻找一个行为类似指针的类 xff0c 来对非数组的数据结构进行遍历
  • Sublime Text运行C和C++程序

    Sublime Text 是一款当下非常流行的文本编辑器 xff0c 其功能强大 xff08 提供有众多的插件 xff09 界面简洁 还支持跨平台使用 xff08 包括 Mac OS X Linux 和 Windows xff09 在程序员
  • c++ string find(), rfind(), find_first_of(),find_last_of()

    find rfind 函数原型 xff1a span class token keyword int span span class token function find span span class token punctuation
  • 1233. 删除子文件夹

    难度 xff1a 中等 你是一位系统管理员 xff0c 手里有一份文件夹列表 folder xff0c 你的任务是要删除该列表中的所有 子文件夹 xff0c 并以 任意顺序 返回剩下的文件夹 如果文件夹 folder i 位于另一个文件夹
  • 【ROS入门篇·一】ROS文件系统 & catkin编译系统

    快速链接 xff1a ROS入门篇 ROS学习简介 一 ROS工作空间创建 amp 编译 1 xff09 创建工作空间 mkdir p catkin ws src cd catkin ws src 2 xff09 创建功能包 catkin
  • 【ROS入门篇·五】launch文件使用 & 向节点传递参数

    快速链接 xff1a ROS入门篇 ROS学习简介 一 launch文件使用 1 1 launch文件简介 launch文件能够同时启动一个ROS Master和多个Node launch文件的标签 lt launch gt lt 根标签