ROS
ROS是機器人操作系統(Robot Operating System)的英文縮寫。 ROS是用於編寫機器人軟件程序的一種具有高度靈活性的軟件架構。 它包含了大量工具軟件、庫代碼和約定協議, 旨在簡化跨機器人平臺創建複雜、魯棒的機器人行爲這一過程的難度與複雜度。 ROS的原型源自斯坦福大學的STanford Artificial Intelligence Robot (STAIR) 和 Personal Robotics (PR)項目。2007 正式啓動,相當於運行在Linux上的中間件。
其他介紹
ROS wiki的解釋
ROS(Robot Operating System,下文簡稱“ROS”)是一個適用於機器人的開源的元操作系統。 它提供了操作系統應有的服務,包括硬件抽象,底層設備控制,常用函數的實現,進程間消息傳遞,以及包管理。 它也提供用於獲取、編譯、編寫、和跨計算機運行代碼所需的工具和庫函數。
ROS 的主要目標是爲機器人研究和開發提供代碼複用的支持。 ROS是一個分佈式的進程(也就是“節點”)框架,這些進程被封裝在易於被分享和發佈的程序包和功能包中。ROS也支持一種類似於代碼儲存庫的聯合系統,這個系統也可以實現工程的協作及發佈。這個設計可以使一個工程的開發和實現從文件系統到用戶接口完全獨立決策(不受ROS限制)。同時,所有的工程都可以被ROS的基礎工具整合在一起。
Brian Gerkey的網上留言
我通常這樣解釋ROS:
- 通道:ROS提供了一種發佈-訂閱式的通信框架用以簡單、快速地構建分佈式計算系。
- 工具:ROS提供了大量的工具組合用以配置、啓動、自檢、調試、可視化、登錄、測試、終止分佈式計算系統。
- 強大的庫:ROS提供了廣泛的庫文件實現以機動性、操作控制、感知爲主的機器人功能。
- 生態系統:ROS的支持與發展依託着一個強大的社區。ros.org尤其關注兼容性和支持文檔,提供了一套“一站式”的方案使得用戶得以搜索並學習來自全球開發者數以千計的ROS程序包。
ROS 工程結構
catkin 工作空間: ROS 定製的編譯構建系統,對CMake的擴展。 組織和管理功能包的文件夾,以 catkin 工具編譯。
mkdir ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
# compile
cd ~/catkin_ws/
catkin_make
source ~/catkin_ws/devel/setup.bash
catkin workspace :
- src 源代碼
- build cmake & catkin 緩存和中間文件
- devel 目標文件存放的目錄
src:
- package1
- CMakeLists.txt 規定了catkin 編譯的規則
- package.xml 定義了包的屬性,相當於包的自我描述
- package2
- CMakelists.txt
- package.xml
包是catkin 編譯的基本單元 一個包的目錄機構:
- package
- Cmakelists.txt
- package.xml
- scripts/
- *.py
- *.sh
- include/
- *.h
- src/
- *.cpp
- msg/
- srv/
- action/
- config/*.yaml
- launch/*.launch
常用指令
rospack find package_name # 查找某個包的位置
rospack list # 列出本地所有的包
roscd package_name # 跳轉到某個包路徑下
rosls package_name # 列舉某個包下的文件信息
rosed package_name file_name # 編輯某個包下的文件
catkin_create_pkg <pkg_name> [deps] #創建包
rosdep install [pkg_name] #安裝某個包所需的依賴
通信架構(計算圖級)
master 節點管理器
每個 node 啓動時都要向 master 註冊。master 管理node 之間的通信。 roscore 程序向節點提供連接信息,以便節點之間可以互相傳遞信息的服務程序。
roscore
# 啓動 ros master
# 啓動 rosout:日誌輸出
# 啓動 parameter server: 參數服務器
node (ROS 中的進程)
node 是包裏可執行文件運行的實例
- 啓動 node
rosrun [pkg_name] [node_name]
rosnode list # 列出當前運行的 node 信息
rosnode info [node_name] # 查看某個node的詳細信息
rosnode kill [node_name]
-
啓動 node 的另一種方法:roslunch 啓動一系列節點的工具。當節點增多,使用rosrun 逐一啓動各個節點是不現實的。 操作launch 文件 而不是節點。這些文件有 .launch 後綴。
roslaunch [pkg_name] [file_name.launch] # launch 文件也是 xml 格式
Topic
ROS 中的異步通信。publish - subscribers模式。一個topic 可以有多個訂閱者。 同一個topic也可以有多個發佈者。
Message
topic 內容的數據類型,定義在pkg/msg/*.msg 文件中。 基本的msg可用的類型有:bool,int64,uint,float64,string,array[],array[C]等。 還有 time, duration, header.
- 相關命令
rostopic list 列出當前所有的topic
rostopic info /topic_name 顯示某個 topic 的屬性信息
rostopic echo /topic_name 顯示某個 topic 的內容
rostopic pub /topic_name 向某個 topic 發佈內容
## rosmsg
rosmsg list 列出系統上所有的msg
rosmsg show /msg_name 顯示某個msg的內容
使用 rostopic pub 向小車傳遞移動信息寫法
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0.0, z: 0.0}, angular:{x: 0.0, y: 0.0, z: 0.0}}'
Service
ROS 中的同步通信方式,Node之間可以通過 request-reply 方式通信。調用時才執行。
# rosservice 類比與 rostopic
rosservice list # 列出當前所有活躍的 service
roservice info service_name # 顯示某個service 的屬性信息
roservice call service_name args # 調用某個service # 不知道參數具體格式時,可以n按TAB鍵
# rossrv 類比與 rosmsg
rossrv list # 列出系統上所有的srv
rossrv show srv_name # 顯示某個srv的內容
.srv 文件能嵌套.msg, 但不能嵌套 .srv。
Topic VS Service
Topic | Service | |
---|---|---|
通信原理 | 異步通信 | 同步通信 |
實現原理 | TCP/IP | TCP/IP |
通信模型 | Publish-Subscribe | Request-Reply |
Publisher-Subscribers | Client-Server | |
多對多 | 多對一 | |
接收者收到數據會回調(callback) | 遠程過程調用(RPC)服務器端的服務 | |
應用場景 | 連續,高頻的數據發佈 | 偶爾調用的功能/具體的任務 |
舉例 | 激光雷達,里程計發佈數據 | 開關傳感器,拍照,逆解計算 |
注:定義了 srv, 或者msg 都需要到 package.xml 和 CMakelists.txt 中添加相應的部分。
Parameter Server
在啓動系統時,系統自動啓動參數服務器。存儲各種參數的字典,可用命令行,launch文件和 node(API)讀寫。
- rosparam 一個命令行工具,用於與參數服務器交互。
rosparam list # 列出當前所有參數
rosparam get param_key # 顯示某個參數的值
rosparam set param_key param_value # 設置某個參數的值
rosparam dump file_name # 保存參數到文件, yaml格式
rosparam load file_name # 從文件讀取參數
rosparam delete param_key # 刪除參數
- 在launch 文件中與設置參數相關的標籤有 和
Action
升級版的service, 帶有狀態反饋的通信方式, 通常用在長時間,可搶佔的任務中。action 通信的數據格式定義在 *.action 中。-> 是客戶發給服務端,<- 是服務器返回給請求方。
Action Client | ROS Topic | Action Server |
---|---|---|
goal -> | ||
cancel -> | ||
status <- | ||
result <- | ||
feedback <- |
常用工具
Gazebo 仿真
機器人仿真工具,ODE物理引擎,可用於動力學,導航,感知等任務的模擬。
RViz
RViz: The Robot Visualization tool 可視化工具,方便監控和調試
rqt
可視化工具,常用rqt_graph, rqt_plot, rqt_console。 基於qt開發,可擴展性好。
- rqt_graph 圖可視化工具,可以用來檢查軟件的通信架構。
- rqt_plot 繪製曲線
- rqt_console 查看日誌
CLI tools
命令行工具有很多,可以用在終端下輸入ros後按tab鍵查看。再次只介紹rosbag。
- rosbag 命令行工具,記錄和回放數據流, 原理是記錄topic 生成 *.bag 用於回放。
rosbag record <topic_names> # 記錄某些topic 到bag 中
rosbag record -a # 記錄所有的topic
rosbag play <bag-files> # 回放bag
專用工具
Moveit
Client Library
和API 類似,並在其上進行了封裝,提供ROS 編程的庫(接口),例如:建立node, 發佈消息, 調用服務。 roscpp 執行效率高, rospy 開發效率高, roslisp,,,
- rospy
TF & URDF
TF: TransForm 座標系轉換,(位置+ 姿態),座標系數據維護工具
TF tree
類型:第一代 tf/tfMessage.msg, 第二代 tf2_msgs/TFMessage
- 相關命令
rosrun tf view_frames # 根據當前的tf樹創建一個pdf圖
rosrun rtq_tf_tree rtq_tf_tree # 產看當前的tf 樹
rosrun tf tf_echo [reference_frame] [target_frame] # 查看兩個frame之間的變換關係
URDF
Unified Robot Description Format 用來描述機器人的結構
- link 標籤 每個部件
- joint 標籤 連接兩個部件的關節
SLAM
- Simultaneous Localization And Mapping 同時定位和建圖
移動機器人的任務通常有:
- Mapping
- Localization
- PathPlanning
針對這些問題,ROS 提供的工具:
- SLAM 開源算法包:Gmapping SLAM, Karto SLAM等;
- AMCL(自適應蒙特卡洛定位) 定位算法包;
- Navigation 導航功能包集,分Global planning(全局規劃)和 local planning (局部導航規劃)。
namespace 和 重映射
ROS 可以在不同命名空間中啓動同一個節點來避免衝突。 ROS 程序中任何一個用於命名的字符串都可以在運行時重映射。
./image_view image:=right/image
./camera __ns:=right
./talker __name:=talker1
./talker __name:=talker2