你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何使用STM32存储激光雷达串口每秒钟发送上来的4000个数

[复制链接]
大连海港 提问时间:2017-5-2 10:25 /
1、问题描述
  现在实验室正在做使用激光雷达避障,希望大神多指点。激光雷达通过串口和STM32通信,每秒钟传送4000次数据(相当于雷达的工作频率为4000HZ),每次数据包含距离和角度数值,我怎么将这4000个数据进行存储,并且实时更新,可以覆盖上一个4000,一个周期存储完成后还能够实时读取,以此获取障碍物2D尺寸轮廓,用EEPROMEEPROM的内存只有2kb,是不是不够用啊?用FLASH?SD卡吗?求大神指点
2、试解决方法(自己想的,不知道对错,希望得到指点)
  选用STM32F429RAM256K,我定义两个全局变量float  distance4000】;float angle4000】,这样数据的大小为:4个字节*2*4000=32K;串口波特率设置成115200,用DMA发送 、保存;如果我想使用这些数据,设置一个定时中断,随时对这4000个角度和距离进行判断,决定小车如何转向,如何避障

收藏 1 评论23 发布时间:2017-5-2 10:25

举报

23个回答
watershade 回答时间:2017-5-3 17:13:50
你这个情况,很具有挑战性,但是希望和你讨论一下。下面按照我的理解说。(如果有错,大家指正)
1、我们假定用串口那你一次的数据假定不包含包头包尾,也不包含校验码和帧ID。这种情况下每秒的数据量有多大呐?float是四个字节,每个字节8位。所以是4000*8*(4+4)=256000。而你说的115200,不好意思,干不了。但是既然你的激光雷达敢给这么高的输出速率,我们也只好迎难而上。按照你的情况,为了保证数据的准确度和有效性,以上几种(包头,包尾,校验码,帧ID)都需要包含。我们还是尽量短一些吧,但是帧ID这里用两个字节,其余各一个。(或者两个包头,不要包尾)。我们每组数据是4+4+5=13.为了稳定性,我们假定有50%的负载率。这时你的波特率是:4000*8*13 = 416000.那就选择460800(115200的四倍)吧。
2、再说数据存储,楼上有位兄弟推荐用SDRAM。这是一个方法。但是你只需要32K,而且按照我对机器人导航的理解,这个数据根本不需要存储.这个数据量F429可以搞定,因为429的RAM是256K。正常情况下,应该可以在RAM中保存你这32K的数据。而且这也是最快的方案。
3、我们在从方案上说一下。你给我们花了一个道。说1秒钟寸4000个,算一个周期。每个周期数据可以更新一次。但是呐,我对你这条道路有点疑问。Why we should do like this?
正常情况下,激光导航的确需要大量数据。但是数据是被吃进去直接消化掉的。就是说你每次的数据去feed我的算法,我迭代这去处理。根本没必要大量存储。销量存储倒是有可能。比如我每40个数做个处理。但是1S种存储的所有数去处理然后一股脑feed给算法。这似乎不正确。也许你们有其它用途。

以上是我的拙见。请赐教
watershade 回答时间:2017-5-4 21:22:39
大连海港 发表于 2017-5-3 19:55
看了您的建议以及码这么多字,真心非常感谢!怪我自己之前没有认真思考清楚,帖子中发东西的下面也需要改 ...

看来我之前对你贴纸中的两个float误解了,我还以为数据都是float的。所以:
1、你提供的数据结构应该是雷达提供方的。所以230400当然可以,但是我建议再大一倍。你可以做个测试就试一下。因为雷达数据的特殊性,所以每一次的确不需要时间标志。
2、的确很抱歉,我忘记了CCMRAM占用的64K内存。我之前只是看别人玩过这一区域,自己一直没有试过。正常情况下,不做图像音频等的处理。变量占用的存储空间不会特别大。你可以根据自己的需求估算一下可能占用的内存,我估计192K是足够的。如果你觉得SRAM,Flash的空间也可以利用,但是如果你要来回王SRAM里面搬迁就太麻烦了。(但是之前看到有人的代码就是在Flash里面运行的,不太清楚是怎么一种考量)。外扩SDRAM是个办法,存储空间可以扩大很多。EEPROM一般用于掉电存储的信息,这里不适合你。
说到CCMRAM,我们还可以讨论一下你的数据到底能否存到这里。OK,你用DMA将串口收到的数据直接搬迁到你定义的一片存储区。(我们想不说这个区域有多大)但是,根据你的数据结构。你真正能够利用的数据用两个16位的数据就可以涵盖。也就是说你不会等到存储区存满才将数据一股脑的提取出来(包含提取和校验)。所以处理之后的数据放哪里呐,据说存CCMRAM有很多优势。尤其是你直接用CPU或DSP处理这些数据。而这篇专用的64K,你可以做很多事情。
ringbuf就是用来解决你需要保留最新一定量数据的好方法。这是标准做法。你应该感谢这位网友。

