代码层级图
1 | |- usbacn_ws |
步骤
1、新建功能包
首先创建一个空的package
单独存放msg
类型(当然也可以在任意的package
中自定义msg
类型) 这里为便于说明,建立一个名为usbcan_test
的包,用于对自定义msg
类型的用法举例
1 | $ cd usbacn_ws/src |
2、新建msg
文件
在usbcan_test
中创建msg
文件夹,在msg
文件夹其中新建一个名为test.msg
消息类型文件
1 | $ cd usbcan_test |
3、修改package.xml
需要message_generation
生成C++或Python能使用的代码,即将将.msg
文件编译生成.h
文件,需要message_runtime
提供运行时的支持,所以package.xml
中添加以下两句(一般生成的文件中都有了,去注释就行)
1 | <build_depend>message_generation</build_depend> |
如果还要ros
支持,同样去注释
1 | <build_depend>roscpp</build_depend> |
4、修改CMakeLists.txt
这个CMakeLists.txt
是功能包下的,有几点注意:
(1) 首先调用find_package
查找依赖的包,必备的有roscpp 、rospy 、message_generation
,其他根据具体类型添加,比如上面的msg
文件中用到了std_msgs/Header header
类型,那么必须查找std_msgs
1 | find_package(catkin REQUIRED COMPONENTS |
(2) 然后是add_message_files
,指定msg文件
1 | add_message_files( |
(3) 然后是generate_messages
,指定生成消息文件时的依赖项,比如上面嵌套了其他消息类型std_msgs
,那么必须注明
1 | # generate_messages必须在catkin_package前面 |
(4) 然后是catkin_package
设置运行依赖
1 | catkin_package( |
到这里新的msg类型usbcan_test/test
就可以使用了,下面编译这个包,然后利用rosmsg show
指令查看
1 | $ cd catkin_ws |
5、调用自定义msg
类型
如果是在usbcan_test
包内的节点中调用usbcan_test/test
类型,只需要在.cpp
文件中如下调用即可
1 |
|
然后修改CMakeLists.txt
1 | # add_executable(${PROJECT_NAME}_node src/usbcan_test_node.cpp) |
因为还用到include
文件夹里的头文件,所以CMakeLists.txt
要去注释
1 | include_directories( |
6、其他包调用自定义msg
类型
如果是在其他包调用usbcan_test/test
类型则需要修改package.xml
和CMakeLists.txt
,比如同样在工作空间usbacn_ws
内有一个名为test
的包,我们可以在这个包内写一个节点,使用我们刚才自定义的消息类型usbcan_test/test
,如下:
(1) 修改package.xml
养成好习惯,维护软件包清单的更新,以便于别人使用你的软件前安装各种依赖项,当然这个文件不影响程序编译
1 | <build_depend>roscpp</build_depend> |
(2) 修改CMakeLists.txt
调用自定义消息类型主要修改两个地方,以下是重点: 一是find_package
中需要声明查找包含该消息类型的包; 二是add_dependencies
要注明该消息的依赖,其他地方和普通节点一样
1 | find_package(catkin REQUIRED COMPONENTS |
完整工程参考