ROS系统 动作编程
生活随笔
收集整理的這篇文章主要介紹了
ROS系统 动作编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
什么是動作
- 一種問答通信機制
- 帶有連續反饋
- 可以在任務過程終止運行
- 基于ROS的消息機制實現。
Action的接口:
- goal:發布任務目標
- cancel:請求取消任務
- status:通知客戶端當前的狀態
- feedback:周期反饋任務運行的監控數據
- result:向客戶端發送任務的執行結果,只發布一次。
創建功能包
cd ~/catkin_ws/src catkin_create_pkg learning_action std_msgs roscpp rospy定義 action 文件夾
cd ~/catkin_ws/src/learning_action mkdir action創建 DoDishes.action 文件
cd ~/catkin_ws/src/learning_action/action touch DoDishes.actionDoDishes.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- 定義目標信息:uint32 dishwasher_id
- 定義結果信息:uint32 total_dishes_cleaned
- 定義周期反饋的信息:float32 percent_complete
在package.xml中添加功能包依賴
<build_depend>actionlib</build_depend> <build_depend>actionlib_msgs</build_depend> <exec_depend>actionlib</exec_depend> <exec_depend>actionlib_msgs</exec_depend>在CMakeLists.txt添加編譯選項
find_package(catkin REQUIRED COMPONENTS................actionlib_msgs actionlib ) add_action_files(DIRECTORY action FILES DoDishes.action) generate_messages(DEPENDENCIES std_msgs actionlib_msgs)配置完成后,對工程目錄進行編譯
cd ~/catkin_ws catkin_make如何實現一個動作服務器
- 初始化ROS節點
- 創建動作服務器實例
- 啟動服務器,等待動作請求
- 在回調函數中完成動作服務功能的處理,并反饋進度信息
- 動作完成,發送結束信息。
通過以下代碼去調用生成的頭文件
在 src 目錄下創建 兩個 cpp文件
cd ~/catkin_ws/src/learning_action/src創建 DoDishes_server.cpp 文件
touch DoDishes_server.cpp以下是 DoDishes_server.cpp 文件中的內容
代碼功能:實現一個動作服務器
如何實現一個動作客戶端
- 初始化ROS節點
- 創建動作客戶端實例
- 連接動作服務端
- 發送動作目標
- 根據不同類型的服務端反饋處理回調函數
創建 DoDishes_client.cpp 文件
touch DoDishes_client.cppDoDishes_client.cpp 文件中的內容
代碼功能:實現一個動作客戶端
DoDishes_client.cpp #include <actionlib/client/simple_action_client.h> #include "learning_communication/DoDishesAction.h"typedef actionlib::SimpleActionClient<learning_communication::DoDishesAction> Client;// 當action完成后會調用該回調函數一次 void doneCb(const actionlib::SimpleClientGoalState& state,const learning_communication::DoDishesResultConstPtr& result) {ROS_INFO("Yay! The dishes are now clean");ros::shutdown(); }// 當action激活后會調用該回調函數一次 void activeCb() {ROS_INFO("Goal just went active"); }// 收到feedback后調用該回調函數 void feedbackCb(const learning_communication::DoDishesFeedbackConstPtr& feedback) {ROS_INFO(" percent_complete : %f ", feedback->percent_complete); }int main(int argc, char** argv) {ros::init(argc, argv, "do_dishes_client");// 定義一個客戶端Client client("do_dishes", true);// 等待服務器端ROS_INFO("Waiting for action server to start.");client.waitForServer();ROS_INFO("Action server started, sending goal.");// 創建一個action的goallearning_communication::DoDishesGoal goal;goal.dishwasher_id = 1;// 發送action的goal給服務器端,并且設置回調函數client.sendGoal(goal, &doneCb, &activeCb, &feedbackCb);ros::spin();return 0; }在CMakeLists.txt文件中添加以下代碼:
add_executable(DoDishes_client src/DoDishes_client.cpp) target_link_libraries( DoDishes_client ${catkin_LIBRARIES}) add_dependencies(DoDishes_client ${${PROJECT_NAME}_EXPORTED_TARGETS})add_executable(DoDishes_server src/DoDishes_server.cpp) target_link_libraries( DoDishes_server ${catkin_LIBRARIES}) add_dependencies(DoDishes_server ${${PROJECT_NAME}_EXPORTED_TARGETS})編譯工程項目
cd ~/catkin_ws catkin_make啟動ROS Master
roscore啟動自定義的客戶端
rosrun learning_action DoDishes_client啟動自定義的服務端
rosrun learning_action DoDishes_server總結
以上是生活随笔為你收集整理的ROS系统 动作编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROS系统 通过服务编程实现两个数相加并
- 下一篇: ROS 分布式通信