ROS学习笔记之七:ROSSerial初试

STM32 接入 ROS1 的 rosserial 实战记录(存量项目适用) 本文摘要(149字): 针对ROS1存量项目的STM32集成方案,介绍了基于rosserial的通信实现方法。主要内容包括:1)生成STM32可用的ROS消息和服务头文件;2)在MDK工程中配置C/C++混合编译环境;3)通过FreeRTOS任务实现ROS节点功能。特别指出该方案适用于维护已有ROS1系统,而新项目建议采用ROS2+micro-ROS架构。文中详细说明了移植过程中的关键技术点,如Python脚本修改、消息回调处理等,并提供了完整的代码实现示例,帮助开发者在资源受限的STM32平台上实现与RO 阅读详情

总体来说,ROS更偏重软件,其涉及的控制、算法都是偏策略或复杂的,但机器人是要和现实世界打交道的,必须有相应的执行机构,使ROS所能做的那些“高、大、上”的工作落地。真正能够和执行硬件打交道、操控起来得心应手的还是MCU,所以如何将MCU控制的硬件和ROS系统相连,可以基于ROS的信息交互机制实现控制和反馈,是学习ROS、基于ROS完成一些任务必须首先化解的问题。

很早我就做了一个4轮全向小车平台,可以将笔记本放置在上面,作为上位机,设计了一个STM32的控制板,驱动4个舵机和4个轮式驱动单元(带反馈的直流电机),通过串口即可控制小车运转:


 

当时就想在笔记本上运行ROS,控制小车运动,相当于那个经典的ROS底盘。可一直没有沉下心来实现ROSSerial,惭愧!希望这次可以借此顺势完成^_^

先从简单的做起吧!

上一篇做了一个STM32的Arduino控制板,并且成功替换了原来的Arduino Nano控制板,将原来的程序移植到STM32平台上,实现了原有的功能。编译后发现资源还富裕很多,在上面应该可以做很多文章,比如PID转速控制;原来那个基于Mega328的Nano有点勉强,不光是资源问题,对AVR的底层也太不熟悉,完全基于Arduino库有点困难。

不过这个先放一下,重点是打通和ROS的通讯,将ROSSerial功能用起来。

ROS的官方教学示例都是以虚拟的小海龟为控制对象,消息、服务均是以控制小海龟作为示例。但小海龟毕竟是虚拟的,而Robot对于很多人而言,是现实存在的。

所以,第一步打算用前文所述的那个小车作为实体的小海龟,尝试一下,可否通过ROS消息控制这个现实世界的小海龟。

作为测试,将geometry_msgs/Twist 中的 linear X 作为 PWM,angular Z 作为舵机转角,每次收到消息走 3 秒。

以上一篇的程序为基础,修改了以下几个部分:

…….

#include<ros.h>      // 190519

#include<geometry_msgs/Twist.h>   // 190519

…….

//-----------190519 ---------------

boolean                           g_bReceived_Msgs;

int                                    gc_iRunTimeCnt;

ros::NodeHandle  nh;

//------------- 190519 ----------------

voidoneWheel_cb( const geometry_msgs::Twist& cmd_msg)

{

  int temp;

  if(cmd_msg.linear.x == 0.0)

  {

       g_ucPara1= BRAKE;

       g_ucPara2= 0;

  }

  else

  {

          if(cmd_msg.linear.x > 0.0)

          {

               g_ucPara1 = FORWARD;

               g_ucPara2 =byte(cmd_msg.linear.x);

          }

          else

          {

               g_ucPara1 = BACKWARD;

               g_ucPara2 = byte(0 -cmd_msg.linear.x);

          }

         }

  temp = int(cmd_msg.angular.z);

         if(temp <0)

         {

          temp = 0;

         }

         if(temp >180)

         {

                   temp = 180;

         }       

         g_ucServoVal = byte(temp);

         g_bReceived_Msgs = true;

         gc_iRunTimeCnt = 3000;

         digitalWrite(LED_BUILTIN, HIGH);  // led 

}

 

ros::Subscriber<geometry_msgs::Twist>sub("turtle_cmd_Vel", oneWheel_cb);

…….

voidsetup()

{

 ………..

  nh.initNode();

  nh.subscribe(sub);

}

voidloop()

{

  ……

      nh.spinOnce();       // 190519

    if(g_bReceived_Msgs)

    {

             g_bReceived_Msgs= false;

             driveMotor(g_ucPara1,g_ucPara2);

             myServo.writeMicroseconds(correctServo(g_ucServoVal));

    }

    if(gc_iRunTimeCnt!=0)

    {

             gc_iRunTimeCnt--;

             if(gc_iRunTimeCnt==0)

             {

                       driveMotor(BRAKE,0);

                       digitalWrite(LED_BUILTIN,LOW);

             }

    }

  }

}

