ros笔记04--从零体验ros2行为通信方式

news2024/11/15 18:50:43

ros笔记04--从零体验ros2行为通信方式

  • 介绍
  • 创建步骤
    • 体验官方案例
    • 基于python开发行为案例
      • 创建action接口
      • 创建action sever和client
  • 注意事项
  • 说明

介绍

行为是ros2中的一种通信方式,其多被用于一些长时间运行的任务,它包含了目标、反馈、结果三部分。
行为建立在主题和服务之上,其功能类似于服务,但它可以取消操作。行为通信方式还提供了稳定的反馈,而服务通信返回单个响应。
行为通行方式使用客户-服务模型,类似于发布者-订阅者模型。行为客户端节点向行为服务端节点发送目标,服务端节点确认目标并返回反馈流和执行结果。
如下图所示,图中可清晰的体现行为通信的数据流向。
在这里插入图片描述

创建步骤

体验官方案例

我们以官网小海龟为例子,打开小海龟节点和键盘终端遥控节点。

打开小海龟仿真节点
$ ros2 run turtlesim turtlesim_node
打开遥控节点
$ ros2 run turtlesim turtle_teleop_key

从终端输出的结果可以看到,若无打断的话目标可以正常完成,我们也可以通过F来中断一个行为目标。

初始状态完成目标和取消
在这里插入图片描述在这里插入图片描述

我们也可以进一步通过 ros2 node info /node-name 来查看节点中包含的Action Servers 和 Clients。

$ ros2 node info /
...
  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute

$ ros2 node info /teleop_turtle
  Action Clients:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute

通过 ros2 action send_goal 让小海龟移动,通过 --feedback 来查看本次目标执行的反馈信息

小海龟旋转180度
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"
Waiting for an action server to become available...
Sending goal:
     theta: 3.14

Goal accepted with ID: 5e97b4ca2592488282727bbb36f2d90c

Result:
    delta: -3.119999885559082

Goal finished with status: SUCCEEDED

输出旋转过程中的反馈信息
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"

基于python开发行为案例

创建action接口

  1. 创建接口包
    继续前几篇ros2博文,当前工作目录依旧为dev_ws
    $ cd dev_ws/src
    $ ros2 pkg create --license Apache-2.0 custom_action_interfaces
    
  2. 定义action文件
    $ cd custom_action_interfaces
    $ mkdir action
    $ vim action/Fibonacci.action
    int32 order
    ---
    int32[] sequence
    ---
    int32[] partial_sequence
    
  3. 在CMakeLists中新增依赖
    find_package(rosidl_default_generators REQUIRED)
    rosidl_generate_interfaces(${PROJECT_NAME}
      "action/Fibonacci.action"
    )
    
  4. 在package.xml下新增如下内容
    <buildtool_depend>rosidl_default_generators</buildtool_depend>
    <member_of_group>rosidl_interface_packages</member_of_group>
    
  5. 构建并测试接口
    # Change to the root of the workspace
    
    $ cd dev_ws
    # Build
    $ colcon build --packages-select custom_action_interfaces
    输出:
    Starting >>> custom_action_interfaces
    Finished <<< custom_action_interfaces [0.65s]                     
    
    Summary: 1 package finished [0.86s]
    
    输出接口信息:
    $ source install/local_setup.bash
    $ ros2 interface show custom_action_interfaces/action/Fibonacci
    
    在这里插入图片描述

