1. 程式人生 > >ROS launch啟動文件的理解與編寫

ROS launch啟動文件的理解與編寫

ali 但是 機器人 聲明 nod 一段 cut body 調用

博客參考:https://blog.csdn.net/weixin_41995979/article/details/81784987 和 https://www.cnblogs.com/zjiaxing/p/5542614.html

簡述

ROS提供了一個同時啟動節點管理器(master)和多個節點的途徑,即使用啟動文件(launch file)。事實上,在ROS功能包中,啟動文件的使用是非常普遍的。任何包含兩個或兩個以上節點的系統都可以利用啟動文件來指定和配置需要使用的節點。通常的命名方案是以.launch作為啟動文件的後綴,啟動文件是XML文件。一般把啟動文件存儲在取名為launch的目錄中。 每個XML文件都必須要包含一個根元素。根元素由一對launch標簽定義:<launch> … <launch>元素都應該包含在這兩個標簽之內
roslaunch PACKAGE_NAME LAUNCH_FILE_NAME
屬性 屬性作用
name="NODE_NAME" 為節點指派名稱,這將會覆蓋掉ros::init()定義的node_name
pkg="PACKAGE_NAME" 節點所在的包名
type="FILE_NAME" 執行文件的名稱如果是用Python編寫的就填寫xxx.py,如果是cpp就寫編譯生成的可執行文件名
output="screen" 終端輸出轉儲在當前的控制臺上,而不是在日誌文件中
respawn="true" 當roslaunch啟動完所有該啟動的節點之後,會監測每一個節點,保證它們正常的運行狀態。對於任意節點,當它終止時,roslaunch 會將該節點重啟
required="true" 當被此屬性標記的節點終止時,roslaunch會將其他的節點一並終止。註意此屬性不可以與respawn="true"一起描述同一個節點
launch-prefix = "command-prefix" 相當於在執行啟動命令時加上一段命令前綴
ns = "NAME_SPACE" 這個屬性可以讓你在自定義的命名空間裏運行節點

節點屬性之節點元素的形式

<node pkg=”package-name” type=”executable-name” name=”node-name”/>

在節點標簽末尾的斜杠“/”是必須的,但很容易忘。你也可以這樣顯式地給出結束標簽:

<node pkg=”…”type=”…” name=”…”></node>

如果該節點有子節點,例如 remap 或者 param 元素,那麽該顯式結束標簽是必不缺少的。還有就是name屬性給節點指派了名稱,它將覆蓋任何通過調用 ros::int來賦予節點的名稱。在默認狀態下,從啟動文件啟動節點的標準輸出被重定向到一個日誌文件中,而不是在制臺顯示。該日誌文件的名稱是:

~/.ros/log/run_id/node_name-number-stout.log

其中,run_id 是節點管理器(master)啟動時生成的一個唯一標示符。

節點屬性之顯示屬性

某個單獨的節點在控制臺中輸出信息,只需在節點元素中配置:output=”screen” 配置了該屬性的節點會將標準輸出顯示在屏幕上而不是記錄到日誌文檔。

節點屬性之復位屬性

對於每個節點,設置復位屬性為真 respawn=”true”,這樣當節點停止的時候,roslaunch會重新啟動該節點。比如在某個節點因為軟件崩潰或硬件故障以及其他原因導致過早退出系統的時候會起到作用。 節點屬性之必要節點:當一個節點被聲明為必要節點即 required=”true”終止的時候,roslaunch 會終止所有其他活躍節點並退出。比如在依賴控制臺的機器人遙控導航中,關閉了該遠程控制節點所在的窗口,roslaunch將會終止其他節點,然後退出。

節點屬性之命名空間

ns=”namespace”,前提是節點的代碼在創建 ros::Pbulisherros::Subccriber 對象時使用了像 turtle1/pose 這樣的相對名稱 (而不是/turtle1/pose 這樣的全局名稱)。同樣,啟動文件中的節點名稱是相對名稱。例如<node name="turtlesim_node" pkg="turtlesim " type="turtlesim_node" ns="sim1" />而不能是node name="/turtlesim_node" ,可以這麽不準確的理解:兩只連體小龜,他們做一件事是同時在做,比如讓他們以不同的速度前進,他們做不到,若做手術分開,把他倆放在不同的房間(命名空間)他倆真正地獨立起來,這樣每個小龜可以接受不同的命令去做事,而且互不幹擾。動文件默認命名空間是全局命名空間“/”,因此,節點的默認命名空間就解析為/sim1,所以對應的全局名稱即/sim1/turtlesim_node。

名稱重映射

重映射是基於替換的思想,每個重映射包含一個原始名稱和一個新名稱。每當節點使用重映射中的原始名稱時,ROS客戶端庫就會將它默默地替換成其對應的新名稱。例如,運行一個 turtlesime 的實例, 如果想要把海龜的姿態數據發布到話題/tim 而不是/turtle1/pose,就可以使用如下命令

rosrun turtlesim turtlesim_node turtle1/pose:=tim

通過啟動文件的方式,只需在啟動文件內使用重映射(remap)元素即可

<remap from=”turtle1/pose” to ”tim”/>

包含其他文件

如果想在啟動文件中包含其他啟動文件的內容( 包括所有的節點和參數),可以使用包含(include)元素

<include file=”$(find package-name)/path/launch-file-name”>

由於直接輸入路徑信息很繁瑣且容易出錯,大多數包含元素都使用查找(find)命令搜索功能包的位置來替代直接輸入路徑。

啟動參數

roslaunch還支持啟動參數,有時也簡稱為參數甚至args。在ROS中prarmeter和argument 是不同的,雖然翻譯一樣。parameter是運行中的ROS系統使用的數值,存儲在參數服務器(parameter server)中,每個活躍的節點都可以通過 ros::param::get 函數來獲取parameter的值,用戶也可以通過rosparam來獲得parameter的值而argument只在啟動文件內才有意義他們的值是不能被節點直接獲取的。

<arg name=”arg-name” default=”arg-value”/>
<arg name=”arg-name” value=”arg-value”/>

兩者的唯一區別在於命令行參數

roslaunch xx yy.launch arg-name:=t

可以覆蓋默認值default,但是不能覆蓋參數值 value。用 $(arg arg-name) 在每個該替換出現的地方,roslaunch 都將它替換成參數值。

ROS launch啟動文件的理解與編寫