ROS-noetic自定义action文件进行通信

news2024/11/17 16:18:01

前言

        本系统的系统是Ubuntu20.04的ros-noetic,本文讲述了通过创建 ROS 节点(服务器和客户端)的完整流程,使用 Action 实现从 1 到 N 的累加和,并在计算过程中向客户端发送进度反馈。

 整体概述

  1. 创建功能包:用来包含 Action 文件及其相关依赖。
  2. 定义 Action 文件:在.action文件中定义目标、结果和反馈。
  3. 修改配置文件:编辑CMakeLists.txt 和package.xml 以包含 Action 文件和依赖。
  4. 编写服务端和客户端:服务端实现累加逻辑并发布进度反馈,客户端发送请求并处理响应。
  5. 运行:通过 ROS Master、服务端和客户端来测试整个流程

过程

1. 创建功能包

        首先我们需要在catkin_ws/src目录下创建一个新的功能包,命名为demo_action,它将包含Action相关的代码和文件。如果没有catkin_ws的文件的话,就自己创建一下吧。

mkdir -p catkin_ws/src
catkin_make
cd ~/catkin_ws/src
catkin_create_pkg demo_action actionlib actionlib_msgs roscpp rospy std_msgs

2.创建Action文件

cd demo_action
mkdir action

        在action目录下创建名为AddInts.action的文件:

touch AddInts.action

        打开AddInts.action文件,添加以下内容:

#目标值
int32 num
---
#最终结果
int32 result
---
#连续反馈
float64 progress_bar

        这个文件中定义了请求的目标值num,最终的响应结果result,以及来纳许反馈的进度progress_bar。

3.编辑配置文件

        修改CMakeLists.txt,在功能包的根目录下,编辑CMakeLists.txt文件。

cd ~/catkin_ws/src/demo_action
sudo nano CMakeLists.txt

        找到find_package部分,添加actionlib和actionlib_msgs,修改完如下:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  actionlib
  actionlib_msgs
)

        再在下面添加add_action_files,指向.action文件。

add_action_files(
  FILES
  AddInts.action
)

        生成消息和动作文件。

generate_messages(
  DEPENDENCIES
  std_msgs
  actionlib_msgs
)

        在catkin_pachage部分声明依赖。

catkin_package(
  CATKIN_DEPENDS roscpp rospy std_msgs actionlib actionlib_msgs
)

        添加完如下图。

 

4.修改package.xml文件

        在package.xml中,添加以下依赖项声明。

<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<exec_depend>actionlib</exec_depend>
<exec_depend>actionlib_msgs</exec_depend>

        添加完如下图。

5.案例测试 

        现在使用一个简单的测试程序来测试一下是否能够正常使用。

        在demo_action/src目录中创建add_ints_server.py和add_ints_client.py文件:

cd ~/catkin_ws/src/demo_action/src
touch add_ints_server.py
sudo nano add_ints_server.py

        将server的代码复制粘贴进去:

#!/usr/bin/env python
import rospy
import actionlib
from demo_action.msg import AddIntsAction, AddIntsResult, AddIntsFeedback

class AddIntsActionServer:
    def __init__(self):
        self.server = actionlib.SimpleActionServer('add_ints', AddIntsAction, self.execute, False)
        self.server.start()

    def execute(self, goal):
        result = AddIntsResult()
        feedback = AddIntsFeedback()

        total_sum = 0
        for i in range(1, goal.num + 1):
            total_sum += i
            feedback.progress_bar = float(i) / goal.num
            self.server.publish_feedback(feedback)
            rospy.sleep(0.5)  # Simulate a delay

        result.result = total_sum
        self.server.set_succeeded(result)

if __name__ == '__main__':
    rospy.init_node('add_ints_server')
    server = AddIntsActionServer()
    rospy.spin()

        然后是client的代码。

#!/usr/bin/env python
import rospy
import actionlib
from demo_action.msg import AddIntsAction, AddIntsGoal

def feedback_cb(feedback):
    rospy.loginfo('Progress: %f' % feedback.progress_bar)

