项目链接:GitHub - cabinx/cabin_auv_ws: A simple demo for rov/auv underwater object tracking based on ros

本文主要介绍ROV水下目标跟踪的简易demo软件实现的思路。

一、视觉模块

视觉模块的任务为:通过单目相机识别目标,并计算目标中心位置与图像中心位置的偏差,通过PID控制器得到控制量。demo中得到的控制量可以理解为竖直方向的推力,以及偏航(yaw)方向的转矩。分别实现在图像坐标下y方向和x方向的目标跟踪。

1、单目相机驱动

单目相机接在树莓派的USB接口上,可以选择的ROS工具包很多,只要确保图像以标准的ros图片格式发布即可。我选择的是usb_cam(usb_cam - ROS Wiki)。岸上PC可以直接订阅发布的topic进行目标识别。

在此需要说明的是,单纯采用这种方式,不做压缩处理,图像传输至岸上的PC将会有一定的滞后,对跟踪控制会造成较大影响。由于本demo偏向于验证性质,故我并未采用实时视频传输的算法。

同时,若是AUV的情形,则完全不用考虑视频传输滞后的问题,依靠AUV内部高算力的开发板可以实现图像的实时处理,类似usb_cam的工具包我认为足以满足需求。

2、目标识别模块

目标识别这部分基本上是深度学习那套东西,在此我选择了Yolov3,原因是我发现Yolov3使用还是比较广泛,而且也较容易上手。Yolov3在ros下的开发包为darknet_ros - ROS Wiki。当然对于像我这样的新手来说,还是需要学习一下Yolov3的使用:YOLO: Real-Time Object Detection。安装配置darknet_ros,录制数据集训练模型这部分看情况有时间的话我可能会写点东西,毕竟当初踩了点坑。

usb_cam模块发布标准ros图像的topic,darknet_ros模块订阅该topic,处理后发布目标的bounding_boxes,即目标在图像的位置框图。

当然,在此完全没有必要一定用Yolo的框架,可以自由的选择其他识别算法框架替代。模块化一直是ros开发的优势。

3、目标中心与图像中心偏差计算模块

此模块代码对应cabin_vision/object_deviation.cpp。这部分没什么好介绍的,无非是订阅目标位置框图,计算其中心位置与图像中心位置的偏差,然后发布。

4、PID控制器

此模块代码对应cabin_behaviors/pid_tracking.cpp。这部分也没什么好介绍的,无非是订阅位置偏差,PID处理后发布控制量。在此值得一提的是借助ros的动态配置(dynamic_reconfigure),可以在测试中动态调节PID参参数,非常方便。

二、基础运动模块

基础运动模块的任务为:将总控制量(力、转矩)根据机械结构模型、机器人状态等分配到每个推进器,计算出每个推进器所需提供的推力,然后根据推进器电机模型计算该推进器的PWM波,最后将PWM波通过串口下发至MCU,实现对推进器的控制。基础运动模块实际上是俄亥俄州大学水下机器人队伍的开源项目(官网,github​​​​​​​)进行的二次开发。遗憾的是当时我进行开发的版本不是目前其github上的最新版本。后续我计划再对里面的几个模块进行进一步解析。

1、推力分配矩阵计算模块

此模块代码对应cabin_controllers/thruster_controller.cpp。模块功能是将总的推力、转矩分配到各推进器,得到推进器推力分配矩阵。

在此需要注意的是模块需要非线性优化库ceres-solver(Ceres Solver — A Large Scale Non-linear Optimization Library)。

实际上代码中亦有定深部分代码,需要配合IMU使用。具体大致是根据rov姿态计算当前rov所受的浮力浮心,然后计算抵消该浮力各推进器所需的推力。测试过程中硬件模块并未配置IMU,故我将代码中的定深部分开关关闭了。

2、PWM波矩阵计算模块

此模块代码对应cabin_controllers/pwm_controllers.cpp。这部分的核心只有一个,根据推进器与PWM波的关系曲线,计算推力所需的PWM波。由于俄亥俄州大学水下机器人队伍的项目亦bluerobotics的T200推进器,我可以直接套用相关电机的参数文件。

3、PWM数据波串口下发模块

此模块代码对应cabin_controllers/serial_to_mcu.cpp。将pwm波,水下灯强度按协议(可以自由定义)转成16进制数据流下发至MCU。demo里的协议将来会放到硬件框架介绍的文章中。这部分我借用了ROS里的serial库,sudo apt install ros-<distro>-serial安装即可。但我还是推荐采用源码(serial - ROS Wiki)安装,将serial的源码放到项目里编译调用。因为早前我的电脑已经安装了serial库,所以github的demo里只有库的调用,没有serial库的代码。

4、手动控制模块

此模块代码对应cabin_teleop。这部分代码是手柄控制rov运动的具体实现,为了录制效果更好的数据包进行训练,顺便也写了水下灯亮度的手柄控制。模块借助ROS里的joystick库,我在测试时将其当工具使用,sudo apt-get install ros-<distro>-joystick-drivers即可。但我依旧推荐源码安装(joystick_drivers - ROS Wiki)。实际上这部分也没有什么好介绍的,无非是手柄按键与控制量的映射。在此我需要特别说明一下的是不同型号的手柄按同一按键发出的信息也可能是不同的,这一点要特别注意。比如demo里就有两款手柄,分别是bluerov使用的logicool手柄,以及我本人玩游戏使用的小鸡T4手柄,按键的对应关系需要在头文件中确定。

