用Python让AWR1843毫米波雷达数据在屏幕上实时跳动,比想象中简单

用Python让AWR1843毫米波雷达数据在屏幕上实时跳动,比想象中简单

【免费下载链接】AWR1843-Read-Data-Python-MMWAVE-SDK-3-Python program to read and plot the data in real time from the AWR1843 mmWave radar board (MMWAVE SDK 3)项目地址: https://gitcode.com/gh_mirrors/aw/AWR1843-Read-Data-Python-MMWAVE-SDK-3-

桌上摊着一块AWR1843毫米波雷达板,数据口每秒往外吐几万字节的二进制流。如果你直接拿串口助手去读,看到的只有一堆乱码一样的十六进制。可旁边那位同学的屏幕上,一个散点图正随着他来回走动实时移动——每个点都代表一个被雷达"看见"的目标。毫米波雷达数据可视化,真的需要先啃完一本信号处理教材才能做吗?这个基于Python 3的开源小项目给出的回答是:不用,装好依赖就能跑。

二十分钟,第一次看到数据点动起来

我拿到这个项目的第一反应是找README,结果发现它短得出奇,核心用法就四句话:装包、改配置文件名、改串口号、运行。我照着做,全程没超过二十分钟。

先把仓库拉到本地:

git clone https://gitcode.com/gh_mirrors/aw/AWR1843-Read-Data-Python-MMWAVE-SDK-3-

然后装三个依赖:numpy负责数组计算,pyserial(代码里 import 的是 serial)负责读串口,pyqtgraph负责画那个实时散点图。

接下来要动的地方只有两处。第一处是文件开头那句:

configFileName = 'AWR1843config.cfg'

仓库里其实带了两份配置文件,默认用的是 AWR1843config.cfg,如果你想要另一套测距测速参数,改成 1843RangeDoppler.cfg 就行。第二处是串口号——程序里已经写好了两套示例:Windows 下是 COM8(CLI口,115200波特率)和 COM9(数据口,921600波特率),树莓派下则是 /dev/ttyACM0 和 /dev/ttyACM1。按你自己的设备管理器或 dmesg 结果改一下,保存,python readData_AWR1843.py,回车。

如果一切顺利,你会看到一个白底的二维坐标图,X 轴范围从 -0.5 到 0.5 米,Y 轴从 0 到 1.5 米,然后——几个小圆点出现了。你往前挪一步,点就跟着往前挪。那一瞬间还是挺有成就感的。

运行那一刻,程序到底在忙什么

点一下鼠标启动程序,背后其实是四件事按顺序发生,理解了这个,之后调参数心里就有底了。

第一件事,serialConfig()把 CLI 口和数据口分别打开,然后一行一行把 .cfg 文件里的命令发给雷达板。这些命令不是随便写的,比如profileCfg定义了发射频率、采样点数,frameCfg定义了每帧的 chirp 数量、帧周期,雷达板收到后就知道自己该怎么发波、发多久。注意 CLI 口用的是 115200,数据口用的是 921600,两个波特率不一样,是故意这么设计的,别接反。

第二件事,parseConfigFile()把同一份配置文件又读了一遍,但这次是解析,把numRangeBinsnumDopplerBins、距离分辨率、最大测距、最大速度这些算好的参数塞进一个字典里。它是从 TI 官方 Matlab demo 移植过来的,所以这套解析思路和 Matlab 版本一脉相承。

第三件事是重头戏,readAndParseData18xx()负责从数据口读字节流。雷达发下来的数据是带帧结构的,每一帧开头有 8 个字节的"魔数"(magic word),程序就是在缓冲里找这个魔数,确认找到帧头之后,再按固定格式把帧号、目标数量、还有一串 TLV 消息读出来。目前它只实现了 TLV 类型为 1 的"检测对象"数据包,也就是每个目标的三维坐标和多普勒速度。range profile、range-azimuth 热图这些数据包,代码注释里写得很清楚:思路一样,只是还没实现。

第四件事,update()把解析出来的目标点交给 pyqtgraph 画成散点,主循环以大约 30Hz 的频率不停地"读一帧、画一帧"。因为 pyqtgraph 本身是高性能绘图库,几十个点刷新起来毫无压力,画面非常跟手。

你会在屏幕上看到什么,数据长什么样

画面本身很朴素:一个散点图,没有任何花哨的按钮。但朴素不等于简单——每一个点背后都对应一组真实测量值。readAndParseData18xx()每次返回一个字典,长这样:

{ "numObj": 3, # 这一帧检测到 3 个目标 "x": [0.12, -0.05, 0.30], # 米 "y": [0.55, 0.80, 0.20], # 米 "z": [-0.02, 0.01, 0.05], # 米 "velocity": [0.4, -0.2, 0.1] # 米/秒,多普勒速度 }

x、y、z 是目标相对雷达的三维坐标,velocity 是多普勒速度,正负号代表目标在靠近还是远离。画图的时候默认取的是 x 和 y,也就是俯视视角,人在雷达前方走动时,点的移动方向和他的实际运动方向是对应的。另外,每一帧的数据都会被存进frameData这个字典数组里,帧号递增,也就是说跑完一段之后,你手里其实攒下了一份完整的带时间顺序的测量记录,可以事后回放、分析。

新手最容易踩的四个坑

我这一路踩过的坑,基本就集中在下面几处,提前知道能省不少时间。

坑一:串口号不对,程序"看起来没反应"。最常见的是 Windows 下 COM 号写错,或者树莓派下板子没识别成 ttyACM。树莓派上如果提示没有权限访问串口,通常是当前用户不在 dialout 用户组里,加一下组再重新登录就行。

坑二:CLI 和数据口接反。一个 115200、一个 921600,如果程序迟迟没有任何输出,先检查是不是把两个口对调了。

坑三:天线没用满却不改参数。代码里numRxAntnumTxAnt默认写死成 4 和 3,如果你的板子配置只用了部分天线,需要同步改这两个值,否则后面算出来的距离、速度分辨率会不对。

坑四:配置文件解析报错。配置文件里不要混入奇怪的换行符或多余空格,改配置时尽量保持原有格式,只改数字。

还有个小细节:退出程序时直接按 Ctrl+C 就行,程序会自动给板子发一条sensorStop命令并关闭串口,不用手动断电。

拿到手之后,还能怎么玩

跑通只是开始,这个项目留了不少可以发挥的余地。

想调探测范围?两份 .cfg 文件就是现成的对比样本,一个最大测距约 9 米,一个约 3.4 米,试着改profileCfg里的采样点数、frameCfg里的帧周期,看看画面里的点分布怎么变。这比看十页文档都直观。

想要更丰富的信息?zvelocity其实都已经解析出来了,只是默认没画。你完全可以给点按速度着色,或者把 z 也加进去做三维显示。

想接入别的系统?每一帧数据都进了frameData,可以在这里加一段代码把数据转成 JSON 发出去,无论是接上位机、写日志还是喂给别的算法,都是一个很小的改动。项目本身基于 MIT 协议开源,改起来没有心理负担。

如果你手头正好有 AWR1843 板子,或者正在为树莓派上读雷达数据发愁,不妨照这篇文章走一遍。二十分钟换一个看得见的实时雷达画面,这笔账怎么算都划算——下一步的玩法,就交给你自己了。

【免费下载链接】AWR1843-Read-Data-Python-MMWAVE-SDK-3-Python program to read and plot the data in real time from the AWR1843 mmWave radar board (MMWAVE SDK 3)项目地址: https://gitcode.com/gh_mirrors/aw/AWR1843-Read-Data-Python-MMWAVE-SDK-3-

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考