注:本篇文章仅作为学习笔记,如有侵权,请联系删除。
目录
例如我们想要在功能包B去订阅功能包A中自定义msg消息:A.msg
一、创建msg消息
首先我们先创建自定义的话题消息A.msg。
1.在src目录创建自定义的msg功能包。
# 在src目录下打开终端,输入:
catkin_create_pkg 功能包名字 roscpp rospy std_msgs
# 在刚刚创建的功能包文件夹内创建一个msg文件目录,并在msg文件内创建要定义的.msg文件(A.msg)
#int8, int16, int32, int64 (或者无符号类型: uint*)
#float32, float64
#string
#time, duration
#other msg files
#variable-length array[] and fixed-length array[C]
#ROS中还有一种特殊类型:Header,标头包含时间戳和ROS中常用的坐标帧信息
2.修改自定义msg功能包内的package.xml文件
#添加编译依赖与执行依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
3.修改自定义msg功能包内的CMakeLists.txt
# 1.在find_package中添加message_generation
find_package(catkin REQUIRED COMPONENTS
...
message_generation
)
# 2.add_message_files中添加自定义的msg文件
add_message_files(
#DIRECTORY msg
FILES
A.msg
)
# 3.生成消息时依赖于 std_msgs
generate_messages(
DEPENDENCIES
std_msgs
)
# 4.执行时依赖
catkin_package(
CATKIN_DEPENDS std_msgs message_runtime
)
# 5.头文件目录
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
4.编译自定义msg功能包
catkin_make -DCATKIN_WHITELIST_PACKAGES=" 包名"
若指定编译多个功能包,中间用";"分开
catkin_make -DCATKIN_WHITELIST_PACKAGES="A;B",
使用rosmsg show "定义msg文件名",可以显示表示定义成功,编译成功后生成的msg头文件目录为(.../工作空间/devel/include/包名/xxx.h)或(.../工作空间/devel/lib/python/dist-packages/包名/msg)
二、同一工作空间下调用不同功能包内的自定义msg消息文件
1.在B功能包中添加自定义msg的头文件
//c++
#include<A/A.h> //自建一个消息类型, 第一个A为自定义msg文件的功能包名字,第二个A为自定义msg文件的名字
#python
from A.msg import A #第一个A为自定义msg文件的功能包名字,第二个A为自动的msg文件名字
2.在B功能包中调用时接口
//c++
//第一个A为自定义msg文件的功能包名字,第二个A为自定义msg文件名
A::A a;
const A::A::ConstPtr& a
#python
#A为自定义msg文件名字
a = A()
3.修改B功能包的package.xml文件
#添加有关A的依,其中A为功能包名子
<build_depend>A</build_depend>
<build_export_depend>A</build_export_depend>
<exec_depend>A</exec_depend>
4.修改CMakeLists.txt文件
1.
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
A # 添加被引用消息的功能包的名字
)
2.取消注释
include_directories(
include
${catkin_INCLUDE_DIRS}
)