小型AUV控制系统开发笔记[一]基于STM32的消息中继器

2024-02-13 10:50

本文主要是介绍小型AUV控制系统开发笔记[一]基于STM32的消息中继器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从2021-2-9开始到2021-2-25该项目基本完成,写一篇笔记算是记录也是纪念把。
第二句话,要感谢一下@iroek,他DE了程序里的所有BUG。如果说为什么要第二句话,因为如果可以的话他喜欢低调。

先来一张全家福
在这里插入图片描述
在这里插入图片描述

虽然小型AUV的控制算法是由运算能力较强的RK3399芯片完成的,但是在收集传感器数据、编写传感器驱动方面,在运行Linux内核的芯片上写起来不是很方便,于是便有了标题中的基于STM32的消息中继器。

消息中继器主要完成的任务就像他的名字一样,完成消息中继。收集各个外设(传感器)的数据,然后以一定的封包格式通过一种特定的通信方式发送给RK3399。

目前该程序已经基本完成,后续添加设备只需要在现有程序框架下添加相应的代码。

硬件

  1. STM32F103C8T6核心板
  2. P30高度计 官方网站
  3. B30深度计 官方网站

软件

  1. STM32CubeIDE
  2. 串口调试助手

软件基本架构
软件采用HAL库为基础,通过Freertos进行任务调度,实现多个任务的调度。
目前主要有三个任务

  1. rosserial时间同步任务
  2. B30深度计任务
  3. P30高度计任务

下面主要根据上述任务对整个中继器的程序进行介绍

rosserial时间同步任务

该任务是最重要的一个任务,用来与RK3399上的rosserial节点进行时间同步,其依赖于rosserial库,进而其他任务才能将数据发送到rosmaster。在RK3399的ROS环境下可以通过较为简单的方式获取STM32上传感器所publish的数据。
下面主要说明一下该任务在源码中路径以及如何移植。
在这里插入图片描述
除了上述三个文件还有main.c里面涉及任务创建的内容以及ros_lib文件夹中的消息库。

可以在安装有ROS环境的机器(STM32未来要连接的机器)上运行下述命令来生成需要安装的库

rosrun rosserial_arduino make_libraries.py /home
cd home

目录下的ros_lib文件夹就为上图中的ros_lib文件夹。

如果要移植rosserial,说到底需要需要实现如下4个函数

  • int init()
    • init函数主要用来执行硬件的初始化操作
  • uint32_t time()
    • 获取时间戳单位为ms
  • int read()
    • 读取一个字节
  • int write(uint8_t* data, uint16_t length)
    • 写入一定长度的数据

由于使用HAL库,time直接可以由HAL_GetTick()函数获取,read和write和使用的通信方式有关,在使用串口的情况下可以调用串口发送和接收相关的函数。
消息中继器采用的是,开启串口的接受DMA中断,在中断内将每一个字节复制进入环形缓冲区。read函数直接从环形缓冲区内读数据。具体代码可以在STM32ROSSerialDevice.h内找到。

深度计任务

深度计任务主要是通过硬件IIC读取深度计的深度数据,通过rosserial 将其数据发布到相应话题下。
深度计提供了一个官方例程是使用软件IIC的。深度计官方例程

在这里插入图片描述
除了图片上标注的三个文件还有main.c中和其相关的任务代码。

移植深度计库主要是使用HAL库函数

//阻塞
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
//非阻塞
HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);

在使用DMA中断接收数据要慎用HAL_I2C_Master_Receive,该函数内部会关闭所有中断,会导致DMA丢失数据。

PS1:在使用HAL_I2C_Master_Transmit_IT如果手动模拟错误拉低SDA线,会导致单片机宕机。
PS2:高度计库目前没有做硬件平台无关的处理,目前硬件和库还处于耦合状态,未来时间充足,会优化代码。

高度计

高度计任务通过配置P30设备到自动工作状态下,解析数据,将距离和置信度发布到相应话题下。
官方提供一个开源的测试程序ping-viewer 项目地址
消息中继器使用和其相同的数据解析库 ping-cpp 项目地址

在这里插入图片描述
移植P30需要实现

  1. uint8_t init()
    init函数主要用来执行硬件的初始化操作
  2. uint16_t readByte()
    读取一个字节返回
  3. size_t write(uint8_t* data, uint16_t length)
    写入一定数量的数据
  4. uint32_t get_tick()
    获取时间戳,单位为ms

与移植rosserial相似,同样采用环形缓冲区储存数据,利用串口DMA中断接收数据。
PS:目前已知ping-parser存在可能数组越界BUG,该BUG会导致单片机宕机。
在数据部分丢失情况下,恰好包头完整,但后续PAYLOAD_LENGTH丢失,后续数据补位导致,PAYLOAD_LENGTH超过缓冲区大小,在接收数据时并没有做溢出检查,会导致数组越界。

项目Github地址

对于整个AUV控制系统相关的程序,都会在 https://github.com/UWVG开源。
该项目地址在 https://github.com/UWVG/AUV-Message-Relayer

项目里的commit都是原汁原味的,并没有最后统一改成一个,因为那些也是调试BUG的美好记忆,你说对吧。

这篇关于小型AUV控制系统开发笔记[一]基于STM32的消息中继器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705338

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