当前位置: 首页 > article >正文

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

在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.kler.cn/a/561702.html

相关文章:

  • openstack ironic ipa 以及用户镜像制作
  • 企业如何通过云计算提高数据的可访问性
  • Siddon算法中对参数值α的解释
  • java给钉钉邮箱发送邮件
  • RK3399 Android7双WiFi功能实现
  • 灵犀互娱游戏测试开发一面面经
  • 音视频入门基础:RTP专题(12)——RTP中的NAL Unit Type简介
  • GGUF 文件格式全解析
  • Spring Boot 中的日志管理
  • ROS ur10机械臂添加140夹爪全流程记录
  • 20-R 绘图 - 饼图
  • 高中数学基础-统计和概率
  • 在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南
  • DeepSeek 提示词:基础结构
  • MQTT实现智能家居------2、写MQTT程序的思路
  • 为什么MySQL选择使用B+树作为索引结构
  • 将 iOS 项目打包并运行到真实的 iPhone 设备
  • 第9章 机器学习与统计模型
  • ubuntu22.04的docker容器中安装ssh服务
  • MFC文件和注册表的操作