ros入門(一),組織架構,通信架構和常用工具


參考

  • 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下也可以放通信相關文件

  1. msg 消息(.msg)
  2. srv 服務(.srv)
  3. 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!是目前爲止應用最廣泛的開源操作軟件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章