发现目前看ros的视频只是一味的去模仿并没有很好的理解为什么要这样去做,所以现在需要对加强对胡老师的每一步的理解。因为没学C++所以代码部分读起来得依靠注释来理解。
本篇学习笔记记录古月居21讲中第12讲的内容,具体如下图,这也是代码编写的整体思路。
目标:自定义消息的自定义和发布者和订阅者的一个创建。
自定义话题消息:建立一个.msg的文件,内容自定义。按本讲来看就是来定义人物的姓名,年龄,性别。
string name
uint8 sex
uint8 age
uint8 unkonw =0
uint8 male =1
uint8 female =2
注意:该文件与语言文件无关,内容不是C++或python。所定义的string,uint8会根据后续编程语言(以C++为例)而进行动态变化,变化成对应该种语言(C++)的定义类型。
因为这样定义存在着这样的数据扩展(上述描述中的动态变化),故需要在CMake中添加一系列的编译选项。
根据上述数据接口设置定义的规则
1.添加功能包的依赖。
此步骤是因为需要用到一个动态生成程序的依赖。也就是当初在创建功能包的时候depend中并没有敲出这部分的代码,后续想要添加进取。方法就是在package.xml中直接添加你需要的依赖。这也是前一讲并未讲到的一部分内容。
message_generation
message_runtime
build_depend:编译依赖,该依赖是来自于ros自带的动态产生message的功能包
exec_depend:执行依赖
两者为固定搭配,记住就行。
2.添加编译选项
由于前面添加依赖时采用了message_generation的功能包,所以需要在CMake中添加它
add_message_files(FILES Person.msg)
其作用是将.msg文件作为定义的接口进行编译
generate_messages(DEPENDENCIES std_msgs)
其作用是编译.msg文件是需要依赖哪些ros已有库或者包,本将所用的string和uint8均为 std_msgs包中定义的。
在catkin_package中创建运行依赖 message_runtime (与package中的exec....中的相对应,因为需要他所以才catkin_package中需要加这个)
注:我在整理的时候才发现这一行的#我在第一次学习中并没有消除,但对最后的结果并没有产生影响
代码理解
第一部分:发布者节点
1.初始化,创造句柄,这两个是必要。
// ROS节点初始化
ros::init(argc, argv, "person_publisher");
// 创建节点句柄
ros::NodeHandle n;
2.创建发布者节点(发布自定义消息的接口),该节点(接口)用来发布话题(topic)——/person_info,类型为learning_topic::Person,队列长度10
ros::Publisher person_info_pub = n.advertise("/person_info", 10);
而这个发布者节点(接口)是需要调用的,调用的文件是我们之前catkin_make(编译)所产生的文件。
#include "learning_topic/Person.h"
所产生的数据都会输出到topic——/person_info中队列长度为10
3.设置循环频率,这个很重要
ros::Rate loop_rate(1);
4.初始化learning_topic::Person类型的消息(自定义topic中的内容)
learning_topic::Person person_msg;
person_msg.name = "Tom";
person_msg.age = 18;
person_msg.sex = learning_topic::Person::male;
tom这个人的性别使用宏定义来调用的,调用文件为learning_topic/Person中定义的male
第二部分:订阅者节点
1.初始化和创建句柄就不赘述了
2.创建一个订阅者节点(接口),该接口用来接受话题topic——/person_info发出的message——learning_topic::Person。
ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);
接受后再进行消息打印出来
整体对比下来和之前的代码区别在于对文件的调用,这一讲所调用的文件为自己生成的文件,而前一讲则是采用的ros里面自带的调用文件。
1.编译代码
catkin_make
2.运行程序
roscore
rosrun learning_topic person_subscriber
rosrun learning_topic person_publisher
拓展:
当运行发布者和订阅者已经通讯成功后,关闭ros master (roscore) 不影响两者之间后续的通讯
但如果要加入第三个节点或者需要访问参数服务器中的数据,就会产生问题
第三个节点的加入需要rosmaster建立连接,而参数服务器这在roscore中