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

本文介绍了ROS中的launch文件使用,包括launch文件的基本结构和如何启动节点、设置参数。同时阐述了ROS参数服务器的作用,详细讲解了如何通过launch文件、命令行以及节点源码来维护参数。此外,还展示了向ROS节点传递参数的两种方法,分别是通过参数服务器和main()函数参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速链接:【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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值