ROS的action通信——实现阶乘运算(三)

news/2025/2/26 16:33:04

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
如果没有问题,则可以得到最终结果
在这里插入图片描述


http://www.niftyadmin.cn/n/5868936.html

相关文章

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…

【前端基础】Day 1 HTML

总结&#xff1a; 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

【前沿探索篇九】【DeepSeek具身智能:机器人操作学习框架】

第一章 具身智能的"五感觉醒" 1.1 多模态感知的神经交响乐 我们的多模态编码器就像机器人的大脑皮层,把不同传感器数据拧成一股绳: class MultimodalEncoder(nn.Module):def __init__(self):sel

电脑不能正常启动了怎么办?查看解决方法

电脑是我们日常生活和工作中不可缺少的工具&#xff0c;但有时候我们可能会遇到电脑不能正常启动的问题&#xff0c;这会给我们带来很多麻烦和困扰。那么&#xff0c;电脑不能正常启动的原因有哪些&#xff0c;又该如何解决呢&#xff1f;本文将为你介绍几种常见的情况和对应的…

STM32【3】芯片的底层组成概论

关于单片机的组成 单片机的意思是&#xff0c;小小计算电脑&#xff0c;麻雀虽小&#xff0c;五脏俱全&#xff0c;里面包含了CPU&#xff0c;ROM&#xff0c;RAM&#xff0c;各种外设。 CPU地位最高&#xff0c;可以访问ROM和RAM&#xff0c;Flash&#xff0c;GPIO等外设&…

面试基础----ReentrantLock vs Synchronized

ReentrantLock vs Synchronized&#xff1a;源码级解析与高并发场景下的锁博弈 引言&#xff1a;多线程编程中的锁为何重要&#xff1f; 业务背景&#xff1a;北京互联网大厂的高并发场景&#xff08;如电商秒杀、支付交易、实时推荐系统&#xff09;对线程安全和性能的极致要…

医疗UI的特殊法则:复杂数据可视化的“零错误”设计守则

在当今医疗技术日新月异的时代&#xff0c;医疗UI设计不仅关乎用户体验&#xff0c;更直接关联到患者的生命健康。尤其是在处理复杂数据时&#xff0c;如何确保可视化的准确性和无误性&#xff0c;成为医疗UI设计的一大挑战。以下&#xff0c;我们将深入探讨医疗UI在复杂数据可…

城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章

当艺术与科技相遇&#xff0c;会碰撞出怎样的火花&#xff1f;城电科技推出的光伏太阳花&#xff0c;以其独特的设计与智能化的功能&#xff0c;给出了答案。这款产品不仅具备太阳能发电的实用功能&#xff0c;更是一件充满科技属性的艺术性光伏产品&#xff0c;吸引了广泛关注…