rosserial移植到STM32(CUBEMX+HAL库)

2023-05-16

使用cubemx+HAL库将rosserial移植到STM32

    • rosserial的作用
    • 需要实现的功能
    • 移植步骤
    • 我创建的工程
    • 没有积分的可以到github下载

rosserial的作用

使用过ros的话都会了解过ros特殊的通信机制,通过话题的发布和订阅来进行通信。
有时候我们需要从PC端的串口与单片机进行通信,我曾试着直接调用串口与STM32进行数据传输,但是数据非常不好处理,自己定协议也是一个非常麻烦的事情,还经常出现一些奇怪的乱码,如果能在STM32上模仿ros直接发布或订阅话题并能够使用ros的数据类型就好了。
我曾在ros的官网上看到有将rosserial移植到arduino的教程,当移植成功后可以将arduino当成一个节点直接订阅ros通信网络上的话题,也可以直接往ros的通信网络发布话题,但是坑爹的是ros官网没给STM32的移植教程。
网上也有一些大佬用标准库移植过,但写的不明不白,我花了大量精力将大佬的代码看懂并强行移植到HAL库,最后确实能用,但代码看起来非常恶心。直到今天我发现了一种非常简单的移植方法,可以将代码搞得非常漂亮,为了让大家少踩坑,我将移植过程写出来供大家参考。

需要实现的功能

我们从PC端发布一个话题为pc_to_stm32的std_msgs::String类型数据,单片机订阅该话题,并将该数据通过话题stm32_to_pc发布出来。

移植步骤

  1. 首先我们建一个CUBEMX工程
    在这里插入图片描述
  2. 选好你的芯片的型号,我的单片机是F103ZET6
    在这里插入图片描述
  3. 分别配RCC ,SYS,TIM2,USART
    在这里插入图片描述
    在这里插入图片描述
  4. 配时钟树,这里我配64MHZ
    在这里插入图片描述
  5. 配USART波特率,这里我配57600,因为这是serial_node的默认参数,方便,你要是改别的也行,但是serial_node也要改对应了
    在这里插入图片描述
    在这里插入图片描述
  6. 配串口DMA
    在这里插入图片描述
    在这里插入图片描述
  7. 串口中断开启
    在这里插入图片描述
    在这里插入图片描述
  8. 配置工程路径与参数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  9. 点击OK后CUBEMX将生成32的工程,但先别急着打开,先关掉
    在这里插入图片描述
  10. 我们将RosLibs文件夹复制粘贴到我们的工程文件夹下,这个文件夹是arduino移植过程生成的,里面储存的是ROS的各种消息类型,方便我们以后调用的,我们这次移植的目的就是为了能直接调用这些数据类型。这个文件夹可以从我分享的文件获得,或者参考官网的arduino教程获取。
    在这里插入图片描述
  11. 我们在MDK-ARM目录建立三个文件
    在这里插入图片描述
  12. 将刚才加进来的文件添加进32的工程
    在这里插入图片描述
    在这里插入图片描述
  13. 如果成功添加那我们就能从工程看到所添加的文件
    在这里插入图片描述
  14. 由于ros数据类型是以类的方式写好的,属于C++的特性,所以我们的32工程需要进行C与C++的混编,同时我们添加数据类型文件的路径
    在这里插入图片描述
    在这里插入图片描述
  15. 在mainpp.cpp文件创建订阅节点和发布节点,与ros在PC的方式完全一样,mainpp.h文件需要注意添加使用C编译规则编译
    在这里插入图片描述
    在这里插入图片描述
  16. 然后我们在main.c文件调用mainpp.cpp的函数,记住要添加mainpp.cpp的头文件
    在这里插入图片描述
    在这里插入图片描述
  17. 编译后我们可以看到编译是通过的,但是有15个警告,不要慌,这是由于keil对C++的支持不太好,但是不影响我们使用。我们需要将警告屏蔽掉,因为不能让别人以为是由于我们代码写的不好而出现的警告
    在这里插入图片描述
    在这里插入图片描述
  18. 忽略警告后重新编译,又是一段 0 Error(s), 0 Warning(s)的完美代码
    在这里插入图片描述
  19. 我们将代码烧录到单片机并将串口怼到PC测试,看能不能出现我们想要的效果,首先不要忘了提高串口权限,然后运行rosserial节点
    在这里插入图片描述
sudo chmod 777 /dev/ttyUSB0
rosrun rosserial_python serial_node.py
  1. 监听话题 /stm32_to_pc(此时/stm32_to_pc没有任何数据)
    在这里插入图片描述