def add_ints_client():
    client = actionlib.SimpleActionClient('add_ints', AddIntsAction)
    client.wait_for_server()

    goal = AddIntsGoal(num=10)
    client.send_goal(goal, feedback_cb=feedback_cb)
    client.wait_for_result()

    return client.get_result()

if __name__ == '__main__':
    rospy.init_node('add_ints_client')
    result = add_ints_client()
    rospy.loginfo('Result: %d' % result.result)

        要确保这两个文件可执行:

chmod +x add_ints_server.py add_ints_client.py

        返回catkin_ws根目录,编译功能包:

cd ~/catkin_ws
catkin_make

        然后启动。

source devel/setup.bash

        启动Action服务器和客户端。

roscore

        启动 Action 服务器:

rosrun demo_action add_ints_server.py

        启动 Action 客户端:

rosrun demo_action add_ints_client.py

        这样就可以测试服务器和客户端是否能正常通信了。

6. 实际测试

        过程和上述的是一样的,我在这里就直接放入代码了。

server.py

#! /usr/bin/env python
import rospy
import actionlib
from demo01_action.msg import *
"""
    需求:
        创建两个ROS 节点,服务器和客户端,
        客户端可以向服务器发送目标数据N(一个整型数据)服务器会计算 1 到 N 之间所有整数的和,
        这是一个循环累加的过程,返回给客户端,这是基于请求响应模式的,
        又已知服务器从接收到请求到产生响应是一个耗时操作,每累加一次耗时0.1s,
        为了良好的用户体验,需要服务器在计算过程中,
        每累加一次,就给客户端响应一次百分比格式的执行进度,使用 action实现。
    流程:
        1.导包
        2.初始化 ROS 节点
        3.使用类封装,然后创建对象
        4.创建服务器对象
        5.处理请求数据产生响应结果,中间还要连续反馈
        6.spin
"""

class MyActionServer:
    def __init__(self):
        #SimpleActionServer(name, ActionSpec, execute_cb=None, auto_start=True)
        self.server = actionlib.SimpleActionServer("addInts",AddIntsAction,self.cb,False)
        self.server.start()
        rospy.loginfo("服务端启动")


    def cb(self,goal):
        rospy.loginfo("服务端处理请求:")
        #1.解析目标值
        num = goal.num
        #2.循环累加,连续反馈
        rate = rospy.Rate(10)
        sum = 0
        for i in range(1,num + 1):
            # 累加
            sum = sum + i
            # 计算进度并连续反馈
            feedBack = i / num
            rospy.loginfo("当前进度:%.2f",feedBack)

            feedBack_obj = AddIntsFeedback()
            feedBack_obj.progress_bar = feedBack
            self.server.publish_feedback(feedBack_obj)
            rate.sleep()
        #3.响应最终结果
        result = AddIntsResult()
        result.result = sum        
        self.server.set_succeeded(result)
        rospy.loginfo("响应结果:%d",sum)
if __name__ == "__main__":
    rospy.init_node("action_server_p")
    server = MyActionServer()
    rospy.spin()

client.py

#! /usr/bin/env python

import rospy
import actionlib
from demo01_action.msg import *

"""
    需求:
        创建两个ROS 节点,服务器和客户端,
        客户端可以向服务器发送目标数据N(一个整型数据)服务器会计算 1 到 N 之间所有整数的和,
        这是一个循环累加的过程,返回给客户端,这是基于请求响应模式的,
        又已知服务器从接收到请求到产生响应是一个耗时操作,每累加一次耗时0.1s,
        为了良好的用户体验,需要服务器在计算过程中,
        每累加一次,就给客户端响应一次百分比格式的执行进度,使用 action实现。
    流程:
        1.导包
        2.初始化 ROS 节点
        3.创建 action Client 对象
        4.等待服务
        5.组织目标对象并发送
        6.编写回调, 激活、连续反馈、最终响应
        7.spin
"""

def done_cb(state,result):
    if state == actionlib.GoalStatus.SUCCEEDED:
        rospy.loginfo("响应结果:%d",result.result)

