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.rhkb.cn/news/267784.html

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

相关文章

【二】【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)…

Doris——纵腾集团流批一体数仓架构

目录 前言 一、早期架构 二、架构选型 三、新数据架构 3.1 数据中台 3.2 数仓建模 3.3 数据导入 四、实践经验 4.1 准备阶段 4.2 验证阶段 4.3 压测阶段 4.4 上线阶段 4.5 宣导阶段 4.6 运行阶段 4.6.1 Tablet规范问题 4.6.2 集群读写优化 五、总结收益 六…

深度学习PyTorch 之 RNN-中文多分类

关于RNN的理论部分我们已经在前面介绍过&#xff0c;所以这里直接上代码 1、 数据部分 1.1 读取数据 # 加载数据 data_path ./data/news.csv data pd.read_csv(data_path)# 预览数据的前几行 data.head()数据是csv格式&#xff0c;只有两列&#xff0c;第一列是标签&#…

【解决方案】ArcGIS Engine二次开发时,运行后出现“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain...”

我们在做ArcGIS Engine二次开发时&#xff0c;特别是新手&#xff0c;安装好了开发环境&#xff0c;满怀信心的准备将按照教程搭建好的框架在Visual Studio中进行运行。点击运行后&#xff0c;却出现了“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化…

ABAP - SALV教程06 - 列的设置(隐藏、修改、优化列宽)

SAVL要想像Function ALV或OO ALV那样设置Fieldcat&#xff0c;也是有方法的。通过取得全体列的类引用 CL_SALV_COLUMNS来进行修改 METHOD set_columns.* 取得全部列的对象DATA(lo_cols) co_alv->get_columns( ).* 设置自动优化列宽度lo_cols->set_optimize( X ).T…

实例驱动计算机网络

文章目录 计算机网络的层次结构应用层DNSHTTP协议HTTP请求响应过程 运输层TCP协议TCP协议面向连接实现TCP的三次握手连接TCP的四次挥手断开连接 TCP协议可靠性实现TCP的流量控制TCP的拥塞控制TCP的重传机制 UDP协议 网际层IP协议&#xff08;主机与主机&#xff09;IP地址的分类…

计算机视觉基础知识(十六)--图像识别

图像识别 信息时代的一门重要技术;目的是让计算机代替人类处理大量的物理信息;随着计算机技术的发展,人类对图像识别技术的认识越来越深刻;图像识别技术利用计算机对图像进行处理\分析\理解,识别不同模式的目标和对象;过程分为信息的获取\预处理\特征抽取和选择\分类器设计\分…

在Golang中简化日志记录:提升性能和调试效率

最大化效率和有效故障排除&#xff1a;在Golang中简化日志记录 日志记录是软件开发的一个基本方面&#xff0c;有助于调试、监控和理解应用程序的流程。在Golang中&#xff0c;有效的日志记录实践可以显著提高性能并简化调试过程。本文探讨了优化Golang日志记录的技术&#xf…

[HackMyVM]靶场 VivifyTech

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Unk…

基于Java的超市商品管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

浅谈 Linux fork 函数

文章目录 前言fork 基本概念代码演示示例1&#xff1a;体会 fork 函数返回值的作用示例2&#xff1a;创建多进程&#xff0c;加深对 fork 函数的理解 前言 本篇介绍 fork 函数。 fork 基本概念 pid_t fork(void) fork 的英文含义是"分叉"&#xff0c;在这里就是 …

Java知识点整理(一)

反射 反射是在运行状态中&#xff0c;动态获取类信息&#xff0c;以及动态调用对象的方法的功能叫做反射机制。在JDBC&#xff0c;Servlet&#xff0c;SpringIOC中 优点&#xff1a;能够灵活的创建代码&#xff0c;动态执行方法访问属性。 缺点&#xff1a;破坏了封装性&…

Mysql学习之MVCC解决读写问题

多版本并发控制 什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制。顾名思义&#xff0c;MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之&#xff0…

从零自制docker-1-【环境配置 docker go介绍与安装】

文章目录 docker简介举例docker安装go语言go安装go 配置 docker简介 Docker可以看作是一种极其轻巧的“虚拟机”&#xff0c;它允许你将一个或多个程序及其运行环境打包在一起&#xff0c;形成一个标准化的单元&#xff0c;这个单元可以在任何支持Docker的系统上运行&#xff…

神经网络之万能定理python-pytorch实现,可以拟合任意曲线

神经网络之万能定理python-pytorch实现&#xff0c;可以拟合任意曲线 博主&#xff0c;这几天一直在做这个曲线拟合的实验&#xff0c;讲道理&#xff0c;网上可能也有很多这方面的资料&#xff0c;但是博主其实试了很多&#xff0c;效果只能对一般的曲线还行&#xff0c;稍微…

114.龙芯2k1000-pmon(13)- 串口如何用

本文是讲原理图的部分&#xff0c;跟pmon的关系不大&#xff01;&#xff01; 参考手册&#xff1a;《龙芯2K1000处理器用户手册.pdf》 刚刚看数据手册&#xff0c;让我是有点惊讶&#xff0c;但是也让我迷惑。&#xff08;一个串口复用为4个是啥意思&#xff1f;&#xff09;…

MogaNet实战:使用MogaNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文&#xff1a;https://arxiv.org/pdf/2211.03295.pdf 作者多阶博弈论交互这一全新视角探索了现代卷积神经网络的表示能力。这种交互反映了不同尺度上下文中变量间的相互作用效…

#WEB前端(DIV、SPAN)

1.实验&#xff1a;DIV、SPAN 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 类? 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdev…

Python3零基础教程之数学运算专题进阶

大家好,我是千与编程,今天已经进入我们Python3的零基础教程的第十节之数学运算专题进阶。上一次的数学运算中我们介绍了简单的基础四则运算,加减乘除运算。当涉及到数学运算的 Python 3 刷题使用时,进阶课程包含了许多重要的概念和技巧。下面是一个简单的教程,涵盖了一些常…

BUUCTF---数据包中的线索1

1.题目描述 2.下载附件&#xff0c;是一个.pcap文件 3.放在wireshark中&#xff0c;仔细观察数据流&#xff0c;会发现有个叫fenxi.php的数据流 4.这条数据流是http,且使用GET方式&#xff0c;接下来我们使用http.request,methodGET 命令来过滤数据流 5.在分析栏中我们追踪htt…