1、自定义话题信息
1、创建工作空间及功能包
mkdir catkin_ws
cd src
catkin_create_pkg test_msgs roscpp rospy std_msgs
2、创建msg文件夹及文件
cd test_msgs
mkdir msg
cd msg
vim test.msg
3、添加内容
eg:
string name
float32 percent
uint32 time
4、修改pcckage中的相关文件
a: 修改package.xml
文件,添加编译依赖与执行依赖
<build_depend>message_generation</build_depend> //编译依赖
<exec_depend>message_runtime</exec_depend> //执行依赖
b: 在CMakeLists.txt
中添加编译选项,4处(可不添加、直接在原内容中直接修改)
1、在find_package中添加message_generation
find_package( catkin REQUIRED COMPONENTS ...message_generation)2、在add_message_files添加自定义的msg文件
add_message_files(FILES test.msg)3、生成消息时依赖于 std_msgs
generate_messages(DEPENDENCIES std_msgs)4、执行时依赖
catkin_package( CATKIN_DEPENDS std_msgs message_runtime)
5、编译
catkin_make
编译出错:
问题1:
CMake Error at /home/.../cmake/test_msgs-genmsg.cmake:3 (message):Could not find messages which'/home/.../msg/test.msg' depends on. Did you forget to specify generate_messages(DEPENDENCIES ...)?Cannot locate message [double] in package [test_msgs] with paths[['/home/..../test_msgs/msg']]
解决:test.msg 文件中数据类型出错 double改为float32
问题2:
CMake Error at /opt/ros/..../catkin_package.cmake:224(message):catkin_package() DEPENDS on the catkin package ‘XXX’ which must therefore be listed as a run dependency in the package.xml
依赖错误:添加了包依赖,而未添加包运行依赖,
<build_export_depend> PACKAGE_NAME </build_export_depend>
<exec_depend> PACKAGE_NAME </exec_depend>
6、信息查看
catkin_make
source devel/setup.bash
rosmsg show test_msgs/test
2、自定义消息调用
其他包调用自定义msg
A:在test_msgs包内
的节点调用test_msgs/Test
类型,在.cpp文件中如下调用即可:
#1 c++
#include <test_msgs/test.h>
test_msgs::test msg;
# 2 python
from test.msg import test
a=test()
B、其他文件中的包
调用test_msgs/Test
,在文件中编写以上代码同时需更改package.xml
和CMakeLists.txt
文件
1)修改package.xml
文件,将上述消息类型的数据包加入
<build_depend>roscpp</build_depend>
<exec_depend>roscpp</exec_depend><build_depend>test_msgs</build_depend>
<exec_depend>test_msgs</exec_depend>
2)更改CMakeLists.txt
一是find_package中
需要声明查找包含该消息类型的包;
二是add_dependencies
要注明该消息的依赖
find_package(catkin REQUIRED COMPONENTSroscppstd_msgstest_msgs
)
add_dependencies(test1 test_msgs_gencpp)#调用同一工作空间的自定义消息类型时注明依赖关系,防止发生头文件找不到的报错
注意::如果缺少add_dependencies中对test_msgs_gencpp的依赖声明,在编译的时候如果先编译test包再编译test_msgs包则会出现如下报错(ROS工作空间各个软件包的编译顺序是随机的),因为头文件test_msgs/Test.h还未生成
fatal error: test_msgs/Test.h: 没有那个文件或目录#include "test_msgs/Test.h"