RotorS 分布式通信综合案例

概述

该示例将使用两台虚拟机,分别在两台虚拟机运行一个节点,以完成分布式通信。

现在我们假定其中一台虚拟机为 Sakura ,将运行节点 ctl_center。另外一台为 Haruko ,运行节点 uav。

此外,我们将涉及到两个服务 execute_task 和 /ctl_center/shutdown,两个话题 pics_data 和pics_process_result。

服务 execute_task

该服务由 ctl_center 提供, uav 进行调用。uav 在调用前填写 request 部分,随后发起服务调用。 ctl_center 接收到服务请求后,检查 request 内容,依据 request 内容填写 reponse ,并返回给 uav 节点。

传输的消息为自定义的 Task.srv。request 部分为标识当前 uav 节点是否正常连接到 gazebo 的bool值,response 为飞行路径及任务开始的位置信息。

话题 pics_data

该话题由 uav 发布,ctl_center 订阅。

传输的消息为自定义的 PicsData.msg 。描述 uav 执行任务时获取的图片信息。

话题 pics_process_result

该话题由 ctl_center 发布,uav 订阅。

传输的消息为自定义的 PicsProcessResult.msg 。描述控制中心对接收到的图片数据的处理结果。

uav 节点

  1. 打开gazebo创建无人机实例;

  2. 调用execute_task服务,记录获取的路径path及执行任务的位置task_pos;

  3. 在飞行期间,到达执行任务位置,收集周围数据,将数据通过pics_data话题发布;

  4. 订阅pics_process_result话题以获取数据处理结果;

  5. 当返回起始坐标,并且接收到处理结果之后,调用 /ctl_center/shutdown 服务。

ctl_center 节点

  1. 等待 uav 调用服务 execute_task ,将任务信息作为 response 内容返回;

  2. 创建 /ctl_center/shutdown 服务,等待调用;

  3. 订阅 pics_data 话题以获取图片信息;

  4. 在话题 pics_process_result 发布图片处理结果。

要求

  1. 功能的完整实现;

  2. uav 和 ctl_center 需运行在不同的主机;

  3. 消息文件srv、msg,生成在单独的功能包 uav_msgs;

具体实现

消息创建

该实例的 srv 和 msg 消息都会被创建在两个节点之外一个单独的功能包内。

创建srv文件:Task.srv

uav节点打开gazebo连接成功后将填写request部分,即ready设置为true,并调用服务。

ctl_center接收到服务请求,若ready为true,填写response,将内容返回给uav节点。

创建msg文件:PicsData.msg、PicsProcessResult.msg

PicsData.msg定义了图片相关的内容,由 uav 发布。

PicsProcessResult.msg定义了图片相关的内容,由ctl_center发布。

Notes:srv和msg文件创建的其他相关配置请参见:ROS/Tutorials/CreatingMsgAndSrv - ROS Wiki

创建任务发布、数据处理的节点:ctl_center.cpp

需求

  1. 等待 uav 调用服务 execute_task ,将任务信息作为 response 内容返回;

  2. 订阅 pics_data 话题以获取图片信息;

  3. 在话题 pics_process_result 发布图片处理结果;

分析

在主机 Sakura,在工作空间下,创建新功能包 ctl_center,切换到其 src 目录下,创建 ctl_center.cpp 文件。

接下来将讲述具体的实现内容,关于 ROS 的初始化、 spin() 等基础内容将略过。

对于 ctl_center 的功能实现,并不需要 RotorS的相关内容。

根据需求创建、订阅、发布对应的服务、话题并编写配套的处理函数即可。

ctl_center.cpp 完整源码

Notes

  1. 一定要接收创建服务时的 ros::ServiceServer 对象,因为该服务的生命周期等同于该对象的周期;

  2. ros::Publihser、ros::subscriber 也是如此;

  3. 话题的名称以及命名空间需要注意,否则无法通信;

创建执行任务、数据采集、实战飞行的无人机节点:uav.cpp

需求

  1. 打开gazebo创建无人机实例;

  2. 调用execute_task服务,记录获取的路径path及执行任务的位置task_pos;

  3. 在飞行期间,到达执行任务位置,收集周围数据,将数据通过pics_data话题发布;

  4. 订阅pics_process_result话题以获取数据处理结果。

分析

基于 RotorS 简单案例,添加新增的服务、话题以及配套的回调函数即可。

RotorS 简单示例可参见:https://merlotliu.github.io/2022/07/25/rotors-simulator-usage

uav.cpp 完整源码

遇到错误

创建消息时错误

错误1

分析

自定义消息使用了 geometry_msgs 下的类型

解决

在 CMakelists.txt 中添加 find_package、generate_messages:

编写源码时错误

错误1

解决

CMakelists.txt 中 find_package和catkin_package添加 uav_msgs:

错误2

解决

package.xml 中添加

错误3

分析

AdvertiseService函数调用错误,找到正确的使用方式即可。

解决

这里将泛型去掉即可,服务的回调函数需要有bool返回值。

Reference

  1. http://docs.ros.org/en/api/geometry_msgs/html/msg/Point.html

  2. https://merlotliu.github.io/2022/07/25/rotors-simulator-usage

Last updated