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

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

我们接下来看一下怎么实现一个服务端,实现服务器的编程

我们在这个功能包下面的src文件夹下面创建一个server.cpp文件:

一个服务器的实现也需要分成四个步骤:

  • 初始化ROS节点;
  • 创建Server实例;
  • 循环等待服务请求,进入回调函数;
  • 在回调函数中完成服务功能的处理,并反馈应答数据。

其代码与之前的比较类似。再回调函数里面,由于之前是将数据分成了两个部分,所以这个也是做两个部分,一个是request,一个是response。

之后我们还要创建一个客户端

具体代码如下:

之后需要对其进行编译:

  • 设置需要编译的代码和生成的可执行文件;
  • 设置链接库;
  • 设置依赖;

add_executable(server src/server.cpp)

target_link_libraries(server ${catkin_LIBRARIES})

add_dependencies(server ${PROJECT_NAME}_gencpp)

add_executable(client src/client.cpp)

target_link_libraries(client ${catkin_LIBRARIES})

add_dependencies(client ${PROJECT_NAME}_gencpp)

设置完成之后,需要回到工作空间的根目录下面对其进行编译:

接下来我们运行编译成功之后的可执行文件:

首先我们roscore启动master,之后启动服务端,再启动客户端,传入参数:

roscore
rosrun learning_communication server
rosrun learning_communication client 1 1

 

3.动作编程

动作也是话题服务的一种机制,但是跟话题服务又有一些区别。比如说我们想让机器人前往一个目标点,并且让机器人不断地返回自己的实时状态,甚至说在机器人运动过程当中,我们不想让机器人前往这个目标点了,给他发布他一个信息,让它停止下来。像这种需要维持一段时间,并且有反馈的这样一种通讯是没有办法用话题或者服务来完成的。动作的实现也是通过ROS的消息机制来实现的。

实现原理图如下所示:

同样也是分为服务端与客户端,通过二者之间的通讯来实现。

Action的接口有:

  • goal:发布任务目标。客户端可以给服务端发送一个动作的目标。
  • cancel:请求取消任务。在运行的过程当中,也可以将其取消。
  • status:通知客户端当前的状态。通知客户端当前服务器的状态。
  • feedback:周期反馈任务运行的监控数据。周期性地反馈,告诉机器人当前服务器的状态。
  • result:向客户端发送任务的执行结果,只发布一次。当完成客户端的命令之后会执行一次。

那么我们如何来实现这样一个具体的动作编程呢:

  • 定义action文件
  • 在package.xml中添加功能包依赖

<build_depend>actionlib</build_depend>

<build_depend>actionlib_msgs</build_depend>

<exec_depend>actionlib</exec_depend>

<exec_depend>actionlib_msgs</exec_depend>

  • 在CMakeLists.txt中添加编译选项

find_package(catkin REQUIRED actionlib_msgs actionlib)

add_action_files(DIRECTORY action FILES DoDishes.action)

generate_messages(DEPENDENCIES actionlib_msgs)

同样,如果ROS中有自定义的工作消息给我们的话我么可以直接调用,如果没有的话那我们就需要自己来定义这样一个自定义的动作消息。

我们现在来假设一个洗盘子这样的任务,客户端发送一个洗盘子的命令给服务端,服务端接收到这个命令之后开始洗盘子,然后反馈给客户端洗了多少了,客户端也可以让服务端终止洗盘子这个命令。盘子洗碗之后返回一个洗碗的信号给客户端。

如果我们想要创建一个动作消息,我们需要在功能包里面创建一个文件夹action。然后在action里面创建具体的动作消息。

这里有两个三横杠,把这整个数据内容分成了三个部分。

第一部分是定义目标数据的,也就是客户端发送什么样的一个动作的目的给服务端。

第二部分定义的是结果的,也就是说我们整个动作执行完成之后到底是一个什么样的结果。

第三部分是一定周期内反馈给客户端的数据内容。这里的话就是反馈洗盘子的百分比。

定义完成之后需要在package.xml里面去添加功能包的依赖。

package.xml改完之后要去改CMakeLists.txt文件。

之后我们编译一下工作空间,看看定义的这些action是否是正确的

编译是没有错误的,所以我们刚才的操作是没有错误的。

我们现在来看一下如何实现一个动作的服务器,主要是以下步骤:

  • 初始化ROS节点
  • 创建动作服务器实例
  • 启动服务器,等待动作请求
  • 在回调函数中完成动作服务功能的处理,并反馈进度信息
  • 动作完成,发送结束信息。

我们从视频资源中把源码拷贝过来:

我们首先看一下服务端代码:

在main函数里面,程序流程大致都差不多。启动服务器之后服务器就会一直循环等待命令。一旦接收到命令之后,服务器就会进入到回调函数里面。回调函数里面就会开始具体的服务处理。

完成服务端之后我们需要去完成客户端的功能:

  • 初始化ROS节点
  • 创建动作客户端实例
  • 连接动作服务端
  • 发送动作目标
  • 根据不同类型的服务端反馈处理回调函数

