launch 文件解析


roslaunch工具是ros中python實現的程序啟動工具,通過讀取launch文件中的參數配置、屬性配置等來啟動一系列節點;
很多ROS包或源碼包中都有launch文件,一般為該程序包能夠運行起來的基本demo配置,運行下面指令自動補全會提示該包現有的launch文件:
$roslaunch  package_name  file.launch
launch文件的位置並不是很重要,如果放在任意一個位置,可以運行下面指令:
$roslaunch  path-to-where/file.launch

launch文件是XML格式標記文本,后綴名無關緊要,一般為.launch/.xml/.test/無后綴
最簡單的配置如下:
<launch>
  <node name="you_define_node_name" pkg="package_name" type="exe_name" />
</launch>
啟動上面的launch文件就會啟動package_name包下的exe_name執行文件,you_define_node_name自定義的node_name

<launch> tag是launch文件根元素/根標簽,其他標簽包含在其中,/標志結束,多行時標簽tag成對存在可以包含其他標簽



一個復雜的配置:
<launch>
    <!-- comment注釋  -->
    
     <!-- arg can be set from high level like this  -->
    <!-- this is the include launch file content:
        <launch>
          <!-- declare arg to be passed in -->
          <arg name="arg_2" /> 

          <!-- read value of arg -->
          <param name="param_2" value="$(arg arg_2)"/>
        </launch>
    -->
    <include file="$(find pkg_name)/path-to/included.launch" ns="namespace">   
        <!-- pass value from high level to included.launch -->
        <arg name="arg_2"  value="value" />
    </include>
    
    <arg name="arg_3"  default="value" />
    <arg name="arg_4"  value="value" />
    
    <node pkg="pkg_name" type="exe_name" name="node_name1" args="arg1 arg2 arg3" respawn="true" output="screen">  
      
         <rosparam command="load" file="$(find pkg_name)/example.yaml"/>

        <param name="frame_id" value="$(arg frame_id)"/>
    </node>   
    <node pkg="pkg_name" type="exe_name" name="node_name2" args="arg1 arg2 arg3" respawn="true" output="screen">  
      
        <param name="name1" type="double" value="10.0"/>
        <param name="name2" value="$(arg arg_1)"/>
        <param name="name3" value="$(env ENVIRONMENT_VARIABLE_NAME)"/>
        <param name="name4" command="$(find pkg_name)/path-to/exe '$(find pkg_name)/path-to/arg.txt'"/>


        <remap from="laser_topic" to="/scan"/>
        <remap from="base_link" to="$(arg arg_1)"/>
    </node>    
    <group if="$(arg use_rviz)">
      <node pkg="rviz" type="rviz" name="rviz" 
            args="-d $(find pkg_name)/launch/VLP16_2D.rviz"/>
    </group>
</launch>
上面的launch文件首先聲明了一些參數,之后include另一個launch文件,included.launch文件中的節點會按深度優先執行配置和啟動;
之后該launch文件啟動3個節點,前兩個節點來自同一個包的同一個可執行文件,節點命名不能相同,每個節點可以進行自己的參數配置;
之后該launch文件啟動rviz節點,參數傳遞 rviz的配置文件,不同配置用於顯示不同的信息
<group>可以作為一組標簽的容器,從而使該組有獨立的名稱空間
所以標簽可使用 if/unless屬性,如果條件成立則包含標簽

launch常用標簽tag:
<arg> 參數聲明,arg_1 通過命令行傳遞,arg_2 傳遞到included.launch, arg_3 默認值可以被重寫覆蓋,agr_4不能被重寫

<include> 包含其他文件,包含文件中定義的參數、變量、節點都會按深度優先遍歷依次執行生效

<param>:設置變量到參數服務器,參數服務器的概念看ros wiki

<rosparam>: dump/load、delete parameters from/to  Parameter Server,常用來加載程序的參數配置文件到參數服務器,然后程序從參數服務器取得參數值;

<remap>:名稱映射 from:被映射名稱 to:目標名稱,名稱映射的概念看ros wiki

<node> 啟動節點,
    <node>常用屬性tag:
    pkg:"pkg_name"  包名
    type:"exe_name"  節點類型,即編譯生成的可執行文件
    name:"node_name" 節點名稱,自定義但不能重復
    args:"arg1 ..."  傳遞節點的參數列表
    respawn:"true" 如果節點退出自動重啟 default:false
    output:"screen" 標准輸出/標准錯誤輸出重定向屏幕,log重定向log文件,default:log
    required:"true" 如果節點退出,殺死全部launch進程
    launch-prefix:"prefix arguments" 前置的參數,可以使用其他工具如gdb,valgrind等

    <node>常用標簽tag:
    param
    remap
    rosparam

    lannch機制不保證節點的啟動順序,雖然launch文件是順序分析,但節點初始化的時間長度不一,啟動時間不一