创建action sever和client

  1. 创建保 action_tutorials_py
    $ cd dev_ws/src
    $ ros2 pkg create --build-type ament_python --license Apache-2.0 action_tutorials_py
    
  2. 创建 action server
    vim action_tutorials_py/action_tutorials_py/fibonacci_action_server.py
    import time
    
    import rclpy
    from rclpy.action import ActionServer
    from rclpy.node import Node
    
    from custom_action_interfaces.action import Fibonacci
    
    
    class FibonacciActionServer(Node):
    
        def __init__(self):
            super().__init__('fibonacci_action_server')
            self._action_server = ActionServer(
                self,
                Fibonacci,
                'fibonacci',
                self.execute_callback)
    
        def execute_callback(self, goal_handle):
            self.get_logger().info('Executing goal...')
    
            feedback_msg = Fibonacci.Feedback()
            feedback_msg.partial_sequence = [0, 1]
    
            for i in range(1, goal_handle.request.order):
                feedback_msg.partial_sequence.append(
                    feedback_msg.partial_sequence[i] + feedback_msg.partial_sequence[i-1])
                self.get_logger().info('Feedback: {0}'.format(feedback_msg.partial_sequence))
                goal_handle.publish_feedback(feedback_msg)
                time.sleep(1)
    
            goal_handle.succeed()
    
            result = Fibonacci.Result()
            result.sequence = feedback_msg.partial_sequence
            return result
    
    
    def main(args=None):
        rclpy.init(args=args)
        fibonacci_action_server = FibonacciActionServer()
        rclpy.spin(fibonacci_action_server)
    
    
    if __name__ == '__main__':
        main()
    
  3. 创建 action client
    vim action_tutorials_py/action_tutorials_py/fibonacci_action_client.py
    import rclpy
    from rclpy.action import ActionClient
    from rclpy.node import Node
    
    from custom_action_interfaces.action import Fibonacci
    
    
    class FibonacciActionClient(Node):
    
        def __init__(self):
            super().__init__('fibonacci_action_client')
            self._action_client = ActionClient(self, Fibonacci, 'fibonacci')
    
        def send_goal(self, order):
            goal_msg = Fibonacci.Goal()
            goal_msg.order = order
    
            self._action_client.wait_for_server()
    
            self._send_goal_future = self._action_client.send_goal_async(goal_msg, feedback_callback=self.feedback_callback)
    
            self._send_goal_future.add_done_callback(self.goal_response_callback)
    
        def goal_response_callback(self, future):
            goal_handle = future.result()
            if not goal_handle.accepted:
                self.get_logger().info('Goal rejected :(')
                return
    
            self.get_logger().info('Goal accepted :)')
    
            self._get_result_future = goal_handle.get_result_async()
            self._get_result_future.add_done_callback(self.get_result_callback)
    
        def get_result_callback(self, future):
            result = future.result().result
            self.get_logger().info('Result: {0}'.format(result.sequence))
            rclpy.shutdown()
    
        def feedback_callback(self, feedback_msg):
            feedback = feedback_msg.feedback
            self.get_logger().info('Received feedback: {0}'.format(feedback.partial_sequence))
    
    
    def main(args=None):
        rclpy.init(args=args)
        action_client = FibonacciActionClient()
        action_client.send_goal(10)
        rclpy.spin(action_client)
    
    
    if __name__ == '__main__':
        main()
    
  4. 在 package.xml 中新增依赖项
      <depend>action_tutorials_interfaces</depend>
      <exec_depend>rclpy</exec_depend>
    
  5. 在 setup.py中新增 entry point
        entry_points={
            'console_scripts': [
                'fibonacci_action_server = action_tutorials_py.fibonacci_action_server:main',
                'fibonacci_action_client = action_tutorials_py.fibonacci_action_client:main',
            ],
        },
    
  6. 构建 & 运行
    构建
    $ cd dev_ws
    $ colcon build --packages-select action_tutorials_py
    运行
    $ source install/setup.bash
    $ ros2 run action_tutorials_py fibonacci_action_server
    $ ros2 run action_tutorials_py fibonacci_action_client
    $ ros2 action send_goal fibonacci custom_action_interfaces/action/Fibonacci "{order: 5}"
    
    输出结果如下:
    在这里插入图片描述
    直接通过 ros2 action send_goal 来发送action请求
    在这里插入图片描述

注意事项

  1. 官方文档直接使用 python3 fibonacci_action_server.py 和 python3 fibonacci_action_client.py 来执行验证,此处为了保持python项目的统一,直接设置了 entry point 并进行了编译构建。

说明

软件版本
ubuntu24.04 Desktop
ros2 jazzy
python 3.12.4(conda)
参考文档
ros2 jazzy 官方文档 Understanding actions
ros2 jazzy 官方文档 Writing an action server and client
ros2官网demos jazzy/action_tutorials/action_tutorials_py

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

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

