使用自定义消息(C++)

使用流程

1. 消息依赖配置

在开发过程种,自定义消息是以一个package存在的,其他package需要用到这个自定义消息的package,是需要添加依赖的。

package.xml依赖配置

来到package.xml中,添加如下:

1
2
3
<build_depend>demo_msgs</build_depend>
<build_export_depend>demo_msgs</build_export_depend>
<exec_depend>demo_msgs</exec_depend>

CMakeLists.txt依赖配置

来到CMakeLists.txt文件中,找到find_package,添加demo_msgs自定义消息依赖,添加结果如下:

1
2
3
4
5
6
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rosmsg
  rospy
  demo_msgs
)

2. 引入依赖

1
#include "demo_msgs/Student"

3. 构建消息

1
2
3
demo_msgs::Student stu;
stu.name = "itheima";
stu.age = 13;

Tip

消息依赖加入后,具体类型是demo_msgs::Student

使用注意点

当自定义消息编译完成成功后,要按照以下步骤执行:

  1. 关闭clion
  2. 启动clion的命令行, 需要重新source devel/setup.bash
  3. 重启clion

Warning

在使用过程中,如果仍然无法include自定义的消息,重复以上操作

完整示例代码

Publisher实现代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include "ros/ros.h"

#include "demo_msgs/Student.h"

using namespace std;

int main(int argc, char **argv) {
  // 创建节点
  string nodeName = "my_publisher1";
  ros::init(argc, argv, nodeName);
  ros::NodeHandle node;

  //通过节点创建发布者
  string topicName = "my_topic";
  const ros::Publisher &publisher = node.advertise<demo_msgs::Student>(topicName, 1000);

  int index = 0;
  ros::Rate rate(1);
  while (ros::ok()) {
    //通过publisher发布消息
    demo_msgs::Student msg;
    msg.name = "name-" + to_string(index);
    msg.age = index;
    publisher.publish(msg);

    index++;
    rate.sleep();
  }

  ros::spin();
  return 0;
}

Subscriber实现代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include "ros/ros.h"
#include "demo_msgs/Student.h"

using namespace std;

void callback(const demo_msgs::Student::ConstPtr &message) {
  cout << message->name << endl;
  cout << message->age << endl;
  cout << "-----------------------" << endl;
}

int main(int argc, char **argv) {
  // 创建节点
  string nodeName = "my_subscriber1";
  ros::init(argc, argv, nodeName);
  ros::NodeHandle node;

  //创建订阅者
  string topicName = "my_topic";
  const ros::Subscriber &subscriber = node.subscribe(topicName, 1000, callback);

  ros::spin();
  return 0;
}