3、现在说算法的问题。之前学习Coursera上的机器人课程,简单了解的是势场法。而你这个VFH法应该是需要通过接受到的新数据去更新场景中ROI或者目标锥形区域的概率。(VFH没有深入了解过,不好意思)所以也符合我之前的说法。不过看来你存储一圈甚至更多圈区域的数据挺好的。
关于算法的实现。建议你看一下CMSIS-DSP。你会发现里面有很多我们之前只在数学里常用的计算工具。我们的确遇到过将计算机代码转到单片机里面就无从入手的情况。最典型的是我们用matlab实验好代码,却发现将代码移植到单片机里是一个大工程。我最早想到的方法是用matlan的那个自动生成代码的工具。发现那个工具收费之后,也曾想过使用别人编写好的某个计算工具(比如矩阵运算)的嵌入式代码库。可是也不太好。去年我尝试使用CMSIS-DSP里面的计算工具(函数)来解决自己的问题,尽管还是有一些没有(比如tan2).但是却有很多好用的。比如矢量电机控制用的帕克变换和卡莱克变换等,直接就有。也有PID的,和一些矩阵的。如果你有很好的办法也请赐教。

因为知识量有限,有错误的请多包涵。



大连海港 回答时间:2017-5-3 19:55:51
watershade 发表于 2017-5-3 17:13
你这个情况,很具有挑战性,但是希望和你讨论一下。下面按照我的理解说。(如果有错,大家指正)
1、我们假 ...

看了您的建议以及码这么多字,真心非常感谢!怪我自己之前没有认真思考清楚,帖子中发东西的下面也需要改正一下,同时也提出点想法和您讨论:
1、        首先说下数据格式以及数据大小问题。之前的看的那款雷达数据频率是4000HZ,现在我把我们即将使用的一个数据贴出来。
测量距离¹ 0.2~10M@30%;重复精度² ±5CM@10M@5Hz;扫描角度 360°;角度分辨率 0.36;扫描频率³ 5Hz;测量速度 5KHz;输出接口 TTL;距离分辨率 1cm;串口波特率 230400bps;
协议:每个距离测试数据包有 4 个字节(依次标号为 A,B,C,D),前面 3 个字节高位为 0,最后一个字节高位为 1,标示此数据包的结束。每个字节分别有 8 位,分别对应 7,6,…1,0。每个数据包中:A7,B7,C7 均为 0,D7为 1。有效数据共 28 位。 A6,A5,A4 校验位,具体算法见校验算法。每个数据包只有 4*7 = 28 位有效数据,A6,A5,A4 校验位,A3,A2,A1,A0,B6,...B0,C6 为距离,共 12 位,范围 0~4000cm。 C5...C0,D6,...D0 共 13 位,为角度值,范围 0~5759,角度精度为十六分之一度。。。。。
其实这样算过来的,雷达数据频率5000HZ,数据量大小:4字节*5000=160000 串口波特率230400,按照官方这么计算的话,应该可以传输。。。
2、        关于数据存储问题。因为没有过机器人避障的经验,只是自己思考应该存一圈360度的数据,然后使用这些进行避障。雷达每秒转5圈,每秒5000个数,相当于需要存一圈1000个数据就够了,如果使用F429,确实有256K的ram,但是其中是包含了64k的CCMRAM,这个不能用DMA访问的,剩下还有192K的SRAM,我现在还不清楚定义了全局变量的数据,它是存在了CCMRAM还是SRAM,希望得到大家解释一下这个地方。如果存在CCMRAM的话,DMA不能把串口的数据传过来吧?(对于数据存储使用,今天别人提供了ringbuff环形缓存区的建议,不知您感觉合适不)
3、        关于方案上的东西,我真的不知道现在该如何处理,您有这方面的经验,希望多介绍一点,当然越详细越好,我现在查的资料就是使用VFH算法,但是如何将算法转化为程序语言,也是在摸索中……这个地方真的希望您多说两句,感谢!
学生刚接触这些东西,有很多地方不懂,希望大家多指点,多交流
Dandjinh 回答时间:2017-5-2 16:22:12
这种速率的串口不可靠,用SPI吧,有SPI转USB的芯片的
zhao.zhao 回答时间:2017-5-3 10:20:22
串口够呛,数据量太大了,楼上的朋友是正解
大连海港 回答时间:2017-5-3 13:50:16
Dandjinh 发表于 2017-5-2 16:22
这种速率的串口不可靠,用SPI吧,有SPI转USB的芯片的

