ROS學習筆記9 —— launch文件


案例

<?xml version="1.0"?>
<launch>
	<arg name="debug" default="true"/>
	<param name="PARAMETER_NAME" value="parameter value"/>
	
	<include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="debug" value="$(arg debug)" /> </include>
	
	<arg name="model" /> <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" />

	<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -model robot1 -param robot_description -z 0.05"/>

	<node pkg="turtlesim" type="turtlesim_node" name="turtlesim" respawn="true"/>
	
	<node pkg="turtlesim" type="turtle_teleop_key" name="teleop_key" required="true" launch-prefix="xterm -e"/>

    <node
        pkg=""
        type=""
        name=""  
        respawn="true" 
        required="true"
        launch-prefix="xterm -e"
        output="screen"
        ns="some_namespace"
    />
	
      <group ns="turtlesim1">
              <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
      </group>

      <group ns="turtlesim2">
              <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
      </group>

      <node pkg="turtlesim" name="mimic" type="mimic">
              <remap from="input"  to="turtlesim1/turtle1" />
              <remap from="output" to="turtlesim2/turtle1" />
      </node>
</launch>

標籤

<launch>                <!--根標籤-->
<node>                  <!--需要啓動的node及其參數-->
<include>               <!--包含其他launch-->
<machine>               <!--指定運行的機器-->
<env-loader>            <!--設置環境變量-->
<param>                 <!--定義參數到參數服務器-->
<rosparam>              <!--加載yaml文件中的參數到參數服務器-->
<arg>                   <!--定義變量-->
<remap>                 <!--設定 topic 映射-->
<group>                 <!--設定分組-->
</launch>               <!--根標籤-->

注意:roslaunch不能保證node的啓動順序!!!

1.參數的定義

a. 參數設置
  • <param>:設置ROS部分參數,節點可通過ros::param::get來獲取該值

    	# 法1:
    	<param name="parameter name" value="parameter value"/>
    	<param name="param_name" type="type1" value="val"/>     # type可以省略,系統自動判斷
    	<param name="param_name" textfile="$(find pkg)/path/file"/>     # 讀取 file 存成 string
    	<param name="param_name" command="$(find pkg)/exe '$(find pkg)/arg.txt'"/>
    	<param name="param" type="yaml" command="cat '$(find pkg)/*.yaml'"/> # command 的結果存在 param 中
    	<param name="somestring1" value="bar" />#明顯看出是字符串類型
      
      <param name="somestring2" value="10" type="str" />#強行定義爲字符串類型
      <param name="someinteger1" value="1" type="int" />#明顯是整型,不用寫type了
      <param name="someinteger2" value="2" />#明顯看出是字符串類型,故省略type
    
      <param name="somefloat1" value="3.14159" type="double" />#明顯是浮點型,可以不用寫type了
      <param name="somefloat2" value="3.0" />#明顯是浮點型,可以不用寫type了
     
      <param name="configfile" textfile="$(find roslaunch)/example.xml" />#把路徑中的文件直接存如configfile中,並且把這個全局參數存放在ros參數服務器中
    
      <param name="binaryfile" binfile="$(find roslaunch)/example.xml" />#把路徑中的xml文件以基於64位二進制形式存入binaryfile中,並且把這個參數存放在ros服務器中
    		
    	# 法2:利用yaml,使用rosparam標籤
    	<rosparam file="$YAML_DIR/config.yaml" command="load" ns="namespace you want to use"/>
    
  • <rosparam>:批量操作

    # load : 從 YAML 文件中加載一批 param
    <rosparam command="load" file="$(find rosparam)/example.yaml" />
    
    # delete: 刪除某個 param
    <rosparam command="delete" param="my_param" />
    
    # 類似 <param> 的賦值操作
    ## 法1:
    <rosparam param="my_param">[1,2,3,4]</rosparam>
    ## 法2:
    <rosparam>
    a: 1
    b: 2
    </rosparam>
    
  • <arg>:launch內利用的參數

    # 定義
    <arg name="argName" default="aaaaaaa"/>
    
    # 調用
    <node name="$(arg argName)" type="$(arg argName)"/>
    
b. paramrosparam的區別
  • 只能對單個 param 操作,而且只有三種:value, textfile, command 形式,返回的是單個 param 的內容。
  • 則可以批量操作,還包括一些對參數設置的命令,如 dump, delete 等

c. defaultvalue的區別
  • default:參數的默認值,可被重寫
  • value:參數的參數值,固定值,不可被重寫

若執行roslaunch pkgName launchFileName argName:="setValue",可覆蓋默認值default,但不能覆蓋value

2. node標籤的使用

<launch>
    <node
        pkg="aaa"
        type="aaa"
        name="aaa"  
        respawn="true" 
        required="true"
        launch-prefix="xterm -e"
        output="screen"
        ns="some_namespace"
    />
