ROS2 学习(五)接口,动作

接口

通信双方统一规定好接口。比如图像 img,控制运动的线速度和角速度……

我们也不用了解具体实现,基本就是了解接口会去用就行。

1692625169102

$ ros2 interface list # 展示所有 interfaces
$ ros2 interface show ... # 显示具体一个 interface
$ ros2 package show ... # 查看一个 package 里所有的 interface

添加接口

不是说我们写一个接口文件就算添加好了,我们也要通过读取文件。

在 CMakeList.txt 中可以看到:

rosidl_generate_interfaces(${PROJECT_NAME}"msg/ObjectPosition.msg""srv/AddTwoInts.srv""srv/GetObjectPosition.srv""action/MoveCircle.action")

指从相应的相对目录文件中找接口。

在文件中使用对应接口时,则需要先引入:

from File_Path import interface_name

这个引入文件的路径位于系统生成的 .py 文件中,编译成功即生成。

后面创建对象的时候就可以使用接口了。

动作

比如想让小乌龟转一圈,我们需要不停发送指令,根据当前状态调整指令,在一定条件时取消指令。使用动作比这样一点点写服务方便得多。

实际使用的时候我们也很少直接用话题和服务,都是用封装好的动作接口。

动作就是可以一边发运动指令,一边收到反馈信息。

实现方法还是基于话题和服务,话题是服务端(比如要控制运动的机器人)周期性反馈当前状态,服务是客户端给服务端发的指令请求。

比如打开小乌龟,打开键盘控制后,我们可以尝试发送如下指令:

$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 0}" --feedback 

在接口中可以看到动作接口的三部分:发起动作的目标,动作完成的结束标志,动作的反馈状态。

添加动作

前面的步骤和添加接口一样,编写对应 .action 文件,在 CMakeList.txt 中添加。

服务端:在程序里注意如何添加 action_server:

import rclpy                                      # ROS2 Python接口库
from rclpy.node   import Node                     # ROS2 节点类
from rclpy.action import ActionServer             # ROS2 动作服务器类
from learning_interface.action import MoveCircle  # 自定义的圆周运动接口class MoveCircleActionServer(Node):def __init__(self, name):super().__init__(name)                   # ROS2节点父类初始化self._action_server = ActionServer(      # 创建动作服务器(接口类型、动作名、回调函数)self,MoveCircle,'move_circle',self.execute_callback)def execute_callback(self, goal_handle):            # 执行收到动作目标之后的处理函数self.get_logger().info('Moving circle...')feedback_msg = MoveCircle.Feedback()            # 创建一个动作反馈信息的消息for i in range(0, 360, 30):                     # 从0到360度,执行圆周运动,并周期反馈信息feedback_msg.state = i                      # 创建反馈信息,表示当前执行到的角度self.get_logger().info('Publishing feedback: %d' % feedback_msg.state)goal_handle.publish_feedback(feedback_msg)  # 发布反馈信息time.sleep(0.5)goal_handle.succeed()                           # 动作执行成功result = MoveCircle.Result()                    # 创建结果消息result.finish = True                            return result                                   # 反馈最终动作执行的结果def main(args=None):                                       # ROS2节点主入口main函数rclpy.init(args=args)                                  # ROS2 Python接口初始化node = MoveCircleActionServer("action_move_server")    # 创建ROS2节点对象并进行初始化rclpy.spin(node)                                       # 循环等待ROS2退出node.destroy_node()                                    # 销毁节点对象rclpy.shutdown()                                       # 关闭ROS2 Python接口

反馈函数每30度标记一次发布反馈信息。

客户端:先启动,然后发送动作请求并注册自己的回调函数、收到目标后的回调函数。

from rclpy.action import ActionClient             # ROS2 动作客户端类from learning_interface.action import MoveCircle  # 自定义的圆周运动接口class MoveCircleActionClient(Node):def __init__(self, name):super().__init__(name)                   # ROS2节点父类初始化self._action_client = ActionClient(      # 创建动作客户端(接口类型、动作名)self, MoveCircle, 'move_circle') def send_goal(self, enable):                 # 创建一个发送动作目标的函数goal_msg = MoveCircle.Goal()             # 创建一个动作目标的消息goal_msg.enable = enable                 # 设置动作目标为使能,希望机器人开始运动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 :(')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().result                                       # 读取动作执行的结果self.get_logger().info('Result: {%d}' % result.finish)                # 日志输出执行结果def feedback_callback(self, feedback_msg):                                # 创建处理周期反馈消息的回调函数feedback = feedback_msg.feedback                                      # 读取反馈的数据self.get_logger().info('Received feedback: {%d}' % feedback.state) def main(args=None):                                       # ROS2节点主入口main函数rclpy.init(args=args)                                  # ROS2 Python接口初始化node = MoveCircleActionClient("action_move_client")    # 创建ROS2节点对象并进行初始化node.send_goal(True)                                   # 发送动作目标rclpy.spin(node)                                       # 循环等待ROS2退出node.destroy_node()                                    # 销毁节点对象rclpy.shutdown()                                       # 关闭ROS2 Python接口