</node>

​ 1 .launch文件的結構

            <launch>

                       <node name="talker"pkg="rospy_tutorials" type="talker" >

                        </node>​

            </launch>

      上面是.launch文件的最小例子。.launch文件開頭是以<launch>​為標簽,讓我們知道這是一個.launch文件,以</launch>為結尾。而中間就是寫自己要啟動的節點,是以<node> 開始,</node>結束,其中pkg="rospy_tutorials",這是自己要啟動的節點所在的包;type="talker",這是自己寫的節點.cpp程序通過編譯生產的可執行文件的名字,你最初編譯.cpp程序的時候要在CMakeLists.txt添加cpp程序編譯的設置,這個可執行文件的名字在CMakeLists.txt中就可以找到;name="talker",這是節點的名字。

2.Roslaunch /XML/remap     ​

 1. 元素​

<node> 啟動一個節點.

<param> 設置參數服務器上的參數

<remap> 聲明一個名稱的映射,允許你通過名稱映射參數到ROS 節點(通過更結構化的方式而不是直接設置節點參數屬性來啟動的節點)。

<machine> 聲明啟動要使用的機器.

<rosparam> 使用rosparam 文件設置啟動要用的ROS 參數

<include> 包含roslaunch 文件.

<env> 制定啟動節點的環境變量

<test> 啟動一個測試節點see rostest).

<arg> 聲明參數

<group> 共享一個命名空間或映射的封閉的元素組。

2 .launch文件的重映射(remap)​

       據我理解,重映射就是甲節點得到相關的信息,通過重映射使乙節點得到甲節點一樣的信息,從而使得乙節點模仿甲節點做出相應的響應。​

<remap>標簽適用於在其范圍內隨后的所有聲明(<launch>, <node> or<group>)。

准備工作

​需要用到rqt和tuetlesim 這兩個包.如果沒有安裝,請執行:

$ sudo apt-get install ros-hydro-rqtros-hydro-rqt-common-plugins ros-hydro-turtlesim

我的ros版本是hydro版本,如果不是hydro,則自行替換。​

 

launch
在ROS應用中,每個節點通常有許多參數需要設置,為了方便高效操作多個節點,可以編寫launch文件,然后用roslaunch命令運行
roslaunch: roslaunch [options] [package] <filename> [arg_name:=value...]
                    roslaunch [options] <filename> [<filename>...] [arg_name:=value...]
launch文件的一般格式,參數:
<launch>
    <node .../>
    <rosparam ..../>
    <param .../>
    <include .../>
    <env .../>
    <remap .../>
    <arg.../>
</launch>

 

參數說明
<node >要啟動的node參數
    pkg=''mypackage''
    type=''nodetype''
    name=''nodename''
    arg=''arg1 ....''(可選)
    respawn=''ture''(可選)如果節點停止,自動重啟節點
    ns=''foo''(可選)在foo命名空間啟動節點
    output=''log|screen''(可選)
<rosparam>操作yaml文件參數
    command=''load|dump|delete''(默認load)
    file=''$(find pkg-name)/path/foo.yaml''(load或dump命令)yaml文件的名字
    param=''param-name''參數名
<param>定義一個設置在參數服務器的參數,它可以添加到<node>中
    name=''namespace/name''
    value=''value''(可選)如果省略這個參數,則應指定一個文件(binfile/textfile)或命令
    type=''str|int|double|boot''(可選)指定參數的類型
    textfile=''$(find pkg-name)/path/file''(可選)   

    binfile=''$(find pkg-name)/path/file''()
    command=''(find pkg-name)/exe '$(find pkg-name)/arg.txt' ''(可選)exe是可執行文件(cpp、py),arg.txt是參        數文件
<include>在當前launch文件中調用另一個launch文件
    file=''$(find pkg-name)/path/launch-file.launch''    
<env>設置節點的環境變量
    name=''environment-variable-name''
    value=''environment-variable-value''    
<remap>將一個參數名映射為另一個名字
    from=''original-name''
    to=''new-name''    
<arg>定義一個局部參數,該參數只能在一個launch文件中使用
    <arg name=''foo''/>聲明一個參數foo,后面需要給它賦值
    <arg name=''foo'' default=''1''/>聲明一個參數foo,如不賦值取默認值
    <arg name=''foo'' value=''bar''/>聲明一常量foo,它的值不能修改


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM