# 3.2 launch文件
## 3.2.1 簡介
機器人是一個系統工程,通常一個機器人運行操作時要開啟很多個node,對于一個復雜的機器人的啟動操作應該怎么做呢?當然,我們并不需要每個節點依次進行rosrun,ROS為我們提供了一個命令能一次性啟動master和多個node。該命令是:
$ roslaunch pkg_name file_name.launch
roslaunch命令首先會自動進行檢測系統的roscore有沒有運行,也即是確認節點管理器是否在運行狀態中,如果master沒有啟動,那么roslaunch就會首先啟動master,然后再按照launch的規則執行。launch文件里已經配置好了啟動的規則。
所以`roslaunch`就像是一個啟動工具,能夠一次性把多個節點按照我們預先的配置啟動起來,減少我們在終端中一條條輸入指令的麻煩。
## 3.2.2 寫法與格式
launch文件同樣也遵循著xml格式規范,是一種標簽文本,它的格式包括以下標簽:
```xml
<launch> <!--根標簽-->
<node> <!--需要啟動的node及其參數-->
<include> <!--包含其他launch-->
<machine> <!--指定運行的機器-->
<env-loader> <!--設置環境變量-->
<param> <!--定義參數到參數服務器-->
<rosparam> <!--啟動yaml文件參數到參數服務器-->
<arg> <!--定義變量-->
<remap> <!--設定參數映射-->
<group> <!--設定命名空間-->
</launch> <!--根標簽-->
```
參考鏈接:http://wiki.ros.org/roslaunch/XML
## 3.2.3 示例
launch文件的寫法和格式看起來內容比較復雜,我們先來介紹一個最簡單的例子如下:
```xml
<launch>
<node name="talker" pkg="rospy_tutorials" type="talker" />
</launch>
```
這是官網給出的一個最小的例子,文本中的信息是,它啟動了一個單獨的節點`talker`,該節點是包`rospy_tutorials`軟件包中的節點。
然而實際中的launch文件要復雜很多,我們以`Ros-Academy-for-Beginners`中的`robot_sim_demo`為例:
```xml
<launch>
<!--arg是launch標簽中的變量聲明,arg的name為變量名,default或者value為值-->
<arg name="robot" default="xbot2"/>
<arg name="debug" default="false"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<!-- Start Gazebo with a blank world -->
<include file="$(find gazebo_ros)/launch/empty_world.launch"> <!--include用來嵌套仿真場景的launch文件-->
<arg name="world_name" value="$(find robot_sim_demo)/worlds/ROS-Academy.world"/>
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<!-- Oh, you wanted a robot? --> <!--嵌套了機器人的launch文件-->
<include file="$(find robot_sim_demo)/launch/include/$(arg robot).launch.xml" />
<!--如果你想連同RViz一起啟動,可以按照以下方式加入RViz這個node-->
<!--node name="rviz" pkg="rviz" type="rviz" args="-d $(find robot_sim_demo)/urdf_gazebo.rviz" /-->
</launch>
```
這個launch文件相比上一個簡單的例子來說,內容稍微有些復雜,它的作用是:啟動gazebo模擬器,導入參數內容,加入機器人模型。
## 小結
對于初學者,我們不要求掌握每一個標簽是什么作用,但至少應該有一個印象。如果我們要進行自己寫launch文件,可以先從改launch文件的模板入手,基本可以滿足普通項目的要求。
- 前言
- 第一章 ROS簡介
- 機器人時代的到來
- ROS發展歷程
- 什么是ROS
- 安裝ROS
- 安裝ROS-Academy-for-Beginners教學包
- 二進制與源碼包
- 安裝RoboWare Studio
- 單元測試一
- 第二章 ROS文件系統
- Catkin編譯系統
- Catkin工作空間
- Package軟件包
- CMakeLists.txt
- package.xml
- Metapacakge軟件元包
- 其他常見文件類型
- 單元測試二
- 第三章 ROS通信架構(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常見msg類型
- 單元測試三
- 第四章 ROS通信架構(二)
- Service
- Srv
- Parameter server
- Action
- 常見srv類型
- 常見action類型
- 單元測試四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 單元測試五
- 第六章 roscpp
- Client Library與roscpp
- 節點初始、關閉與NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 時鐘
- 日志與異常
- 第七章 rospy
- Rospy與主要接口
- Topic in rospy
- Service in rospy
- Param與Time
- 第八章 TF與URDF
- 認識TF
- TF消息
- tf in c++
- tf in python
- 統一機器人描述格式
- 附錄:TF數學基礎
- 三維空間剛體運動---旋轉矩陣
- 三維空間剛體運動---歐拉角
- 三維空間剛體運動---四元數
- 第九章 SLAM
- 地圖
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附錄:Navigation工具包說明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery