前言
在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++调用的中间文件
功能包下新建msg目录,添加文件Person.msg
- string name
- uint16 age
- float height
package.xml 中添加编译依赖与执行依赖
- <build_depend>message_generationbuild_depend>
-
- <exec_depend>message_runtimeexec_depend>
-
CmakeList.txt 编辑msg相关配置
- find_package(catkin REQUIRED COMPONENTS
-
- roscpp
-
- rospy
-
- std_msgs
-
- message_generation
-
- )
- #需要加入 message_generation,必须有 std_msgs
##配置msg源文件
- add_message_files(
- FILES
- Person.msg
- )
##生成消息时依赖于 std_msgs
- generate_messages(
- DEPENDENCIES
- std_msgs
- )
##执行时依赖
- catkin_package(
-
- # INCLUDE_DIRS include
-
- # LIBRARIES demo02_talker_listener
-
- CATKIN_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
在
message_generation
在
message_runtime
打开CMakeLists.txt文件
找到
- find_package(catkin REQUIRED COMPONENTS
- roscpp
- rospy
- std_msgs
- )
将其替换成
- find_package(catkin REQUIRED COMPONENTS
- roscpp
- rospy
- std_msgs
- message_generation
- )
找到
- # add_message_files(
- # FILES
- # Message1.msg
- # Message2.msg
- # )
将其替换成
- add_message_files(
- FILES
- Person.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
则证明你的自定义消息类型已经实现了