由浅到深理解ROS(5.1)- roslaunch 学习
oslaunch 用處:將多個rosnode 結合起來,一起運行。這樣就不需要一個個的運行。
roslaunch格式
(add_two.launch)
<launch>
??????? <arg name="a" default="1" />
??????? <arg name="b" default="2" />
??? <node pkg="beginner_tutorials" name="add_two_ints_server" type="add_two_ints_server"/>
??? <node pkg="beginner_tutorials" name="add_two_ints_client" type="add_two_ints_client" args="$(arg a) $(arg b)"/>
??? <node name = "stage" pkg="stage_ros" type = "stageros" args="$(find stage_ros)/world/willow-erratic.world"/>
?? </launch>
?
launch文件為xml格式。
每個tag的格式至少包含下面三部分
1.pkg = “your package name”,
2.name = “your name”//一般為可執行文件的名稱
可執行文件的名稱是robot_cleaner_node
3.type =”可執行文件的名稱”,
(即在CMakeList.txt中的add_executable(node_name src/c++file.cpp)中的node_name)
例如:add_executable(robot_cleaner_node src/robot_cleaner_move_rotate.cpp)中的robot_cleaner_node
此處的type是可執行文件的名稱,而name則是可以任意給出的,它覆蓋了原有文件中ros::init指定的node name。
4.(非必須)args 為運行時的參數
定義參數a,默認值為0,運行時可以重新賦值;
定義參數b,值為2,運行時不能賦值;
若賦值會出現錯誤:Invalid tag: cannot override arg ‘b’, which has already been set.
args="$(arg a) $(arg b)":a,b作為參數傳入節點,運行時可以將a重新賦值,不賦值使用默認值1.
$(find package_name)找到package_name 所在路徑
$(find stage_ros)/world/willow-erratic.world" 表示 /opt/ros/indigo/share/stage_ros/world/willow-erratic.world
運行:1.(未定義arg時) roslaunch beginner_tutorials add_two.launch a:=4 b:=5
2.(定義arg后) roslaunch beginner_tutorials add_two.launch 或者roslaunch beginner_tutorials add_two.launch a:=4(只給a賦值,b不需要)
運行之后輸出會保存在log文件中:例如log file: /home/server/.ros/log/e907e8c8-9be8-11e6-bf00-74d43562c7a3/add_two_ints_client-2*.log,并不會出現在控制臺
要想輸出在控制臺,添加output屬性
<node name = "my_stage" pkg = "my_stage" type = "my_stage"
output = "screen" />
?
5 若顯示所有nodes的輸出,用–screen命令行。
$ roslaunch –screen package_name launch_file_name
6 respawn="true"
eg:<node pkg="turtlesim" name="sim" type="turtlesim_node"? respawn="true"/>
?
代表當我們啟動一個node時,roslaunch會監控它,當它關閉時,比如啟動turtlesim節點,當我們關閉turtlesim窗口時,roslaunch會重新啟動一個新的。
7 required="true"
???
此屬性表示當這個節點退出后,roslaunch會關閉所有的節點,并退出。
8讓一個節點在單獨的終端窗口中啟動:
roslaunch 使所有的節點都共用一個終端,要想節點有自己的終端可以使用
launch-prefix="xterm -e"
???
9 命名空間ns
ns="turtlesim1"
??? 1
如果同一個節點使用這個屬性可以創建了兩個無關的節點。
eg:
<launch>
??? <node
??? name="turtlesim_node "
??? pkg="turtlesim"
??? type="turtlesim_node "
??? ns="sim1"
??? />
??? <node
??? pkg="turtlesim"
??? type="turtle_teleop_key "
??? name="teleop_key"
??? required="true"
??? launch ?prefix="xterm ?e"
??? ns="sim1"
??? />
??? <node
??? name="turtlesim_node "
??? pkg="turtlesim"
??? type="turtlesim_node "
??? ns="sim2"
??? />
??? <node
??? pkg="a gitr "
??? type="pubvel"
??? name="velocity_publisher "
??? ns="sim2"
??? />
</launch>
???
10.remap :在launch文件中重新命名:使用 remap 元素
格式:<remap from="original-name" to="new-name" />
如果這個 remap 是 launch 元素的一個child(子類),與 node 元素同一層級, 并在 launch 元素內的最頂層。那么這個 remapping 將會作用于后續所有的節點。
將turtle1/pose 重新命名為tim
使用rosrun 命令rosrun turtlesim turtlesim_node turtle1/pose:=tim
使用roslaunch
?<node pkg="turtlesim" type="turtlesim_node"
??????? name="turtlesim" >
??????? <remap from="turtle1/pose" to="tim" />
??? </node>
?
??? including
??? 這個屬性期望我們添加想要包含的文件的完整路徑。但是大多數時候,include 元素使用一個 find 命令來搜索一個程序包,代替一個明確的完整路徑:
<include file="$(find package-name)/launch-file-name" />
?
roslaunch 命令 將會在程序包(package)的子目錄里搜索launch文件。 include 元素必須要指定文件的特定路徑,你可以使用 find 來找到這個程序包,但是卻不能在這個程序包目錄里面自動的找到某個子目錄里有launch文件。舉例:
這樣做是正確的:<include file = "find learning_tutrols"/launch/start_demo.launch" / >
這樣做是錯誤的:<include file = "find learning_tutrols"/start_demo.launch" />
?
include 元素也支持 ns 屬性,可以讓這個文件里的內容推送到一個命名空間里面:
<include file=". . . " ns="namespace" />
?
一般我們都會給 include 元素設置一個 ns 屬性。
12 .param 標簽
wiki.ros.org/roslaunch/XML/param
定義了一個參數服務器上的參數,屬性有
name : 參數名字
type :參數的類型,”str|int|double|bool”
value:參數的值,除了value還可以使用以下三種
textfile= $(find pkg-name)/path/file.txt,該文件的內容將被讀取并存儲為一個字符串,此文件必須是本地的,可訪問的。所以強烈推薦使用$(find pkg-name) 形式來。避免在另一臺機器上找不到文件路徑運行失敗。
binfile="$(find pkg-name)/path/file"該文件的內容將被讀取并存儲為Base64編碼的XML-RPC二進制對象
command="$(find pkg-name)/exe '$(find pkg-name)/arg.txt'"
parameter server 參數除了上述方法外,可以通過以下方式設置
命令行 rosparam set / rosparam get 設置
代碼中
roscpp: ros::param::set / ros::param::get
rospy: set_param / get_param
13.rosparam 標簽
wiki.ros.org/roslaunch/XML/rosparam
rosparam :可以使用從rosparam YAML文件加載,刪除,dump ,ROS參數服務器參數
rosparam 參數:
command=”load|dump|delete” (optional, default=load)
file=”$(find pkg-name)/path/foo.yaml” (load or dump commands)
param=”param-name”
ns=”namespace” (optional)
subst_value=true|false (optional) 是否允許替換yaml文本中的參數
eg:
<rosparam command="load" file="$(find rosparam)/example.yaml" />//加載文件中的參數
<rosparam command="delete" param="my/param" />//刪除參數
<arg name="whitelist" default="[3, 2]"/>
<rosparam param="whitelist" subst_value="True">$(arg whitelist)</rosparam> //替換
<rosparam param="a_list">[1, 2, 3, 4]</rosparam>
<rosparam>
? a: 1
? b: 2
</rosparam>
?? 參考:
blog.csdn.net/fengmengdan/article/details/42984429
blog.csdn.net/github_35160620/article/details/52618271
?
總結
以上是生活随笔為你收集整理的由浅到深理解ROS(5.1)- roslaunch 学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 14.9万元!欧拉好猫GT 401km版
- 下一篇: 个体户怎么在网上申请信用卡