Launch学习

参考博客:
(1) 史上最全的launch的解析来啦,木有之一欧

1 ROS工作空间简介

在这里插入图片描述

2 元功能包

src目录下可以包含多个功能包,假设需要使用机器人导航模块,但是这个模块中包含着地图、定位、路径规划等不同的功能包,它们的逻辑关系如下:

在这里插入图片描述
在Linux系统中为了更方便的组织工程项目(这里针对的是项目文件,即功能包),出现了“元功能包”的概念。这个是一个“虚包”,就是这个功能包的src目录下没有源文件,因此自身不会实现专属功能,其功能的实现完全依赖于其他的功能包,起到一个组织功能包的作用。

以导航模块中的元功能包为例:
在这里插入图片描述navigation功能包为元功能包(metapackage),元功能包中由于没有src目录因此无需添加任何依赖项,因为这个功能包没有自己的专属功能,它的功能是借助其他的功能包的功能来实现的。元功能包有两个文件即可:一个是package.xml文件:用于声明元功能包所依赖的其他功能包;另一个是CMakelist.txt文件:用于指定功能包之间的依赖关系。

CMakelist.txt

cmake_minimum_required(VERSION 3.0.2)  
project(navigation)  
find_package(catkin REQUIRED)  
catkin_metapackage() // 只需添加此条内容即可

package.xml

<exec_depend>amcl</exec_depend>  
<exec_depend>base_local_planner</exec_depend>  
<exec_depend>carrot_planner</exec_depend>  
<exec_depend>clear_costmap_recovery</exec_depend>  
<exec_depend>costmap_2d</exec_depend>  
<exec_depend>dwa_local_planner</exec_depend>  
<exec_depend>fake_localization</exec_depend>  
<exec_depend>global_planner</exec_depend>  
<exec_depend>map_server</exec_depend>  
<exec_depend>move_base</exec_depend>  
<exec_depend>move_base_msgs</exec_depend>  
<exec_depend>move_slow_and_clear</exec_depend>  
<exec_depend>navfn</exec_depend>  
<exec_depend>nav_core</exec_depend>  
<exec_depend>rotate_recovery</exec_depend>  
<exec_depend>voxel_grid</exec_depend>  <export>  <metapackage/> // 表征:这个功能包为元功能包
</export>  

3 Launch文件

Launch文件:源文件的组织者
① 节点启动标签

<launch>  <node pkg = "turtlesim" type = "turtlesim_node" name = "my_node"/>  <node pkg = "turtlesim" type = "turtle_teleop_key" name = "my_key"/>  
</launch>  

Tip:因为ROS中采用多线程,因此节点的运行不会按照节点在launch中排列顺序进行。

pkg:功能包的名称
type:节点本来的名称,这个名称和节点所在.cpp源文件的文件名一致
name:节点重映射的名称,相当于在系统中给节点所在源文件改了个名字

launch标签有一个子级标签deprecated,用于文本说明:

<launch deprecated="this vision is out-of-date!">  
</launch> 

如果认为给很多节点取名太麻烦,可以使用name=”$(anon node_name)”标签在节点node_name名称之后加一些随机数,使得该节点名称在整个catkin编译项目中唯一:

<launch deprecated="this vision is out-of-date!">  <!-- the topic of turtlesim_node is /turtle1/cmd_vel -->  <node pkg="turtlesim" type="turtlesim_node" name="$(anon my_node)"/>  <!-- the topic of turtle_teleop_key is /turtle1/cmd_vel -->  <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>  
</launch>  

意外关闭后自动启动的子级标签
respawn = true|false 表示:如果节点意外关闭是否重新启动

<launch>  <node pkg="turtlesim" type="turtlesim_node" name="my_node" respawn="true"/>  <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" respawn="true"/>  
</launch>  

节点延迟启动的子级标签,一般结合节点重启动是使能标签respawn(如果节点异常退出运行,那么该节点会被重新启动)一起使用

<launch>  <node pkg="turtlesim" type="turtlesim_node" name="my_node" respawn="true" respawn_delay="10"/>  <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" respawn="true" respawn_delay="10"/>  
</launch>  

如果XXX节点结束运行(XXX节点被杀死),则所有节点都停止运行

<launch>  <node pkg="turtlesim" type="turtlesim_node" name="my_node" required="true"/>  <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" />  
</launch>  

给节点名称添加前缀(给节点添加命名空间)的子级标签

