历史上的今天
返回首页

历史上的今天

今天是:2024年11月27日(星期三)

正在发生

2020年11月27日 | STM32和ROS机器人的串口通信方案

2020-11-27 来源:eefocus

具体协议大致如下,易读、易调用、易拓展、易更改。

源码文件:进入下面公众号:小白学移动机器人,发送:串口通信升级。即可获得。

http://weixin.qq.com/r/KERAWIvE1daqrc879xE6 (二维码自动识别)

本方案解决的问题:解决以STM32做ROS机器人底层驱动的串口通信问题。


为什么要写篇文章?:

最近发现越来越多的小伙伴走入ROS机器人的领域,而ROS机器人与底层驱动的串口通信问题,是大家学习路上的一个难题。很多小伙伴对STM32单片机并不熟悉,对串口通信的理解并不透彻,自己去解决这个问题,费时费力,最后也可能没有好的结果,并且这又不是大多数学习ROS机器人的重点。最后发现网上也没有很好的教程(也可能是我没找到),所以,这里根据本人的开发经历,给大家提供一种高效、稳定、易用的ROS机器人与STM32串口通信的常用方案。


如果不想了解细节的朋友,可以只看下面方案介绍和方案快速使用部分,关于方案的原理就不用花时间思考了,但是还是希望大家对细节有敬畏之心。


本方案提供的API:(最基础的ROS机器人需要的协议)

STM32向ROS发送左轮实时轮速、右轮实时轮速、实时角度、预留控制位。

ROS向STM32发送左轮设定速度、右轮设定速度、预留控制位

本方案优势:

经测试,长期稳定运行

保证数据准确率极高

频率50HZ左右,可更高,根据自己发送频率设置

易用,引入相关头文件即可,低耦合

------------------------------------------------华丽丽的分界线--------------------------------------------

方案介绍:

本方案将数据开头加入数据头,数据尾部加入数据循环冗余校验和数据尾,将数据打包发送,确保数据的正确性,避免出现一些无法察觉的问题。同样根据STM32和Linux系统配备相应的数据解析协议。

本方案STM32下位机依托USART1编写的收发协议,ROS上位机依托boost::asio编写的收发协议。串口并不一定是串口1,可以更改,但是需要程序变更一些内容(很容易,程序中有标记共三处)。

本方案巧妙的使用共用体的特性,进行数据解析,(也就是无需使用数据分离技术解析数据)。关于共用体,你只需要知道以下几点:

  1. C语言的一种机制,结构体内不同成员共享内存的机制,(即内存地址一致)

  2. 同一时刻,只能访问其中的一个成员

  3. 不同成员,按照成员类型的性质进行内存访问

不理解的小伙伴,可以看下图,有直观的理解即可。有图有真相

温馨提示:从左向右读图。

 

 

-----------------------------------------------华丽丽的分界线--------------------------------------------

方案快速使用:

硬件环境准备:(必须)

STM32串口+TTL转USB模块(CH340)+Linux硬件设备

线路连接:(有图有真相)

 

 

STM32下位机软件使用介绍:

首先是STM32串口参数的配置:(这里配置代码和相关例程都一致)

  • 波特率=115200

  • 数据长度=8位

  • 停止位=1个

  • 奇偶校验位=无

  • 硬件数据流控制=无

其次是函数使用说明,封装函数如下图:

这里做简单说明:

函数usartReceiveOneData(int *p_leftSpeedSet,int *p_rightSpeedSet,unsigned char *p_crtlFlag),填入地址参数作数据获取,使用时放在相应串口的中断服务函数中即可。如这里使用的串口1,如下图所示:

函数usartSendData(short leftVel, short rightVel,short angle,unsigned char ctrlFlag),填入需要发送的数据变量作发送,使用时放入指定频率的循环里使用,每次发送一次数据,最好延时10-15ms,下位机发送和上位机接收都需要时间(时间和串口波特率有关)。我使用的如下图所示:

