文章目录
Python使用自定义消息
假设自定义消息包名称为test_msgs, 消息文件为Test.msg(消息类型名即为Test)
注意:from后面是自定义消息所在package名称+.msg,一定不要忘了.msg
from test_msgs.msg import Test
print"Hello, import self-defined msg Test"
ROS自定义消息
参考文章:ROS自定义消息
————————————————
版权声明:本文为CSDN博主「张京林要加油」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013453604/article/details/72903398
几个重点:
一、创建msg消息
首先创建一个空的package单独存放msg类型(当然也可以在任意的package中自定义msg类型)
这里为便于说明,建立一个名为test_msgs的包,用于对自定义msg类型的用法举例
$ cd catkin_ws/src
$ catkin_create_pkg test_msgs
1.新建msg文件
然后在
test_msgs
中创建msg文件夹,在msg文件夹其中新建一个名为
Test.msg
消息类型文件
$ cd test_msgs
$ mkdir msg
Test.msg的内容如下,
基本类型可参考: std_msgs、common_msgs
float32[]data
float32 vel
geometry_msgs/Pose pose
string name
2.修改package.xml
接下来需要message_generation生成C++或Python能使用的代码,需要message_runtime提供运行时的支持,所以package.xml中添加以下两句
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
3.修改CMakeLists.txt
CMakeLists.txt要注意四个地方
(1)首先调用
find_package
查找依赖的包,必备的有roscpp rospy message_generation,其他根据具体类型添加,比如上面的msg文件中用到了geometry_msgs/Pose pose类型,那么必须查找geometry_msgs
find_package(catkin REQUIRED COMPONENTS roscpp rospy message_generation std_msgs geometry_msgs)
(2)然后是
add_message_files
,指定msg文件
add_message_files(
FILES
Test.msg
# Message2.msg)
(3)然后是
generate_messages
,指定生成消息文件时的依赖项,比如上面嵌套了其他消息类型geometry_msgs,那么必须注明
#generate_messages必须在catkin_package前面
generate_messages(
DEPENDENCIES
geometry_msgs
)
(4)然后是
catkin_package
设置运行依赖
catkin_package(
CATKIN_DEPENDS message_runtime
)
到这里新的msg类型test_msgs/Test就可以使用了,下面
编译
这个包,然后利用rosmsg show指令查看
二、msg的使用
**要使用自定义的消息类型必须source自定义消息所在的工作空间**
,否则rosmsg show test_msgs/Test和rostopic echo /test_msg(/test_msg是节点中使用自定义消息类型test_msgs/Test的topic)都会报错,因为
没有source的情况下自定义消息类型是不可见的,被认为是未定义类型
一种典型的错误是删掉工作空间下的devel和build文件夹之后重新编译代码,此时由于没有source自定义消息所在的工作空间,即使使用自定义消息的代码和自定义消息在同一个包也无法找到,该消息头文件,此时需要运行source devel/setup.bash之后重新编译就好
1.其他包调用自定义msg类型
参考:
DefiningCustomMessages
如果是
在test_msgs包内
的节点中调用test_msgs/Test类型,只需要在.cpp文件中如下调用即可
#include<test_msgs/Test.h>
test_msgs::Test msg;
如果是
在其他包调用
test_msgs/Test类型则需要修改package.xml和CMakeLists.txt,比如同样在工作空间catkin_ws内有一个名为test的包,我们可以在这个包内写一个节点,使用我们刚才自定义的消息类型test_msgs/Test,如下:
(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
geometry_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"
版权归原作者 mingcheng2650 所有, 如有侵权,请联系我们删除。