<launch>  <node pkg="turtlesim" type="turtlesim_node" name="my_node" ns="hello"/>  <node pkg="turtlesim" type="turtle_teleop_key" name="my_key"/>  
</launch> 

② 参数设置标签
设置global全局参数

<launch><param name="var" type="int" value="10"/>
</launch>

结合标签设置带有命名空间的私有参数

<launch><node pkg="turtlesim" type="turtlesim_node" name="my_node"/><node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"><param name="var1" type="int" value="20"/></node>
</launch>

③ 参数打包输入输出删除的标签
从.yaml文件中读取参数:

<launch><rosparam command="load" file="$(find test01)/launch/params.yaml"/><node pkg="turtlesim" type="turtlesim_node" name="my_node"/>  <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/> <param name="var" type="int" value="10"/>  
</launch> 

将.yaml参数文件中的参数导入参数服务器时,我们还可以给这些参数添加namespace命名空间:

<launch>  <node pkg="turtlesim" type="turtlesim_node" name="my_node"/>  <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>  <param name="var" type="int" value="10"/>  <rosparam command="load" file="$(find test01)/launch/params.yaml" ns="hello"/>  
</launch> 

将参数打包输入进.yaml文件中,这样做啥变量都没导进去:
在这里插入图片描述

<launch>  <rosparam command="dump" file="$(find test01)/launch/input.yaml"/>  <node pkg="turtlesim" type="turtlesim_node" name="my_node"/>  <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>  <param name="var" type="int" value="10"/>  
</launch>  

我们要想导入参数必须另建一个.launch文件,在使用上述launch文件启动完所有节点之后,在另一个launch文件中执行该功能包参数的导出操作:

<launch><rosparam command="dump" file="$(find test01)/launch/input.yaml" />
</launch>
<launch>  <rosparam command="dump" file="$(find test01)/launch/input.yaml"/>  <rosparam command="delete" param="/hello/n1"/>  
</launch>  

④ 参数统一管理的标签

<launch>  <arg name="car_width" default="[1,2,3,4]" doc="the width of car"/>  <rosparam param="a_list">$(arg car_width)</rosparam>  <rosparam>  Name:  a: 9  b: "hello"  c: $(arg car_width)  </rosparam>  
</launch>

⑤ 改topic名称的标签

<launch>  <!-- the topic of turtlesim_node is /turtle1/cmd_vel -->  <node pkg="turtlesim" type="turtlesim_node" name="my_node"/>  <remap from="/turtle1/cmd_vel" to="new_topic"/>  
</launch>  

⑥ 节点组织标签
就是给被<group>…</group>包含的所有参数、节点的属性加上了namespace

<launch deprecated="this vision is out-of-date!">  <group ns="family">  <!-- the topic of turtlesim_node is /turtle1/cmd_vel -->  <node pkg="turtlesim" type="turtlesim_node" name="my_node"/>  <!-- the topic of turtle_teleop_key is /turtle1/cmd_vel -->  <node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>  <rosparam command="load" file="$(find test01)/launch/params.yaml" ns="hello"/>  <arg name="car_width" default="[1,2,3,4]" doc="the width of car"/>  <rosparam param="a_list" value="$(arg car_width)"/>  <rosparam>  Name:  a: 9  b: "hello"  c: [1,2,3,4]  </rosparam>  <param name="var" type="int" value="$(arg car_width)"/>  </group>  
</launch> 

⑦ 启动其他launch文件的标签

<launch>  <include file="$(find test01)/launch/test01_launch.launch">  <arg name="car_width" default="10"/>  </include>  
</launch>  

4 功能包/源文件/launch文件组织工具

在这里插入图片描述文件组织形式如下所示:
在这里插入图片描述

5 功能包绝对路径替换标签

标签格式:$(find package_name)
使用示例:

<launch>  <include file="$(find tf2_turtle)/launch/setupGUI.launch"/>  
</launch>  

6 工作空间下绝对路径替换标签

下面是test1.launch调用setupGUI.launch文件的代码,并且两个launch文件在一个文件夹之中:

<launch>  <include file="$(dirname)/setupGUI.launch"/>  
</launch> 

$(dirname)代表“test1.launch文件所在工作空间的绝对地址

7 Launch文件

列出几个Launch文件自测一下学习成果