相关文章

科普文:从源码解读5种Redis基本数据类型

键值对字符串 char* 与 SDS char* 的不足&#xff1a; 操作效率低&#xff1a;获取长度需遍历&#xff0c;O(N)复杂度 二进制不安全&#xff1a;无法存储包含 \0 的数据 SDS 的优势&#xff1a; 操作效率高&#xff1a;获取长度无需遍历&#xff0c;O(1)复杂度&#xff08…

HIS系统搭建|HIS系统功能|HIS系统开发

在当今医疗信息化的浪潮中&#xff0c;医院信息系统&#xff08;HIS&#xff09;的搭建成为了提升医疗服务效率和质量的关键。HIS系统不仅仅是一个简单的数据记录工具&#xff0c;它是一个集成了预约挂号、病历管理、药品管理、财务结算等多个功能模块的综合性平台。通过这一系…

使用idea集成的springboot实现注册接口

跟黑马程序员学pringboot3vue3,代码都是黑马程序员视频里的代码 实战篇-03_注册接口_哔哩哔哩_bilibili 本文仅仅用于学习记录 开发用户接口 注册接口 开发流程&#xff1a;明确需求>>阅读接口文档>>思路分析>>开发>>测试 分析&#xff1a; 这个…

使用SDL库以及C++实现的简单的贪吃蛇:AI Fitten生成

简单使用AI代码生成器做了一个贪吃蛇游戏 设计的基本逻辑都是正确的&#xff0c;能流畅运行 免费准确率高&#xff0c;非常不错&#xff01;支持Visual Studio系列 Fitten&#xff1a;https://codewebchat.fittenlab.cn/ SDL 入门指南&#xff1a;安装配置https://blog.csdn.n…

高效数据抓取:Scrapy框架详解

一、Scrapy框架简介 Scrapy是一个为了爬取网站数据、提取结构性数据而编写的爬虫框架。它支持异步处理&#xff0c;能够快速抓取大量网页&#xff0c;并且易于扩展。Scrapy使用Twisted这个事件驱动的网络引擎&#xff0c;可以处理大量的并发请求&#xff0c;从而提高数据抓取的…

C语言分支结构作业

作业 输入你的身高和体重&#xff0c;测试你的健康状况。 计算bmi的值&#xff0c; bmi &#xff08;体重/身高的平方) 如果bmi 小于18.5&#xff0c;则显示“偏瘦&#xff0c;注意加强营养” 如果bmi 在18.5和23.9之间&#xff0c;则显示“体重指数良好&#xff0c;注意保持…

【全栈实战】大模型自学:从入门到实战打怪升级,20W字总结(二)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本栏讲解【全栈实战】大模型自学&#xff1a;从入门到实战打怪升级。 &#x1f514;专栏持续更新&#xff0c;适合人群&#xff1a;本科生、研究生、大模型爱好者&#xff0c;期…

基于单片机的电梯控制系统的设计

摘 要: 本文提出了一种基于单片机的电梯控制系统设计 。 设计以单片机为核心&#xff0c;通过使用和设计新型先进的硬件和控制程序来模拟和控制整个电梯的运行&#xff0c;在使用过程中具有成本低廉、 维护方便、 运行稳定 、 易于操作 、 安全系数高等优点 。 主要设计思路是…

聚焦全局应用可用性的提升策略,详解GLSB是什么

伴随互联网的快速发展和全球化趋势的深入&#xff0c;企业对网络应用的需求日渐增长。为满足全球范围内用户大量的访问需求&#xff0c;同时解决容灾、用户就近访问以及全球应用交付等问题&#xff0c;GLSB&#xff08;全局负载均衡&#xff09;也因此应运而生。那么GLSB是什么…

Axure RP:打造动态交互的大屏可视化设计利器

