ROS学习之七:创建ROS消息和服务
话题与服务
ROS节点间可通过话题和服务进行通信,其中话题在“ROS学习之四:ROS话题与消息”中介绍,服务在“ROS学习之五:ROS服务和参数”中介绍,对于话题,节点可以在其上发布消息,亦可订阅话题以接收消息,而服务则是节点发送请求、获得响应
msg与srv
- msg(消息):msg文件是用于描述ROS消息字段的文本文件,用于为不同编程语言编写的消息生成源代码,存放在软件包的msg目录下,msg文件每行均有一个字段类型和字段名称,可使用的类型包括:
- int8, int16, int32, int64 (以及 uint*)
- float32, float64
- string
- time, duration
- 其他msg文件
- variable-length array[] 和 fixed-length array[C]
- Header(含有时间戳和ROS中广泛使用的左坐标帧信息)
msg文件示例:
Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist
- srv(服务):一个srv文件描述一个服务,由请求(request)和响应(response)两部分组成,存放在软件包的srv目录下,srv文件与msg文件类似,不同之处在于srv文件包含两请求和响应两个部分,并用“---”隔开
srv文件示例:
int64 A int64 B --- int64 Sum
msg
在创建msg之前,需要在软件包中新建一个名为msg的文件夹用以存储msg文件:
roscd package mkdir msg echo "int64 num" > msg/Num.msg
上述命令首先切换到软件包目录下,并创建msg目录,并将内容“int64 num”写入到名为Num.msg的文件中
此外,为了使msg文件能被转换为C++、Python和其他语言的源代码,还需要在package.xml中添加如下两行内容:
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
其中message_generation用于构建时,而message_runtime用于运行时
在CMakeList.txt文件中,为find_package调用添加message_generation依赖项
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
如图:
其中mseeage_generation一行为新添加内容
添加消息运行时依赖关系
catkin_package(
...
CATKIN_DEPENDS message_runtime
...)
如图:
并找到代码块:
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
去掉注释,将Message1.msg改为自定义的msg文件名称,去掉多余的Message2.msg:
add_message_files(
FILES
Num.msg
)
如图:
再去掉如下代码块的注释:
# generate_messages(
# DEPENDENCIES
# std_msgs
# )
使之成为:
generate_messages(
DEPENDENCIES
std_msgs
)
如图:
以上即为创建msg的所有步骤,可通过rosmsg show命令查看msg能否被ROS识别:
rosmsg show package/Num
或将包名省略:
rosmsg show Num
则会显示自定义消息Num的类型——int64 num
srv
在创建msg时所用的软件包中继续创建服务:
roscd package mkdir srv
此处通过复制现有定义而非手动方式创建srv,从rospy_tutorials包中复制一个服务,使用roscp命令:
roscp [package_name] [file_to_copy_path] [copy_path]
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
同样,为了使srv文件能被转换为C++、Python和其他语言的源代码,还需要确认package.xml文件是否已经包含:
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
(由于在上文创建msg时已经添加,此处无需再添加)
此外,与msg类似,还需要在CMakeList.txt文件中添加message_generation,但由于message_generation对msg与srv均通用,因此无需再添加,如图:
同样的,在创建msg时,已添加消息运行时依赖关系,故不必再次添加:
catkin_package(
...
CATKIN_DEPENDS message_runtime
...)
然后去掉以下段落注释:
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
并修改为:
add_service_messages(
FILES
AddTwoInts.srv
)
如图:
同样是在创建msg过程中去掉了代码段:
# generate_messages(
# DEPENDENCIES
# std_msgs
# )
的注释,也不必再次进行
完成后使用rossrv show命令查看添加的srv是否被ROS识别:
rossrv show package/AddTwoInts
从而得到:
int64 a int64 b --- int64 sum
也可在不指定包名的情况下,通过命令:
rossrv show AddTwoInts
进行查找,则package包及rospy_tutorials包中的同名服务均会被找到
在完成msg及srv的创建后,需要重新catkin_make软件包,从而使得包中msg路径下的任何.msg文件及srv包中的任何.srv文件都生成所有支持语言的代码,且生成的C++的头文件在包中的devel/include/package目录下
基础命令
rosmsg | show [message type] | 查看消息类型 |
roscp | [package_name] [file_to_copy_path] [copy_path] | 将文件从一个包复制到另一个包 |
rossrv | show <service type> | 查看服务类型 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)