有鑑於昨天寫的文章被我同事看到(可惡好赤裸)以後說寫得太不完整了,決定今天再給他補完整一點XD
昨天寫的比較著重在使用launch檔執行node所需要的標籤,但其實launch檔也可以拿來執行另外一個launch檔:
<include file="$(find package)/launch/velodyne_vlp16_multi.launch" />
並且在launch內也可以下$的符號,跟shell script一樣可以定義參數以後在標籤內加入:
<!-- 先定義好參數以後 -->
<arg name="arg_name" default="arg_value" />
<node pkg="pkg_name" type="exec_node_name" name="node_name"
args="$(arg arg_name_1) $(arg arg_name_2)" />
<!-- 另外一種用法就是直接加在標籤內 -->
<include file="$(find pkg_name)/launch_files/launch_name.launch">
<arg name="launch_arg" value="$(arg arg_name)" />
</include>
剛剛寫的arg標籤設定數值的方式可以使用default和value兩種方式,其差別在於使用default的時候可以在cmd 下執行launch檔的時候修改參數值,value就是直接給定值了:
<arg name="arg_name" default="arg_value" />
<arg name="arg_name" value="arg_value" />
cmd:
$ roslaunch pkg_name launch_name.launch launch_arg:=arg_name
都講到了arg,好像也不能免俗的講一下param和rosparam,基本上param對我來說是跟arg一樣的存在,只是一個可以用在include和node標籤中,另外一個只能用在node標籤內,所以誰比較好用應該很清楚了吧XD
arg是原生xml的標籤,param和rosparam算是ros新增出來的標籤,param用法跟arg很像,但是可以被ros master管理。而rosparam標籤就是用來管理param的,跟cmd直接下rosparam有一樣的效果。
用法:
<param name="/param_name" value="$(arg arg1)" />
<rosparam command="delete" param="/param_name" />
如果加在node標籤底下,就會成為區域變數,若設定為全域變數的話,在cmd可以下rosparam set/get
指令接收,詳細用法請參考我兩年前寫的文章,在此不贅述。
<launch>
<!-- 參數定義在這邊 -->
<arg name="arg1" default="lalala_input_arg_value" />
<arg name="arg2" value="lalala_input_arg_value" />
<param name="/param_name" value="$(arg arg1)" />
<!-- 用launch執行launch檔-->
<include file="$(find pkg_name)/launch_files/setup_tf.launch">
<arg name="launch_arg" default="$(arg arg_name)"/>
</include>
<!-- 執行node檔 -->
<node pkg="pkg_name" type="node_name" name="node_mame" respawn="true">
<param name="param_name" value="lalala_param_value" />
<!-- 偷渡昨天的remap用法 -->
<remap from="/points_raw" to="/sync_drivers/points_raw" if="$(arg sync)" />
</node>
</launch>
http://wiki.ros.org/roslaunch/XML
https://durant35.github.io/2017/07/14/ROS_%3Carg%3E$%3Cparam%3E$%3Crosparam%3E/