Axure大屏可视化是指使用Axure RP这款原型设计工具来创建具有视觉冲击力和数据展示功能的大屏幕界面。Axure以其强大的交互设计和丰富的组件库&#xff0c;成为了实现大屏可视化的重要工具之一。以下是对Axure大屏可视化的详细阐述&#xff1a; 一、Axure在大屏可视化中的优势 …

​易能医药董事长易跃能博士荣获“湖湘药学领航奖”

近日&#xff0c;湖南省药学会主办的“湖南省药学会70周年庆典暨第六届湖南药学大会”在湖南长沙隆重召开。易能医药董事长易跃能博士荣获由湖南省药学会颁发的“湖湘药学领航奖”。此次“湖湘药学领航奖”由湖南药学大会学术委员会组织评选&#xff0c;湖南省全省仅有八个名额…

六、3 PWM 舵机代码

目录 1、通道选择 2、参数计算 3、代码部分 1、通道选择 PA1对应通道2 注意&#xff1a;同一个定时器不同通道输出PWM的特点 同一个定时器的不同通道输出的PWM&#xff0c;频率相同&#xff08;因为它们共用一个计数器&#xff09;&#xff0c;占空比可以各自设定&#xff…

Kubernetes 学习记录

https://note.youdao.com/ynoteshare/index.html?idbc7bee305611b52d6900ba209a92bd4d&typenote&_time1694072007342 概览 K8S官网文档&#xff1a;https://kubernetes.io/zh/docs/home/ K8S 是Kubernetes的全称&#xff0c;源于希腊语&#xff0c;意为“舵手”或“…

ITSS:IT服务工程师

证书亮点&#xff1a;适中的费用、较低的难度、广泛的应用范围以及专业的运维认证。 总体评价&#xff1a;性价比良好&#xff01; 证书名称&#xff1a;ITSS服务工程师 证书有效期&#xff1a;持续3年 培训要求&#xff1a;必须参加培训&#xff0c;否则将无法参与考试 发…

Aboboo一些操作

常用快捷键⌨ 快捷键/操作方式 功能 鼠标中键/Esc 进入/退出全屏 空格/Tab 暂停/恢复播放 左/右箭头 快退/快进 Ctrl-左/右箭头 30秒快退/快进 Alt-左/右箭头 60秒快退/快进 Ctrl-Alt-左/右箭头 播放速率调节 PageUp/PageDown 上一句/下一句 上下箭头/滚轮 …

WSL配置镜像网络使用本地端口调试Linux程序

一、安装WSL 二、配置WSL为镜像 在C:\Users\XXUser目录下添加.wslconfig文件 [wsl2] networkingModemirrored # 开启镜像网络 dnsTunnelingtrue # 开启 DNS Tunneling firewalltrue # 开启 Windows 防火墙 autoProxytrue # 开启自动同步代理重启WSL wsl --shutdown wsl三、…

计算机毕业设计选题推荐-音乐播放系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

计算机网络04

文章目录 IP 基本认识**IP 地址的基础知识****IP 地址的分类**无分类地址 CIDR公有 IP 地址与私有 IP 地址IP 地址与路由控制IP 分片与重组IPv6 基本认识IPv4 首部与 IPv6 首部 IP 协议相关技术DNS 域名解析ARP 与 RARP 协议DHCP 动态获取 IP 地址NAT 网络地址转换ICMP 互联网控…

NACOS保姆笔记(5)——Nacos的集群教程

前面我们介绍过: NACOS保姆笔记(1)——NACOS的安装和启动NACOS保姆笔记(2)——Spring Cloud Alibaba Nacos服务注册与发现以及负载均衡NACOS保姆笔记(3)——Spring Cloud Alibaba Nacos配置中心NACOS保姆笔记(4)——Spring Cloud Alibaba Nacos鉴权本篇主要介绍下Na…

5种IO模型简述

文章目录 前言什么是IO模型&#xff1f;阻塞IO非阻塞IO多路复用IO信号驱动IO异步IO 结语 前言 最近学netty&#xff0c;当然无法避免IO模型这部分知识。 我尽量用最简洁的语言来讲清楚这个东西。 什么是IO模型&#xff1f; 既然最近学netty&#xff0c;就拿它来举例子。 比如…