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.pswp.cn/news/716082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716082.shtml
英文地址,請注明出處:http://en.pswp.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;…

【探索AI】十一 深度學習之機器學習基礎

鑒于之前文章中提到的深度學習計劃&#xff0c;后續的文章會根據之前的接著繼續學習&#xff0c;python基礎略過&#xff0c;想學的同學請自學&#xff1a; python入門 python進階 機器學習基礎 機器學習是人工智能領域的一個子集&#xff0c;它專注于從數據中自動學習并提升…

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

本周及寒假 參加了校企合作的工程過程管理&#xff0c;和學長學姐一起寫項目&#xff0c;之前學了vue也沒有應用&#xff0c;然后對框架很多組件的用法不太了解&#xff0c;前期耽誤了一些時間。 框架模塊 首先是框架模塊的介紹 api存了一些系統管理及發送請求的方法 例如p…

【python】`assert`斷言語句

assert是一個斷言語句&#xff0c;用于在代碼中檢查某個條件是否為真。 如果條件為假&#xff0c;將觸發AssertionError 異常&#xff0c;從而指示存在錯誤。

Linux獲取進程(系統啟動時間和運行時間)運行時間

Linux獲取進程運行時間 思路&#xff1a;使用 ps - o命令 ps -p 986 -o etime可以獲取進程986的執行時間&#xff0c;不論系統時間有沒有發生改變&#xff0c;它都可以返回正確的結果: 總結&#xff1a;etime 是真正的程序運行時間&#xff0c;而不是系統運行時間與進程啟動…

在您的下一個項目中選擇 Golang 和 Node.js 之間的抉擇

作為一名軟件開發者&#xff0c;我總是在尋找構建應用程序的最快、最高效的工具。在速度和處理復雜任務方面&#xff0c;我認為 Golang 和 Node.js 是頂尖技術。兩者在性能方面都享有極高的聲譽。但哪一個更快——Golang 還是 Node&#xff1f;我決定深入一些硬核基準測試&…

java-ssm-jsp-寵物護理預定系統

java-ssm-jsp-寵物護理預定系統 獲取源碼——》公主號&#xff1a;計算機專業畢設大全

ASPICE實操中的那點事兒-底層軟件的單元測試該如何做

先來說下ASPICE項目實操中遇到的問題&#xff1a; 底層軟件在做單元測試時&#xff0c;從ASPICE角度看&#xff0c;該如何做&#xff1f;要不要在目標控制器或開發板中去測&#xff1f;尤其是復雜驅動&#xff0c;如果不在將程序下載到硬件中&#xff0c;該如何測試&#xff1…

物聯網與智慧城市:融合創新,塑造未來城市生活新圖景

一、引言 在科技飛速發展的今天&#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…

291.【華為OD機試】模擬目錄管理(JavaPythonC++JS實現)

??點擊這里可直接跳轉到本專欄,可查閱頂置最新的華為OD機試寶典~ 本專欄所有題目均包含優質解題思路,高質量解題代碼(Java&Python&C++&JS分別實現),詳細代碼講解,助你深入學習,深度掌握! 文章目錄 一. 題目-模擬目錄管理二.解題思路三.題解代碼Python題解…

計算機設計大賽 深度學習火車票識別系統

文章目錄 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…

SLAM基礎知識:前端和后端

在基于濾波的SLAM算法中&#xff0c;使用迭代卡爾曼濾波&#xff08;Iterative Kalman Filtering&#xff09;來求解當前幀狀態量的步驟通常屬于SLAM系統的前端部分。 前端負責處理傳感器數據&#xff0c;進行狀態估計和地圖構建的初步步驟。迭代卡爾曼濾波作為一種濾波器&…

批次大小對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;而且還能夠與…