增加了上述语句后,编译通过(在ubuntu环境下,因为只在那里面安装了ROS):


 

可以看出对于STM32F103C8而言,64K FLASH 只占用了25k(38%),20K RAM只占用了2.7k(13%),在此基础上,可以有很大的发挥空间。

用USB转TTL电平串口模块连接STM32duino控制板:


 

使用消息发布测试:


 

现实世界中的小海龟动起来了!

感觉不错。不过尝试用无线适配器代替USB转TTL电平串口,失败了:(

好像 ROSSerial 协议在通讯过程中不断在用时间同步,经过两个无线模块转发后,可能通讯帧不连贯了,导致通讯只能偶尔成功,多数情况下失败。

看来如果要让这个小海龟无拘无束的跑起来,只能用TK-1之类的小主板放置在小车上了,或者使用树莓派3B+ 放置在小车上,作为中继,通过Wifi实现远程。

这一步的目标算是实现了,证明 ROSSerial可用,而且还比较方便,ROS.lib封装的不错。

下一步要尝试:如果程序框架基于 FreeRTOS编写,是否还可以可靠的使用ROS.lib?通过ROSSerial和ROS主机通讯。

因为我以往的小车控制程序都是基于 uCOS编写的,要移植到Arduino环境下,如果放弃RTOS框架,改写的内容太多,关键是需要自己写调度部分,有些麻烦。感觉移植到FreeRTOS上会方便些,STM32Duino有现成的 FreeRTOS库。

 

注:程序附在 QQ 群 32438885 的共享文件夹中,供参考。

ROS基础篇(六)-- ROS与Arduino如何通信(rosserial_arduino) 如今,ROS与嵌入式系统实现串口通讯的方式有好几种,目前最常用的就是rosserial,rosserial已支持Arduino、STM32等开源和低成本硬件的通讯。本篇主要介绍通过rosserial实现ROS与Arduino通信。 阅读详情

相关推荐

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

rosserial+stm32开发及调试方法 基本原理 Ref: http://wiki.ros.org/rosserial 简言之,rosserial提供一种嵌入式节点和运行在主控PC上的ros master通信的方式,使得在嵌入式节点上编写、运行ros节点成为可能,主要用于转接IO和各类传感器,运行底层控制算法。 要使用rosserial,显然需要分别在嵌入式板卡和主控PC上部署,当前支持的板卡有: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8XPwBJvY-1605

leida_wt的博客 1万+

rosserial简介

rosserial是用于非ROS设备与ROS设备进行通信的一种协议

兴若磐石的博客 1万+

ROS使用serial包进行串口通信

ROS使用serial包进行串口通信1、安装serial串口功能包2、查看对应的串口设备号及权限3、相关代码编辑节点相关C文件编写节点相关CMakeLists编译文件编写 1、安装serial串口功能包 下载安装对应的serial串口功能包 ubuntu16.04 sudo apt install ros-kinetic-serial ubuntu18.04 sudo apt install ros-melodic-serial 2、查看对应的串口设备号及权限 串口权限设置 查看本机串口信

杰尼君的博客 7312

ROS与STM32通信(一)-rosserial

rosserial是ROS中的一个重要模块,它实现了ROS通信协议与各类嵌入式硬件平台之间的桥接,大大简化了ROS在底层硬件上的移植和应用。rosserial通过消息序列化和常用串行通信接口,实现了ROS主机和嵌入式客户端之间的消息交互,为各种嵌入式平台提供了C++和Python的ROS客户端库,使得在这些硬件上也能方便地使用ROS的通信架构来进行节点管理、话题通信和服务调用。rosserial还支持动态主题和服务,以较小的代码占用实现ROS功能,具有很强的可移植性。出现以下内容则表示运行正常。

weixin_51002159的博客 5396

Jetson设备EXT4文件系统修复实战:从superblock损坏到系统恢复

本文详细介绍了Jetson设备因异常断电等原因导致EXT4文件系统superblock损坏后的诊断与修复实战。通过从健康设备移植fsck工具、使用备份超级块等步骤,指导用户逐步恢复系统,并提供了数据备份与预防措施,帮助用户有效应对嵌入式AI开发中的存储故障。

theta的博客 591

2025 高效抓取雪球社区数据:自动化导出Excel与PDF全攻略

本文详细介绍了2025年高效自动化抓取雪球社区数据的完整方案。通过Python脚本,用户可自动抓取帖子列表数据并导出为结构化的Excel表格,同时批量将帖子内容保存为PDF文档,并支持合并与添加书签,极大提升投资研究和信息整理的效率。

weixin_29034963的博客 690

ROS 通信—— serial功能包的使用

serial作为ROS与下位机通讯的功能包,可以很方便的供我们与我们的下位机通信。 本文全部为个人理解,如有错误,还请您指导! 通讯的使用: 1、首先我们需要添加serial的头文件 #include ''serial/serial.h" 2、我们要实例化化一个对象 ...

weixin_55880439的博客 5392

学习笔记之——Event Camera(事件相机)调研

概述 Event Camera是一种bio-inspired sensor,对应的领域为bio-inspired vision。对于传统的相机,从某种程度上,是捕获一个静态/静止的空间,而Event Camera的目的是:敏感地捕捉运动的物体。 对于传统RGB-camera,相机传回的信息是同步的,所谓同步,就是在某一时刻t,相机会进行曝光,把这一时刻所有的像素填在一个矩阵里回传,一张照片就诞生了。一张照片上所有的像素都对应着同一时刻。至于视频,不过是很多帧的图片,相邻图片间的时间间隔...

gwpscut的博客 3万+

五、ROS使用serial包进行串口通信

ROS

早睡早起的程序员小姚的博客 6330

Lisflood

文献:基于SWMM和LISFLOOD-FP模型的居住区低影响开发模拟评价。问题:多个节点溢流同时,不行,待解决。目录下,cmd命令行。

警警的博客 2662

BRepNet与图神经网络融合:提升3D CAD加工特征识别的精度与泛化能力

本文探讨了BRepNet与图神经网络(GNN)融合技术如何显著提升3D CAD加工特征识别的精度与泛化能力。通过将CAD模型视为图结构,利用GNN的消息传递机制增强对复杂拓扑关系的理解,并结合BRepNet的局部特征提取,该融合方法在MFCAD++数据集上实现了高达99.53%的准确率,有效解决了传统方法在处理复杂相交特征时的局限性,为智能制造提供了关键技术支撑。

android的专栏 775

ROS - rosserial从入门到入坟

我以搭建在jeston nano的Ubunu18(ROS-melodic)为例,通过stm32虚拟串口通信USBCDC,来实现stm32与ROS通信。教程同时附有配套视频教程,为你的rosserial学习保驾护航!

Hrilug的博客 1772

振镜控制卡硬件接口揭秘:XY2-100/SL2-100协议对比

本文对比分析了工业振镜控制领域两种主流数字通信协议XY2-100和SL2-100的硬件接口差异与应用场景。XY2-100作为开放式协议兼容性强,采用LVDS差分信号传输,适用于激光打标等中高精度场景;SL2-100为半封闭协议,采用RS485差分信号,专为高速响应场景设计。文章详细解析了两种协议的引脚定义、通信机制和性能参数,指出XY2-100适配多品牌振镜且调试简单,SL2-100则更适合Nutfield专用设备的高速高精度需求。最后提供了接口调试的实操建议和选型逻辑,强调应根据具体应用场景的精度、速度和

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 636

ROS中rosserial通讯协议初探

ROS中rosserial通讯协议初探 串行的通讯,我们用串口模拟下通讯图 官方 http://wiki.ros.org/rosserial rosserial 1概述 标准ROS序列化message的协议,可以让一个字符设备(单片机)通过串口或者网口就能实现多topics和services的功能。 1.1客户端库很多 1.2ROS端可以python也可以c++ 1.3...

大志的博客 3894

微调实操一: 增量预训练(Pretraining)

《微调入门篇:大模型微调的理论学习》我们对大模型微调理论有了基本了解,这篇结合我们现实中常见的场景,进行大模型微调实操部分的了解和学习,之前我有写过类似的文章《实践篇:大模型微调增量预训练实践(二)》利用的MedicalGPT的源码在colab进行操作, 由于MedicalGPT代码比较难以理解,而且模型只能从hugging face上下载,对于一些国内服务器无法访问,我重构了代码,让训练代码更有可读性,并参考LLAMAFactory的项目,增加了modelscope上下载模型,轻松在国内服务器运行.

youbingchen的博客 6992

rk628d修改默认分辨率

在rk3568上使用628d hdmi转mipi,在628d已经调试好的情况下,客户新增需求:视频输入这边的推荐分辨率固定在1024x768。

m0_60805802的博客 2052

一次成功流水帐 ros中使用serial包实现串口通信__以及依据通信协议C++串口通信

Catkin创建工程_鲁班班班七号的博客-优快云博客_catkin工程ros中使用serial包实现串口通信_鲁班班班七号的博客-优快云博客_ros 串口通信ROS使用serial库编译时出现“未定义的引用”解决办法_学术马的博客-优快云博客_ros编译未定义的引用ros中使用serial包实现串口通信_鲁班班班七号的博客-优快云博客_ros 串口通信 ROS下创建第一个节点工程_weixin_30907523的博客-优快云博客 首先创建工程和包 然后安装软件 再写代码 CMakeL

weixin_50084948的博客 2575

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[ROS 系列学习教程] ROS利用ros-kinetic-serial包与下位机串口通信

一、使用ros-kinetic-serial包,首先安装这个package sudo apt install ros-kinetic-serial #可以将kinetic替换为你的ROS版本 二、连接设备并查看串口名 关于linux串口的操作看这里 Ubuntu关于串口的操作(查看串口信息、串口助手、串口权限) 三、在package中包编写代码 1. 在工作空间中创建你自己的package 创...

淋曦的进击手记 6355

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

rosserial: 为ROS设备提供轻量级通讯解决方案

rosserial: 为ROS设备提供轻量级通讯解决方案 Rosserial是用于在ROS(Robot Operating System)系统中与硬件设备进行通信的开源库。它允许您通过串行接口(如USB或蓝牙)将嵌入式微控制器连接到ROS网络,并使您的设备能够像ROS节点一样运行。 Rosserial能用来做什么? Rosserial是一个非常适合在嵌入式系统中使用的ROS通信库。有了它,您可以:...

gitblog_00006的博客 798

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++使用serial串口通信 + ROS2示例IMU串口驱动

串行接口 (Serial Interface)简称串口(通常指COM接口),是采用串行通信方式的扩展接口,是指数据一位一位地顺序传送。这里使用的是亚博智能的10轴IMU模块为例介绍C++使用serial串口通信。

zardforever123的博客 1万+

技术分享 | 如何在ROS中使用Serial包?

首先,这个Serial 是一个跨平台、简单易用的库,用于在计算机上使用串行端口。该库提供了一个 C++、面向对象的接口,用于与 Linux 和 Windows 上的类似 RS-232 的设备进行交互。但是这个没有API文档,接下来我将把我的使用经验呈现给大家。 http://wiki.ros.org/serial Serial 的GitHub:https://github.com/wjwwood/serial 一、开始使用: 操作系统:Ubuntu18.04 ROS版本:melodic 首先在命令.

AMOVLAB(阿木实验室) 2790

rosserial通信协议简介

rosserial通信协议介绍

倔强不倒翁的博客 1万+

ROS利用ros-kinetic-serial包与下位机串口通信(这个和我的需求很相似,命令行输入不同数字发送不同命令,而且只执行一次)

转载自: ROS利用ros-kinetic-serial包与下位机串口通信 万俟淋曦 2019-12-03 15:50:17 2213 收藏 25 分类专栏: ROS 文章标签: serial ROS 串口 ubuntu 版权 一、使用ros-kinetic-serial包,首先安装这个package 注意,需将kinetic替换为你的ROS版本 sudo apt install ros-kinetic-serial 二、连接设备并查看串口名 关于linux串口的操作看这里 U

自主无人机 PX4 ROS SLAM 路径规划 MVS等技术分享 817

ROS串口通信协议解析

ROSserial 串口通信协议解析 1. 总览 ROS-serial是用于包装标准ROS序列化消息并在外部设备(例如串行端口或网络套接字)上多路复用多个主题和服务的协议。 2. 局限性 这里定义了发布主题消息的最大大小,发布者/订阅者的最大数量 对于rosserial_client,默认情况下,发布者和订阅者的数量限制为25,序列化和反序列化缓冲区的大小限制为512字节。 但是,这些数目和大小对于SRAM有限的微控制器来说太大了。rosserial_arduino的缓冲区大小和发布者/订阅者的数量现在取决

栀末寸芒 2731

使用rosserial实现ROS与Windows的service服务通信

使用rosserial window来实现ROS与Windows的service服务通信,测试了add_two_ints的服务,并使用rosserial window在windows端创建Visual Studio C++连接使用创建的add_two_ints服务,并测试成功。

scruffybear的专栏 1511

Ubuntu 下 ROS 使用 serial 包进行无线串口通信

lsusb。

huangjunsheng123的博客 2724
上一篇: ROS学习笔记之六:创建基于STM32的Arduino环境
下一篇: ROS学习笔记之八:尝试在FreeRTOS中使用ROSSerial
嵌入之梦
博客等级 码龄21年 134粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值