首页 > 其他分享 >ROS笔记5--动作通讯

ROS笔记5--动作通讯

时间:2024-04-19 11:56:11浏览次数:28  
标签:goal get -- self 笔记 result action Progress ROS

1、动作通讯简介

机器人是一个复杂的智能系统,并不仅仅是键盘遥控运动、识别某个目标这么简单,我们需要实现的是送餐、送货、分拣等满足具体场景需求的机器人。在这些应用功能的实现中,另外一种ROS通信机制也会被常常用到——那就是动作。 从这个名字上就可以很好理解这个概念的含义,这种通信机制的目的就是便于对机器人某一完整行为的流程进行管理。 动作通讯是一种带有连续反馈的通讯模型,在通讯双方中,客户端发送请求数据到服务端,服务端响应结果给客户端,但是在服务端接收到请求产生最终响应的过程中,会发送连续的反馈信息给客户端。 客户端发送一个运动的目标,想让机器人动起来,服务器端收到之后,就开始控制机器人运动,一边运动,一边反馈当前的状态。 如果是一个导航动作,这个反馈可能是当前所处的坐标,如果是机械臂抓取,这个反馈可能又是机械臂的实时姿态。 动作通讯客户端/服务器模型如下:   0 功能如下:动作客户端提交一个整数类型num,动作服务器接收请求数据并累加1-num之间的所有整数,将最终结果返回给客户端,且每次累计计算后将当前结果返回给客户端

2、新建功能包

2.1、动作通讯需要先创建通讯接口

cd ~/ros_ws/src ros2 pkg create --build-type ament_cmake pkg_interfaces

2.2、接下来在pkg_interfaces功能包下创建一个action文件夹,并在action文件夹内新建【Progress.action】文件,内容如下:

int64 num 
--- 
int64 sum 
--- 
float64 progress

2.3、在package.xml中添加依赖包,内容如下:

<buildtool_depend>rosidl_default_generators</buildtool_depend>
<depend>action_msgs</depend>
<member_of_group>rosidl_interface_packages</member_of_group>

2.4、在CMakeLists.txt中添加如下配置:

find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
    "action/Progress.action"

2.5、编译功能包

cd ~/ros_ws colcon build --packages-select pkg_interfaces
编译完成后在工作空间的install目录下将生成Progress.action文件对应的C++和Python文件,可以在终端进入工作空间,通过如下命令查看是否编译成功:
source install/setup.bash 
ros2 interface show pkg_interfaces/action/Progress
如果终端输出与Progress.action文件一致的内容则正常。 0

3、创建动作功能包

cd ~/ros_ws/src 
ros2 pkg create pkg_action --build_type ament_python --dependencies rclpy pkg_interfaces --node-name action_server_demo

4、服务端实现

import time
import rclpy
from rclpy.action import ActionServer
from rclpy.node import Node
from pkg_interfaces.action import Progress

class Action_Server(Node):
    def __init__(self):
        super().__init__('progress_action_server')
# 创建动作服务端 self._action_server = Action_Server( self, Progress, 'get_sum', self.execute_callback ) self.get_logger().info("action service starting!!!") def execute_callback(self, goal_handle): self.get_logger().info('start execute task...')
# 生成连续反馈 feedback_msg = Progress.Feedback() sum = 0 for i in range(1, goal_handle.request.num + 1): sum += i feedback_msg.progress = i / goal_handle.request.num self.get_logger().info('callback: %.2f' % feedback_msg.progress) goal_handle.publish_feedback(feedback_msg) time.sleep(1) # 生成最终响应 goal_handle.succeed() result = Progress.Result() result.sum = sum self.get_logger().info("task done!!!") return result def main(args=None): rclpy.init(args=args) Progress_action_server = Action_Server() rclpy.spin(Progress_action_server) Progress_action_server.destroy_node() rclpy.shutdown()

5、客户端实现

import rclpy
from rclpy.action import ActionClient
from rclpy.node import Node
from pkg_interfaces.action import Progress

class Action_Client(Node):
    def __init__(self):
        super().__init__('progress_action_client')
# 创建动作客户端 self._action_client = Action_Client(self, Progress, 'get_sum') def send_goal(self, num):
# 发送请求 goal_msg = Progress.Goal() goal_msg.num = num 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('request refuesd') return self.get_logger().info('request received, start execute task') 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('final result sum = %d' % result.sum) rclpy.shutdown
# 处理连续返回 def feedback_callback(self, feedback_msg): feedback = (int)(feedback_msg.feedback.progress * 100) self.get_logger().info('now progress: %d%%' % feedback) def main(args=None): rclpy.init(args=args) action_client = Action_Client() action_client.send_goal(10) rclpy.spin(action_client)