代码完成之后就是来编译这些代码:

add_executable(DoDishes_client src/DoDishes_client.cpp)

target_link_libraries( DoDishes_client ${catkin_LIBRARIES})

add_dependencies(DoDishes_client ${${PROJECT_NAME}_EXPORTED_TARGETS})

add_executable(DoDishes_server src/DoDishes_server.cpp)

target_link_libraries( DoDishes_server ${catkin_LIBRARIES})

add_dependencies(DoDishes_server ${${PROJECT_NAME}_EXPORTED_TARGETS})

之后进入工作空间目录下对其进行编译

我们接下来对其进行验证测试:

roscore
rosrun learning_communication DoDishes_client
rosrun learning_communication DoDishes_client

我的微信公众号名称:深度学习与先进智能决策

微信公众号ID:MultiAgent1024

公众号介绍:主要研究强化学习、计算机视觉、深度学习、机器学习等相关内容,分享学习过程中的学习笔记和心得!期待您的关注,欢迎一起学习交流进步!

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
ROS入门实践
本课程将基于基础设施即代码 IaC 的理念,介绍阿里云自动化编排服务ROS的概念、功能和使用方式,并通过实际应用场景介绍如何借助ROS实现云资源的自动化部署,使得云上资源部署和运维工作更为高效。
相关文章
|
并行计算 Ubuntu Linux
Ubuntu学习笔记(五):18.04安装多版本CUDA
这篇博客文章介绍了在Ubuntu 18.04系统上如何安装和切换不同版本的CUDA,以及如何安装不同版本的cuDNN。
671 2
|
4月前
|
Ubuntu 开发工具
Ubuntu 22.04 aarch64版本操作系统下编译ZLMediaKit教程
通过上述步骤,你可以在Ubuntu 22.04 aarch64版本上成功编译ZLMediaKit,这是一个相对简单而直接的过程,但可能会遇到一些需要根据具体系统环境和要求调整的地方。
623 0
|
7月前
|
Ubuntu 机器人 Shell
在Jetson TX2的Ubuntu18.04系统中安装ROS的教程
所有这些步骤并不复杂,但确实需要仔细一点。如果遇到问题,不要灰心,问题是解决问题的开始。保持耐心,细心阅读错误信息,通常情况下,问题的答案就藏在其中。祝ROS旅程顺利!
234 18
|
Ubuntu 网络安全 图形学
Ubuntu学习笔记(二):ubuntu20.04解决右上角网络图标激活失败或者消失,无法连接有线问题。
在Ubuntu 20.04系统中解决网络图标消失和无法连接有线网络问题的方法,其中第三种方法通过检查并确保Windows防火墙中相关服务开启后成功恢复了网络连接。
4588 0
Ubuntu学习笔记(二):ubuntu20.04解决右上角网络图标激活失败或者消失,无法连接有线问题。
|
Ubuntu Shell Python
Ubuntu学习笔记(一):pycharm设置快捷启动图标详解
这篇博客详细讲解了如何在Ubuntu 20.04系统中为PyCharm设置快捷启动图标,包括创建.desktop文件、编辑文件内容以及添加到收藏夹的步骤。
1050 0
Ubuntu学习笔记(一):pycharm设置快捷启动图标详解
|
10月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
310 19
|
11月前
|
存储 弹性计算 运维
云端问道 7 期实践教学-使用操作系统智能助手 OS Copilot 轻松运维与编程
使用操作系统智能助手 OS Copilot 轻松运维与编程
233 14
|
11月前
|
弹性计算 人工智能 运维
新手训练营——使用操作系统智能助手OS Copilot轻松运维与编程
本文摘自阿里云操作系统团队的林演(林生)关于操作系统智能助手创新产品的分享,围绕“OS Copilot的高效运维与编程”展开,主要包括以下几方面的内容: 1. 行业痛点击及背景 2. 产品与架构 3. 典型应用场景 4. 实验及反馈渠道
283 1
|
11月前
|
人工智能 弹性计算 运维
云端问道7期方案教学-使用操作系统智能助手OS Copilot轻松运维与编程
本文介绍了阿里云基础软件团队推出的操作系统智能助手 OS Copilot,旨在解决 Linux 开发与运维中的痛点。OS Copilot 基于大模型和操作系统领域知识构建,支持自然语言问答、命令辅助执行、系统运维优化及代码生成等功能,极大降低了学习成本和工作量。文章详细阐述了其产品架构、典型应用场景以及实验反馈渠道,帮助用户更高效地进行系统管理和编程。目前该产品处于公测阶段,免费提供给阿里云 ECS 实例和 Alinux 3 系统用户使用。
185 1
|
传感器 机器人 数据处理
ROS 编程入门的介绍
【10月更文挑战第13天】ROS(Robot Operating System)是一种开源的机器人软件框架,广泛用于机器人开发中。通过使用 ROS,开发者可以轻松创建和管理机器人应用程序。在本节中,我们将介绍如何创建一个 ROS 功能包并实现一些基本功能。
719 3