管脚 功能 颜色 说明
1 +12V±20% 红色 直流电源正极
2 GND 白色 电源地
3 TTL GND 黑色 和电源地机内连通
4 TTL Tx 绿色 TTL Tx
5 TTL Rx 黄色 TTL Rx

雷达引脚是这样的,应该只能用串口吧?
大连海港 回答时间:2017-5-3 13:50:51
zhao.zhao 发表于 2017-5-3 10:20
串口够呛,数据量太大了,楼上的朋友是正解

管脚 功能 颜色 说明
1 +12V±20% 红色 直流电源正极
2 GND 白色 电源地
3 TTL GND 黑色 和电源地机内连通
4 TTL Tx 绿色 TTL Tx
5 TTL Rx 黄色 TTL Rx

雷达接口是这样的,应该只能用串口吧?
涛哥2035 回答时间:2017-5-3 14:53:49
用429就加个256Mbit的SDRAM
大连海港 回答时间:2017-5-3 15:23:11
whtt 发表于 2017-5-3 14:53
用429就加个256Mbit的SDRAM

需要加这么大的内存吗?如果按照我的计算,32K就够用了吧,您能解释一下加256Mbit的SDRAM的原因吗?谢谢
wofei1314 回答时间:2017-5-3 15:43:20
这个一般还用不上429,一秒4000字节数据量也不算非常大,115200的波特率每秒约传11520字节,如果距离够短,还可以提升波特率,这样传输的时间短,使用DMA接收;可以扩展一个SRAM临时存储数据;掉电保存的话还是用Flash吧,经济
jcx0324 回答时间:2017-5-3 15:46:14
芯片自身带的RAM都够了,根本没必要那么复杂,串口可以最高跑到好几M呢,主要看你的线路
大连海港 回答时间:2017-5-3 19:59:36
wofei1314 发表于 2017-5-3 15:43
这个一般还用不上429,一秒4000字节数据量也不算非常大,115200的波特率每秒约传11520字节,如果距离够短, ...

您说的串口距离指的是什么?导线的距离?还有串口的波特率影响数据传输的速度吗?比如1152000和9600的,9600的传输速度要比115200大吗?
zhao.zhao 回答时间:2017-5-4 09:56:46
那串口的波特率设置的大一些
wofei1314 回答时间:2017-5-4 10:30:23
大连海港 发表于 2017-5-3 19:59
您说的串口距离指的是什么?导线的距离?还有串口的波特率影响数据传输的速度吗?比如1152000和9600的,9 ...

串口通信的距离是说,单片机的串口到雷达的串口,距离越短越好!!长了,通信的波特率不能太高,否则会丢包、错码
波特率的概念大概是说,一秒钟传输xx个bit,115200,就是说一秒传输115200个bit,加上开始位、停止的话除以10大概就是一秒传输的字节数,具体的问度娘~
大连海港 回答时间:2017-5-4 11:28:22
wofei1314 发表于 2017-5-4 10:30
串口通信的距离是说,单片机的串口到雷达的串口,距离越短越好!!长了,通信的波特率不能太高,否则会丢 ...

谢谢,我在自己多了解了解
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版