在STM32上运行ROS节点——rosserial&stm32开发及调试方法

2023-05-16

近期接手了一些ROS机器人项目,这里将开发中遇到的问题和解决方法记录下来。
stm32强大的外设资源为机器人底层设备控制带来了极大的便利,本文简述借助rosserial项目在stm32中运行ROS节点的方法。

基本原理

ref: http://wiki.ros.org/rosserial
简言之,rosserial通过串口建立嵌入式板卡和ros master的通信,使得在嵌入式板卡上编写、运行ros节点成为可能,主要用于转接IO和各类传感器,运行底层控制算法。
要使用rosserial,需要分别在嵌入式板卡和主控PC上进行安装,rosserial项目当前支持的板卡有:
在这里插入图片描述

安装

由前所述,需要分别在服务端和嵌入式端安装rosserial:

服务端(PC,树莓派等)rosserial的安装

执行

sudo apt-get install ros-melodic-rosserial
sudo apt-get install ros-melodic-rosserial-arduino

随后将rosserial_stm32 库clone到catkin_ws/src目录,这些软件包提供转发功能

嵌入式端rosserial的安装和配置(stm32模板工程的建立)

rosserial在嵌入式端的文件有两部分,第一部分是固件STM32Hardware.h和ros.h,这头两个文件提供硬件底层串口的实现和ROS协议的解析,第二部分是ros头文件,这些文件和在ROS PC端调用的并无区别,官方提供了一个脚本来自动生成这些头文件,使用时只需拷入stm32的工程目录即可。
因此,嵌入式端rosserial安装的关键在于要根据具体硬件的修改STM32Hardware.h和ros.h,使得rosserial能够调用嵌入式板卡的串口。rosserial官方已经提供修改好的固件及样板工程:
https://github.com/yoneken/rosserial_stm32
这个工程基于stm32 HAL库,并通过cubeMX工具进行配置。

接下来我们在官方文件的基础上,在STM32CubeIDE1.4.0上建立新工程。
注:关于STM32CubeIDE:近几年,ST公司将STM32CubeMX进一步升级,集成到全新的STM32CubeIDE中,STM32CubeIDE是基于Eclipse开发的集成开发环境。

如下是两个关于cubeMX工具和HAL库的教程,本文不再赘述:
http://www.mculover666.cn/posts/578764034/
https://www.waveshare.net/study/portal.php?mod=list&catid=40

此外,STM32CubeIDE默认的代码提示功能的触发条件比较严苛,可参考此处的方法调整STM32CubeIDE的代码补全策略,提高开发效率。

下面开始建立stm32工程:Ref: https://blog.csdn.net/qq_37416258/article/details/84844051
事实上,我们只需要开启并配置串口2即可,rosserial提供的固件使用串口2实现rosserial通信接口,注意开启串口DMA和中断。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:上面引用的博客中,开启TIM2是没有必要的,后半部分也有过时的地方,如头文件的修改。
串口配置搞定后,我们进一步生成ros头文件并添加到stm32工程中,这些头文件用于提供对自定义消息、ros标准消息的支持:
在服务端执行:

rosrun rosserial_stm32 make_libraries.py .

这将在当前目录生成Inc/文件夹,里面包含需所有头文件,将这些文件拷贝到工程即可,本文模板工程中放置于RosLibs文件夹
注意,当PC端添加新包后,需再次执行以更新这些头文件
之后,在工程中建立User文件夹,将mainpp.h,mainpp.cpp拷入,后续自行编写的节点逻辑在此存放。最后,在工程main.c中调用即可。这里同时存在mainpp 和 main 两个“入口”的目的是方便C/C++混合编译。
最后的最后,设置工程的查找路径:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:这里截图中使用了绝对路径,后续已修正为相对路径

模板工程下载

链接: https://pan.baidu.com/s/1SNI_tKaFUS6zXoIS0GWRCw 提取码: exq5

ROS节点编写

Ref: https://sudonull.com/post/31955-Rosserial-STM32
官方例程:
https://github.com/yoneken/rosserial_stm32/tree/master/src/ros_lib/examples
为控制节点发送频率,我们借助cubeMX默认开启的sysTick定时器实现频率控制。
Ref: http://www.mculover666.cn/posts/4283984198/

节点的逻辑在mainpp.c中实现,其中setup()函数放置初始化工作,loop()中编写周期性消息发送指令,如:

