一、ROS包消息/服務模式與要點
從功能上看,ROS包是信息交互和處理的基本單元。根據信息的交互和處理方式,ROS包有如下兩大類:服務器
消息發佈者與訂閱者
服務器與客戶端
對於消息模式的包,信息的提供者主動,信息的使用者被動:信息使用者接收到消息後執行回調函數處理信息,即處理信息的回調函數由信息發佈者觸發;函數
對於服務模式的包,信息的提供者被動,信息的使用者主動:信息使用者須要時向信息提供者查詢,提供者收到查詢參數後,調用回調函數計算結果真後給予應答,即處理信息的回調函數由服務的查詢者(信息使用者)觸發;工具
要點以下:測試
1.1 消息發佈與訂閱
消息的定義方法:
消息定義於包目錄的msg/xxx.msg中
定義消息的包能夠與發佈者/訂閱者的包不同
在消息定義包的package.xml中加上build_depend和run_depend約束項
在消息定義包的CMakeLists.txt中設置好find_package(), catkin_package(), add_message_files(), generate_messages()
消息的發佈
完成節點初始化 ros::init()
建立節點句柄 ros::NodeHandle
調用NodeHandle的advertise方法建立消息發佈者
調用消息發佈者的publish方法發佈消息
消息的訂閱
建立訂閱到消息後須要執行的回調函數
完成節點初始化 ros::init()
建立節點句柄 ros::NodeHandle
調用NodeHandle的subscribe方法建立消息訂閱者並綁定回調函數
ros::spin()
消息發佈和訂閱的命令行工具
經過命令行發佈和訂閱消息,不用經過ROS節點,測試的時候很是方便:
1. rosmsg show [message type] 顯示消息的數據格式
2. rostopic echo /topic_name 顯示特定topic接收到的消息
3. rostopic pub <topic-name> <topic-type> [data...] 向特定的topic發送消息ui
1.2 服務器與客戶端
服務的定義方法:
服務定義於包目錄的srv/xxx.srv中
定義服務的包能夠與服務器/客戶端的包不同
在消息定義包的CMakeLists.txt中設置好find_package(), add_service_files(), generate_messages()
服務器
建立處理服務數據的回調函數
完成節點初始化 ros::init()
建立節點句柄 ros::NodeHandle
調用節點句柄的advertiseService函數啓動服務
ros::spin()
客戶端
完成節點初始化 ros::init()
建立節點句柄 ros::NodeHandle
調用節點句柄的serviceClient函數建立客戶端對象client,經過服務名稱綁定服務
申明服務類型的對象(srv),並將srv.request部分賦初值
調用client的call(srv)函數調用服務
服務執行成功後,經過srv.response取得服務器的應答結果
命令行工具
rosservice call <service-name> [service-args]調用特定服務
1.3 須要注意的細節
消息/服務模式的節點實現時要include消息/服務對應的頭文件
上述頭文件須要先編譯消息定義包來生成,所以須要在消息/服務使用者對應的CMakeLists.txt中加上add_dependencies()約束,不然會出現找不到頭文件的現象
信息交互中的被動方,即消息模式的消息訂閱者或服務模式的服務器在都要調用ros::spin(),該函數確保回調可以發生。命令行