# launch study 1. 啟動ROS節點: ```htmlmixed= <launch> <node pkg="package-name"type="executable-name" name="node-name" /> </launch> ``` 常用參數: - pkg:定義執行node所在的pkckage名稱 - type:可執行文件名稱,也就是你的node名稱 - name:定義節點運行時的名稱 備註:pkg,type等同於在終端中使用rosrun命令執行node時的輸入參數 一般參數: - output = "screen":將node的標準輸出到終端屏幕,默認輸出為日誌文檔 - respawn = "true":若設置此參數為True則該節點停止時,會自動重啟,默認為false - required = " true":當該節點終止時,launch文件中的其他節點也被終止 - ns = "namespace":命名空間,為節點內的相對名稱添加命名空間前綴 - args = "arguments":節點需要的輸入參數 2.設定參數 (1) <param> ROS系統運行中的參數,儲存在參數服務器(Parameter Server),可以想成是所有node使用的全域變數,通常是使用在硬體參數的調整,例如像是相機取像解析度的調整,使用方式如下 ```htmlmixed= <launch> <param name="output_frame" value="odom"/> </launch> ``` 運行launch文件後,output_frame這個parameter的值就設置為odom,並且加載到ROS參數服務器上了。但是在很多複雜的系統中,參數的數量很多,如果這樣一個一個的設置會非常麻煩,ROS也為我們提供了另外一種類似的參數加載方式<rosparam> ```htmlmixed= <launch> <rosparamfile="filename.yaml" command="load" ns="local_costmap" /> </launch> ``` <rosparam>可以幫助我們將一個yaml格式文件中的參數全部加載到ROS參數服務器中,需要設置command屬性為“load”,還可以選擇設置命名空間“ns”。 程式中得到parameter server的範例 https://blog.csdn.net/EliminatedAcmer/article/details/80639546 http://blog.sina.com.cn/s/blog_602f87700102wt29.html (2) <arg> argument是另外一個概念,類似於launch文件內部的區域變數,僅限於launch文件使用,和ROS節點內部的實現沒有關係,設置argument使用<arg>標籤元素,語法如下: ```htmlmixed= <launch> <arg name=”arg-name” default=”arg-value”/> </launch> ``` launch文件中需要使用到argument時,可以使用如下方式調用: ```htmlmixed= <launch> <arg="$(arg arg-name)" value="argument value" /> <node name="node" pkg="package" type="type" args="$(arg arg-name)" /> </launch> ``` 3.重映射機制 ROS的設計目標是提高代碼的複用率,所以ROS社區中的很多功能包我們都可以拿來直接使用,而不需要關注功能包的內部實現。那麼問題就來了,別人功能包的接口不一定和我們的系統兼容呀? ROS提供一種重映射的機制,簡單來說就是取別名,類似於C++中的別名機制,我們不需要修改別人功能包的接口,只需要將接口名稱重映射一下,取個別名,我們的系統就認識了(接口的數據類型必須相同)。launch文件中的<remap>標籤可以幫我們實現這個重映射的功能。 比如turtlebot的鍵盤控制節點,發布的速度控制指令話題可能是/turtlebot/cmd_vel,但是我們自己的機器人訂閱的速度控制話題是/cmd_vel,這個時候使用<remap>就可以輕鬆解決問題,將/turtlebot / cmd_vel重映射為/cmd_vel,我們的機器人就可以接收到速度控制指令了: ```htmlmixed= <launch> <remap from="/turtlebot/cmd_vel"to="/cmd_vel"/> </launch> ``` 4.include 在復雜的系統當中,launch文件往往有很多,這些launch文件之間也會存在依賴關係。如果需要直接**引入一個已有launch文件中的內容,可以使用<include>標籤包含其他launch文件**,這和C語言中的include幾乎是一樣的。 ```htmlmixed= <launch> <include file="$(dirname)/other.launch" /> </launch> ``` launch文件中的tag完整說明 https://blog.csdn.net/lewif/article/details/75736286 更多資訊如下 http://wiki.ros.org/roslaunch/XML http://ttshun.com/2018/05/24/ROS%E5%AD%A6%E4%B9%A0%E4%B9%8Broslaunch/ http://www.voidcn.com/article/p-kcoeitrs-sm.html https://www.cnblogs.com/aobosir/p/5928530.html 古月連結 https://zhuanlan.zhihu.com/p/47919563