</launch>
  • pkg:功能包的名稱
  • type:功能包中的可執行文件或者源文件編譯後的可執行文件名稱
  • name:節點啓動後的名字,將覆蓋ros::init設置的節點名稱,不可重複,除非不在同一命名空間下。
  • respawn:若該節點關閉,是否自動重新啓動
  • required:若該節點關閉,是否關閉其他所有節點
  • launch-prefix: 是否新開一個窗口執行。例如,需要通過窗口進行機器人移動控制的時候,應該爲控制 node 新開一個窗口;或者當 node 有些信息輸出,不希望與其他 node 信息混雜在一起的時候。
  • output:默認情況下,launch 啓動 node 的信息會存在/.ros/log/run_id/node_name-number-stdout.log中,通過此處參數設置,可令信息顯示在屏幕上
  • ns:將 node歸入不同的namespace,即在node name前邊加 ns指定的前綴。 注意:此時在源文件中定義node nametopic name時應使用相對名稱,即不加/

3. 接口重映射

使用接口重映射改變topic名稱:

<node pkg="aaa" type="aaa" name="aaa">
    <remap from="origin" to="new" />
</node>

4. group標籤

<group ns="wg2">
    <remap from="chatter" to="talker"/> # 對該 group 中後續所有 node 都有效
    <node ... />
    <node ... >
        <remap from="chatter" to="talker1"/> # 各個 node 中可以重新設置 remap
    </node>
</group>

5. 嵌套複用

<include file="launch-file-name.launch"/>

# 增強可移植性
<include file="$(find package-name)/launch-file-name" />

# 爲了放入某一命名空間
<include file="$(find package-name)/launch-file-name " ns="namespace_name" />

6. 其他XML format

  • env:替換當前環境中的一個變量的值;如果環境中沒有設置該值,則該launch文件啓動失敗

    $(env ENVIRONMENT_VARIABLE)
    
  • optenv:如果環境變量有這個值,則替換;如果提供了默認值,且環境變量中沒有該值,則添加該值;如果沒有個默認值,則會使用一個空字符串;(默認值可以是以空格分開的多個單詞)

    $(optenv ENVIRONMENT_VARIABLE) 
    $(optenv ENVIRONMENT_VARIABLE default_value)
    
    <param name="foo" value="$(optenv NUM_CPUS 1)" />
    <param name="foo" value="$(optenv CONFIG_PATH /home/marvin/ros_workspace)" />
    <param name="foo" value="$(optenv VARIABLE ros rocks)" />
    
    
  • $(find rospy)

     $(find rospy)/manifest.xml#獲取rospy包下的manifest.xml的路徑
    
  • $(anon name)

     $(anon name)#在name後面添加你的主機名+一串數字;以產生一個獨一無二的名字
    
    <node
        name="$(anon joint_state_publisher)"
        pkg="joint_state_publisher"
        type="joint_state_publisher" />
    
  • doc:用來描述一個標籤

      <arg name="robot_ip" doc="IP of the controller" />
    
  • $(eval )

      <arg name="radius" value="5"/>
      <arg name="pi" value="3.141592653"/>
      <param name="circumference" value="$(eval 2*arg('pi')*arg('radius'))"/>#調用參數的值必須在參數名上加單引號
    
  • unless

      <param name="other_launch" value="I have be launched" unless="0"/> #可直接認爲unless是取反,unless爲假是執行該指令
    
  • if

      <group if="$(arg include)">#如果include參數是正,纔會執行group標籤中的內容
      <param name="binaryfile" binfile="$(find gripper)/package.xml" />
      <include file="$(find gripper)/launch/other.launch" />
      </group>
    

7. 以urdf和xacro爲基礎的launch文件案例

#######################      urdf     ############################
<launch>
	<!-- 通過定義全局變量,告知launch文件啓動時把全局變量robot_description中存儲的模型文件加載到rviz中 -->
	<param name="robot_description" textfile="$(find mbot_description)/urdf/urdf/mbot_base.urdf" />

	<!-- 設置GUI參數,顯示關節控制插件(可以把這個插件同下面節點看成一個整體,用於控制關節運動) -->
	<param name="use_gui" value="true"/>
	
	<!-- 運行joint_state_publisher節點,發佈機器人的關節狀態(顯示關節旋轉了多少度等等)  -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
	
	<!-- 運行robot_state_publisher節點,發佈tf(根據上面的關節狀態,創建整個機器人的tf關係,併發布到系統中)-->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
	
	<!-- 運行rviz可視化界面(args的參數作用類似於自定義rviz中的顯示設置) -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>

#######################      xacro     ############################
<launch>
	<arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/mbot.xacro'" />
	<arg name="gui" default="true" />

	<param name="robot_description" command="$(arg model)" />

    <!-- 設置GUI參數,顯示關節控制插件 -->
	<param name="use_gui" value="$(arg gui)"/>

    <!-- 運行joint_state_publisher節點,發佈機器人的關節狀態  -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

	<!-- 運行robot_state_publisher節點,發佈tf  -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

    <!-- 運行rviz可視化界面 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />

</launch>


參考文獻:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章