ROS自定义消息

ROS 自定义消息

一.概论

std_msgs实在太弱了,能发出来的东西太少,所以我们想要自己定义一些信息,这样消息容量更多,能够传递更加复杂的消息。

自定义msgs有点想结构体

二.具体实现

1.按照固定格式创建Msgs文件

在现有的功能包下新建Msg文件夹,在其中添加文件person.msg

image-20240313204714163

2.配置xml与cmake

  1. package.xml
image-20240313204826620
  1. cmakelist
image-20240313204911908
image-20240313205117490
image-20240313205156540
image-20240313205303043

find_package是编译时的依赖,catkin_package是运行时的依赖

3. 编译

Shift+ctrl+B后会在devel中生成中间文件,包括但不限于头文件等

image-20240313210129284

三、 发布方实现

为了方便代码提示以及避免误抛异常,需要先配置 vscode,将前面生成的 head 文件路径配置进 c_cpp_properties.json 的includepath属性,下面为具体步骤

  1. 在终端打开该文件
image-20240313210146485
  1. 在终端输入pwd,复制所得的路径
image-20240313210400551
  1. 在c_cpp_properties.json文件下新增一行这个,注意之前的要打逗号结束语句
image-20240313210457795

4.引用头文件,注意要有文件路径前缀

image-20240313210744668

5.接下来按照订阅进行操作即可,一直到创建发布者对象使用如下代码

1
ros::Publisher pub = advertise <plumbing_pub_sub::Person>("liaotian",10);

6.创建被发布的东西

1
2
3
4
plumbing_pub_sub::Person person;
person.name = "满孝";
person.age = 114514;
person.height = 1.80;
  1. 配置add_executable等

    image-20240313211837454
    image-20240313211858315
  2. 因为使用了自定义消息,所以还需要配置add_dependencies

    1
    add_dependencies(和add_executable后的第一个参数一样  ${PROJECT_NAME}_generate_messages_cpp)

    注意,如果想用rostopic echo来查看所发的消息,那么在这个命令之前也要source一下,即

    1
    source ./devel/setup.bash

完整的代码如下

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
34
35
36
37
38
39
40
41
42
43
/*
需求: 循环发布人的信息

*/

#include "ros/ros.h"
#include "demo02_talker_listener/Person.h"

int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");

//1.初始化 ROS 节点
ros::init(argc,argv,"talker_person");

//2.创建 ROS 句柄
ros::NodeHandle nh;

//3.创建发布者对象
ros::Publisher pub = nh.advertise<demo02_talker_listener::Person>("chatter_person",1000);

//4.组织被发布的消息,编写发布逻辑并发布消息
demo02_talker_listener::Person p;
p.name = "sunwukong";
p.age = 2000;
p.height = 1.45;

ros::Rate r(1);
while (ros::ok())
{
pub.publish(p);
p.age += 1;
ROS_INFO("我叫:%s,今年%d岁,高%.2f米", p.name.c_str(), p.age, p.height);

r.sleep();
ros::spinOnce();
}



return 0;
}

订阅方实现

其他都无大差别

这里需要注意的是,发布者定义时可以不指名是何种消息

1
ros::Subscriber sub = nh.subscribe("liaotian",10,doPerson)

具体参数可以参阅我之前写的ros中常用API一文:

ros中常用的API-CSDN博客


ROS自定义消息
http://example.com/2024/12/01/ROS自定义消息/
Author
Wu Xuanye
Posted on
December 1, 2024
Licensed under