ROS消息自定义、调用及问题解决

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.xmlCMakeLists.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 COMPONENTS
  roscpp
  std_msgs
  test_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"
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值