# 6.1 Client Library與roscpp
## 6.1.1 Client Library簡介
ROS為機器人開發者們提供了不同語言的編程接口,比如C++接口叫做roscpp,Python接口叫做rospy,Java接口叫做rosjava。盡管語言不通,但這些接口都可以用來創建topic、service、param,實現ROS的通信功能。Clinet Lirary有點類似開發中的Helper Class,把一些常用的基本功能做了封裝。
目前ROS支持的Clinet Library包括:
| Client Library | 介紹 |
| :------: | :------: |
| roscpp | ROS的C++庫,是目前最廣泛應用的ROS客戶端庫,執行效率高 |
| rospy | ROS的Python庫,開發效率高,通常用在對運行時間沒有太大要求的場合,例如配置、初始化等操作 |
| roslisp | ROS的LISP庫 |
| roscs | Mono/.NET.庫,可用任何Mono/.NET語言,包括C#,Iron Python, Iron Ruby等|
| rosgo | ROS Go語言庫|
| rosjava | ROS Java語言庫|
| rosnodejs | Javascript客戶端庫|
| ... | ...|
目前最常用的只有roscpp和rospy,而其余的語言版本基本都還是測試版。
從開發客戶端庫的角度看,一個客戶端庫,至少需要能夠包括master注冊、名稱管理、消息收發等功能。這樣才能給開發者提供對ROS通信架構進行配置的方法。
整個ROS包括的packages如下,你可以看到roscpp、rospy處于什么位置。

## 6.1.2 roscpp
roscpp位于`/opt/ros/kinetic`之下,用C++實現了ROS通信。在ROS中,C++的代碼是通過catkin這個編譯系統(擴展的CMake)來進行編譯構建的。所以簡單地理解,你也可以把roscpp就當作為一個C++的庫,我們創建一個CMake工程,在其中include了roscpp等ROS的libraries,這樣就可以在工程中使用ROS提供的函數了。
通常我們要調用ROS的C++接口,首先就需要`#include <ros/ros.h>`。
roscpp的主要部分包括:
* ros::init() : 解析傳入的ROS參數,創建node第一步需要用到的函數
* ros::NodeHandle : 和topic、service、param等交互的公共接口
* ros::master : 包含從master查詢信息的函數
* ros::this_node:包含查詢這個進程(node)的函數
* ros::service:包含查詢服務的函數
* ros::param:包含查詢參數服務器的函數,而不需要用到NodeHandle
* ros::names:包含處理ROS圖資源名稱的函數
具體可見:http://docs.ros.org/api/roscpp/html/index.html
以上功能可以分為以下幾類:
* Initialization and Shutdown 初始與關閉
* Topics 話題
* Services 服務
* Parameter Server 參數服務器
* Timers 定時器
* NodeHandles 節點句柄
* Callbacks and Spinning 回調和自旋(或者翻譯叫輪詢?)
* Logging 日志
* Names and Node Information 名稱管理
* Time 時鐘
* Exception 異常
看到這么多接口,千萬別覺得復雜,我們日常開發并不會用到所有的功能,你只需對要有一些印象,掌握幾個比較常見和重要的用法就足夠了。下面我們來介紹關鍵的用法。
- 前言
- 第一章 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