<?xml version="1.0"?>
<launch><!--  加载车模型 --><include file="$(find vehicle_description)/launch/estima_black.launch" /><!--  --><node pkg="car_simulation" type="car_model_node" name="car_simulation" output="screen" />
</launch>
<launch><include file="$(find global_routing)/launch/global_routing.launch"/><!-- 车辆仿真 --><include file="$(find car_simulation)/launch/car_simulation.launch" /><!-- rviz --><node pkg="rviz" type="rviz" name="rviz" args="-d $(find global_routing)/config/planning_demo.rviz"/>  
</launch>
<?xml version="1.0"?>
<launch><!-- 其他launch文件传入的参数 --><arg name="is_planner"/><arg name="is_lateral_optimization"/><arg name="is_change_lane"/><arg name="is_carla_simulation"/><arg name="ego_vehicle_name"/><arg name="is_parking"/><arg name="is_goal"/><!-- 模拟动态障碍物的加载文件,这些都是录好的轨迹点,播放这个文件就可以实现障碍物移动 --><param name="obstacle_test_path" value="$(find dynamic_routing)/obstacle_files"/><!-- 加载存储的其他参考线数据 --><param name="referenceline_path" value="$(find dynamic_routing)/other_referenceline_files"/><!-- yaml文件 --><param name="yaml_path" value="$(find dynamic_routing)/config"/><!-- 规划算法选择 --><param name="use_what_planner"  value="$(arg is_planner)"/><!-- 变道决策是否开启 --><param name="change_lane"  value="$(arg is_change_lane)"/><!-- 是否使用二次规划,选择了lattice规划,选择这个才有效果 --><param name="use_lateral_optimization"  value="$(arg is_lateral_optimization)"/><!-- 是否选择carla联合仿真 --><param name="carla_simulation"  value="$(arg is_carla_simulation)"/><!-- role_name --><param name="role_name"  value="$(arg ego_vehicle_name)"/><!-- carla 停车场景 --><param name="parking_mode" value="$(arg is_parking)"/><!-- 在frenet规划下的参数设置,lattice规划不用这些 --><!-- COLLISION_CHECK_THRESHOLD 距离障碍物的最短距离 --><param name="COLLISION_CHECK_THRESHOLD" type="double" value="2" /><!-- 调整轨迹的长度 --><param name="MaxT" type="double" value="11" /><param name="MinT" type="double" value="9" /><!--  判断与终点的停车距离阈值 --><param name="goal_distanse"  type="double" value="$(arg is_goal)"/><!-- 打开 Hybrid_a_star 的测试图 --><!-- mapserver提供了一个ROS节点,该节点通过一个ROS Service来提供地图数据 --><node name="map_server" pkg="map_server" type="map_server" args="$(find dynamic_routing)/maps/map.yaml" ><param name="frame_id" value="map" /></node><!--Open palnner的launch参数,顺便加载dynamic节点 --><include file="$(find dynamic_routing)/launch/op_common_params.launch" /><!-- DWA --><arg name="dwa_params" default="$(find dynamic_routing)/config/dwa_params.yaml"/><rosparam command="load" file="$(arg dwa_params)"/>
</launch> 
<?xml version="1.0"?>
<launch><!-- 是否使用carla联合仿真 --><arg name="carla"  default="false"/>   <arg name="ego_vehicle_name"  default="ego_vehicle"/>  <param name="carla_simulation" value="$(arg carla)"/><param name="role_name" value="$(arg ego_vehicle_name)"/><!-- 不能改这里的参数 --><arg name="parking" default="false"/><param name="parking_mode" value="$(arg parking)"/><!-- ros单独仿真下的controller,carla不适用: 1 stanley  2 lqr 3 pure_pursuit4 pid 5 mpc  --><arg name="control"  value="2"/>  <param name="use_what_controller" value="$(arg control)"/><!-- planner: 1是纯frenet规划2是lattice规划3是em_palnner规划4是混合A*规划5是op_planner规划6是DWA规划7是Teb规划8是simple_em(EM的简化版本,待更新)--><arg name="planner"  value="7"/>    <param name="use_what_planner" value="$(arg planner)"/><!-- 是否使用二次规划,选择了lattice规划,选择这个才有效果 --><!-- false:lattice 采样规划,true:lattice 二次规划 --><arg name="use_lateral_optimization" default="false"/>    <!-- 是否开启变道决策,变道选择的是Lattce采样规划,其他方法不使用 --><arg name="change_lane"  default="false"/>    <!-- 参考线平滑的方式选择: true:CosThetaSmoother  false:FemPosSmooth--><arg name="which_smoother" default="false"/>    <param name="which_smoothers" value="$(arg which_smoother)"/><!--  判断与终点的停车距离阈值 --><arg name="goal_dis"  value="0.5"/>  <param name="goal_distanse"  type="double" value="$(arg goal_dis)"/><!-- 局部规划 --><include file="$(find dynamic_routing)/launch/dynamic_routing.launch" ><arg name="is_planner" value="$(arg planner)" /><arg name="is_lateral_optimization" value="$(arg use_lateral_optimization)" /><arg name="is_change_lane" value="$(arg change_lane)" /><arg name="is_carla_simulation" value="$(arg carla)" /><arg name="ego_vehicle_name" value="$(arg ego_vehicle_name)" /><arg name="is_parking" value="$(arg parking)"/><arg name="is_goal" value="$(arg goal_dis)"/></include><!-- carla联合仿真下的控制方法和参数  --><!-- LQR_dynamics  LQR_kinematics Stanley PurePursuit --><param name="control_method" value='LQR_kinematics'/>  <!-- "PurePursuit"增益系数 --><param name="k_pure" type="double" value="0.3" /> <!-- "Stanley"增益系数  --><param name="k_cte" type="double" value="100" /> <param name="kp"  value="0.5" /><param name="ki" type="double" value="0.02" /><param name="kd" type="double" value="0.05" /><!-- LQR Q R矩阵参数 --><param name="Q_ed" type="double" value="20.0" /><param name="Q_ed_dot" type="double" value="1.0" /><param name="Q_ephi" type="double" value="10.0" /><param name="Q_ephi_dot" type="double" value="1.0" /><param name="R_value" type="double" value="40.0" /><!--  --><param name="Q_ex_k" type="double" value="3.0" /><param name="Q_ed_k" type="double" value="3.0" /><param name="Q_ephi_k" type="double" value="1.5" /><param name="R_value_k" type="double" value="4.0" /><!-- 全局规划 --><node pkg="global_routing" type="global_routing_node" name="global_routing" output="screen" /></launch>

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

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