rostopic echo /stm32_to_pc 
  1. 发布话题 /pc_to_stm32 ,同时我们可以看到STM32通过话题/stm32_to_pc将数据转反回来,到这里就说明我们移植成功了。
    在这里插入图片描述
rostopic pub -r 1 pc_to_stm32 std_msgs/String hello
  1. 通过rqt查看节点我们可以这样理解,节点serial_node作为STM32与ros的桥梁,主要负责数据的转化。
    在这里插入图片描述
  2. 如果移植到STM32别的系列主要改动下面几个地方(以F407ZGT6为例)
    在这里插入图片描述
    24.BUG解决
    由于我用来讲解的单片机是F103ZET6,受限于硬件问题,就是tim2用于计数那个寄存器是16位的,最大值只能到65535,我们用了它的数据作为rosserial协议的时间戳的数据源,当计数超出65535时候就会溢出,这导致了我们的时间戳匹配不上,从而会重新连接,并报出Unable to sync with device; possible link problem or link software version mismatch such as hydro rosserial_python with groovy Arduino这个错误,你们会发现没10秒左右就出重新连接一次就是这个原因,但是这并不影响实际的通信效果,只是非常恶心罢了,如果你用了别的型号的单片机,你可以检查一下这个寄存器的容量,有的是32位的,比如F407ZGT6就是32位的,根据下图修改就可以修复这个小bug了
    在这里插入图片描述

我创建的工程

rosserial

没有积分的可以到github下载

github下载地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rosserial移植到STM32(CUBEMX+HAL库) 的相关文章

  • c/c++math.h标准库

    math h数学函数 这个库中所有可用的函数取double参数并返回double的结果 abs 绝对值 acos 反余弦 acosh 反双曲余弦 asin 反正弦 asinh 反双曲正弦 atan2 两个参数的反正切 atan 反正切 at
  • Linux Simulink打不开——unable to run the MATLABWindow application on Linux

    Linux Simulink打不开 unable to run the MATLABWindow application on Linux 解决办法 xff1a 解决办法 xff1a 参考网页 xff1a https www mathwor
  • RTX移植STM32F103,超详细~

    目录 RTX移植前言移植1 创建工程2 配置工程3 添加LED文件4 编写测试代码5 编译烧录 RTX移植 往期回顾 为什么需要RTOS 前言 keil RTX是一款应用广泛的嵌入式RTOS xff0c 具体可见官网 为什么需要RTOS x
  • 基于28035的ePWM触发ADC采样设计

    目录 前言实验目的实验要求硬件电路实验步骤代码解释实验结果总结体会 前言 玖道最近在做一个开关电源项目 xff0c 需要用到TI 的TMS320F28035 芯片 xff0c 实现控制电路的设计 简单来说就是利用28035采集信号量 xff
  • 浅析DSP28035的看门狗模块

    目录 背景工作原理结构与寄存器代码实验结果总结 背景 嵌入式系统通常会使用DSP来实现控制功能 xff0c 比如开关电源的数字控制 试想如果DSP中程序出现Bug 崩溃 跑飞了怎么办 xff1f 如果不及时处理 xff0c 这对整个嵌入式系
  • 浅析TMS320F28035的GPIO模块

    目录 GPIO简介硬件电路软件代码总结 通用输入输出端口 General Purpose Input Output GPIO 几乎是学习包括DSP xff0c 单片机在内的微处理器的第一步 GPIO的功能包括基本的输入 xff0c 输出 x
  • Ubuntu 20.04下配置 HAL 汇编开发环境教程

    目录 安装解压配置环境变量测试 案例 安装 环境 xff1a Ubuntu 20 04 安装包 xff1a linux64 hla tar gz 这里安装的是64位的 xff0c 具体与linux hla tar gz有什么不同 xff0c
  • 为什么单片机需要时钟系统,时钟信号在单片机中扮演怎样的角色?

    现在想想 xff0c 我自学单片机都快一年了 我自学过8051 msp430和STM32 xff0c 做一些基本的小项目 xff0c 参加过2018年江苏省电子设计大赛 xff0c 还获得了一等奖 我懂 xff0c 也不懂单片机 不懂就要去
  • Spring Security OAuth2.0认证授权学习与使用~(更新中)

    Spring Security OAuth2 0认证授权学习与使用 1 1 什么是认证1 1 1 系统为什么要认证 xff1f 1 1 2 认证 1 2 什么是会话 xff1f 1 2 1 会话1 2 2 基于Session的认证方式如下图
  • Altium中PCB上走线镀锡的方法

    Altium中PCB上走线镀锡的方法 PCB设计时 有时候需要在不增加PCB走线宽度的情况下提高该走线通过大电流的能力 载流能力 通常的方法是给该导线镀锡 或者上锡 下面以在PCB顶层走线镀锡为例 使用AD09软件 简单介绍如何走线上锡处理
  • Arduino成长日记2 - Arduino编程基础

    上一篇讲述了什么是Arduino以及各类Arduino开发板的参数 xff0c 本篇开始介绍开发环境搭建以及一些编程基础 Arduino开发环境 开发环境即Arduino项目的编程环境 Arduino IDE xff0c Arduino集成
  • 通过QGC应用TFmini Plus

    TFmini QGC中所需设置参数 xff1a EKF2 RNG AID enable EKF2 RNG MODE Range sensor SENS TFMINI CFG TELEM SERIAL 4 最后一个参数如何确定是哪一通道 xf
  • C语言格式化字符串漏洞实验

    格式化字符串漏洞实验 在线实验环境 xff1a 格式化字符串漏洞实验 文章转载自 xff1a https github com shiyanlou seedlab blob master formatstring md 一 实验描述 格式化
  • C语言Socket编程(TCP与UDP)

    C语言Socket编程 xff08 TCP与UDP xff09 UDP xff1a span class token comment udp server c span span class token macro property spa
  • ubuntu 换源深层次解析

    换源也是一个容易出错的问题 xff0c 本文以树莓派为例展开 xff0c x86也是一样的操作 那么假设成立的话 xff0c 就要记住我们是在树莓派 xff08 arm xff09 上安装的ubuntu xff0c 不是X86 xff0c
  • 1运动规划概述

    Motion planning autonomous robot 总结一下什么是自主机器人 xff1a 首先我们需要状态估计 xff08 定位 xff09 xff1b 基于此 xff0c 利用传感器融合人建立一个周围环境的三维地图 xff1
  • 5轨迹生成

    文章目录 Introduction全局与局部方法全局与局部对比 轨迹生成T xff08 what xff09 为什么需要平滑轨迹呢Y why W how 微分平坦 xff08 Differential Flatness xff09 TQua
  • java--通过JNI调用动态链接库(dll、so、dylib)

    公司项目需要用到第三方qt插件 xff0c 由于业务是偏底层的 xff0c 基本上用不到jar包 xff0c 因此只能通过jni的方式调用 没学过c 43 43 xff0c 十多天的摸爬滚打一路过来不容易啊 xff01 今天总算跑通了 网上
  • 在头文件实现函数的重定义问题

    例如一个头文件headfile h这样写 pragma once bool Func return true 在这个头文件被多个地方包含的时候就会出问题 xff0c 链接时报错 FuncB报重定义 fatal error LNK1169 找
  • 数字电路基础知识系列(六)之LC滤波器的基础知识

    针对设计过程的问题 xff0c 如有疑问 xff0c 欢迎留言讨论 xff01 点我返回目录 LC滤波器 xff0c 是指将电感 L 与电容器 进行组合设计构成的滤波电路 xff0c 可去除或通过特定频率的无源器件 电容器具有隔直流通交流

