ROS学习笔记(三)

发现目前看ros的视频只是一味的去模仿并没有很好的理解为什么要这样去做,所以现在需要对加强对胡老师的每一步的理解。因为没学C++所以代码部分读起来得依靠注释来理解。

本篇学习笔记记录古月居21讲中第12讲的内容,具体如下图,这也是代码编写的整体思路。

ROS学习笔记(三)_第1张图片

 目标:自定义消息的自定义和发布者和订阅者的一个创建。

具体步骤:

第一步:

自定义话题消息:建立一个.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中添加它

ROS学习笔记(三)_第2张图片

add_message_files(FILES Person.msg)

其作用是将.msg文件作为定义的接口进行编译

generate_messages(DEPENDENCIES std_msgs)

其作用是编译.msg文件是需要依赖哪些ros已有库或者包,本将所用的string和uint8均为 std_msgs包中定义的。

ROS学习笔记(三)_第3张图片

在catkin_package中创建运行依赖 message_runtime (与package中的exec....中的相对应,因为需要他所以才catkin_package中需要加这个)

ROS学习笔记(三)_第4张图片

注:我在整理的时候才发现这一行的#我在第一次学习中并没有消除,但对最后的结果并没有产生影响

代码理解

第一部分:发布者节点

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中

你可能感兴趣的:(学习)