void loop(void)
{
    if (nh.connected()){
        if(HAL_GetTick() - tickstart >= 10){
            // 翻转LED,发布chatter消息,周期1000ms
            HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_3);
            str_msg.data = hello;
            chatter.publish(&str_msg);
            tickstart=HAL_GetTick();
        }
    }
    nh.spinOnce();
}

联合调试

首先在PC端给权限,USB串口插上后,通常挂载在/dev/ttyUSB0,需要线给下777权限:
sudo chmod 777 /dev/ttyUSB0
也可直接添加用户组,一劳永逸:
https://blog.csdn.net/qq_32618327/article/details/106222196
启动服务端桥接节点:

rosrun rosserial_python serial_node.py

随后借助rqt_graph工具,可看到rosserial已经建立stm32节点和ros master的通讯。

rosserial错误处理

开发ros srv时ERROR: service [/topic] responded with an error: service cannot process request: service handler returned None错误的处理方法

https://github.com/ros-drivers/rosserial/pull/414
where you find working ServiceClient.py (https://github.com/ros-drivers/rosserial/releases/tag/0.7.7)
don’t forget to update the Arduino ros_lib after step 8
Step 8.1 Delete Arduino/libraries/ros_lib
Step 8.2 Install ros_lib again (https://wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20IDE%20Setup)
Step 8.3 Make Headers agian (https://wiki.ros.org/rosserial_arduino/Tutorials/Adding%20Custom%20Messages)
Step 8.4 Restart Arduino IDE( If it was Open)
Step 9
即:将现有ServiceClient.py替换为更老版本的,当前版本库的ServiceClient.py存在Bug

tried to publish before configured topic id 125错误的解决

扩大预设缓冲区,原为512
在这里插入图片描述
在这里插入图片描述

Printf打印浮点的方法

在这里插入图片描述

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

在STM32上运行ROS节点——rosserial&stm32开发及调试方法 的相关文章

  • nginx服务占用百分之百

    一 当nginx达到100 时 xff0c 也就是服务器负载突然上升 1 利用top命令查看cpu使用率较高的php cgi进程 PID USER PR NI VIRT RES SHR S CPU MEM TIME 43 COMMAND 1
  • Gazebo教程(使用roslaunch 启动Gazebo,world以及urdf模型)

    Gazebo教程 xff08 使用roslaunch 启动Gazebo xff0c world以及urdf模型 xff09 关于如何学习ROS可以参考古月居的这篇文章 1 https www zhihu com question 35788
  • dispatch_queue_create---创建队列

    dispatch queue create span class hljs keyword const span span class hljs keyword char span label dispatch queue attr t a
  • Java多种方式解决生产者消费者问题(十分详细)

    一 问题描述 生产者消费者问题 xff08 Producer consumer problem xff09 xff0c 也称有限缓冲问题 xff08 Bounded buffer problem xff09 xff0c 是一个多线程同步问题
  • Http协议WWW-Authenticate

    HTTP协议有一个叫WWW Authenticate的头字段 xff0c 可以用于实现登录验证 它是在RFC 2617中定义的 当服务器接收到一个request xff0c 并在实现下面的代码 xff1a br http response
  • Android 运行时注解

    编译时注解点击此处 xff5e xff5e xff5e 运行时注解 以 64 BindView 为例 下面是实现步骤 新建一个 apt annotation 的 java library xff0c 然后在库中新建一个注解 xff0c 传入
  • 使用k-近邻算法识别手写数字。

    在之前的文章中介绍了k 近邻算法的原理知识并且用Python实现了一个分类器 xff0c 而且完成了一个简单的优化约会网站配对效果的实例 在 机器学习实战 中有关kNN的后一部分内容就是一个手写识别系统 xff0c 可以识别手写的0 9的数
  • 在Ubuntu14.04不能添加PPA源到apt源的问题解决方法

    在Ubuntu14 04使用apt get 更新Git 时 xff0c 需要更新apt源 xff0c 添加一个带有最新Git的源 xff0c 如下命令 xff1a sudo add apt repository ppa git core p
  • 单片机的操作本质【以STM32系列为例】

    单片机的操作本质 摘要寄存器的本质单片机的操作本质操作寄存器的方法 摘要 本文档是笔者学习野火F103视频 课时5 至 课时7 的总结 视频链接 xff1a https study 163 com course introduction 1
  • 《视觉SLAM进阶:从零开始手写VIO》第一讲作业

    目录 1 视觉与IMU融合之后有何优势 xff1f 2 有哪些常见的视觉 43 IMU融合方案 xff1f 有没有工业界应用的例子 xff1f 3 在学术界 xff0c VIO研究有哪些新进展 xff1f 有没有将学习方法应用到VIO的例子
  • GPS坐标与UTM坐标的转换

    1 简介 1 1 消息 gps common定义了两个通用消息 xff0c 供GPS驱动程序输出 xff1a gps common GPSFix和gps common GPSStatus 在大多数情况下 xff0c 这些消息应同时发布 xf
  • NVIDIA Jetson TX2使用笔记(一):开机设置

    0 写在前面 由于项目需要 xff0c 使用 NVIDIA Jetson TX2作为硬件开发平台 xff0c 在此记录使用方法和遇到的问题 NVIDIA Jetson TX2是英伟达的嵌入式开发套件 xff0c 可以进行视觉计算 xff0c
  • ORB-SLAM2的安装与运行

    0 背景简介 ORB SLAM是西班牙Zaragoza大学的Raul Mur Artal编写的视觉SLAM系统 他的论文 ORB SLAM a versatile andaccurate monocular SLAM system 34 发
  • Ubuntu14.04升级cmake版本的方法

    在Ubuntu14 04用以下命令默认安装的cmake版本为2 8 x xff0c 有时我们需要更高版本的cmake xff0c 所以需要升级 span class hljs built in sudo span apt get insta
  • 在TX2上配置ORB-SLAM2错误总结

    Pangolin 错误描述 usr lib gcc aarch64 linux gnu 5 aarch64 linux gnu libGL so undefined reference to 96 drmFreeDevice 解决方法 cd
  • docker镜像迁移/移植

    docker镜像迁移 移植 或者docker save 镜像名 版本号 o 路径 保存的包名 tar 通过这两个命令保存保存镜像 xff0c 下载到本地再上传到其他服务器 然后通过docker load lt 保存的包名 tar 完成镜像移
  • 安装并运行VINS-Mono

    0 A Robust and Versatile Monocular Visual Inertial State Estimator VINS Mono是单目视觉惯性系统的实时SLAM框架 它使用基于优化的滑动窗口配方来提供高精度的视觉惯性
  • 使用小觅双目-惯性相机运行VINS-Mono

    步骤 1 下载相机驱动MYNT EYE SDK 2 xff0c 然后make ros xff08 注意 xff1a 前面的Ubuntu安装也要操作 xff09 xff1b 2 安装VINS Mono xff1b 3 在MYNT EYE VI
  • 在TX2上安装VIINS-Mono——问题总结

    1 ceres solver 我们一般通过以下命令安装Eigen xff1a sudo apt get install libeigen3 dev 默认安装在 usr include eigen3 在CMakeList txt中一般用以下语
  • LeGO-LOAM初探:原理,安装和测试

    前言 最近要搞3D激光SLAM xff0c 先后测试了Autoware xff0c cartographer xff0c loam和LeGO LOAM 今天就带来LeGO LOAM的使用体验 Github xff1a https githu

随机推荐

  • IMU噪声标定——加速度计和陀螺仪的白噪声和零偏不稳定性

    前言 imu utils是一个用于分析IMU性能的ROS工具包 参考资料 Allan Variance Noise Analysis for Gyroscopesvectornav gyroscopeAn introduction to i
  • TF坐标变换

    文章目录 TF坐标变换TF功能包TF工具乌龟例程中的TF创建TF广播器创建TF监听器实现乌龟跟随运动 存在的问题总结参考 TF坐标变换 坐标变换是机器人学中一个非常基础 xff0c 同时也是非常重要的概念 机器人本体和机器人的工作环境中往往
  • Linux下目录文件的操作(opendir,readdir,closedir) 以及DIR,dirent,stat等结构体详解

    From http blog chinaunix net uid 27213819 id 3810699 html 注 xff1a 为什么要说 目录文件 xff1f 其实在linux中 目录也是一种 文件 xff0c 只是它的内容是上级的
  • 堆栈的工作原理

    声明 xff1a 以下均为个人收集的一些资料 xff0c 非原创 每一个使用c语言的都应该知道栈的重要性 xff0c 我们能够使用C C 43 43 语言写出诸多复杂的程序 xff0c 很大功劳一部分有归于栈的实现 xff0c 因为它可以帮
  • RTK+GPS提高定位精度原理解析(一个小白写给另一个小白系列)

    RTK 43 GPS提高定位精度原理解析 xff08 一个小白写给另一个小白系列 xff09 GPS定位原理回顾RTK基本概念RTK组成RTK传输差分示意RTK数据链接坐标转换RTK应用后记 我们在上一篇文章导航定位系统的原理解析 xff0
  • Python 嵌套函数中内部函数引用外部函数循环变量情况

    Python 嵌套函数中内部函数引用外部函数循环变量情况 Python中的嵌套函数也称为闭包 xff08 Closure xff09 有一个特点就是内部函数可以引用外部函数内的变量并且在外部函数返回后保存该引用变量的值 xff1b 但是如果
  • Git查看版本改动—— git diff

    HEAD 表示当前版本 xff0c 也就是最新的提交 上一个版本就是 HEAD xff0c 上上一个版本就是 HEAD xff0c 往上100个版本写100个 比较容易数不过来 xff0c 所以写成 HEAD 100 HEAD 2 相当于
  • PyQt5编程-鼠标事件

    处理鼠标事件的频率不低于键盘事件 包括按下 松开鼠标按键 xff1b 移动鼠标到特定区域或离开特定区域 xff1b 更改鼠标指针的形状 xff0c 等等 1 按下 松开鼠标按键 按下并释放鼠标按钮时 xff0c 将调用以下方法 xff1a
  • latex 正文设置为双栏,图片如何占两栏

    xff08 1 xff09 插入一栏图片时 xff0c 使用的是 xff1a begin figure end figure 96 xff08 2 xff09 插入双栏图片时 xff0c 需在figure的上标中加入星号 begin fig
  • VIO松耦合和紧耦合对比

    松耦合 xff08 结果级融合 xff09 xff1a 两个独立的运动估计过程中分别处理视觉和惯性测量的信息 xff0c 最终将他们的输出 xff08 位置和姿态 xff09 融合作为结果 紧耦合 xff08 特征级融合 xff09 xff
  • zed2相机运行VINS-mono

    zed2相机标定请参考专栏前面博文 xff01 一 zed2相机运行VINS mono 1 下载VINS mono mkdir p vins ws src cd vins ws src git clone https github com
  • C语言指针笔试题

    1 我们先来看第一段代码和它的输出 span class token keyword int span span class token function main span span class token punctuation spa
  • Gazebo 官网教程学习笔记--Model Editor

    终端打开Gazebo Gui 界面 然后快捷键CTRL 43 M 打开 Model Editor xff0c 或者在edit 下选择model editor 界面如下 1 工具栏 包含用于编辑模型的工具 2 调色板 也称为左面板 有两个选项
  • 《大厂算法面试》小书

    算法面试是大多数小伙伴的弱势 xff0c 但是大厂几乎都会考算法 xff0c 如果在面试过程中不刻意准备一下算法 xff0c 很大概率被挂 其实对于前端和移动端来说 xff0c 算法要求的并不是很高 xff0c 只要把一些常见的算法题刷完
  • ROS通信架构上——Topic和Msg

    Topic 异步通信方式 Node间通过publish subscribe机制通信 相关的命令 xff1a rostopic rostopic list 列出当前所有topicrostopic info topic name 显示某个top
  • Type-C显示器是什么,Type-C显示器的5大优势

    在显示器领域内 xff0c USB Type C接口还处于发展阶段 xff0c 目前已经在新推出的一些高端显示器和旗舰显示器中有配置 USB Type C接口的出现 xff0c 将会形成以显示器为核心的桌面解决方案 xff0c 用户可以把任
  • SLAM综述

    SLAM综述 前言一 概述二 Lidar SLAM激光雷达传感器激光雷达SLAM系统 xff08 Lidar SLAM System xff09 2D SLAM3D SLAM深度学习与激光雷达Feature amp Detection xf
  • VisionPro使用 C# 开发

    VisionPro 常用控件的说明 工具设置窗体 CogPMAlignEditV2 模版匹配设置窗体控件 CogPMAlignEditV2 Subject 工具关联对象 如 xff1a CogPMAlignEditV2 Subject 61
  • rosdep update 失败及解决办法

    一 问题 reading in sources list data from etc ros rosdep sources list d Hit https raw githubusercontent com ros rosdistro m
  • 在STM32上运行ROS节点——rosserial&stm32开发及调试方法

    近期接手了一些ROS机器人项目 xff0c 这里将开发中遇到的问题和解决方法记录下来 stm32强大的外设资源为机器人底层设备控制带来了极大的便利 xff0c 本文简述借助rosserial项目在stm32中运行ROS节点的方法 基本原理