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

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_turtleAction 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.14Goal accepted with ID: 5e97b4ca2592488282727bbb36f2d90cResult:delta: -3.119999885559082Goal 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 timeimport rclpy
    from rclpy.action import ActionServer
    from rclpy.node import Nodefrom custom_action_interfaces.action import Fibonacciclass 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_sequencereturn resultdef 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 Nodefrom custom_action_interfaces.action import Fibonacciclass 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 = orderself._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 :(')returnself.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().resultself.get_logger().info('Result: {0}'.format(result.sequence))rclpy.shutdown()def feedback_callback(self, feedback_msg):feedback = feedback_msg.feedbackself.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://xiahunao.cn/news/3279926.html

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

相关文章

Qt Creator使用git管理代码

1.在GitHub中新建仓库&#xff0c;设置好仓库名后&#xff0c;其它的设置默认即可。 2.打开git bash&#xff0c;输入以下命令&#xff1a; git config --global user.name "xxxxx" #设置你的GitHub用户名 git config --global user.email "xxxxxxxxx.…

79.WEB渗透测试-信息收集-框架组件识别利用(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;78.WEB渗透测试-信息收集-框架组件识别利用&#xff08;2&#xff09;-CSDN博客 struts2…

GPT-4o mini- 开发者的新宠儿

在人工智能的浪潮中,一颗新星正在冉冉升起。OpenAI最新发布的GPT-4o mini模型以其惊人的性能和极具竞争力的价格,正在成为开发者们的新宠儿。作为一名大数据开发者,我深深被这个"迄今为止最具成本效益的小模型"所吸引。让我们一起探索GPT-4o mini的魅力,看看它如何改…

docker(一):Develop faster. Run anywhere.

前言 在进行微服务部署时&#xff0c;首先需要进行部署环境的搭建。目前&#xff0c;Docker 已经成为了微服务部署的主流解决方案之一。Docker 可以帮助我们更快地打包、测试以及部署应用程序&#xff0c;从而缩短从编写到部署运行代码的周期。 在本文中&#xff0c;我们将对…

ITSS:IT服务工程师

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

软件-vscode-plantUML-IDEA

文章目录 vscode基础命令 实操1. vscode实现springboot项目搭建 &#xff08;包括spring data jpa和sqlLite连接&#xff09; PlantUMLIDEA下载及安装Eval Reset插件配置修改IDEA创建项目的默认目录IDEA配置gitIDEA翻译插件translationIDEA断点调试IDEA全局搜索快捷键不能使用代…

人工智能学习笔记 - 初级篇Ⅱ - 图形可视化 - 第11节: 绘制带填充区域的图表

微信公众号&#xff1a;御风研墨 关注可了解更多。问题或建议&#xff0c;请公众号留言 文章目录 绘制带填充区域的图表应用背景准备工作操作步骤工作原理补充说明最后 绘制带填充区域的图表 应用背景 在数据可视化中&#xff0c;带填充区域的图表可以有效地表示数据范围、趋…

springBoot 3.X整合camunda

camunDa camunDa 是2013年从Activiti5 中分离出来的一个新的工作流引擎。Camunda 官方提供了 Camunda Platform、Camunda Modeler&#xff0c;其中 Camunda Platform 以 Camunda engine 为基础为用户提供可视化界面&#xff0c;Camunda Modeler 是流程文件建模平台&#xff0c…

FMEA在光伏电站安全生产管理中的应用

在绿色能源浪潮席卷全球的今天&#xff0c;光伏电站作为清洁能源的重要支柱&#xff0c;其安全高效运行直接关系到能源供应的稳定与环境的可持续发展。然而&#xff0c;光伏电站的日常运营中潜藏着诸多风险与挑战&#xff0c;如何有效预防事故、保障人员安全及设备稳定运行&…

Aboboo一些操作

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

算法入门:Java实现排序、查找算法

链接&#xff1a;算法入门&#xff1a;Java实现排序、查找算法 (qq.com) 冒泡/选择/插入/希尔排序代码 (qq.com) 快排/归并/堆排/基数排序代码 (qq.com)

六西格玛管理法

六西格玛管理法是一种旨在提高业务流程效率和减少缺陷的管理策略。它最初由摩托罗拉公司在1980年代末期提出&#xff0c;并随后被通用电气等公司广泛应用和发展。六西格玛的核心理念是通过减少过程变异性来提高产品质量和服务水平。 六西格玛的含义&#xff1a; 统计学概念&am…

【HarmonyOS】鸿蒙中如何获取资源文件的指定类型 fd,string,Uint8Array,RawFileDescriptor

【HarmonyOS】鸿蒙中如何获取资源文件的指定类型 fd&#xff0c;string&#xff0c;Uint8Array&#xff0c;RawFileDescriptor 一、问题背景&#xff1a; 众所周知&#xff0c;在鸿蒙中的资源分为media和rawfile。两者的区别对标android工程一致&#xff0c;后者是其他类型文…

笑谈“八股文”,人生不成文

一、“八股文”在实际工作中是助力、阻力还是空谈&#xff1f; 作为现在各类大中小企业面试程序员时的必问内容&#xff0c;“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢&#xff1f;有IT人士不禁发出疑问&#xff1a;程序员面试…

未来社交:Facebook如何定义虚拟现实的新时代?

随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;逐渐从科幻小说中的幻想变成了现实生活中的前沿技术。在这一领域&#xff0c;Facebook&#xff08;现已更名为Meta&#xff09;扮演了重要角色&#xff0c;通过不断的创新和投资&#xff0c;致力于打造一个全…

python爬取某财富网

过程&#xff1a; 点击底部的第3页&#xff0c;第5页&#xff0c;网页刷新了&#xff0c;但是顶部的url地址没有变。那么就是 动态加载&#xff0c; 就是 XHR. 直接请求api. 实验代码如下: import requestsheaders {"User-Agent": "Mozilla/5.0 (Windows NT…

YOLOv10环境搭建、训练自己的目标检测数据集、实际验证和测试

1 环境搭建 1.1 在官方仓库的给定的使用python3.9版本&#xff0c;则使用conda创建对应虚拟环境。 conda create -n yolov10 python3.9 1.2 切换到对应虚拟环境 conda activate yolov10 1.3 在指定目录下克隆yolov10官方仓库代码 git clone https://github.com/THU-MIG/yo…

vue3实战(通用后台管理系统)问题总结

npm install less vue-router element-plus -s elementplus 路由引入组件第二种写法&#xff1a; 使用动态的import( )语法(推荐使用)&#xff08;路由懒加载&#xff09; component:()>import(路径)component:()>import(/views/Main.vue)打包之后的文件将会异常的大&a…

华为云依赖引入错误

问题&#xff1a;记录一次项目加载华为云依赖错误&#xff0c;如下&#xff1a; 错误信息&#xff1a;Could not find artifact com.huawei.storage:esdk-obs-java:pom:3.1.2.1 in bintray-qcloud-maven-repo (https://dl.bintray.com/qcloud/maven-repo/) 找到本地仓库&#…

探索NSL-KDD数据集:入侵检测的起点

引言 在信息安全的世界里&#xff0c;数据集是我们最宝贵的资源。就像厨师离不开食材&#xff0c;数据科学家也离不开数据集。对于入侵检测系统&#xff08;IDS&#xff09;而言&#xff0c;NSL-KDD数据集无疑是一个经典的选择。今天&#xff0c;我们将深入探讨这个数据集&…