1. 定义msg文件
在功能包下创建msg目录,并添加自定义的msg文件。这里以ExampleMessage.msg为例。
工作空间为ROS_WS,功能包名为example_ros_msg,文件目录如下图所示:
ExampleMessage.msg文件内容如下:
Header header
int32 demo_int
float64 demo_double
2.编辑配置文件
(1) package.xml
<!--自定义msg需要的编译依赖-->
<build_depend>message_generation</build_depend>
<!--自定义msg需要的执行依赖-->
<exec_depend>message_runtime</exec_depend>
(2) CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
)
# 需要加入 message_generation,必须有 std_msgs
## 配置 msg 源文件
add_message_files(
FILES
ExampleMessage.msg
)
# 生成消息时依赖于 std_msgs
generate_messages(
DEPENDENCIES
std_msgs
)
#执行时依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo02_talker_listener
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
3. 编译
在 工作空间/devel/include/包名/下生成了 ExampleMessage.h 文件
4. 使用
为了方便代码提示以及避免误抛异常,需要先配置 vscode,将前面生成的 head 文件路径配置进 c_cpp_properties.json 的 includepath属性:
{
"configurations": [
{
"browse": {
"databaseFilename": "",
"limitSymbolsToIncludedHeaders": true
},
"includePath": [
"/opt/ros/noetic/include/**",
"/usr/include/**",
"/xxx/yyy工作空间/devel/include/**" //配置 head 文件的路径
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
(1)发布
example_ros_msg_publisher.cpp 的代码如下:
#include "ros/ros.h"
#include "example_ros_msg/ExampleMessage.h"
#include "math.h"
int main(int argc, char *argv[])
{
ros::init(argc, argv, "example_ros_msg_pub");
ros::NodeHandle nh;
ros::Publisher myPublisher = nh.advertise<example_ros_msg::ExampleMessage>("example_topic",1);
example_ros_msg::ExampleMessage m;
m.header.seq = 0;
m.header.frame_id = "base_frame";
m.demo_int = 1;
m.demo_double = 100.0;
ros::Rate r(1);
double sqrt_arg;
while (ros::ok())
{
m.header.seq ++;
m.header.stamp = ros::Time::now();
m.demo_int *= 2;
sqrt_arg = m.demo_double;
m.demo_double = sqrt(sqrt_arg);
myPublisher.publish(m);
r.sleep();
}
/* code */
return 0;
}
(2)CMakeLists.txt
add_executable(example_ros_msg_publisher src/example_ros_msg_publisher.cpp)
add_dependencies(example_ros_msg_publisher ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(example_ros_msg_publisher
${catkin_LIBRARIES}
)