ROS2学习之旅(20)——创建一个动作消息
本文用来自定义一个动作消息类型。
以下命令用来创建一个工作空间并建立一个功能包:
mkdir -p action_ws/src
cd action_ws/src
ros2 pkg create action_tutorials_interfaces
1.定义一个动作
按照以下格式定义.action
文件:
# Request
---
# Result
---
# Feedback
动作定义由三个消息定义组成,它们之间用--
分隔。
请求(request)消息从动作客户端发送到动作服务器,初始化一个新目标。
当目标完成时,结果(result)消息从动作服务器发送到动作客户端。
反馈(feedback)消息定期从动作服务器发送到动作客户端,其中包含关于目标的更新。
一个动作的实例通常被称为目标(goal)。
假设想要定义一个新的动作“Fibonacci”来计算Fibonacci序列。
在ROS 2包action_tutorials_interfaces
中创建一个action
目录:
cd action_tutorials_interfaces
mkdir action
在action
目录中,创建一个名为Fibonacci.action
的文件,内容如下:
int32 order
---
int32[] sequence
---
int32[] partial_sequence
目标请求是想要计算的斐波那契数列的order
,结果是最终的sequence
,而反馈是到目前为止计算的partial_sequence
。
2.编译动作文件
在代码中使用新的Fibonacci动作类型之前,必须将定义传递给rosidl
。
这可以通过在action_tutorials_interfaces
的CMakeLists.txt
来实现,在ament_package()
行之前,将以下几行添加到文件中:
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"action/Fibonacci.action"
)
在package.xml
文件中添加以下依赖:
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<depend>action_msgs</depend>
<member_of_group>rosidl_interface_packages</member_of_group>
注意:需要依赖于action_msgs
,因为动作定义包括额外的元数据(例如目标id)。
现在可以编译包含Fibonacci动作定义的包:
# Change to the root of the workspace
cd ~/action_ws
# Build
colcon build
按照约定,动作类型将以它们的包名和单词action
作为前缀。因此,当想引用新动作时,它的全名将是action_tutorials_interfaces/action/Fibonacci
。
可以用命令行工具检查动作文件是否成功构建:
# Source our workspace
# On Windows: call install/setup.bat
. install/setup.bash
# Check that our action definition exists
ros2 interface show action_tutorials_interfaces/action/Fibonacci
此时,可以看到斐波那契动作的定义打印到屏幕上。
3.总结
在本文中,学习了动作定义的结构,还学习了如何使用CMakeLists.txt
和package.xml
正确地编译一个动作,以及如何验证动作是否编译成功。
如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。
都看到这了,点个推荐再走吧~
未经允许,禁止转载。
ROS2学习之旅(20)——创建一个动作消息的更多相关文章
- ROS2学习之旅(4)——理解ROS2 Graph中的节点
ROS(2)图(ROS(2) graph)是一个同时处理数据的基于ROS2元素的网络,它包含了所有的可执行文件以及它们之间的连接.图中的基本元素包括:节点(nodes).话题(topics).服务(s ...
- ROS2学习之旅(21)——创建一个动作服务和客户节点(C++)
动作是ROS中的一种异步通信形式,动作客户端向动作服务器发送目标请求,目标服务器向操作客户端发送目标反馈和结果.本文基于前一篇自定义动作博文. 1.创建一个action_turtorials_cpp包 ...
- ROS2学习之旅(13)——创建ROS2 功能包
一个功能包可以被认为是ROS2代码的容器.如果希望能够管理代码或与他人共享代码,那么需要将其组织在一个包中.通过包,可以发布ROS2工作,并允许其他人轻松地构建和使用它. 在ROS2中,创建功能包使用 ...
- ROS2学习之旅(12)——创建工作空间
workspace(工作空间)是包含ROS2 packages(包)的文件夹.在使用ROS 2之前,有必要在终端中source一下ROS 2的安装工作区,这样就可以在该终端中使用ROS 2的软件包. ...
- ROS2学习之旅(14)——编写简单的发布者和订阅者(C++)
节点是通过ROS Graph进行通信的可执行进程.在本文中,节点将通过话题以字符串消息的形式相互传递信息.这里使用的例子是一个简单的"talker"和"listener& ...
- ROS2学习之旅(15)——编写简单的服务和客户节点(C++)
当节点使用服务进行通信时,发送数据请求的节点称为客户节点,响应请求的节点称为服务节点.请求和响应的结构由.srv文件决定. 本文的例子是一个简单的整数加法系统:一个节点请求两个整数的和,另一个节点响应 ...
- Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况
运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...
- 【Android Developers Training】 20. 创建一个Fragment
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- maven学习3,如何创建一个web项目
Maven学习 (三) 使用m2eclipse创建web项目 1.首先确认你的eclipse已经安装好m2eclipse的环境,可以参照上两篇Maven学习内容 2.新建一个maven的项目 ...
随机推荐
- python的数组
- 查看mysql的数据库物理存放位置
1.查看mysql的数据库物理存放位置: show global variables like "%datadir%";
- Docker学习(14) Docker容器的数据管理
Docker容器的数据管理 Docker容器的数据卷 重要: Docker的数据卷容器 Docker数据卷的备份和还原
- vue 打包优化
vue 打包优化 路由按需加载 通过vue写的单页应用时,可能会有很多的路由引入.当打包构建的时候,javascript包会变得非常大,影响加载.如果我们能把不同路由对应的组件分割成不同的代码块,然后 ...
- NVIDIA深度学习Tensor Core性能解析(上)
NVIDIA深度学习Tensor Core性能解析(上) 本篇将通过多项测试来考验Volta架构,利用各种深度学习框架来了解Tensor Core的性能. 很多时候,深度学习这样的新领域会让人难以理解 ...
- ADO.NET的五大对象
ADO.NET是一种数据访问技术,使得应用程序可以连接到数据库存储,并以各种方式操作存储在其中的数据.该技术基于.NETFramework,与.NET Framework类库的其余部分高度集成. 其中 ...
- Spring Security 快速上手
Spring Security 框架简介 Spring Security 说明 Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案 关于安全方面的两 ...
- Typescript学习总结
typescript(以下简称TS)出来也有好长时间了,下面记录一下学习心得. 首先学这门语言前,请确保有以下基础知识: 扎实的javascript基础知识 es6的基础知识 面向对象编程的概念(没有 ...
- 高性能的Redis之对象底层实现原理详解
对象 在前面的数个章节里, 我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合, 等等. Redis 并没有直接使用这些数据结构来实 ...
- Android Studio使用Gradle引入第三方库文件
原文链接:https://blog.csdn.net/qiutiandepaomo/article/details/81538937 使用AndroidStudio开发Android应用的时候,会经常 ...