首页 > 其他分享 >[ROS学习]8. 话题消息(Message)的定义与使用

[ROS学习]8. 话题消息(Message)的定义与使用

时间:2022-08-28 20:45:29浏览次数:86  
标签:publisher 定义 编译 代码 Person person msg Message ROS

笔记图文参考:【ROS学习笔记】8.话题消息(Message)的定义与使用

基于B站ROS公开课:【古月居】古月·ROS入门21讲
基于Ubuntu 20.04.1、Noetic版本

本节说明:

之前两节使用了Topic模型,我们先使用了Twist类型(geometry_msgs.msg库下的Twist类)的Message作为输入指令进行发布,接着使用了Pose类型(Turtlesim.msg库下的Pose类)的Message作为订阅消息进行接收。

我们可以使用rosmsg show ...来查看这俩的数据结构,可以看出包含了哪些信息:

以上的Message消息都是预定义好的,当我们需要自定义消息该怎么做呢?

1 模型图

这节我们自定义一个消息类型“Person”,并完成Publish/Subscribe整个过程,Publisher进行发布个人信息,Subscriber来接收个人信息。Topic定义名为“person_info”。

2 自定义话题消息

定义msg文件

我们通过自定义msg文件来自定义话题消息。
我们定义msg文件名为:Person.msg(必须以.msg格式)

在learning_topic的功能包根目录下,新建文件夹 msg(消息相关的文件都可以放在这里面)
创建新文件 Person.msg,创建方法为使用touch命令在当前目录输入:touch Person.msg

  1. 我们把下面代码写入进Person.msg

msg文件定义使用自己的一套语言规则。
定义好msg数据接口后,就可以根据这个定义用C++或Python编译。

string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male = 1
uint8 female = 2

在package.xml中添加功能包依赖

添加动态生成程序的功能包依赖。
打开package.xml文件,将下面代码拷到文件指定位置:

build_depend为编译依赖,这里依赖的是一个会动态产生message的功能包
exer_depend为执行依赖,这里依赖的是一个动态runtime运行的功能包

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

在CMakeLists.txt中添加编译选项

  1. 因为在package.xml添加了功能包编译依赖,在CMakeList.txt里的find_package中也要加上对应的部分;
  2. 需要将定义的Person.msg作为消息接口,针对它做编译;
  3. 需要指明编译这个消息接口需要哪些ROS已有的包;
    有了这两个配置才可将定义的msg编译成不同的程序文件
  4. 因为在package.xml添加了功能包执行依赖,在CMakeList.txt里的catkin_package中也要加上对应的部分
find_package( ...... message_generation)

add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)

catkin_package( ...... message_runtime)

编译生成C++头文件或Python库

以上完成后,到工作空间根目录,编译:catkin_make

编译完成后,我们可以在 devel/include/learning_topic/ 下找到这个C++的头文件Person.h:

也可以在 devel/lib/python3/dist-packages/learning_topic/msg 下找到Python的包:

接下来我们就可以通过编写程序来调用生成的.h或.py了!

3 创建代码并编译运行(C++)

创建代码

我们创建一个Publisher代码和一个Subscriber代码,通过程序调用生成的.h:

在代码中我们调用了自己编译好的头文件,并使用了定义的Person类和属性。

将代码拷贝到src文件夹下。

编译

先配置CMakeLists.txt编译规则,复习一下规则:

  • 设置需要编译的代码和生成的可执行文件;
  • 设置链接库;
  • 添加依赖项

将下面代码拷贝到指定位置:

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)

add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)

这里新增了一个添加依赖项,因为代码涉及到动态生成,我们需要将可执行文件与动态生成的程序产生依赖关系。

然后编译:

cd ~/catkin_ws
catkin_make

运行

默认已经source,接着运行。

roscore
rosrun learning_topic person_subscriber
rosrun learning_topic person_publisher

可以看到运行成功,subscriber接收到了publisher的person信息:

可以看到计算图:

如果我们将roscore关掉,可以看到subscriber和publisher依然在接发。roscore代表了ROS Master,它帮助subscriber和publisher建立通信连接,连接建立后退出舞台也没什么问题了。
但是关闭ROS Master就不能管理这个连接了。同时也无法看到rqt_graph。

4 创建代码并编译运行(Python)

创建代码

我们创建一个Publisher代码和一个Subscriber代码,通过程序调用生成的.py。

作者的person_publisher.py代码有两个问题:

这里函数名“velocity_publisher”取的有点问题,和之前小节的重名了。不过不影响运行。

在代码中我们调用了自己编译好的python库(编译指ROS将之前写好的Person.msg文件用我们的规则编译成python库),并使用了定义的Person类和属性。

将代码拷贝到src文件夹下。
右击py文件→属性,打开执行权限。

roscore
rosrun learning_topic person_subscriber.py
rosrun learning_topic person_publisher.py

同样可以运行成功,subscriber接收到了publisher的person信息!

标签:publisher,定义,编译,代码,Person,person,msg,Message,ROS
From: https://www.cnblogs.com/gentlejan/p/16633596.html

相关文章

  • ThinkPHP自定义错误页面、成功页面及异常页面
    [TP笔记]ThinkPHP自定义错误页面、成功页面及异常页面|Specs'Blog-就爱PHP https://9iphp.com/opensystem/thinkphp/999.html看了前面分享的一篇《什么是真正的程序......
  • 注解-自定义注解-属性定义以及元注解
    自定义注解-属性定义属性:接口中的抽象方法要求:1、属性的返回值类型基本数据类型String枚举注解......
  • 自定义类型和类型别名
    1.自定义类型在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。type后面跟的是类型,写方法的时候......
  • Spring源码-自定义标签
    一、新建实体类publicclassUserimplementsSerializable{privateStringid;privateStringname;privateIntegerage;publicStringgetId(){ return......
  • vue中props定义对象和数组的区别
    扯开怎么定义,为什么要定义props,相信小伙伴们都知道,都会用了,但是有个问题,为什么有时候定义的是数组形式,有时候是对象形式呢?一句话:props对象形式才能给默认值和类型和必填......
  • 通过自定义指令对button进行权限的校验
    通过自定义指令对button进行权限的校验场景:左侧菜单栏通过调接口获取,每一个菜单下的还有该菜单下的button的权限操作,在mentType为2时,该children就是button权限列表1.先获......
  • vue自定义实现虚拟化列表
     1使用<ViualList:size="40":remain="8":dataList="dataList"></ViualList>size:每个列表的高度Heightremain:当前屏幕展示数据个数dataList:当前数据2自定义......
  • centeros 修改yum数据源
     1.修改vim/etc/yum.repos.d/CentOS-Base.repo文件将mirrorlist配置注释掉,并将baseurl修改为阿里云镜像地址[BaseOS]name=CentOS-$releasever-Base#mirrorlist=ht......
  • [ROS学习]7. 订阅者Subscriber的编程实现
    笔记参考:【ROS学习笔记】7.订阅者Subscriber的编程实现(C++和Python)基于B站ROS公开课:【古月居】古月·ROS入门21讲基于Ubuntu20.04.1、Noetic版本(部分图摘自:b站【古月居......
  • 支付插件-使用 woocommerce_api_(action) Action 钩子添加自定义 URL 到WooCommerce
    WooCommerce的woocommerce_api_(action) Action钩子可以让插件添加一个自定义回调到一个URL上面,当这个URL被访问的时候,自定义回调中的函数或方法就会执行,这个API......