使用ROS2构建无人艇的网络通信系统

  1. 1. 使用ROS2构建网络通信系统(进行中)
    1. 1.1. 0.项目背景
    2. 1.2. 1.objectives
    3. 1.3. 2.系统设计
      1. 1.3.1. 硬件系统结构
      2. 1.3.2. 软件系统结构
        1. 1.3.2.1. GUI结构设计(存在问题)
    4. 1.4. 3.环境的配置

使用ROS2构建网络通信系统(进行中)

喵呼呼o(=•ェ•=)m

0.项目背景

robotx

1.objectives

project objectives:
开发具有自主能力的海上平台(USV & UAV)

personal objectives:
为USV(Unmanned Surface Vehicles)开发网络通信系统,这个系统应该能够允许无人艇各个模块之间进行有线通信以及无人艇和岸上基站之间进行无线通信,并且还需要具有一个人机交互界面(GUI)

2.系统设计

构建这样的网络通信系统,需要同时设计软件和硬件层面的系统结构

硬件系统结构

无人艇各个模块之间的通信系统:

东西还没买回来先拿别人的图凑付一下
如果给感知组,机电组,规划组各一个树莓派来连接他们小组的传感器以及运行他们的代码,那么不可避免的会涉及到多个树莓派与上位机的通信问题,在硬件层面上暂时考虑通过使用网线和交换机进行连接

软件系统结构

无人艇各个模块之间的通信系统:

GUI结构设计(存在问题)

当心哦≧ ﹏ ≦

这个问题一开始看起来很简单,但是越是尝试越发现这个问题不是很好解决,主要的问题是gui需要获得ros2节点发布的信息,但是这样就需要额外的节点订阅ros2节点发布的信息,目前想到了几种方法:

  • 在gui.py也就是gui对应的python文件中启动ros2节点订阅来自ros2节点的topic,这个方法会使得gui的代码变得异常的长,任务需要启动的ros2节点越多,gui文件对应的就要启动等量的ros2节点订阅这些信息,非常的不优雅
  • 第二种方法是利用一个python脚本做连接,这个脚本导入了gui脚本,并且同时能够启动ros2订阅者节点,这样可以保证gui对应的python文件是相对独立的,便于维护
  • 既然可以使用一个单独的脚本做连接,又因为在软件系统中存在数字空间功能包,我就想到可以利用这个功能包。这里先假设这个数字空间功能包实际上负责的是一个数据库文件的修改,我们可以用以下的结构实现 在这个模型中,gui脚本只需要启动一个客户端节点去调用存储在数据库中的内容,而数字空间构建与更新节点则负责所有节点发送的信息的写入(尚未实践)

同时,在具体编写gui相关脚本的时候我还发现,使用前两种方式时,不同节点的启动可能会涉及到冲突的问题,具体原因是涉及到了rclpy客户端的初始化问题(在同时只能初始化一个rclpy)。同时在关闭多个节点时同样存在问题,因为一旦关闭节点就会涉及到rclpy的关闭问题,当在关闭ros2节点同时关闭rclpy,就会导致运行中的ros2节点使用的rclpy也被关闭

3.环境的配置

这个项目使用ubuntu20.04和ros2 foxy版本进行开发