发送动作请求成功了,服务器端先发一个应答反馈,触发的是 goal_response_callback 中的 ‘Goal accepted 😃’ ,后续收到反馈信息是输出 (‘Received feedback: {%d}’ .

$ ros2 run learning_action action_move_server 
[INFO] [1692636260.811751032] [action_move_server]: Moving circle...
[INFO] [1692636260.812184742] [action_move_server]: Publishing feedback: 0
[INFO] [1692636261.313871989] [action_move_server]: Publishing feedback: 30
[INFO] [1692636261.817491663] [action_move_server]: Publishing feedback: 60
[INFO] [1692636262.319652946] [action_move_server]: Publishing feedback: 90
[INFO] [1692636262.822605205] [action_move_server]: Publishing feedback: 120
[INFO] [1692636263.325196016] [action_move_server]: Publishing feedback: 150
[INFO] [1692636263.826669745] [action_move_server]: Publishing feedback: 180
[INFO] [1692636264.328210660] [action_move_server]: Publishing feedback: 210
[INFO] [1692636264.829900461] [action_move_server]: Publishing feedback: 240
[INFO] [1692636265.331746904] [action_move_server]: Publishing feedback: 270
[INFO] [1692636265.833479902] [action_move_server]: Publishing feedback: 300
[INFO] [1692636266.335957841] [action_move_server]: Publishing feedback: 330$ ros2 run learning_action action_move_client 
[INFO] [1692636260.807239104] [action_move_client]: Goal accepted :)
[INFO] [1692636260.815466218] [action_move_client]: Received feedback: {0}
[INFO] [1692636261.315441690] [action_move_client]: Received feedback: {30}
[INFO] [1692636261.820438299] [action_move_client]: Received feedback: {60}
[INFO] [1692636262.320808661] [action_move_client]: Received feedback: {90}
[INFO] [1692636262.827049792] [action_move_client]: Received feedback: {120}
[INFO] [1692636263.326864092] [action_move_client]: Received feedback: {150}
[INFO] [1692636263.827891348] [action_move_client]: Received feedback: {180}
[INFO] [1692636264.332103011] [action_move_client]: Received feedback: {210}
[INFO] [1692636264.831075874] [action_move_client]: Received feedback: {240}
[INFO] [1692636265.332972986] [action_move_client]: Received feedback: {270}
[INFO] [1692636265.834606029] [action_move_client]: Received feedback: {300}
[INFO] [1692636266.337943178] [action_move_client]: Received feedback: {330}
[INFO] [1692636266.848281638] [action_move_client]: Result: {1}

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

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

相关文章

如何通过tomcat下载映射下载文件

1.1找到tomcat服务器中server.xml文件 !--doBase是静态资源路径位置&#xff0c; path作用相当于设置的key, doBase作用相当于value --> <Context path"/download" docBase"E:\testBackData"></Context>1.2 找到tomcat服务器中web.xml文…

GPT和AI绘图学习【第13期】,chatgpt文案制作引导并写出爆款小红书推文、AI换脸、客服话术回复等

第13期GPT和AI绘图学习班&#xff0c;主要内容包括&#xff1a;ChatGPT文案制作引导并写出爆款小红书推文、分析数据、策划视频脚本、图片扩展、高效修图、产品设计、平面设计、线镐渲染、AI换脸、客服话术回复等。 目录&#xff1a; 1.第1天&#xff1a;运用GPT提高工作效率…

山西电力市场日前价格预测【2023-08-26】

日前价格预测 预测明日&#xff08;2023-08-26&#xff09;山西电力市场全天平均日前电价为287.61元/MWh。其中&#xff0c;最高日前电价为318.26元/MWh&#xff0c;预计出现在19: 30。最低日前电价为246.18元/MWh&#xff0c;预计出现在05: 15。 价差方向预测 1&#xff1a; 实…

MIA文献阅读 ——医学图像处理在慢性肾脏疾病评估中的最新进展【2021】

目录 0 摘要1 引言2 磁共振成像(MRI)2.1 扩散磁共振成像2.1.1 扩散加权成像(DWI)2.1.2 扩散张量成像(DTI) 2.2 血氧水平依赖成像2.3 动脉自旋标记2.4 动态对比增强磁共振成像2.5 T1和T2映射2.6 磁化转移磁共振成像2.7 磁共振弹性成像2.8 其他磁共振成像技术 3 其他成像方式3.1 …

实验三 HBase1.2.6安装及配置

系列文章目录 文章目录 系列文章目录前言一、HBase1.2.6的安装二、HBase1.2.6的配置2.1 单机模式配置2.2 伪分布式模式配置 总结参考 前言 在安装HBase1.2.6之前&#xff0c;需要安装好hadoop2.7.6。 本篇文章参考&#xff1a;HBase2.2.2安装和编程实践指南 一、HBase1.2.6的安…

2023年你需要知道的最佳预算Wi-Fi路由器清单

买新路由器?让我们帮助你挑选一些既有很多功能和性能,又经济实惠的产品。 购买Wi-Fi路由器并不一定要倾家荡产,尤其是如果你不需要一个提供数百Mbps速度的路由器。廉价路由器是一个很好的选择,它包含了许多功能,不会对钱包造成影响。 一、2023年在廉价Wi-Fi路由器中寻找…

