# 3.1 Node & Master
## 3.1.1 Node
在ROS的世界里,最小的進程單元就是節點(node)。一個軟件包里可以有多個可執行文件,可執行文件在運行之后就成了一個進程(process),這個進程在ROS中就叫做**節點**。
從程序角度來說,node就是一個可執行文件(通常為C++編譯生成的可執行文件、Python腳本)被執行,加載到了內存之中;從功能角度來說,通常一個node負責者機器人的某一個單獨的功能。由于機器人的功能模塊非常復雜,我們往往不會把所有功能都集中到一個node上,而會采用分布式的方式,把雞蛋放到不同的籃子里。例如有一個node來控制底盤輪子的運動,有一個node驅動攝像頭獲取圖像,有一個node驅動激光雷達,有一個node根據傳感器信息進行路徑規劃……這樣做可以降低程序發生崩潰的可能性,試想一下如果把所有功能都寫到一個程序中,模塊間的通信、異常處理將會很麻煩。
我們在1.4節打開了小海龜的運動程序和鍵盤控制程序,在1.5節同樣啟動了鍵盤運動程序,這每一個程序便是一個node。ROS系統中不同功能模塊之間的通信,也就是節點間的通信。我們可以把鍵盤控制替換為其他控制方式,而小海龜運動程序、機器人仿真程序則不用變化。這樣就是一種模塊化分工的思想。
## 3.1.2 Master
由于機器人的元器件很多,功能龐大,因此實際運行時往往會運行眾多的node,負責感知世界、控制運動、決策和計算等功能。那么如何合理的進行調配、管理這些node?這就要利用ROS提供給我們的節點管理器master, master在整個網絡通信架構里相當于管理中心,管理著各個node。node首先在master處進行注冊,之后master會將該node納入整個ROS程序中。node之間的通信也是先由master進行“牽線”,才能兩兩的進行點對點通信。當ROS程序啟動時,第一步首先啟動master,由節點管理器處理依次啟動node。
## 3.1.3 啟動master和node
當我們要啟動ROS時,首先輸入命令:
$ roscore
此時ROS master啟動,同時啟動的還有`rosout`和`parameter server`,其中`rosout`是負責日志輸出的一個節點,其作用是告知用戶當前系統的狀態,包括輸出系統的error、warning等等,并且將log記錄于日志文件中,`parameter server`即是參數服務器,它并不是一個node,而是存儲參數配置的一個服務器,后文我們會單獨介紹。每一次我們運行ROS的節點前,都需要把master啟動起來,這樣才能夠讓節點啟動和注冊。
master之后,節點管理器就開始按照系統的安排協調進行啟動具體的節點。節點就是一個進程,只不過在ROS中它被賦予了專用的名字里——node。在第二章我們介紹了ROS的文件系統,我們知道一個package中存放著可執行文件,可執行文件是靜態的,當系統執行這些可執行文件,將這些文件加載到內存中,它就成為了動態的node。具體啟動node的語句是:
$ rosrun pkg_name node_name
通常我們運行ROS,就是按照這樣的順序啟動,有時候節點太多,我們會選擇用launch文件來啟動,下一小節會有介紹。
Master、Node之間以及Node之間的關系如下圖所示:

## 3.1.3 rosrun和rosnode命令
**rosrun命令的詳細用法如下**:
$ rosrun [--prefix cmd] [--debug] pkg_name node_name [ARGS]
rosrun將會尋找PACKAGE下的名為EXECUTABLE的可執行程序,將可選參數ARGS傳入。
例如在GDB下運行ros程序:
$ rosrun --prefix 'gdb -ex run --args' pkg_name node_name
**rosnode命令的詳細作用列表如下**:
| rosnode命令 | 作用 |
| :------: | :------: |
| `rosnode list` | 列出當前運行的node信息 |
| `rosnode info node_name` | 顯示出node的詳細信息 |
| `rosnode kill node_name` | 結束某個node |
| `rosnode ping` | 測試連接節點 |
| `rosnode machine ` | 列出在特定機器或列表機器上運行的節點 |
| `rosnode cleanup`| 清除不可到達節點的注冊信息|
以上命令中常用的為前三個,在開發調試時經常會需要查看當前node以及node信息,所以請記住這些常用命令。如果你想不起來,也可以通過`rosnode help`來查看`rosnode`命令的用法。
- 前言
- 第一章 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