def active_cb():
    rospy.loginfo("服务被激活....")


def fb_cb(fb):
    rospy.loginfo("当前进度:%.2f",fb.progress_bar)

if __name__ == "__main__":
    # 2.初始化 ROS 节点
    rospy.init_node("action_client_p")
    # 3.创建 action Client 对象
    client = actionlib.SimpleActionClient("addInts",AddIntsAction)
    # 4.等待服务
    client.wait_for_server()
    # 5.组织目标对象并发送
    goal_obj = AddIntsGoal()
    goal_obj.num = 10
    client.send_goal(goal_obj,done_cb,active_cb,fb_cb)
    # 6.编写回调, 激活、连续反馈、最终响应
    # 7.spin
    rospy.spin()

        如果运行成功的话,就会如下图的显示。

结语 

         在本文中,创建了一个基于 ROS 的 Action 通信示例,包括一个服务器和一个客户端。服务器能够接收来自客户端的整数输入,并计算从 1 到 N 的和。服务器在计算过程中实时反馈执行进度,客户端则展示了这一进度和最终结果。

        在以后中,可以在此基础上扩展功能,进一步探索 ROS 的其他特性,比如消息过滤、服务调用等,提升机器人系统的智能和灵活性。

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

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

相关文章

多线程极速导出/9字段10W行只需2秒/导入导出打印组件/功能丰富简单易用

一、功能特点 组件同时集成了导出数据到csv、xls、pdf和打印数据。所有操作全部提供静态方法无需new&#xff0c;数据和属性等各种参数设置采用结构体数据&#xff0c;极为方便。同时支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等数据源。提供静态方法…

如何使用GitHub Desktop管理GitLab库

不管是新手还是老手&#xff0c;Github Desktop都是在苹果系统和Windows系统上管理与创建项目的不错的方式&#xff0c;GitHub Desktop都能够让在GitHub上的工作流更为简单快捷。 注意&#xff0c;以下步骤只支持原版的GitHub Desktop 第一步 从这下载GitHub Desktop打开你的G…

CSS中<a>超链接的样式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- 伪类选择器 -->&…

大模型RAG入门到实战基础教程(非常详细),大模型RAG入门到精通,收藏这一篇就够了!

写在前面 大模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的浪潮已经席卷了几乎各行业&#xff0c;但当涉及到专业场景或行业细分域时&#xff0c;通用大模型就会面临专业知识不足的问题。相对于成本昂贵的“Post Train”或“SFT”&#xff0c;基于RAG的技…

css 中 ~ 符号的使用

直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:;">…

Vxe UI vue 使用 vxe-form 表单实现简历模板

Vxe UI 使用 vxe-form 表单实现简历模板 查看 github <template><div><p>边框&#xff1a;<vxe-switch v-model"border"></vxe-switch>标题背景&#xff1a;<vxe-switch v-model"titleBackground"></vxe-switch&…

【GreenHills】使用“gsrec”命令生成二进制文件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录在GHS中修改工程命令&#xff0c;输出hex&#xff0c;bin文件等&#xff0c;对问题进行快速答疑&#xff0c;GHS编译器如何去使用”gsrec“生成不同的二进制文件。 2、 问题场景 客户想要生成hex&#xff0c;bi…

【每日一题】LeetCode 2306.公司命名(位运算、数组、哈希表、字符串、枚举)

【每日一题】LeetCode 2306.公司命名&#xff08;位运算、数组、哈希表、字符串、枚举&#xff09; 题目描述 给定一个字符串数组 ideas&#xff0c;表示在公司命名过程中使用的名字列表。我们需要从 ideas 中选择两个不同的名字&#xff0c;称为 ideaA 和 ideaB。然后交换 i…

深入探索Go语言反射机制:reflect包的高级用法和实战技巧

深入探索Go语言反射机制:reflect包的高级用法和实战技巧 引言reflect包的作用和重要性为什么reflect包对于Go语言开发者的重要性 reflect包的基础reflect包的导入和基本用法reflect的核心概念&#xff1a;类型&#xff08;Type&#xff09;和值&#xff08;Value&#xff09;使…

