系统环境:Ubuntu16.04
实现一个动作服务器:
1.初始化ROS节点
2.创建动作服务器实例
3.启动服务器,等待动作请求
4.在回调函数中完成动作服务功能的处理,并反馈进度信息
5.动作完成,发送结束信息
在功能包/src下新建文件DoDishes_server.cpp,输入以下内容并保存退出。
例程:
#include <ros/ros.h>
//此动作库用于实现简单动作
#include <actionlib/server/simple_action_server.h>
#include “learning_communication/DoDishesAction.h”
//提前定义一下,方便后面使用。
typedef actionlib::SimpleActionServer<learning_communication::DoDishesAction> Server;
// 收到action的goal后调用该回调函数
void execute(const learning_communication::DoDishesGoalConstPtr& goal, Server* as)
{
ros::Rate r(1);
//定义反馈
learning_communication::DoDishesFeedback feedback;
ROS_INFO("Dishwasher %d is working.", goal->dishwasher_id);
// 假设洗盘子的进度,并且按照1hz的频率发布进度feedback
for(int i=1; i<=10; i++)
{
feedback.percent_complete = i * 10;
as->publishFeedback(feedback);
r.sleep();
}
// 当action完成后,向客户端返回结果
ROS_INFO("Dishwasher %d finish working.", goal->dishwasher_id);
as->setSucceeded();
}
int main(int argc, char** argv)
{
ros::init(argc, argv, “do_dishes_server”);
ros::NodeHandle n;
// 定义一个服务器
Server server(n, "do_dishes", boost::bind(&execute, _1, &server), false);
// 服务器开始运行
server.start();
ros::spin();
return 0;
}