ubuntu16.04下ROS操作系统学习笔记(三 / 二)ROS基础-ROS通信编程(上)

简介: ubuntu16.04下ROS操作系统学习笔记(三 / 二)ROS基础-ROS通信编程(上)

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:

之后进入工作空间下面,对其进行编译:

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
9月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
9月前
|
存储 Ubuntu 应用服务中间件
【Nginx】centos和Ubuntu操作系统下载Nginx配置文件并启动Nginx服务详解
【Nginx】centos和Ubuntu操作系统下载Nginx配置文件并启动Nginx服务详解
114 1
|
5月前
|
Ubuntu 网络安全 开发工具
Ubuntu19.04的安装过程详解以及操作系统初始化配置
本文详细介绍了Ubuntu 19.04操作系统的安装过程、初始化配置、网络设置、软件源配置、SSH远程登录以及终端显示设置。
166 1
Ubuntu19.04的安装过程详解以及操作系统初始化配置
|
6月前
|
机器学习/深度学习 Ubuntu 数据挖掘
揭秘:Ubuntu系统下部署Anaconda环境及Python语言的终极指南!跟随这一步步神秘流程,解锁编程大师的秘密武器!
【8月更文挑战第19天】在Ubuntu中部署Anaconda环境与Python相当直观。首先需从官网下载Linux版安装包。接着,在终端依次执行命令:添加Anaconda清华镜像源至软件源列表,更新软件包信息,然后安装Anaconda。安装后可通过`anaconda --version`验证。使用`anaconda create -n myenv python=3.8`创建名为“myenv”的环境并指定Python 3.8版本。
363 0
|
6月前
|
Ubuntu NoSQL 关系型数据库
在Ubuntu操作系统上安装/使用/卸载Docker容器引擎
这篇文章详细介绍了在Ubuntu操作系统上安装、配置、使用、基本操作以及卸载Docker容器引擎的步骤,包括配置Docker镜像加速和使用Docker部署Nginx、MySQL和Redis服务器的方法。
117 0
|
8月前
|
Ubuntu Python
银河麒麟-麒麟软件操作系统 kylin 搭建yum源 ubuntu搭建yum源 yum软件仓库搭建ftp源、python源、硬盘源
银河麒麟-麒麟软件操作系统 kylin 搭建yum源 ubuntu搭建yum源 yum软件仓库搭建ftp源、python源、硬盘源
893 1
|
9月前
|
存储 安全 调度
【操作系统】进程控制与进程通信
【操作系统】进程控制与进程通信
81 3
|
9月前
|
监控 Linux 调度
操作系统学习笔记(一)
在Linux中,使用`ps -aux | grep PID`来查看特定进程的状态,或者用`top`指令监控进程和内存。通过`cat 文件名 | grep 关键词`或`grep -i 关键词 文件名`搜索日志文件。`grep`是一个强大的文本搜索工具,支持多种参数,如`-i`忽略大小写,`-c`计数,`-f`从文件读取关键词。要临时更改主机名用`hostname 新主机名`,永久更改则用`hostnamectl set-hostname 新主机名`
54 0
|
9月前
|
消息中间件
操作系统学习笔记(二)
进程切换比线程切换更消耗资源,因为进程切换需保存更多上下文,包括地址空间、寄存器、栈和文件描述符等,还要刷新TLB。线程切换仅需切换硬件上下文和内核栈,上下文更小,所以开销低。进程间通信有多种方式,如匿名管道(父子进程间)、命名管道(无亲缘关系进程)、信号、消息队列、共享内存和信号量等。这些通信方法各有特点,适用于不同场景。例如,匿名管道是半双工的,有名管道允许任何进程通过路径通信,信号用于进程间的简单通知,消息队列支持随机查询和按类型读取,共享内存允许多进程共享数据,而信号量则用于同步和控制对共享资源的访问。
49 0
|
9月前
|
Ubuntu Android开发 数据安全/隐私保护
【Android平板编程】远程Ubuntu服务器Code-Server编程写代码
【Android平板编程】远程Ubuntu服务器Code-Server编程写代码
117 0