052话题通信_自定义msg_实现_Chapter2-ROS通信机制_哔哩哔哩_bilibili
2.1.4 话题通信自定义msg · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程
一、自定义msg实现
需求:创建自定义消息,该消息包含人的信息:姓名、身高、年龄等。
1.定义msg文件
(1)新建msg文件夹,再创建Person.msg文件
(2)设置字段
(3)配置
①
②编译功能包,需要依赖message_generation
③放开注释( 取消多行注释:Ctrl+K+U)
更改为: 这个实现意味着我们要编译message目录下的Person.msg文件;
④放开注释,意味着如果要编译generate_messages需要依赖std_msgs
⑤ 放开注释,添加
这里的catkin_package是和find_package对应,
find_package意思是如果编译自定义的功能包(plumbing_pub_sub),必须依赖于find_package里面的包,而这些包又依赖于catkin_package里面的功能包;
可以将 find_package理解为编译时依赖,catkin_package理解为运行时依赖;
(4)编译(ctrl+shift+B)
编译成功后会生成一些中间文件
二、自定义msg使用( C++)
需求:
编写发布订阅实现,要求发布方以10HZ(每秒10次)的频率发布自定义消息,订阅方订阅自定义消息并将消息内容打印输出
流程:
- 按照固定格式创建 msg 文件
- 编辑配置文件
- 编译生成可以被 Python 或 C++ 调用的中间文件
1.vscode配置
12行可对照上行修改为:
2.发布方实现
(1)新建文件demo03_pub_person.cpp
(2)添加头文件
(3)初始化ros节点
banZhuRen——节点名称
(4)创建节点句柄
(5)创建发布者对象
(6)发布逻辑
①创建被发布数据
中文输出需要添加该函数:
②设置发布频率
③循环发布数据
(7)配置
①
映射名最好和原文件名一致
②
③
更改为:
第一个参数是原文件映射名称;
(8)编译
(9)测试
①启动roscore
②再开终端,发布节点
③ 打印
注意不能直接如下操作:
因为打印的消息类型是person类型,在当前命令行找不到,必须进入工作空间
④结果
(10)输出打印优化
重新编译,结果:
三、订阅方实现
1.新建文件
2.订阅方和发布方对比
(1) 代码
/*
需求: 订阅人的信息
*/
#include "ros/ros.h"
#include "demo02_talker_listener/Person.h"
void doPerson(const demo02_talker_listener::Person::ConstPtr& person_p){
ROS_INFO("订阅的人信息:%s, %d, %.2f", person_p->name.c_str(), person_p->age, person_p->height);
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//1.初始化 ROS 节点
ros::init(argc,argv,"listener_person");
//2.创建 ROS 句柄
ros::NodeHandle nh;
//3.创建订阅对象
ros::Subscriber sub = nh.subscribe<demo02_talker_listener::Person>("chatter_person",10,doPerson);
//4.回调函数中处理 person
//5.ros::spin();
ros::spin();
return 0;
}
(2)配置
需要添加 add_dependencies 用以设置所依赖的消息相关的中间文件。
add_executable(person_talker src/person_talker.cpp)
add_executable(person_listener src/person_listener.cpp)
add_dependencies(person_talker ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(person_listener ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(person_talker
${catkin_LIBRARIES}
)
target_link_libraries(person_listener
${catkin_LIBRARIES}
)
(3)编译,运行
- 启动 roscore;
- 启动发布节点;
- 启动订阅节点。
- PS:可以使用 rqt_graph 查看节点关系。