相关文章

agent内存马

搭建一个简单的Servlet项目 ServletDemo package com.naihe;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;…

vue2+若依框架plus交互 路由介绍

本周及寒假 参加了校企合作的工程过程管理&#xff0c;和学长学姐一起写项目&#xff0c;之前学了vue也没有应用&#xff0c;然后对框架很多组件的用法不太了解&#xff0c;前期耽误了一些时间。 框架模块 首先是框架模块的介绍 api存了一些系统管理及发送请求的方法 例如p…

【python】`assert`断言语句

assert是一个断言语句&#xff0c;用于在代码中检查某个条件是否为真。 如果条件为假&#xff0c;将触发AssertionError 异常&#xff0c;从而指示存在错误。

在您的下一个项目中选择 Golang 和 Node.js 之间的抉择

作为一名软件开发者&#xff0c;我总是在寻找构建应用程序的最快、最高效的工具。在速度和处理复杂任务方面&#xff0c;我认为 Golang 和 Node.js 是顶尖技术。两者在性能方面都享有极高的声誉。但哪一个更快——Golang 还是 Node&#xff1f;我决定深入一些硬核基准测试&…

java-ssm-jsp-宠物护理预定系统

java-ssm-jsp-宠物护理预定系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

物联网与智慧城市:融合创新,塑造未来城市生活新图景

一、引言 在科技飞速发展的今天&#xff0c;物联网与智慧城市的融合创新已成为推动城市发展的重要力量。物联网技术通过连接万物&#xff0c;实现信息的智能感知、传输和处理&#xff0c;为智慧城市的构建提供了无限可能。智慧城市则运用物联网等先进技术&#xff0c;实现城市…

使用R语言进行Logistic回归分析(2)

一、数据集描述&#xff0c;问题要求 下表是40位肺癌病人的生存资料&#xff0c;X1表示生活行为能力平分&#xff08;1到100&#xff09;&#xff0c;X2为病人的年龄&#xff08;年&#xff09;&#xff0c;X3由诊断到进入研究的时间&#xff08;月&#xff09;&#xff0c;X4…

计算机设计大赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

Pycharm的下载安装与汉化