Keepalive+LVS群集部署

一、Keepalive概述 keepalived 软件起初是专为 LVS 负载均衡软件设计的&#xff0c;用来管理并监控 LVS集群中各个服务节点的状态&#xff0c;后来又加入了可以实现高可用的 VRRP 功能。因此&#xff0c;keepalived 除了能够管理 LVS集群外&#xff0c;还可以为其他服务&#…

【数据结构练习】单链表OJ题(二)

目录 一、相交链表二、环形链表1三、环形链表2四、链表分割五、复制带随机指针的链表 一、相交链表 题目&#xff1a; 示例&#xff1a; 注意&#xff1a;不能根据节点的值来比较是否相交&#xff0c;而是根据节点在内存中是否指向相同的位置。 例如以上图&#xff1a; 链表…

深入解析:如何打造高效的直播视频美颜SDK

在当今数字化时代&#xff0c;视频直播已经成为人们交流、娱乐和信息传递的重要方式。然而&#xff0c;许多人在直播时都希望能够呈现出最佳的外观&#xff0c;这就需要高效的直播视频美颜技术。本文将深入解析如何打造高效的直播视频美颜SDK&#xff0c;以实现令人满意的视觉效…

Embedding 向量生成GPT数据使用相关

如果使用python3.6的版本&#xff0c;使用pycharm创建工程&#xff0c;那么默认会使用 docx包&#xff0c;这样运行程序会爆异常&#xff0c;突然想起以前请教的一个大神&#xff0c;想当 初&#xff0c;这个问题困扰了我 两天时间&#xff0c;在此记录一下&#xff1a; pytho…

skywalking服务部署

一、前言 Apache SkyWalking 是一个开源的分布式跟踪、监控和诊断系统&#xff0c;旨在帮助用户监控和诊断分布式应用程序、微服务架构和云原生应用的性能和健康状况。它提供了可视化的分析工具&#xff0c;帮助开发人员和运维团队深入了解应用程序的性能、调用链和异常情况 …

信创国产系统麒麟arm架构中nginx安装过程

前言 在事业单位或国企&#xff0c;信创项目在步步推进&#xff0c;下面将在国产系统通信arm架构中nginx的安装过程记录分享出来&#xff0c;希望帮助到有需要的小伙伴。 1、nginx下载 1.1、在线下载 进入指定目录&#xff0c;如/usr/local&#xff0c;执行如下命令&#x…

[C++] STL_vector使用与常用接口的模拟实现

文章目录 1、vector的介绍2、vector的使用2.1 vector的定义2.2 vector迭代器的使用2.3 vector的空间增长问题 3、vector的增删查改3.1 push_back&#xff08;重点&#xff09;3.2 pop_back&#xff08;重点&#xff09;3.3 operator[]&#xff08;重点&#xff09;3.4 insert3.…

【Android】Mobile-Security-Framework-MobSF Manifest 静态扫描规则

前言 移动安全框架&#xff08;MobSF&#xff09;是一个自动化的一体化移动应用程序&#xff08;Android/iOS/Windows&#xff09;测试、恶意软件分析和安全评估框架&#xff0c;能够执行静态和动态分析。MobSF支持移动应用程序二进制文件&#xff08;APK、XAPK、IPA和APPX&am…

深度学习论文: WinCLIP: Zero-/Few-Shot Anomaly Classification and Segmentation

深度学习论文: WinCLIP: Zero-/Few-Shot Anomaly Classification and Segmentation WinCLIP: Zero-/Few-Shot Anomaly Classification and Segmentation PDF: https://arxiv.org/pdf/2303.14814.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: h…

java使用swing制作桌面图形应用的实例教程

本篇文章主要讲解&#xff0c;java编程语言通过swing制作桌面图形应用的实例教程&#xff0c;通过一个简单的个人信息提交表单界面&#xff0c;让你了解swing的布局管理、窗口图标设置、编译和运行以及窗口菜单的设置。 日期&#xff1a;2023年8月25日 实际效果 弹出新窗口帮助…

一种分解多种信号模式非线性线性调频的方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Azure应用程序网关

文章目录 什么是应用程序网关实战演练创建虚拟网络创建虚拟机创建应用程序网关测试搭建结果 什么是应用程序网关 Azure应用程序网关是一种托管服务&#xff0c;用于提供安全、可缩放的 Web 应用程序前端点的应用程序传送控制和保护。它可以通过 SSL 终止、cookie 基于会话持久…

uniapp 安卓平台签名证书(.keystore)生成

安装JRE环境 下载jre安装包&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8安装jre安装包时&#xff0c;记录安装目录(例:C:\Program Files\Java\jdk-20)打开命令行&#xff08;cmd&#xff09;&#xff0c;将JRE安装路径添加到系统环境变量 d: se…

使用vlc在线播放rtsp视频url

1. 2. 3. 工具链接&#xff1a; https://download.csdn.net/download/qq_43560721/88249440