前言
在ROS通信协议中,ROS中通过std_msgs封装了一些原生的数据类型,比如:String,Int32,Char,Bool,Int64,Empty
但是这些数据一般只包含一个data字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:激光雷达的信息,std_msgs由于描述性就会不理想,这种场景下可以使用自定义的消息类型。
msgs只是简单的文本文件,每行具有字段类型和字段名称,可以使用的字段类型有:
string
float32 float64
time duration
int8 int16 int32 int64
other msg files
variable-length array[] and fixed-length array[C] (数组)
ROS中还有一种特殊类型:Header,标头包含时间戳(消息被发出去的那一刻的时间值)和ROS中常用的坐标帧信息。会经常看到msg文件的第一行具有Header标头。
流程简介:
1、按照固定格式创建msg文件
2、编辑配置文件
3、编译生成可以被Python或C++调用的中间文件
1、定义msg文件(类似结构体)
功能包下新建msg目录,添加文件Person.msg
string name
uint16 age
float height
2、编辑配置文件
package.xml 中添加编译依赖与执行依赖
<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend><!--exec_depend以前对应的是 run_depend 现在非法-->
CmakeList.txt 编辑msg相关配置
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation)
#需要加入 message_generation,必须有 std_msgs
##配置msg源文件
add_message_files(FILESPerson.msg)
##生成消息时依赖于 std_msgs
generate_messages(DEPENDENCIESstd_msgs)
##执行时依赖
catkin_package(# INCLUDE_DIRS include# LIBRARIES demo02_talker_listenerCATKIN_DEPENDS roscpp rospy std_msgs message_runtime# DEPENDS system_lib)
演示
1、在plumbing_pub_sub中新建文件夹msg
2、在msg中间中新建Person.msg文件
3、打开Person.msg文件
在里面输入
string name
int32 age
float32 height
配置相关文件
打开package.xml
在<build_depend>std_msgs</build_depend>后面添加
<build_depend>message_generation</build_depend>
在<exec_depend>std_msgs</exec_depend>后面添加
<exec_depend>message_runtime</exec_depend>
打开CMakeLists.txt文件
找到
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgs
)
将其替换成
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
找到
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
将其替换成
add_message_files(FILESPerson.msg
)
找到
# generate_messages(
# DEPENDENCIES
# std_msgs
# )
将其注释去掉
generate_messages(
DEPENDENCIES
std_msgs
)
找到
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES plumbing_pub_sub
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
将其替换成
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES plumbing_pub_sub
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
然后编译一下
看到 项目名称/devel/include下面出现Person.h
和 项目名称/devel/lib/python3/msg下面出现_Person.py
则证明你的自定义消息类型已经实现了
53. 54. 052话题通信_自定义msg_实现_Chapter2-ROS通信机制_哔哩哔哩_bilibili