參考
- http://wiki.ros.org/
- mooc上重德智能的ros操作系統教程
- 講義: https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/
- 視頻
安裝
直接參考官方文檔,如對melodic版本的:http://wiki.ros.org/melodic/Installation/Ubuntu
文件組織架構
ros使用的是catkin編譯系統,首先要建立一個catkin工作空間
mkdir -p catkin_ws/src
cd catkin_ws
catkin_make
運行完上述命令後初始化完成,於是一個ros的工作空間得以建立
工作空間內的目錄如下
使用指令tree可以查看目錄結構
工作空間下包括src(源代碼),devel(環境step.bash等文件及目標文件),build三個文件夾
package
package下有兩個關鍵文件: CMakeLists.txt和package.xml(包的介紹等,包括其依賴等)
其中scripts文件下放的是可執行腳本,src目錄下可以放python文件
package下也可以放通信相關文件
- msg 消息(.msg)
- srv 服務(.srv)
- action 動作(.action)
package下也可以通過config文件夾和launch文件夾下的.config和.launch 將多個package可執行文件一同執行
rospack
# 查找某個pkg的地址
$ rospack find package_name
roscd
# 跳轉到某個pkg目錄下
$ roscd package_name
rosls
# 列舉某個pkg下的文件信息
rosls package_name
rosed
# 編輯pkg中的文件
$ roscd package_name file_name
catkin_creat_pkg
# 創建一個pkg
$ catkin_create_pkg <pkg_name>[deps]
rosdep
# 安裝某個pkg所需的依賴,用於從github下載的ros包的依賴的創建,如msf的依賴以及重德智能的依賴
$ rosdep install [pkg_name]
metapackage
一個虛包,本身沒有什麼實質性內容,但是指定了其運行所需的衆多依賴,可以通過運行它,安裝這些依賴,ros之前將這種稱之爲軟件包集Stack
ros開發中常用到的幾個metapacakge
Metapacakge名稱 | 描述 | 鏈接 |
---|---|---|
navigation | 導航相關的功能包集 | https://github.com/ros-planning/navigation |
moveit | 運動規劃相關的(主要是機械臂)功能包集 | https://github.com/ros-planning/moveit |
image_pipeline | 圖像獲取、處理相關的功能包集 | https://github.com/ros-perception/image_common |
vision_opencv | ROS與OpenCV交互的功能包集 | https://github.com/ros-perception/vision_opencv |
turtlebot | Turtlebot機器人相關的功能包集 | https://github.com/turtlebot/turtlebot |
pr2_robot | pr2機器人驅動功能包集 | https://github.com/PR2/pr2_robot |
… | … | … |
通信架構
master: 節點管理器,每一個node都要在master這裏進行註冊,master也承擔了聯繫不同node的責任
node: 節點,類似於進程,加載了靜態的可執行文件,但是node是動態的
指令
roscore
啓動master,同時啓動的還有rosout(日誌輸出)以及parameter sever(參數服務器)
rosnode
# 列出當前運行節點的詳細信息
rosnode list
# 某個節點的詳細信息
rosnode info [node_name]
# 結束某個node
rosnode kill [node_name]
運行包
$ rosrun [--prefix cmd] [--debug] pkg_name node_name [ARGS]
我們並不需要每個節點依次進行rosrun,ROS爲我們提供了一個命令能一次性啓動master和多個node,具體使用roslaunch命令,如果沒有運行roscore其會首先執行roscore
$ roslaunch pkg_name file_name.launch
當前有一個默認的規則,把能啓動整個系統的包名加上bringup
通信方式
Topic
異步通信
tostopic相關命令
命令 | 作用 |
---|---|
rostopic list |
列出當前所有的topic |
rostopic info topic_name |
顯示某個topic的屬性信息 |
rostopic echo topic_name |
顯示某個topic的內容 |
rostopic pub topic_name ... |
向某個topic發佈內容 |
rostopic bw topic_name |
查看某個topic的帶寬 |
rostopic hz topic_name |
查看某個topic的頻率 |
rostopic find topic_type |
查找某個類型的topic |
rostopic type topic_name |
查看某個topic的類型(msg) |
topic的通信方式使用.msg文件,定義方式類似c語言中的結構體,具體使用命令如下
rosmsg命令 | 作用 |
---|---|
rosmsg list |
列出系統上所有的msg |
rosmsg show msg_name |
顯示某個msg的內容 |
舉例如下:
Quaternion.msg
#消息代表空間中旋轉的四元數
#文件位置:geometry_msgs/Quaternion.msg
float64 x
float64 y
float64 z
float64 w
Vector3.msg
#文件位置:geometry_msgs/Vector3.msg
float64 x
float64 y
float64 z
service
不同於topic,service是同步通信,即既有指令又有反饋,有等待的過程,Service是同步通信方式,所謂同步就是說,此時Node A發佈請求後會在原地等待reply,直到Node B處理完了請求並且完成了reply,Node A纔會繼續執行。Node A等待過程中,是處於阻塞狀態的成通信。這樣的通信模型沒有頻繁的消息傳遞,沒有衝突與高系統資源的佔用,只有接受請求才執行服務,簡單而且高效。
Node B是server(應答方),提供了一個服務的接口,叫做/Service
,我們一般都會用string類型來指定service的名稱,類似於topic。Node A向Node B發起了請求,經過處理後得到了反饋
rosservice命令:
rosservice 命令 | 作用 |
---|---|
rosservice list |
顯示服務列表 |
rosservice info |
打印服務信息 |
rosservice type |
打印服務類型 |
rosservice uri |
打印服務ROSRPC uri |
rosservice find |
按服務類型查找服務 |
rosservice call |
使用所提供的args調用服務 |
rosservice args |
打印服務參數 |
srv
包括一個request和一個reply兩個過程,其中srv的問答和回覆可以使用msg文件,msg也可以嵌套msg文件
舉例:
msgs_demo/srv/DetectHuman.srv
bool start_detect
---
my_pkg/HumanPose[] pose_data
msgs_demo/msg/HumanPose.msg
std_msgs/Header header
string uuid
int32 number_of_joints
my_pkg/JointPose[]joint_data
msgs_demo/msg/JointPose.msg
string joint_name
geometry_msgs/Pose pose
floar32 confidence
再舉幾個不同類型的srv的例子
AddTwoInts.srv
#對兩個整數求和,虛線前是輸入量,後是返回量
#文件位置:自定義srv文件
int32 a
int32 b
---
int32 sum
Empty.srv
#文件位置:std_srvs/Empty.srv
#代表一個空的srv類型
---
GetMap.srv
#文件位置:nav_msgs/GetMap.srv
#獲取地圖,注意請求部分爲空
---
nav_msgs/OccupancyGrid map
rossrv命令:
rossrv 命令 | 作用 |
---|---|
rossrv show |
顯示服務描述 |
rossrv list |
列出所有服務 |
rossrv md5 |
顯示服務md5sum |
rossrv package |
列出包中的服務 |
rossrv packages |
列出包含服務的包 |
service和topic
service和topic比較如下
名稱 | Topic | Service |
---|---|---|
通信方式 | 異步通信 | 同步通信 |
實現原理 | TCP/IP | TCP/IP |
通信模型 | Publish-Subscribe | Request-Reply |
映射關係 | Publish-Subscribe(多對多) | Request-Reply(多對一) |
特點 | 接受者收到數據會回調(Callback) | 遠程過程調用(RPC)服務器端的服務 |
應用場景 | 連續、高頻的數據發佈 | 偶爾使用的功能/具體的任務 |
舉例 | 激光雷達、里程計發佈數據 | 開關傳感器、拍照、逆解計算 |
完成這些文件後還要修改CMakeLists.txt和package.xml等文件
如xml文件添加依賴:
<build_depend>** message_generation **</build_depend>
<run_depend>** message_runtime **</run_depend>
Parameter server
個人理解不知道爲什麼把它當成通信模式一種
-
命令行維護
-
launch文件內讀寫
-
node源碼
命令行操作:
rosparam 命令 | 作用 |
---|---|
rosparam set param_key param_value |
設置參數 |
rosparam get param_key |
顯示參數 |
rosparam load file_name |
從文件加載參數 |
rosparam dump file_name |
保存參數到文件 |
rosparam delete |
刪除參數 |
rosparam list |
列出參數名稱 |
Action
這是一種service通信方式的補充,當server運行時間過長時可以反饋給client當前狀態,client可以終止請求
action包括3個部分
- 目標: 機器人執行一個動作,應該有明確的移動目標信息,包括一些參數的設定,方向、角度、速度等等。從而使機器人完成動作任務。
- 反饋: 在動作進行的過程中,應該有實時的狀態信息反饋給服務器的實施者,告訴實施者動作完成的狀態,可以使實施者作出準確的判斷去修正命令。
- 結果: 當運動完成時,動作服務器把本次運動的結果數據發送給客戶端,使客戶端得到本次動作的全部信息,例如可能包含機器人的運動時長,最終姿勢等等。
Action規範文件的後綴名是.action,它的內容格式如下:
# Define the goal
uint32 dishwasher_id # Specify which dishwasher we want to use
---
# Define the result
uint32 total_dishes_cleaned
---
# Define a feedback message
float32 percent_complete
其中action也是可以缺少其中一項的,但是—不能少
AddTwoInts.action
#文件位置:自定義action文件
#表示將兩個整數求和
int64 a
int64 b
---
int64 sum
---
當然還需要修改CMakeLists.txt和xml
ros常用工具
gazebo是一種最常用的ROS仿真工具,也是目前仿真ROS效果最好的工具。
RViz是可視化工具,是將接收到的信息呈現出來。
rqt則是非常好用的數據流可視化工具,有了它我們可以直觀的看到消息的通信架構和流通路徑。
rosbag則是對軟件包進行操作的一個命令,此外還提供代碼API,對包進行操作編寫。
rosbridge是一個溝通ROS和外界的功能包。
moveit!是目前爲止應用最廣泛的開源操作軟件。