随机推荐

  • I-002 智能家居系列--ESP8266环境搭建

    智能家居系列 1 NodeMCU简介2 硬件介绍3 开发工具的选择3 1 软件介绍3 2 环境搭建 4 测试代码5 后续会更新这边文章 1 NodeMCU简介 NodeMCU简介 NodeMCU 是一个开源的 物联网 平台 它使用 Lua
  • I-000 智能家居系列--需求梳理

    智能家居系列 1 智能家居2 系统框架3 组成部分4 开发思路5 当前的进展 1 智能家居 智能家居的目的旨在提高人们的生活水平 xff0c 确保人们的生活更加舒适 2 系统框架 下图只是初版 xff0c 在具体的开发过程中 xff0c 会
  • Cartographer(二)使用思岚rplidar雷达进行cartographer建图

    一 修改launch文件和lua配置文件 xff08 1 xff09 修改revo lds lua 到目录下 xff0c 打开文件 home meng xx catographer ws src cartographer ros carto
  • 数字电路硬件设计系列(三)之缓启电路设计

    针对设计过程中的问题 xff0c 如有疑问 xff0c 欢迎留言评论 xff01 点我返回目录 1 简介 在一些大电压 大电流的产品中 xff0c 上电的瞬间通常会有较大的电流冲击 xff0c 下图是一款产品上电过程中波形 最大的电流达到1
  • 数字电路硬件设计系列(十)之RS485电路设计

    针对设计过程中的问题 xff0c 如有疑问 xff0c 欢迎留言评论 xff01 点我返回目录 1 简介 RS485通信属于串口通信中的半双工通信 xff0c RS485具有支持多节点 xff08 32个节点 xff09 传输距离远 xff
  • 数字电路硬件设计系列(五)之AT89C51/C52最小系统设计

    针对设计过程中的问题 xff0c 如有疑问 xff0c 欢迎留言评论 xff01 点我返回目录 1 简介 AT89C51 C52是指两个系列的产品 xff0c 具体包含AT89C51 AT89C52 xff0c 但是最小系统的组成基本上相差
  • 1.18 接地设计问题(非常实用)

    目录 1 简介 2 接地的分类 3 接地的目的 3 1 对地阻抗低 3 2 地平面稳定 3 3 对地均衡 4 共地耦合干扰 5 常用的基地方式 6 安全地 防雷击浪涌接地的接法 1 简介 在电路设计的过程中 xff0c 接地是一个老生常谈的
  • 1.0 硬件设计基础(面试题)

    1 滤波磁珠和滤波电感的区别 磁珠由导线穿过铁氧体组成 xff0c 直流电阻很小 xff0c 在低频时阻抗也很小 xff0c 对直流信号几乎没有影响 在高频 xff08 几十兆赫兹以上 xff09 时磁珠阻抗比较大 xff0c 高频电磁场在
  • 1.19 旁路电容与去耦电容

    1 简介 旁路电容和旁路电容是电路设计过程中十分常见 xff0c 但是很多应将工程师都没有真正区分这两者的功能 xff0c 我们先来看看这两个单词在英文中的意思 xff1a 电容英文中文解释旁路电容Bypass抄近道去耦电容couple是一
  • vins运行1

    vins fusion 运行笔记 安装code utils 1 fatal error elfutils libdw h 没有那个文件或目录 没有安装 sudo apt get install libdw dev 2 fatal error
  • 四旋翼无人机汇报

    我主要负责的是四旋翼无人机的组装和飞控参数的调试 遇到的问题 当初焊接时由于时间紧张用的是比较细的焊条 xff0c 虽然焊接成功 xff0c 但是导致了后续插拔导线时容易接触不良 xff0c 后来在焊点处重新焊接 由于未在地面站软件中修改无
  • 载波相位差分定位

    x1f30e 我接触差分定位是通过暑期在南京北斗一段时间的实习 x1f30e 我把 Lambda算法的zip和rar上传到了这里 x1f30e https wwi lanzoui com b01bp70yj x1f30e 再推荐一个gith
  • nRF SPI 与 TWI 操作相关 (BMI088 与 MLX90614 举例)

    SPI0 与 TWI0 的 ID相同 xff0c SPI0 与 TWI0 的 ID相同 编译时有报错 若要避免 xff0c 有两个方法 1 使用不同ID外设 2 使用模拟SPI或模拟IIC nRF SPI 初始化 sdk config h
  • ros(13):ros找不到包报错及解决办法--Config.cmake

    目录 一 基础包 1 1 rospy包 1 2 tf包 1 3 grid map包 1 4 serial 二 专有包 2 1 dynamic reconfigure包 2 2 rosparam handler包 2 3 qt build包
  • stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面升级

    stm32 esp8266 ota系列文章 xff1a stm32 esp8266 ota 快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级 tcp模拟http stm32 esp8266 o
  • win系统C++的udp通信(接收并发送)详细教程、win下inet_pton和inet_ntop无法使用解决方法

    对UDP编程0基础的可以参考这篇记录博文 我做的是同一个程序中接收指定IP地址和端口号的信息作为输入 xff0c 通过程序的算法进行处理 xff0c 处理后的信息再通过另一个指定IP地址和端口号进行发送 也就是需要做两个udp一个接收数据
  • postman下载与汉化(附直接下载链接)

    想用英文版本的可以直接点击如下链接下载最新版本 官网最新版本 无法汉化 xff1a Download Postman Get Started for Free 如果想要汉化的就不能使用最新版本 xff0c 因为最新版本没有汉化包可以用 汉化
  • Qt 自定义流程图 diagram

    Qt 自定义流程图 diagram 前言程序执行效果程序源码下载图形视图框架成员介绍重写QGraphicsItem程序源码介绍重点代码 前言 本文将对QGraphicsScene QGraphicsView QGraphicsItem这三个
  • 用C语言实现简单的HTTP数据请求

    我的博客 xff1a https blog csdn net qq 37388044我的知乎 xff1a https www zhihu com people bbtganmin联系方式 xff1a 知乎私信 转载或者引用本文内容请注明来源
  • rosserial移植到STM32(CUBEMX+HAL库)

    使用cubemx 43 HAL库将rosserial移植到STM32 rosserial的作用需要实现的功能移植步骤我创建的工程没有积分的可以到github下载 rosserial的作用 使用过ros的话都会了解过ros特殊的通信机制 xf