数字化TPM:从概念到实践的飞跃之旅

数字化TPM&#xff0c;顾名思义&#xff0c;是将传统TPM理念与现代信息技术深度融合的产物。它不仅仅关注设备维护的“全面性”和“预防性”&#xff0c;更强调通过大数据、云计算、物联网等先进技术&#xff0c;实现设备状态的实时监控、故障预警、智能决策及优化管理。这一转…

MyBatis 深层次 Map 自动嵌套:解锁数据映射新境界

在 Java 开发的征程中&#xff0c;MyBatis 以其强大的数据库映射功能而备受青睐。其中&#xff0c;深层次 Map 自动嵌套这一特性更是为开发者带来了诸多惊喜与便利。 前提&#xff1a;首先开启自动映射&#xff01; java和mysql命名规则不一样&#xff0c;每次在mybatis中起别…

【成功案例】解决浙江xx电子有限公司的勒索病毒

01 背景 当地时间 2020年5月18日&#xff0c;思而听网络科技有限公司&#xff08;以下简称思而听&#xff09;接到浙江xx电子有限公司&#xff08;以下简称xx电子&#xff09;的求救邮件&#xff0c;邮件中指出&#xff0c;xx电子的内部计算机收到了不明黑客的恶意勒索病毒攻击…

MySQL_聚合函数

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

如何在算家云搭建text-generation-webui(文本生成)

一、text-generation-webui 简介 text-generation-webui 是一个流行的用于文本生成的 Gradio Web UI。支持 transformers、GPTQ、AWQ、EXL2、llama.cpp (GGUF)、Llama 模型。 它的特点如下&#xff0c; 3 种界面模式&#xff1a;default (two columns), notebook, chat支持多…

揭秘计算机内部奥秘:从CPU到操作系统,深入探索进程与线程的工作原理

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 引言 计算的需求在人类的历史中是广泛存在的&#xff0c;发展大体经历了从一般计…

视频融合共享平台LntonAIServer视频智能分析抖动检测算法和过亮过暗检测算法

LntonAIServer作为一款智能视频监控平台&#xff0c;集成了多种先进的视频质量诊断功能&#xff0c;其中包括抖动检测和过暗检测算法。这些算法对于提升视频监控系统的稳定性和图像质量具有重要意义。 以下是对抖动检测算法和过暗检测算法的应用场景及优势的详细介绍。 一、L…

电商必备的8个AI工具

让我们来谈谈电子商务的 AI 工具。 这篇文章旨在帮助你找到真正的 AI 电子商务软件&#xff0c;以协助你进行内容创建和管理、销售、客户服务自动化、营销策略审计、竞争情报等。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - …

云和恩墨携手华为,发布zCloud数据库备份管理一体机并宣布共建数据保护生态...

为期三天的第九届华为全联接大会&#xff08;HUAWEI CONNECT 2024&#xff09;于9月19日在上海世博中心&展览馆盛大召开。20日下午&#xff0c;一场围绕“全场景数据保护&#xff0c;护航数智化时代”的专题论坛举办&#xff0c;云和恩墨受邀参加&#xff0c;并期待与华为合…

神舟笔记本安装Control Center无法打开

神舟笔记本安装Control Center无法打开 1.1 下载驱动 首先来到神舟笔记本官方&#xff0c;下载笔记本对应的驱动&#xff1a;http://archive.hasee.com/Chinese/download/computer.aspx?cid105001003001001 选择型号搜索&#xff08;例如笔者的时Z8-CT7NT&#xff09;&#…

UE4_Niagara基础实例—使用自定义模块

功能实现&#xff1a;用音频来触发粒子特效。 效果&#xff1a; 根据音量调节粒子大小 分析&#xff1a;我们想通过音量来控制Curl Noise Forc强度e的strength参数&#xff0c;但经过搜索会发现既没有这个参数&#xff0c;也没有这个模块&#xff0c;那么只能自定义这个模块。…