在ROS中除了常見的話題(topic)通信、服務(server)通信等方式,還有action通信這一方式,由于可以實時反饋任務完成情況,該通信方式被廣泛運用于機器人導航等任務中。本文將通過三個小節的分享,實現基于action通信的階乘運算。
第一節:自定義action文件
第二節:基于C++實現action通信的服務端
第三節:基于C++實現action通信的客戶端
本節為第三節:基于C++實現action通信的客戶端
詳細步驟如下:
步驟1:在action_ws/src/factorial_pkg/src下創建factorial_client.cpp文件
cd action_ws/src/factorial_pkg/src
touch factorial_client.cpp
步驟2: 編寫factorial_client.cpp文件
作者已在代碼中進行了詳細注釋
#include "ros/ros.h"
// 導入自定義action頭文件
#include "factorial_pkg/FactorialAction.h"
// 用于創建一個簡單的行為服務器客戶端
#include "actionlib/client/simple_action_client.h"typedef actionlib::SimpleActionClient<factorial_pkg::FactorialAction> ac;// 當任務完成時被調用,可以用來處理返回的結果
void doneCB(const actionlib::SimpleClientGoalState &goal_state, const factorial_pkg::FactorialResultConstPtr &result)
{if(goal_state.state_ == goal_state.SUCCEEDED){ROS_INFO("The task has succeeded");ROS_INFO("result: %ld", result->result);}else{ROS_INFO("The task failure");}
}// 這個回調函數在目標開始執行并變為“活動”(Active)狀態時被調用。
// 在這里,你可以執行一些操作,比如更新用戶界面,表示任務正在進行等。
void activeCB()
{ROS_INFO("Goal just went active");
}// 這個回調函數會在目標執行期間接收到反饋信息時被調用。
// 這通常用來獲取目標執行的進度、狀態更新等。
void feedbackCB(const factorial_pkg::FactorialFeedbackConstPtr &feedback)
{ROS_INFO("feedback: %.2f", feedback->feedback_num);
} int main(int argc, char *argv[])
{ros::init(argc, argv, "factorial_client");ros::NodeHandle nh_;ac ac_(nh_, "factorial_action", true);// 等待服務器啟動ac_.waitForServer();// 發送goal;factorial_pkg::FactorialGoal goal;goal.goal = 10;ac_.sendGoal(goal, &doneCB, &activeCB, &feedbackCB);ros::spin();return 0;
}
步驟3:編寫factorial_pkg下的CMakeLists.txt文件
add_executable(factorial_client src/factorial_client.cpp)
target_link_libraries(factorial_client ${catkin_LIBRARIES})
步驟四:客戶端和服務端聯調
在終端中編譯文件
打開一個終端,輸入roscore
新開一個終端,輸入rosrun factorial_pkg factorial_server
新開一個終端,輸入rosrun factorial_pkg factorial_client
如果沒有問題,則可以得到最終結果