想要自定义消息类型,又需要在同一空间的外部功能包中调用,备忘。
1. 自定义消息类型
1.1 新建一个功能包来管理自定义消息类型
在实际使用中,利用单独的功能包来创建特定消息类型,与其他功能代码区分开,方便后续排错。
-
新建功能包
udf_msgs
依赖一些常用的 ROS 包,udf
取user defined
之意。catkin_create_pkg udf_msgs roscpp rospy std_msgs sensor_msgs geometry_msgs nav_msgs
-
新建
msg
文件夹,并新建一个 ``xx.msg` 文件为例子,简单编写一下文件。cd your_ws/src/udf_msgs/使用 mkdir msg && cd msg touch xx.msg && gedit xx.msg
-
xx.msg
文件内部示例# This represents xx msg with reference coordinate frame and timestamp Header header std_msgs/Int16 test_num
-
修改
package.xml
文件,添加两行用于生成消息。<build_export_depend>message_generation</build_export_depend> <exec_depend>message_runtime</exec_depend>
-
修改
CMakeLists.txt
文件。add_message_files(FILES xx.msg) #注意和消息文件同名 generate_messages(DEPENDENCIES std_msgs) #这里只依赖了 std_msgs catkin_package( # INCLUDE_DIRS include # LIBRARIES usv_msgs # 取消下面这句的注释,并添加 message_runtime CATKIN_DEPENDS geometry_msgs nav_msgs roscpp rospy sensor_msgs std_msgs message_runtime # DEPENDS system_lib )
-
编译功能包,并检查消息是否成功生成,成功的话应该会输出你定义的类型,否则检查上面步骤。
cd your_ws && catkin_make source your_ws/devel/setup.zsh rosmsg show udf_msgs/xx
1.2 在其他功能包中使用上述自定义消息类型
其他的功能包定义为 “调用包”,自定义消息功能包
udf_msgs
定义为 “消息包”。
-
调用包修改
package.xml
文件,添加依赖。<build_depend>xx_msgs</build_depend> <build_export_depend>xx_msgs</build_export_depend> <exec_depend>xx_msgs</exec_depend>
-
调用包修改
CMakeLists.txt
文件。find_package (udf_msgs) # 增加 udf_msgs catkin_package( INCLUDE_DIRS include #取消这行注释 # LIBRARIES arduino_pkg # CATKIN_DEPENDS geometry_msgs roscpp sensor_msgs std_msgs # DEPENDS system_lib ) include_directories( include #取消这行注释 ${catkin_INCLUDE_DIRS} )
-
调用包中的节点包含头文件:
#include <udf_msgs/xx.h> udf_msgs::xx xx_msg; //定义消息 xx_msg.header; //赋值消息 xx_msg.test_num; //赋值消息
1.3 小 TIPS
- 生成新消息类型后,在 your_ws/devel/include 中查看是否有消息的头文件。
- 用
vscode
编写可能会出现消息正确生成,但包含报错的问题,尽管编译没有问题,但是红线确实恼人,找到你 调用包 中的.vscode
文件夹,删掉重新打开vscode
即可解决。该文件夹为隐藏属性,可利用ctrl+H
或ls -a
。