ROS學習筆記(一) : 入門之基本概念
目錄
基本概念
實踐操作
基本概念
1. Package
程序包,裏面包含節點Node、ROS程序庫、數據集、配置文件
Package Manefist
程序包的配置文件,即描述程序包的相關信息,包括其名字、版本、功能簡述、依賴關系
2. Repositories
代碼倉庫
3. Computation Graph
計算圖,ROS在點對點網絡裏整合並處理數據的過程。圖中包含的基本概念:節點、主機、參數服務器、消息、服務、話題、數據包。
4. Node
節點,一個機器人控制系統由多個節點組成,每個節點控制不同的部分。比如一個機器人有兩個節點,一個是傳感器節點,專門負責接收傳感器數據,另一個是控制節點,專門負責控制機器人作出某些動作。
5. Master
主機,節點管理器,功能是對於計算圖中各個元素進行名字註冊(register)和檢索,沒有主機,節點之間就不能找到彼此則無法進行通信。
Parameter Service
參數服務器,是主機的一部分,允許數據通過鍵的方式存儲
6. Message
消息,節點之間通過傳遞消息交流,消息是一種數據結構
7. Topic
話題,消息的傳輸使用的是發布\訂閱的機制。一個話題可理解為只針對某種消息,節點發送消息則是將該消息發布到其對應的話題上,只有那些訂閱該話題的節點才能接收到這個消息。一個話題可能有多個訂閱者和發布者,一般他們互相是不知道(也不需知道)對方的存在,以達到解耦(decouple)的效果。
【配圖,節點發送消息的過程】
8. Service
服務,盡管"發布\訂閱"模型非常靈活,但它是多對多、單向傳輸的,不適用於"發出請求\返回響應"方式的交互,然而這種交互在分布式系統中十分常見。因此 "請求\響應"通過服務來實現。節點需要提供的信息有:所使用服務的名字以及使用服務的客戶,將這些信息打包成請求,發送出去之後等待答復。
9. Bag
數據包,存儲一段時間內ROS的消息數據
10. Rosout
相當於ROS中的stdout/stderr
11. Roscore
主機+Rosout+參數服務器
實踐操作
1. workspace 工作空間
catkin工作空間:
創建catkin工作空間,在需要創建的目錄下輸入命令:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
- 最後一個命令是使用catkin工作空間時很方便的工具,在工作空間中第一次執行該命令時,會自動在~/catkin_ws/src文件夾中創建CMakeList,同時在工作空間目錄中創建build和devel文件夾
- 在devel文件夾中有幾個setup.*sh 文件,source其中的任一文件可將工作空間路徑包含到環境變量中
source devel/setup.bash
- 為了確認是否包含,檢查ROS_PACKAGE _PATH這個環境變量的值:
echo $ROS_PACKAGE_PATH
可以看到當前工作空間的路徑在最前面
**【註:roscd, rospack等ROS工具只能針對那些路徑已包含在環境變量ROS_PACKAGE _PATH中的程序包】**
2. package 程序包
2.1 最簡單的程序包 其文件結構看起來如下:
- my_package
- CMakeLists.txt
- package.xml
2.2 在catkin工作空間中的程序包
- workspace_folder
- src
- CMakeLists.txt
- pkg_1
- CMakeLists.txt
- package.xml
- ...
- pkg_n
- CMakeLists.txt
- package.xml
2.3 在工作空間中創建程序包
cd ~/catkin_ws/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
- 最後一個命令用於創建名為beginner_tutorials的新程序包,這個程序包依賴於std _msgs、roscpp和rospy這幾個程序包
- 執行後在src目錄下看到beginner_tutorials文件夾,裏面包含一個package.xml文件和一個CMakeList,這兩個文件已自動包含了之前在命令中規定的依賴關系
- catkin_create_pkg 格式:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
2.4 程序包的依賴關系
- 一級依賴
(註意要先將當前工作空間的路徑添加到環境變量中,即前面提到的source命令,這樣之後執行rospack命令才不會報錯提示找不到beginner_tutorials這個包)
rospack depends1 beginner_tutorials
輸出結果
std_msgs
rospy
roscpp
- 間接依賴
對於程序包A的一級依賴程序包B,其自身也依賴一些其它的程序包C,這些程序包C是A的間接依賴
rospack depends1 rospy
可看到rospy的一級依賴
rospack depend beginner_tutorials
遞歸檢測出A的所有的依賴包(包括一級和間接)
2.5 編譯程序包
用catkin_make,可認為是在CMake標準工作流程中依次調用了cmake和make
在工作空間中使用catkin_make
在工作空間的根目錄下,輸入
catkin_make
該命令會編譯位於目錄 catkin_ws/src 中的所有程序包
更多關於catkin_ make的資料: http://wiki.ros.org/catkin/commands/catkin_make
3. 用實際例子理解節點和話題
每個節點是一個可執行文件
節點之間通過話題來通信
- 比如一個遙控器節點和一個機器人節點,二者通過話題command來通信,遙控器節點發布信息到command話題中,機器人節點訂閱command話題從而接收到遙控器節點發布的信息
使用rosrun
rosrun ros_pkg ros_pkg_node
- 該命令用於運行某個ros程序包中的某個節點
使用rosnode list
rosnode list
- 該命令可以列出當前活躍的所有節點
- rosnode help 列出可選的命令參數
使用rostopic echo
rostopic echo [topic]
- 該命令可以顯示在某個話題上發布的信息
- rostopic help 列出可選的命令參數
使用rqt_graph
rosrun rqt_graph rqt_graph
- 打開rqt_graph 可以觀察到目前有哪些節點在通過什麽話題來通信
使用rqt_plot
rosrun rqt_plot rqt_plot
- 可以實時顯示一個發布到某個話題上的數據變化圖形
turtlesim模擬器的使用
首先運行turtlesim包中的turtlesim_node節點[海龜本體]
rosrun turtlesim turtlesim_node
另外打開一個終端
- 可以通過鍵盤來控制turtle [運行一個控制海龜的節點]
rosrun turtlesim turtle_teleop_key
在新終端中打開rqt_graph,可觀察到這兩個節點通過話題cmmd _vel來通信
rosrun rqt_graph rqt_graph
- 也可以通過手動發布消息到話題上來控制turtle
在新終端中, 列出當前的topic
rostopic list
列出該話題的消息類型
rostopic type /turtle1/cmd_vel
列出該消息類型的詳細數據類型
rosmsg show geometry_msgs/Twist
發布消息到話題cmd_vel,告訴turtlesim _node,使其以2.0大小的線速度和1.8大小的角速度移動
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
命令中的-1表示rostopic發布一條信息後馬上退出,也可以設置為循環發送:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
該信息以1Hz的穩定頻率來發送,使turtle保持移動狀態
這時可以觀察rqt_graph
發現多了一個節點:rostopic發布器節點,同樣地,該節點與turtlesim_node節點[海龜本體] 通過話題cmd _vel通信
roslaunch的使用
使用roslaunch同時運行多個節點,通過編寫launch文件來配置各個節點
以turtlesim為例
首先保證環境變量中是否有catkin_ws工作空間的路徑
echo $ROS_PACKAGE_PATH
若無,則進入該工作空間的根目錄,執行
source devel/setup.bash
之後在任意目錄下都可以進入之前創建的程序包
roscd beginner_tutorials
新建launch文件夾,在裏面創建launch文件
mkdir launch
gedit turtlemimic.launch
拷貝以下launch文件的內容:
http://wiki.ros.org/cn/ROS/Tutorials/UsingRqtconsoleRoslaunch
ROSCPP
ROS編寫消息發布器和訂閱器
相關API格式
https://blog.csdn.net/junshen1314/article/details/44701693 更詳細的解釋
[http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber(c%2B%2B)]
ROS學習筆記(一) : 入門之基本概念