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

如何使用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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版