ROS 自定义消息
一.概论
std_msgs实在太弱了,能发出来的东西太少,所以我们想要自己定义一些信息,这样消息容量更多,能够传递更加复杂的消息。
自定义msgs有点想结构体
二.具体实现
1.按照固定格式创建Msgs文件
在现有的功能包下新建Msg文件夹,在其中添加文件person.msg
image-20240313204714163
2.配置xml与cmake
- package.xml
image-20240313204826620
- 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属性,下面为具体步骤
- 在终端打开该文件
image-20240313210146485
- 在终端输入pwd,复制所得的路径
image-20240313210400551
- 在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;
|
配置add_executable等
image-20240313211837454
image-20240313211858315
因为使用了自定义消息,所以还需要配置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,"");
ros::init(argc,argv,"talker_person");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<demo02_talker_listener::Person>("chatter_person",1000);
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博客