一.下载安装包 1.接下来按照步骤来就行 2.然后就能在桌面上找到打开了 3.先建立一个文件夹 二.Pycharm的汉化

ABAP - SALV教程07 斑马纹显示和SALV标题

SALV设置斑马纹和标题 METHOD set_layout.DATA: lo_display TYPE REF TO cl_salv_display_settings. * 取得显示对象lo_display co_alv->get_display_settings( ).* 设置ZEBRA显示lo_display->set_striped_pattern( X ). * 设置Titlelo_display->set_list_he…

企业微信变更主体怎么改?

企业微信变更主体有什么作用&#xff1f;做过企业运营的小伙伴都知道&#xff0c;很多时候经常会遇到现有的企业需要注销&#xff0c;切换成新的企业进行经营的情况&#xff0c;但是原来企业申请的企业微信上面却积累了很多客户&#xff0c;肯定不能直接丢弃&#xff0c;所以这…

【二】【SQL】去重表数据及分组聚合查询

去重表数据 表的准备工作 去除表中重复的数据&#xff0c;重复的数据只留一份。 mysql> create table duplicate_table (-> id int,-> name varchar(20)-> ); Query OK, 0 rows affected (0.03 sec)mysql> insert into duplicate_table values-> (100,aaa)…

Day24-yum与rpm软件包管理2

Day24-yum与rpm软件包管理2 1. 配置缓存rpm包2. 为什么要缓存&#xff1f;3. 组包相关指令4. yum帮助与补全功能4.1 补全4.2 什么是yum源4.3 常见互联网 yum 源 5. 搭建局域网YUM仓库实践 1. 配置缓存rpm包 修改yum.conf配置 [rootoldboy ~]# sed -i.bak s#keepcache0#keepca…

批次大小对ES写入性能影响初探

问题背景 ES使用bulk写入时每批次的大小对性能有什么影响&#xff1f;设置每批次多大为好&#xff1f; 一般来说&#xff0c;在Elasticsearch中&#xff0c;使用bulk API进行批量写入时&#xff0c;每批次的大小对性能有着显著的影响。具体来说&#xff0c;当批量请求的大小增…

PVLAN组网实验

一&#xff0c;PVLAN类型 主VLAN 主VLAN可以由多个辅助私用VLAN组成&#xff0c;而这些辅VLAN与主VLAN属于同一子网。 辅助VLAN ① 团体VLAN&#xff1a;如果某个端口属于团体VLAN&#xff0c;那么它就不仅能够与相同团体VLAN中的其他端口进行通信&#xff0c;而且还能够与…

RFID(Radio Frequency Identification)技术笔记

一、RFID的介绍 RFID&#xff0c;全称为Radio Frequency Identification&#xff0c;即射频识别技术&#xff0c;也常被称为电子标签或无线射频识别。它是一种非接触式的自动识别技术&#xff0c;通过射频信号自动识别目标对象并获取相关数据&#xff0c;识别过程无需人工干预&…

[云原生] k8s之pod容器

一、pod的相关知识 1.1 Pod基础概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理…

如何确保JDK版本与操作系统架构匹配?

1. 序言 最近的工作中&#xff0c;需要升级JDK版本到17.0.7&#xff0c;以解决一个JDK bug&#xff1a;JDK-8299626该bug的core dump关键字如下&#xff1a;SIGSEGV in PhaseIdealLoop::build_loop_late_post_work公司JDK团队提供的、包含JDK的基础镜像&#xff0c;有aarch64和…

Hololens2开发环境配置及项目生成部署

Hololens2开发环境配置及项目生成部署 Hololens2开发环境配置及项目生成部署一、官方文档及推荐配置说明1.官方文档介绍2.推荐配置及配置说明 二、安装步骤0.现有Visual Stuido和Unity卸载1.Windows SDK安装2.Visual Studio安装3.Unity安装4.MRTK配置 三、初次环境配置1.新建Un…

ABAP - SALV教程05 添加页眉和页脚

先看看效果叭CL_SALV_TABLE提供了SET_TOP_OF_LIST方法设置页眉显示和SET_TOP_OF_LIST_PRINT方法设置页眉打印来实现添加页眉的目的。CL_SALV_TABLE提供了SET_END_OF_LIST方法设置页脚显示和SET_END_OF_LIST_PRINT方法设置页脚打印来实现添加页脚的目的。这个四个方法的传入参数…