引出
launch時roslaunch首先檢查roscore是否已經啓動,如果沒有則啓動roscore。
roscore會做三件事:
- 啓動master節點,該節點是隱藏的,用於通過消息名查詢目標節點,實現消息、服務在各個節點之間的連接
- 啓動parameter server,用於設置與查詢參數
- 啓動日誌節點,記錄所有消息收發和stdout、stderr, 目前roscore暫不會加入其他功能。
其中啓動的任務(節點)列表
任務名稱 | 任務功能 | 特性 |
---|---|---|
master | 通過消息名查詢目標節點,實現消息、服務在各個節點之間的連接 | 隱藏 |
parameter server | 設置與查詢參數 | - |
日誌節點 | 記錄所有消息收發和stdout、stderr | - |
parameter server
參數的訪問有三種方式:
- 命令行:rosparam set / rosparam get
- launch文件:param / rosparam
- API:
roscpp: ros::param::set / ros::param::get
rospy: set_param / get_param
訪問方式
其中parameter server參數服務器,可以方便地通過設置參數來改變節點的行爲。參數服務器內的參數是以key,value的形式交互。 其中key可以加前綴作爲命名空間構成多級參數。
參數的訪問有三種方式:
- 命令行:rosparam set / rosparam get
- launch文件:param / rosparam
- API:
- roscpp: ros::param::set / ros::param::get
- rospy: set_param / get_param
可用數據類型
The Parameter Server使用 XMLRPC數據類型作爲參數值包括
- 32-bit integers
- booleans
- strings
- doubles
- iso8601 dates
- lists
- base64-encoded binary data
命名空間
parameter的命名使用正常的ROS命名傳統,這個意味着參數可以是一個分級的,他和和ros topic,ros node是一致的。層級可以很好保護參數的名稱衝突,另外對於相關的參數的表示也是有幫助的。
/camera/left/name: leftcamera
/camera/left/exposure: 1
/camera/right/name: rightcamera
/camera/right/exposure: 1.1
roscpp中的parameter server
roscpp中的API上述數據類型,對於其他的數據類型需要使用XmlRpc::XmlRpcValue Class
功能 | 函數名 | command-line tool |
---|---|---|
Getting Parameters | ros::NodeHandle::getParam(),ros::param::get() | rosparam get get parameter |
Setting Parameters | ros::NodeHandle::setParam(),ros::param::set() | rosparam set set parameter |
Checking Parameter Existence | ros::NodeHandle::hasParam(),ros::param::has() | - |
Deleting Parameters | ros::NodeHandle::deleteParam(),ros::param::del() | rosparam delete delete parameter |
Searching for Parameter Keys | ros::NodeHandle::searchParam() | - |
Retrieving Lists | - | rosparam list list parameter names |
load form file | - | rosparam load load parameters from file |
dump to file | - | rosparam dump dump parameters to file |
launch
ROS中,param特指在參數服務器parameter server中存儲的參數
在launch文件中有兩個相關的標籤:、
- 標籤可用於直接設置參數,也可以從文件中讀取
- 標籤用於從yaml文件中讀取並設置參數
roslaunch發現和標籤後會調用rosparam包來實現設置
使用參數 | 描述 |
---|---|
command=”load | dump |
file=”$(find pkg-name)/path/foo.yaml” (load or dump commands) | Name of rosparam file. |
param=”param-name” | Name of parameter. |
ns=”namespace” (optional) | Scope the parameters to the specified namespace. |
subst_value=true | false (optional) |
Examples
<rosparam command="load" file="$(find rosparam)/example.yaml" />
<rosparam command="delete" param="my/param" /
arg
標籤給launch文件內部設置參數,通過標籤設置的參數僅在launch文件內有效.
標籤有三種設置參數的方式:
- 直接用此標籤設置
- 用此標籤聲明,用roslaunch命令確定其值
- 用此標籤聲明,在include本launch文件的父launch文件中確定其值
只有一種使用方式:通過launch文件內部的substitution args來使用:$(arg foo)
arg的整個設置到解析僅在roslaunch解析launch文件過程中使用
完成整個啓動過程後即刻失效
env
標籤用於設置環境變量,此處“環境變量”是指linux系統的進程環境變量,設置了的node對應的進程可觀察到此環境變量。可以通過getenv函數讀取, ros也提供了跨平臺函數ros::get_environment_variable來讀取環境變量。需要注意的是此法設置的環境變量是進程的環境變量,在運行roslaunch的shell上是echo不出來的。 可以先rosnode info查看節點進程的pid,例如是12345,再cat /proc/12345/evniron | tr ‘\0’ ‘\n’來查看進程的環境變量。
注意:launch文件的substitution args: $(env ENVIRONMENT_VARIABLE)用於查詢當前shell環境變量
是無法查詢設置的進程環境變量的。故無法改變launch的行爲,只能通過getenv或ros::get_environment_variable來改變節點的行爲