6、编辑配置文件、编译工作空间

0  
cd ~/ros_ws 
colcon build --packages-select pkg_action source install/setup.bash

7、运行程序

分终端分别启动服务端和客户端
ros2 run pkg_action action_server_demo 
ros2 run pkg_action action_client_demo
0   0  

标签:goal,get,--,self,笔记,result,action,Progress,ROS
From: https://www.cnblogs.com/jackion5/p/18145520

相关文章

  • 【云原生|K8s系列第1篇】:K8s的基础概念、组件架构及实战安装
    1、先从K8s不是什么讲起首先,K8s并不是一个传统意义上的PaaS平台即服务的工具,它充分给使用者提供了很多很多选择的空间。不限制支持的应用程序类型,K8s并不插手应用程序框架,也不限制支持的语言(如Java,Python,Ruby等),只要应用符合12因素即可。也就是说,只需要应用可以在......
  • 荣誉
    荣誉个人学习委员国防教育先锋队朋辈导师优秀团员省级三好学生职业技能大赛网络安全河南省第七届御网杯信息安全大赛三等奖第二十届全国大学生信息安全对抗技术竞赛​ 数通H3C认证路由交换网络工程师.pdfH3CSE-RS-IPv6.pdf华为ICT网络赛道三等奖华为HarmonyOS......
  • Windows10中多屏显示器型号获取并与Screen对应
    需求:标识某块屏,不参与窗口快速移动@@@codepublicclassMonitor{///<summary>///DeviceID,如:\\.\DISPLAY17///</summary>publicStringDeviceName{get;set;} ///<summary>///名称,如:Def......
  • 从 RPC 到服务化框架设计
    目前互联网系统都是微服务化,那么就需要RPC调用,因此本文梳理了从RPC基本框架协议到整个服务化框架体系建设中所包含的知识点,重点在于RPC框架和服务治理能力的梳理,本文定位于一个科普性质的文章,在于让大家了解一个全貌。一、RPC基本框架1-1、RPC基本框架理解RPCRPC......
  • Sqlsugar 的使用
    1、实体特性[SugarColumn(IsPrimaryKey=true)]标识是否为主键[SugarColumn(IsIdentity=true)]是否为自增长[SugarColumn(ColumnName="id")]对应数据库表里面的某列[SugarColumn(IsIgnore=true)]忽略熟悉,在ORM会过滤掉[SugarColumn(ColumnDescription="创建时间"......
  • Git
    rebase操作将多次commit合并到一个commit,(仅适用于自己的开发分支,避免污染公共分支)1.gitrebase-iHEAD~5(将最近5次commit合并到最初始的commit)2.将后面的pick改为s,wq保存3.多余的commitinfo删掉,用vim的dd快捷键,wq保存->4.gitpush-f把改动推送到远端将公共分支上......
  • 分页select的问题
    这是后端返回给前端的数据 这是数据要是前端接收后展示效果如下: 这并不是我想要的效果有两种解决方式: 第一种方式单一的解决某个类中的create_time和update_time,一般不采用此方式一般在配置类中重写方法,去扩展SpringMVC消息转换器,重写父类方法如下: 下面是账号的启......
  • DoD
    在执行任何任务或项目之前,确立明确的完成标准(DefinitionofDone,DoD)是至关重要的。DoD不仅是一个思维模式,它也是一种消除不确定性和达成共识的方式。通过为每个目标设定明确的标准,无论是个人目标如学习新技能、减肥,还是工作任务,你都能清晰地知道何时这些目标被实现。任务处理的......
  • [code notes] ecpg precompiler 1
    Thisnotewillintroducetheworkflowofparse.ploftheecpgprecompiler.Runtheprecompiler:perlparse.pl.../../../backend/parser/gram.yworkflowloadecpg.addonsintoanmemoryhashtable.Thekeyiscomposedofstringliteralsfromaproduction......
  • VKL144C/D LQFP48/SSOP48仪器仪表超低功耗/超省电LCD液晶段码驱动IC适用于分贝仪、测
    VKL144C/D概述:VKL144C/D是一个点阵式存储映射的LCD驱动器,可支持最大144点(36SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。特点•工......