目 录CONTENT

文章目录

基于AP的服务器网络延迟

Rho
Rho
2023-10-25 / 0 评论 / 0 点赞 / 31 阅读 / 5928 字

这段代码是一个ROS节点,它是一个服务器节点,它提供了由network_delay节点请求的动作。这有助于计算网络中的应用层延迟。以下是每行代码的中文注释:

#include <ros/ros.h> // 引入ROS头文件
#include <actionlib/server/simple_action_server.h> // 引入actionlib头文件,用于创建动作服务器
#include <network_analysis/PingAction.h> // 引入自定义的PingAction头文件,定义了动作的目标、反馈和结果

class PingAction // 定义一个PingAction类
{
protected:

ros::NodeHandle nh_; // 创建一个ROS节点句柄
actionlib::SimpleActionServer<network_analysis::PingAction> as_; // 创建一个动作服务器对象,使用network_analysis::PingAction类型的动作
std::string action_name_; // 定义一个字符串变量,存储动作的名称
network_analysis::PingFeedback feedback_; // 定义一个feedback_变量,存储动作的反馈信息
network_analysis::PingResult result_; // 定义一个result_变量,存储动作的结果信息

public:

PingAction(std::string name) : // 定义一个构造函数,接受一个字符串参数name
as_(nh_, name, boost::bind(&PingAction::executeCB, this, 1), false), // 初始化动作服务器对象,传入节点句柄、动作名称、执行回调函数和自动启动选项
action_name(name) // 初始化动作名称变量
{
as_.start(); // 启动动作服务器
}

~PingAction(void) // 定义一个析构函数
{
}

void executeCB(const network_analysis::PingGoalConstPtr &goal) // 定义一个执行回调函数,接受一个目标指针参数goal
{
// helper variables
ros::Rate r(1000); // 创建一个ros::Rate对象,设置循环频率为1000Hz
bool success = true; // 定义一个布尔变量,存储执行状态

// start executing the action
if(goal->inp) // 如果目标参数的inp值为真
{
// check that preempt has not been requested by the client
if (as_.isPreemptRequested() || !ros::ok()) // 如果客户端请求了抢占或者ROS系统异常
{
ROS_INFO("ROS Action %s: Preempted", action_name_.c_str()); // 打印日志信息,表示动作被抢占
// set the action state to preempted
as_.setPreempted(); // 设置动作状态为抢占状态
success = false; // 设置执行状态为失败
return; // 返回函数
}
feedback_.fb = true; // 设置反馈信息的fb值为真
// publish the feedback
as_.publishFeedback(feedback_); // 发布反馈信息给客户端
//r.sleep

}

if(success) // 如果执行状态为成功
{
result_.outp = feedback_.fb; // 设置结果信息的outp值为反馈信息的fb值
ROS_INFO("ROS Action %s: Succeeded", action_name_.c_str()); // 打印日志信息,表示动作成功完成
// set the action state to succeeded
as_.setSucceeded(result_); // 设置动作状态为成功状态,并发送结果信息给客户端
}
}

};

int main(int argc, char** argv) // 定义主函数,接受命令行参数
{
ros::init(argc, argv, "pingactionserver"); // 初始化ROS系统,并设置节点名称为pingactionserver

PingAction Ping("Ping"); // 创建一个PingAction对象,传入动作名称为Ping
ros::spin(); // 进入循环,等待动作请求

return 0; // 返回0,表示程序正常退出
}
0

评论区