其余的两个函数是被上面两个函数调用的,这里就不多说了。

注意:

在外部引用函数时,注意引用头文件#include "mbotLinuxUsart.h"

小伙伴在编译时,可能出现#include "mbotLinuxUsart.h"文件下 sys.h不存在,原因是使用的不是正点原子的例程,此时将#include 替换为各自版本的配置头文件,如果不清楚,就在其他.h文件中复制粘贴已有的头文件,关于stm32的

ROS上位机软件使用介绍:(PC)

看图说话,下面共有四个函数,看函数名和参数就可以理解用途。

首先是调用头文件#include "mbot_linux_serial.h",然后进行初始化串口

在程序初始化的时候调用serialInit()函数,内置串口参数和下位机串口参数一致。

然后就是在调用writeSpeed(double RobotV, double YawRate,unsigned char ctrlFlag)函数,参数是机器人线速度和角速度,也就是/cmd_vel的数据。将机器人的需要设定的速度下发到下位机。

最后就是调用readSpeed(double &vx,double &vth,double &th,unsigned char &ctrlFlag)函数,这里使用的引用,输入存放机器人线速度、角速度、角度的变量即可。为了发布机器人里程计用的。

注意:

这里需要两个参数根据自己的机器人进行更改,ROBOT_LENGTH 机器人真实轮间距(从左侧轮子中心到右侧轮子中心的距离),ROBOT_RADIUS 机器人轮间距的一半。

文中boost::asio::serial_port sp(iosev, "/dev/mbot");的设备名字是我的串口的设备名字,小伙伴可以根据自己的进行更改,例如,/dev/ttyUSB0。

到这里大家肯定都可以愉悦的使用了。如果想知道细节,请往下看。

-------------------------------------------华丽丽的分界线-----------------------------------------------

方案的原理解释:

此方案用的是共用体的思路,上面小伙伴们也都对共用有个大致的了解。这是一种按照共用体内成员的数据类型进行内存访问的特性,不同数据类型按照自己的类型访问内存。上位机和下位机的原理是一致的。都定义了数据头、数据尾的常量,和收发共用体。

下位机发送的数据协议: 上位机发送的数据协议:

STM32的串口接收原理:每接收到一个字节就会触发一次中断,我这里采用在串口的中断服务函数中进行数据接收的解析,具体函数体现在receiveTo103()

根据上位机发送的协议进行判断解析,详见代码,注释清晰。

Linux上位机采用ASIO,ASIO不仅支持网络通信,还能支持串口通信。

这里采用boost::asio::write(sp, boost::asio::buffer(buf));发送数据

使用boost::asio::read_until(sp, response, "rn",err);

copy(istream_iterator(istream(&response)>>noskipws),

istream_iterator(),buf);

获取数据,再具体的细节需要见源码解释了。脑子里的思想就是把相应的数据放到相应的位置,没有数据解析概念,对应的字符数据存好后,就可以通过另外一个成员访问了。


推荐阅读

史海拾趣

General Instrument Corp公司的发展小趣事
通常较低,例如ML2281系列的最大功耗为12.5mW。
Cogent_Computer_Systems公司的发展小趣事

在电子行业中,技术创新是企业发展的核心驱动力。Cogent_Computer_Systems公司深知这一点,因此始终坚持将大量资金投入研发领域。公司建立了一支高素质的研发团队,并配备了先进的研发设备。通过持续不断的研发投入,公司成功推出了一系列具有创新性的产品,满足了市场不断变化的需求。这种以研发驱动的发展模式使得公司在激烈的市场竞争中始终保持领先地位。

Acculin Inc公司的发展小趣事

随着电子行业的竞争加剧,Acculin Inc面临着市场份额下降的挑战。为了应对这一变化,公司决定调整战略方向,将重点转向智能穿戴设备市场。通过研发具有独特功能的智能手环和智能手表,Acculin成功吸引了年轻消费者的关注,并在新的市场领域取得了突破。

