ROS采用rosrun命令可以啟動(dòng)一個(gè)節(jié)點(diǎn),如果需要同時(shí)啟動(dòng)節(jié)點(diǎn)管理器(master)和多個(gè)節(jié)點(diǎn),就需要采用launch文件來(lái)配置。launch文件是一種特殊的XML格式文件,通常以.launch作為文件后綴。每個(gè)launch文件都必須要包含一個(gè)根元素。
roslaunch的使用方法為:
$ roslaunch pkg-name launch-file-name
下面以一個(gè)典型的launch文件舉例說(shuō)明:
<launch>
<arg name="debug" default="true"/>
<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"/>
</launch>
launch
每個(gè)launch文件都必須且只能包含一個(gè)根元素。根元素由一對(duì)launch標(biāo)簽定義,其他所有元素標(biāo)簽都應(yīng)該包含在這兩個(gè)標(biāo)簽之內(nèi)。
<launch> ... </launch>
arg
roslaunch支持啟動(dòng)參數(shù)arg,可以通過(guò)設(shè)置arg來(lái)改變程序的運(yùn)行。name為啟動(dòng)參數(shù)的名稱,default為該參數(shù)的默認(rèn)值,value為該參數(shù)的參數(shù)值。
default與 value兩者的唯一區(qū)別在于命令行參數(shù)roslaunch pkg-name launch-file-name arg-name:=”set-value”可以覆蓋默認(rèn)值default,但是不能覆蓋參數(shù)值 value。在launch文件中出現(xiàn)$(arg arg-name)的地方,運(yùn)行時(shí)roslaunch 會(huì)將它替換成參數(shù)值。并且可以在include元素標(biāo)簽內(nèi)使用arg來(lái)設(shè)置所包含的launch文件中的參數(shù)值。
param
在ROS中prarmeter和argument 是不同的,雖然翻譯一樣。parameter是運(yùn)行中的ROS系統(tǒng)使用的數(shù)值,存儲(chǔ)在參數(shù)服務(wù)器(parameter server)中,每個(gè)活躍的節(jié)點(diǎn)都可以通過(guò) ros::param::get 函數(shù)來(lái)獲取parameter的值,用戶也可以通過(guò)rosparam來(lái)獲得parameter的值而argument只在啟動(dòng)文件內(nèi)才有意義他們的值是不能被節(jié)點(diǎn)直接獲取的。
include
在launch文件中復(fù)用其他launch文件可以減少代碼編寫的工作量,提高文件的簡(jiǎn)潔性。使用包含元素include在launch文件中可包含其他launch文件中所有的節(jié)點(diǎn)和參數(shù)。
<include file="$(find pkg-name)/launch/launch-file-name"> <arg name="arg_name" value="set-value"/> </include>
node
節(jié)點(diǎn)的形式為:
<node name="node-name" pkg="pkg-name" type="executable-name" />
node的三個(gè)屬性分別為節(jié)點(diǎn)名字、程序包名字和 可執(zhí)行文件的名字。 name屬性給節(jié)點(diǎn)指派了名稱,它將覆蓋任何通過(guò)調(diào)用 ros::init來(lái)賦予節(jié)點(diǎn)的名稱。另外node標(biāo)簽內(nèi)也可以用過(guò)arg設(shè)置節(jié)點(diǎn)參數(shù)值。如果node標(biāo)簽有children標(biāo)簽,就需要顯式標(biāo)簽來(lái)定義。即末尾為/node>