1.话题编程
首先我们要有一个发布话题的Talker,还要有一个订阅话题的Listener,然后就是负责管理整个系统的ROS Master。
话题编程的流程主要是以下四个步骤:
- 创建发布者
- 创建订阅者
- 添加编译选项
- 运行可执行程序
上面的前两步是编程实现的,第三步是通过编译的方式生成可执行文件。最后一步就是去运行一下这个可执行的程序。
我们之前创建的功能包learning_communication里面是没有代码的:
然后在这个文件下面创建一个talker.cpp文件
里面的代码解释也非常清晰。通过句柄.advertise发布消息,里面需要传入发布消息的具体类型,以及队列的长度。
代码的流程如下:
- 初始化ROS节点
- 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型。
- 按照一定频率循环发布消息。
有了发布者之后,我们接下来需要去定义一个订阅者,步骤如下:
- 初始化ROS节点
- 订阅需要的话题
- 循环等待话题消息,接收到消息后进入回调函数。
- 在回调函数里面完成消息处理。
源码如下:
现在的话我们就已经写好了c++文件,我们需要对其进行编译,如果我们使用的是python文件的话,我们就不用对其进行编译了。编译代码主要有以下三个步骤:
- 设置需要编译的代码和生成的可执行文件;
- 设置链接库;
- 设置依赖。
在上面这个文件夹下面的CMakeLists.txt就是我们具体需要编译的选项的。接下来我们需要在这个文件下面设置我们需要编译的选项。在这个文件里面很多都是被注释掉了,我们很多时候去掉其中的注释然后再改一点就可以了,并不需要我们自己写。将代码生成可执行文件就是需要使用add_executable这个配置。
这里我们在下面再粘贴一下:
这里我们只需要看未被注释的,第一行的意思就是将talker.cpp生成可执行文件。如果需要更多的文件来生成可执行文件的话,需要在后面再多加几个c++文件。
因为我们需要依赖第三方的库,所以我们需要添加target_link_libraries来与第三方的库做一个链接。之后我们回到工作空间对其进行编译。
编译成功之后就会有以下提示:显示达到1005并且没有报错的话就说明编译成功了。
我们在下面这个文件里面就可以找到我们编译生成的可执行文件了。
之后我们启动roscore
再运行发送“hello world”可执行文件:
再运行接收文件的话,就可以看到下面的结果:
如果我们需要自己定义话题消息的话,我们可以采取以下方式自定义话题消息:
string name
uint8 sex
unit8 age
unit8 unknown = 0
unit8 male = 1
unit8 female = 2
具体操作步骤如下:
- 定义msg文件
- 在package.xml中添加功能包依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
- 在CMakeList.txt添加编译选项
接下来具体操作一下:
首先创建一个文件夹,命名为msg文件
在这个文件夹下面创建一个具体的Person.msg文件
之后我们在package.xml文件里面去添加依赖。部分的ROS版本中的exec_depend需要改成run_depend。
之后的话我们需要在CMakeLists.txt文件里面添加编译选项,在下面添加message_generation功能包。
然后添加编译时候的依赖:
接下来添加是哪一个具体的msg文件:
之后对其进行编译:
我们可以在代码终端里面验证一下:
2.服务编程
listener通过请求的形式来完成跟talker的一个通讯,talker把处理完成之后的数据处理完成之后再发布给listener,整个服务编程流程可以大致分为以下四个步骤:
- 创建服务器
- 创建客户端
- 添加编译选项
- 运行可执行程序
假设如下场景,listener发布某两个加数给talker,talker接收到这两个加数之后将这两个加数进行相加,并且把求和的结果告诉listener。具体步骤如下:
- 定义srv文件
- 在package.xml中添加功能包依赖
- 在CMakeLists.txt添加编译选项
首先创建一个srv文件:
然后在下面定义以下文件:
中间的三条横线将数据分成两部分,上面的是服务的请求部分,下面的是服务的应答部分。
之后我们需要在pacaage.xml文件中添加功能包依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
这个和之前的talker-listener是一样的,因为我们刚才添加好了,这里就不用去做任何修改:
之后修改CMakeLists.txt文件,和之前的也差不多:
首先修改message_generation,和message_runtime。
之后再修改add_service_files:
之后进入工作空间下面,对其进行编译: