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

在ROS中除了常见的话题(topic)通信、服务(server)通信等方式,还有action通信这一方式,由于可以实时反馈任务完成情况,该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享,实现基于action通信的阶乘运算。
第一节:自定义action文件
第二节:基于C++实现action通信的服务端
第三节:基于C++实现action通信的客户端

本节为第二节:基于C++实现action通信的服务端

详细步骤如下:

步骤1:在action_ws/src/factorial_pkg/src下创建factorial_server.cpp文件

cd action_ws/src/factorial_pkg/src
touch factorial_server.cpp

步骤2: 编写factorial_server.cpp文件

作者已在代码中进行了详细注释

#include "ros/ros.h"
// 创建一个简单行为服务器(simple_action_server)
#include "actionlib/server/simple_action_server.h"
// 导入自定义action文件
#include "factorial_pkg/FactorialAction.h"/* 由于 actionlib::SimpleActionServer<factorial_pkg::FactorialAction> 
名称太长,使用typedef给它一个简短的命名 */
typedef actionlib::SimpleActionServer<factorial_pkg::FactorialAction> as;// 定义FactorialAction类,阶乘运算将在这个类内实现
class FactorialAction
{
protected:ros::NodeHandle nh_; // ros句柄as as_; // 定义行为服务器 as_// action通信的话题名称(类似于话题通信中的topic name)std::string action_name_; // 定义action中的结果与反馈变量factorial_pkg::FactorialResult result_;factorial_pkg::FactorialFeedback feedback_;public:// 构造函数(使用参数列表进行参数初始化)FactorialAction(std::string name):/* as_的第一个参数是NodeHandle的名称第二个参数是action通信的话题名称第三个参数用于将回调函数与当前的对象进行绑定<个人想法:理解不了就背一下(反正作者是背的Hhh...)>第四个参数用于选择是否自动启动如果是false,需要as_.start()启动如果true,则不需要改行代码注意, as_()内的参数位置不能改变 */as_(nh_, name, boost::bind(&FactorialAction::executeCB, this, _1), false),action_name_(name){as_.start();}~FactorialAction(){}/*回调函数的实现1 需要定义频率 ros::Rate r(10),主要是feedback需要使用2 具体实现阶乘*/void executeCB(const factorial_pkg::FactorialGoalConstPtr &goal){ros::Rate r(10);bool success = true;// 获取goal -> goalint64_t g = goal->goal;// 实现阶乘int64_t result = 1;for(int i=1; i<=g; i++){// 检查进程是否需要关闭if(as_.isPreemptRequested() || !ros::ok()){as_.setPreempted();success = false;break;}result = result * i;feedback_.feedback_num = i / (double)g;// 发送feedbackas_.publishFeedback(feedback_);r.sleep();}if(success){result_.result = result;ROS_INFO("%s: Succeeded", action_name_.c_str());// 发送feedbackas_.setSucceeded(result_);}}};int main(int argc, char *argv[])
{ros::init(argc, argv, "factorial_server");// 实例化一个对象,传入行为服务器话题名称FactorialAction factorial_action("factorial_action"); ros::spin();return 0;
}

步骤3:编写factorial_pkg下的CMakeLists.txt文件

add_executable(factorial_server src/factorial_server.cpp)
target_link_libraries(factorial_server ${catkin_LIBRARIES})

步骤4:检查是否成功创建simple_action_server

启动roscore,
新打开一个终端运行factorial_server节点,
与此同时,再新打开一个终端执行rostopic list -v

如果没有问题会有如下效果

a@melodic:~/desk/action_ws$ rostopic list -vPublished topics:* /factorial_action/result [factorial_pkg/FactorialActionResult] 1 publisher* /rosout [rosgraph_msgs/Log] 1 publisher* /factorial_action/status [actionlib_msgs/GoalStatusArray] 1 publisher* /rosout_agg [rosgraph_msgs/Log] 1 publisher* /factorial_action/feedback [factorial_pkg/FactorialActionFeedback] 1 publisherSubscribed topics:* /rosout [rosgraph_msgs/Log] 1 subscriber* /factorial_action/cancel [actionlib_msgs/GoalID] 1 subscriber* /factorial_action/goal [factorial_pkg/FactorialActionGoal] 1 subscribera@melodic:~/desk/action_ws$ catkin_create_pkg 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot启动过程?

目录 1. 启动入口 2. SpringApplication 初始化 3. 准备环境 4. 创建应用上下文(ApplicationContext) 5. 准备应用上下文 6. 刷新应用上下文 7. 启动 Web 服务器(若为 Web 应用) 8. 发布 ApplicationStartedEvent 事件 9. 执行 Runner 10. 发布 ApplicationReady…

VUE 获取视频时长,无需修改数据库,前提当前查看视频可以得到时长

第一字段处 <el-table-column label"视频时长" align"center"> <template slot-scope"scope"> <span>{{ formatDuration(scope.row.duration) }}</span> </template> </el-ta…

seacmsv9注入管理员账号密码+orderby+limit

一、seacmsv9 SQL注入漏洞 1.1 seacms漏洞介绍 海洋影视管理系统&#xff08;seacms&#xff0c;海洋cms&#xff09;是一套专为不同需求的站长而设计的视频点播系统&#xff0c;采 用的是 php5.Xmysql 的架构&#xff0c;seacmsv9漏洞文件&#xff1a;./comment/api/index.p…

WPF学习之Prism(二)

前言 学习一下Prism。 1.Prism Prism框架提供了一套丰富的工具、类和模块&#xff0c;帮助开发人员实现以下功能&#xff1a; 模块化&#xff1a;Prism框架支持将应用程序拆分为多个模块&#xff0c;每个模块具有自己的功能和视图。这种模块化的设计使得应用程序更加灵活和…

【EB-03】 AUTOSAR builder与EB RTE集成

AUTOSAR builder与EB RTE集成 1. Import Arxml files to Tresos2. Run MultiTask Script3. Add Components3.1 Run EcuExtractCreator Script4. Mapping Component to Partitions5. Event Mapping/Runnables Mapping to Tasks6. Port Connect7. Run SvcAs_Trigger Script8. Ver…

算法教程:香槟塔问题

香槟塔问题 问题描述 我们将玻璃杯堆成金字塔状,第一排有 1 个玻璃杯,第二排有 2 个玻璃杯,依此类推,直到第 100 排。每个玻璃杯装一杯香槟。 然后,将一些香槟倒入最上面的第一个玻璃杯中。当最上面的玻璃杯装满时,任何多余的液体都会均匀地落到它左右两侧的玻璃杯上。当…

FastJSON 默认行为:JSON.toJSONString 忽略 null 字段

完整的 FakeRegistrationController 代码&#xff0c;这让我可以全面分析后端逻辑&#xff0c;特别是为什么空的字段&#xff08;如 compareDate&#xff09;不返回给前端。我将详细分析代码的每个接口&#xff0c;尤其是与 list 请求和字段返回相关的部分&#xff0c;并解释原…

大模型基础概念之神经网络宽度

在大模型中,神经网络宽度是提升模型容量的核心手段之一,与深度、数据规模共同构成性能的三大支柱。合理增加宽度可显著增强模型表达能力,但需结合正则化、硬件优化和结构设计进行平衡。未来趋势可能包括动态宽度调整、稀疏化宽度设计(如MoE)以及更高效宽度-深度复合缩放策…

在Linux环境下利用MTCNN进行人脸检测(基于ncnn架构)

概述 本文将详细介绍如何在Linux环境下部署MTCNN模型进行人脸检测&#xff0c;并使用NCNN框架进行推理。 1. CMake的安装与配置 下载CMake源码 前往CMake官网下载&#xff0c;找到适合您系统的最新版本tar.gz文件链接&#xff0c;或者直接通过wget下载&#xff1a;CMake官方…

算法day1 dfs搜索2题

一 火星人 拿到这种类似于排序的&#xff0c;这个就好比如我们之前学习dfs基础的时候里面的指数型枚举 指数型枚举数据与数据之间没有任何枚举&#xff0c;就比如选这个数字与不选组合型枚举数据与数据之间有联系&#xff0c;下一个数字不可以给上一个数字排列型枚举数据与数…

CC攻击防御策略全解析:技术实现与代码示例

CC攻击&#xff08;Challenge Collapsar&#xff09;是一种以消耗服务器资源为目标的分布式拒绝服务攻击&#xff08;DDoS&#xff09;&#xff0c;其特点在于攻击流量伪装成合法请求&#xff0c;难以通过传统防火墙完全防御。本文将从技术实现角度详细解析CC攻击的防御策略&am…

(九)axios的使用

1、axios 的基本使用 1.1、简介 在 Web 开发的演进历程中&#xff0c;数据请求方式的变革至关重要。回溯早期&#xff0c;旧浏览器在向服务器请求数据时&#xff0c;存在严重弊端。由于返回的是整个页面数据&#xff0c;每次请求都会导致页面强制刷新&#xff0c;这不仅极大地…

【MySQL篇】数据库基础

目录 1&#xff0c;什么是数据库&#xff1f; 2&#xff0c;主流数据库 3&#xff0c;MySQL介绍 1&#xff0c;MySQL架构 2&#xff0c;SQL分类 3&#xff0c;MySQL存储引擎 1&#xff0c;什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xf…

网络安全事件研判

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 研判&#xff08;入侵检测&#xff09; 研判我理解为人工层面对入侵检测事件进行再分析&#xff0c;即借助已有的设备告警根据经验判断是否为真实action 研判工作…

python整理文件下

我们使用 os.path.join() 函数拼接出文件要移动的目标地址。 并使用 os.path.exists() 函数配合 not 关键字找到未创建的文件夹。 这节课&#xff0c;我们会先创建文件夹&#xff0c;然后再移动文件到目标文件夹。如果文件夹不存在&#xff0c;我们需要先创建文件夹&#xff…

hackmyvm-buster

题目地址 信息收集 主机发现 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…

FS800DTU联动OneNET平台数据可视化View

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件环境 2.3 硬件连接 3 注册OneNET云平台并建立物模型 3.1 参数获取 3.2 连接OneNET 3.3上报数据 4 数据可视化View 4.1 用户信息获取 4.2 启用数据可视化View 4.3 创建项目 4.4 编辑项目 4.5 新增数据源 4.6 数据过滤器配置 4.6 项…

Dockerfile 中的 COPY 语句:作用与使用详解

在 Docker 的构建过程中&#xff0c;Dockerfile 是一个核心文件&#xff0c;它定义了镜像的构建步骤和内容。其中&#xff0c;COPY 语句是一个非常重要的指令&#xff0c;用于将文件或目录从构建上下文&#xff08;通常是 Dockerfile 所在的目录及其子目录&#xff09;复制到容…

大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理

大白话Vuex 核心概念&#xff08;state、mutations、actions&#xff09;的使用案例与原理 Vuex是Vue.js应用程序中专门用来管理状态的工具&#xff0c;就好像是一个大管家&#xff0c;帮你把项目里一些重要的数据和操作管理得井井有条。下面用大白话结合案例来介绍Vuex核心概…

机器学习介绍与数据集

一、机器学习介绍与定义 1.1 机器学习定义 机器学习&#xff08;Machine Learning&#xff09;是让计算机从数据中自动学习规律&#xff0c;并依据这些规律对未来数据进行预测的技术。它涵盖聚类、分类、决策树、贝叶斯、神经网络、深度学习&#xff08;Deep Learning&#xf…