Enable Semiconductor Corp公司的发展小趣事

品质是Enable Semiconductor Corp公司的生命线。公司从原材料采购到产品生产、从质量检测到售后服务,都严格执行质量管理体系的要求。这种对品质的执着追求使得公司的产品在市场上享有良好的口碑。同时,公司还积极参与国际标准的制定和认证工作,不断提升产品的国际竞争力。

川土(Chipanalog)公司的发展小趣事

2022年,川土微电子的CA-IS3062W产品荣获了中国IC设计成就奖之“年度最佳隔离器”。这一荣誉的获得不仅是对川土微电子技术实力的肯定,也进一步提升了公司在行业内的知名度。同时,这也为川土微电子未来的发展奠定了坚实的基础。

Gaomi Xinghe Electronics公司的发展小趣事

背景:随着中国经济的快速发展和消费者对电子产品需求的不断增加,Galaxy公司敏锐地捕捉到这一市场机遇。

行动:在2003年初,Galaxy以缜密的市场调研为基础,全力部署进入大陆市场。同年6月,公司推出了以“影驰”命名的Geforce家族系列产品,迅速吸引了众多游戏发烧友和电子产品爱好者的关注。随后,公司又在多个城市设立了销售和服务网点,为消费者提供更加便捷的产品体验和服务。

成果:经过多年的深耕细作,Galaxy在大陆市场取得了显著成绩,品牌影响力不断增强,市场份额稳步提升。

问答坊 | AI 解惑

电子电路设计与实践

初学者可以拿去参考参考…

查看全部问答>

protelDXP2004原理图修改元件参数有什么快速方法

protelDXP2004原理图修改元件参数有什么快速方法呀。一个一个改好麻烦呀。:L…

查看全部问答>

基于MSP430 单片机高精度温度测量的补偿方法

用MSP430P315 单片机的A/D 转换器,实现阻性温度传感器的电阻检测;用查表和线性插值结合的方法,简化标度变换的算法结构。对电池电压的降低进行补偿的同时分析补偿电阻的精度对温度检测的影响。 …

查看全部问答>

软件工程师的职位规划

/************************************************ *技术直接转销售还是先转技术支持再转销售好呢? ************************************************/ 我是09年毕业的,毕业的时候,是在一家医疗器材公司工作。 最近换了一家公司,是搞 ...…

查看全部问答>

请教一点关于并口驱动开发的问题

老师让做一个dsp和pc通过并口epp通信的东西,在xp下对并口操作是不是要写个驱动?老板让我用WinDriver,我想问问关于并口开发要怎样调试呢?以前没有做过关于并口通信东西,所以想请问各位老大,希望能给指点一下…

查看全部问答>

请问一下

我的程序 无法进入中断程序 可能是什么原因? 我是用的下降沿有效啊…

查看全部问答>

请教evc中如何快速移动图片

在Wince中添加一个较大的位图,设想有一个相对较小的取景框,当这个框快速移动时,我想显示屏幕上位图移动的动画效果。我在evc中代码如下:          CBitmap m_bitmap;         BITMAP bm; ...…

查看全部问答>

帮我下一个外文文献

Kaiser, J.F., Nonrecursive digital filter design using the I0-sinh window function, Proceedings of the 1974 IEEE International Symposium on Circuits and Systems (1974) 请发送邮件到donghongyong@live.cn …

查看全部问答>

uboot怎样向kenerl传递一个物理地址

现在uboot中有个物理需要传到kernel中! 我该在uboot怎样做?请各位大虾指点下!!谢谢…

查看全部问答>

(北京)迎接Linux时代的到来

4月21日(周六)东方标准特邀请嵌入式软件仿真开源(SkyEye)项目核心成员、AKA 嵌入式小组成员康烁,为大家做《利用SkyEye进行操作系统分析及SkyEye的最新进展》的讲座。 康烁--作为自由软件爱好者,精通嵌入式系统移植,驱动开发,多年嵌入式开发 ...…

查看全部问答>