三、模块分布

软件框架中cabin_controllers/serial_to_mcu以及usb_cam必须运行于机器人本体开发板,因为二者需要开发板的串口或USB口的信息。以本次测试为例,二者均运行于bluerov的树莓派上。实际上,测试中cabin_controllers均运行于此。

软件框架的其余部分既可以运行于岸上PC,也可以运行于机器人本体开发板(算力满足的前提下)。以本次测试为例,树莓派显然无法满足实时处理图像的需求,故将darknet_ros模块运行于岸上PC。实际上测试中cabin_vision、cabin_behaviors、cabin_teleop均运行于此。

最后再放一张测试中整个ros网络的状态图:

基于ROS搭建简易软件框架实现ROV水下目标跟踪(三)--软件框架简述相关推荐

  1. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(一)--简述

    当前,水下领域比较小众,开源的资料比较少.Bluerov作为成熟的产品,结合其开源的优势,经历了多年的技术迭代,在市场上受到极大欢迎.刚接触水下领域时,希望能找到一个比较方便的实验平台,开源的Blue ...

  2. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(补2)--水下slam仿真构想

    这部分内容其实和水下目标跟踪的软件框架没啥联系,但既然上一篇文章提到了水下环境的仿真,结合近期的一点小尝试,也谈谈对水下slam仿真可行性的一些构想. 在水下光学传感器基本上效果非常差.声学设备一方面 ...

  3. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(二)--硬件框架简述

    虽然本系列文章是介绍一个简易的ROV水下目标跟踪demo的软件实现,但软件框架的运行也是需要硬件基础的.鉴于我在这方面不擅长,实际工作也非我完成,由我撰写此部分可能会出现谬误.和完成demo硬件部分的 ...

  4. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(补1)--gazebo仿真

    项目地址:https://github.com/cabinx/cabin_auv_simulation 鉴于水下机器人调试的复杂性,在仿真环境中对水下机器人进行先期调试能降低调试难度,节约大量的时间成 ...

  5. ros 双wan配置_基于ROS搭建简易软件框架实现ROV水下目标跟踪(九)--程序解析之PWM波下发...

    模块对应cabin_controllers/serial_to_mcu.模块实现的功能为监听网络中PWM矩阵信息,将其转换成十六进制数据通过串口下发至MCU,实现对推进器电机的控制.模块数据的串口通信 ...

  6. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(六)--电机模型文件

    项目链接:https://github.com/cabinx/cabin_auv_ws 推进器电机模型文件的内容只有一个:推进器推力与PWM波的映射关系.当我们推算得到某时刻该推进器需要提供的推力时, ...

  7. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(四)--网络配置

    项目链接:https://github.com/cabinx/cabin_auv_ws Demo测试时需要岸上PC与树莓派在同一局域网下运行,二者能进行通信.下水测试时总的设备连接大致如下图. Fat ...

  8. 基于ROS搭建仿真环境——B站苏的一休抓取环境复现

    大佬链接:https://www.bilibili.com/video/BV19f4y1h73E?vd_source=6f2fc443cc3323efe0300c7cb662e8a8 搭建 此功能包在 ...

  9. 软件需求可测试性,软件需求管理与可跟踪性

    软件需求管理与可跟踪性 发表于:2009-09-15来源:作者:点击数: 软件需求管理与可跟踪性 软件需求管理 需求可跟踪性是需求管理的一部分.需求管理还包括处理 测试 需求. 人们需要根据成本评估需 ...

最新文章

  1. 数据倾斜的原因和解决方案
  2. outlook地址薄导入到FOXMAIL
  3. webpack打包的两种方式
  4. java poi doc转docx_Java 插入Word分页符、分节符
  5. GNS3 VoIP Lab (Cisco 3725 and CME 4.3)
  6. STM32官方固件库
  7. sa结构组网方式_卢伟冰为大家科普一番:为啥在NSA与SA组网方式惹争议?
  8. php is_subclass_of,PHP is_subclass_of函数的一个BUG和解决方法
  9. windows下release模式调试某行代码无法中断
  10. 服务器系统能连wi-fi吗,电脑怎么用wifi连接iphone
  11. 《数字电路与逻辑设计》课程教学大纲
  12. nodejs+java+python网上体育用品销售系统
  13. 监控视频平台LiveNVR如何给摄像头视频添加文字水印和图片水印
  14. 荣耀简史:起于抗击小米、止于拯救华为
  15. 教妹学 Java:晦涩难懂的泛型
  16. C#操作Oracle数据库中文乱码 US7ASCII字符集 (解决方案)
  17. 揭秘北京龙泉寺,连清华北大学子都排队出家的神秘科研组织
  18. 将Chrome浏览器网页背景改成豆绿色
  19. mpls 笔记 part 1
  20. 1002 写出这个数 (C语言实现)

热门文章

  1. 如何挑选购买葡萄酒?
  2. 父子组件传值--父组件使用v-model,子组件接收问题?
  3. vim配置(在Ubuntu下)
  4. matlab音乐键盘模拟,Matlab课程设计报告--MATLAB GUI的音乐键盘仿真
  5. WPF中显示GIF动态图
  6. 汇编语言系列Ⅰ 实现各种码制的转换
  7. 诺基亚8.1高配版登陆印度 标配6+128GB存储
  8. 【Linux】磁盘分区常用方案
  9. Linux系统下,对两幅bmp图像进行左右拼接,合成一个bmp图
  10. 【Python】正则表达式