扬帆起航:毫米波雷达开发手册之硬件配置
严肃声明
严格禁止未经本人允许转载本文工作成果(包括引言、证明、代码分析等),一经发现被用于学术或商业用途,将予以法律警告。欢迎和笔者深度合作,探讨学术话题。
本人发现部分网站(如https://it.cha138.com/等野鸡网站)未经本人允许私自将本人博客内容转发公开,本人严禁杜绝此类行为,一经发现将投诉举报相关行为并追究违法责任!!!
写在前面
深知新手在接触毫米波雷达板硬件时需要花费的沉没成本,因此在行将告别毫米波雷达之际,总结这两年以来在毫米波雷达上的一些经验和教训。
本文档用于为实现基于AWR1243BOOST
等单板毫米波雷达开发提供参考指南与解决方案,主要包括硬件配置
、基础参数
、信号模型
、应用DEMO开发
以及可深入研究方向思考
等;为更好地匹配后续级联雷达应用的学习路线,在本手册中会尽可能同化单板雷达和级联雷达中的相关表述。
本指南作者信息:Xl
,联系方式:xxxxx@zju.edu.cn
。未经本人允许,请勿用于商业和学术用途。
希望后者在使用本指南时可以考虑引用作者在毫米波雷达旅途中的相关工作。
本章节为硬件配置章节,主要解读TI毫米波雷达硬件配置流程
、典型BUG
、参考工具/LUA脚本文件
以及TI毫米波雷达一键实时系统实现
。
本章节内容后续代码会上传至以下链接:(希望能给个星星)https://github.com/DingdongD/RadarConfigure/tree/main
https://github.com/DingdongD/SIMFNet/tree/main/Mains/RealTime-APP
硬件配置
基本准备
1、在使用实验室这块单板时不需要去动硬件的按键以及跳帽等。在正式使用前,检查毫米波雷达射频板和DCA1000板的两根安卓标准UART线和1根以太网通信线是否正确连接到电脑,2根电源线需要保证5V3A的电源供电,切记电压不可超过5V,否则会击穿射频板电容而不能正常工作。
正常的接线方式如下所示,此处省略另一头DCA1000上的电源接线。
2、根据毫米波雷达开发板类型在官网下载对应版本的mmwave studio,需要正确选择版本,否则会导致后续的固件烧录不适配,官网链接为:https://www.ti.com/tool/MMWAVE-STUDIO.
除此以外,需要安装MATLAB引擎。
PS:在mmwave-studio安装路径下如C:\ti\mmwave_studio_02_01_01_00\docs
的docs文件夹中通常会有官方提供的User Guider,用户可以通过User Guider完成新板的电路连接、参数配置等。
3、完成端口和驱动的具体配置;验证配置成功的方法是:选择WIN+R
在CMD``窗口输入devmgmt.msc
打开设备管理器,正常情况下在端口列表下会出现4个AR-DEVPACK-EVM-012
和2个XDS110 CLASS
的端口内容,其中XDS110 CLASS APPLICATION /USER UART
的COM x
口是后续在mmwave studio
的RS232
链接配置时需要选择的。
4、打开mmwave studio 2.1.1.0
,可以采取手动配置和脚本配置。手动配置参开User Guider手册。
4.1 选择CONNECTION
栏目下的BOARD CONTROL
界面中的SET
,其次选择RS232 OPERATIONS
界面中的CONNECT
,波特率建议选择115200
。如果出现问题,需要检查一下连线和5V电源电流
情况是否正确。
4.2 在下方的BROWSE
中选择文件夹路径如C:\ti\mmwave_studio_02_01_01_00\mmWaveStudio\Scripts中的DataCaptureDemo_1243.lua
文件,然后选择RUN
则可以开始脚本配置。等待进度条加载完成可以看到SPI CONNECTIVITY
处会显示绿色CONNECTED
,同时SENSOR CONFIG
栏目下的SETUP DCA1000
能够正常显示FPGA
的版本。
4.3 基本配置已经完成,可以通过SENSOR CONFIG
栏目下的DCA1000 TRIGGER
来进行数据的采集,每次采集数据都需要按DCA1000 TRIGGER
来进行,否则容易出现ERROR
。如果需要在界面查看数据采集和可视化情况,可以选择同一行的POSTPROC
进行查看。(通常数据采集回来的bin
文件放置在POSTPROC
文件夹下)
疑难BUG
- 报错1:
Error: Connection failed: Calling_ConnectTarget returned 3
;检查RS232
的COM
端口是否选择正确。 - 报错2:
MSS POWER UP
等相关问题;电源电流无法带动板子导致,建议重启板子和studio
重新烧录。此外,每次烧录成功后再次烧录都需要重启。除了电源也有可能是接触问题,检查DCA1000
和AWRXXXX
的JPEG
插排连线是否紧固;如果以上问题均排查,再检查一下XDS
和AR
固件版本。XDS
固件下载可以参考:http://software-dl.ti.com/ccs/esd/documents/xdsdebugprobes/emu_xds_software_package_download.html - 报错3:
DCA1000
不能获取FPGA
版本信息;检查防火墙是否关闭以及是否配置千兆网网卡。 - 其他报错可以查看
DCA1000 DEBUG 手册
。
工具解读
此处主要解读LUA文件中相关语句及其含义,并介绍一款参数估计和配置工具。
TI官方工具解释
首先介绍一下mmWave Sensing Estimator
这款TI
官方计算器,可根据不同的应用场景来进行毫米波雷达参数的配置。
工具链接如下:https://dev.ti.com/gallery/view/1792614/mmWaveSensingEstimator/ver/1.3.0/
参数解释:
Short Range Default 和Long Range Default
:前者基于短距离高分辨率应用,检测人;后者基于长距离应用,可用于监测车辆。
Device Specific Parameters
:选择毫米波雷达型号与接收、发射天线。
Board Specific Parameters
: 选择发射增益和接收增益。
Regulatory Restrictions
:选择频率范围(GHz
)、最大带宽(MHz
)、发射功率(dBm
)
Scene Parameters
:可用于细化雷达的应用场景,可配置范围广、用于不同的场景,一个参数会影响另一个参数,最大检测范围会影响距离分辨率。(在这里面可以设置最大检测速度、最大检测距离以及速度和距离分辨率、检测目标类型等指标)
Additional Parameters
: 在这里可以进一步考虑检测损失、系统损失和检测信噪比等指标。
Outputs and Chirp Design
:提供了非常详细的Chirp
配置信息(包括斜率、采样率、带宽等),是适合新手配置雷达的最佳工具。
脚本文件解释
下面主要通过注释
的方式结合具体的代码块来分析含义,而不再额外地赘述。
--[[
下面三行代码在TI提供的lua文件中是没有出现的,但是确实是有意义的;我们知道在使用TI的这套雷达开发板时,绕不开mmwave studio,每次都要在雷达上电以后启动mmwave studio点击set和connect完成板子的初始化以后才能再点击RUN按键进行LUA文件的烧录,以完成参数的配置。
这样处理没什么问题,就是看起来觉得操作繁琐。能不能够整合这两步,直接烧录lua文件?意思就是说,我打开mmwave studio以后,直接烧录lua文件完成一键配置可以吗?当然是可以的,但是这里先不讲如何实现的这个过程,下面主要还是先分析代码块的意义。
说到现在了,应该能明白下面这三条语句就是用来实现“启动mmwave studio点击set和connect”这两个步骤。
]]
--[[
ar1.FullReset()
ar1.SOPControl(2)
--ar1.Connect(4,115200,1000)
]]
info = debug.getinfo(1,'S');
-- 获取当前文件的根目录 通常为C:\ti\mmwave_studio_02_01_01_00\mmWaveStudio\Scripts\DataCaptureDemo_1243.lua
file_path = (info.source);
-- 返回时通常有@符号,在下面需要分别替换为空格
file_path = string.gsub(file_path, "@","");
file_path = string.gsub(file_path, "DataCaptureDemo_1243.lua","");
-- 如果你的lua文件名称修改了,你对应也需要在这里修改lua文件的名称,否则会正则匹配失败,无法读取到信息。
fw_path = file_path.."..\\..\\rf_eval_firmware"
-- fw_path为MSS和BSS file文件保存路径,..表示返回到上一级目录,2个..表示范围到前2级目录
--ADC_Data file path
data_path = file_path.."..\\PostProc"
adc_data_path = "C:\\ti\\mmwave_studio_02_01_01_00\\mmWaveStudio\\PostProc\\adc_data.bin"
--[[
修改data_path 路径为 "H:\\RadarProcessing\\RawData"
修改adc_data_path路径为"H:\\RadarProcessing\\RawData\\adc_data.bin"
这里不调用PostPROC会在文件夹下出现adc_data_raw.bin文件,调用POSTPROC后adc_data_raw.bin文件消失,出现adc_data.bin文件.两者在2.1.1.0版本studio是相同的.
]]
ar1.CaptureCardConfig_StartRecord("H:\\RadarProcessing\\RawData\\adc_data_1.bin", 1)
RSTD.Sleep(1000)
RSTD.Sleep(5000) -- 延时足够长可以开始下一次数据的采集
ar1.CaptureCardConfig_StartRecord("H:\\RadarProcessing\\RawData\\adc_data_2.bin", 1)
RSTD.Sleep(1000)
RSTD.Sleep(5000) -- 延时足够长可以开始下一次数据的采集
-- 下面代码将在数据采集完成后处理RAW ADC DATA
ar1.StartMatlabPostProc(adc_data_path)
RSTD.Sleep(10000)
WriteToLog("Please wait for a few seconds for matlab post processing .....!!!! \n", "green")
-- 这里只截取了和本毫米波雷达AWR1243相关的部分来分析
-- 下面是和每个chirp相关参数的配置
elseif((partId == 1243) or (partId == 1443)) then
if(ar1.ProfileConfig(0, 77, 100, 6, 60, 0, 0, 0, 0, 0, 0, 60.012, 0, 1024, 20000, 0, 0, 30) == 0) then
WriteToLog("ProfileConfig Success\n", "green")
else
WriteToLog("ProfileConfig failure\n", "red")
end
-- ProfileConfig中参数分别对应Profile Id,Start Freq,Idle Time,ADC Start Time,Ramp End Time
-- 紧随其后的6个0 分别对应TX0 TX1 TX2 的Pwr Backoff和相移
-- 60.012对应调频斜率,0为TX START TIME, 1024为ADC采样点, 20000为ADC采样率, 30为接收天线增益
-- 下述代码块用于配置天线发射顺序 分别为TX0 TX2 TX1,TX2为垂直天线,TX0和TX1为水平天线
-- 发射天线TX0按第1次序发射 1 0 0
if (ar1.ChirpConfig(0, 0, 0, 0, 0, 0, 0, 1, 0, 0) == 0) then
WriteToLog("ChirpConfig Success\n", "green")
else
WriteToLog("ChirpConfig failure\n", "red")
end
-- 发射天线TX2按第2次序发射 0 1 0
if (ar1.ChirpConfig(2, 2, 0, 0, 0, 0, 0, 0, 1, 0) == 0) then
WriteToLog("ChirpConfig Success\n", "green")
else
WriteToLog("ChirpConfig failure\n", "red")
end
-- 发射天线TX1按第3次序发射 0 0 1
if (ar1.ChirpConfig(1, 1, 0, 0, 0, 0, 0, 0, 0, 1) == 0) then
WriteToLog("ChirpConfig Success\n", "green")
else
WriteToLog("ChirpConfig failure\n", "red")
end
-- 下面是和chirp组、帧信息相关的配置
if (ar1.FrameConfig(0, 2, 200, 64, 40, 0, 0, 1) == 0) then
WriteToLog("FrameConfig Success\n", "green")
else
WriteToLog("FrameConfig failure\n", "red")
end
--[[
0 表示 START CHIPR TX,2 表示 END CHIRP TX
200 表示帧数(No of Frames) 64表示每帧发几个Chirp
帧周期PERIODICITY 40ms 修改帧数和chirp对应要修改周期
延迟时间TRIGGER DDELAY 0 DUMMY CHIRPS 0
]]
一键系统
在上面,我们近乎是能够用一个lua
文件来实现解放双手、无需再点mmwave studio
中按键的功效了,但实际上还有一个问题,我们不是要先点set
和connect
才能到RUN
一键烧录lua
文件这个步骤么?我现在告诉你我直接烧lua
,我就不要点了??那究竟是怎么做到的呢?
其实这里需要用到一个客户端通信工具RtttNetClient
,对应可以在如C:\ti\mmwave_studio_02_01_01_00\mmWaveStudio\Clients
的路径下找到其执行文件。我们可以用Matlab
和通信客户端建立RSTD
连接,并将脚本lua
文件通过协议传输给客户端、执行脚本命令,完成配置。
那怎么样让MATLAB
能够和RtttNetClient
握手呢?请见以下程序。
function ErrStatus = Init_RSTD_Connection(RSTD_DLL_Path)
% 本文件用于和mmWaveStudio建立连接
% By Xuliang
if (strcmp(which('RtttNetClientAPI.RtttNetClient.IsConnected'),''))
% 在打开MATLAB后首先运行本代码
disp('Adding RSTD Assembly');
RSTD_Assembly = NET.addAssembly(RSTD_DLL_Path);
if ~strcmp(RSTD_Assembly.Classes{1},'RtttNetClientAPI.RtttClient')
disp('RSTD Assembly not loaded correctly. Check DLL path');
ErrStatus = -10;
return
end
Init_RSTD_Connection = 1;
elseif ~RtttNetClientAPI.RtttNetClient.IsConnected()
Init_RSTD_Connection = 1;
else
Init_RSTD_Connection = 0;
end
if Init_RSTD_Connection
disp('Initializing RSTD client');
ErrStatus = RtttNetClientAPI.RtttNetClient.Init();
if (ErrStatus ~= 0)
disp('Unable to initialize NetClient DLL');
return;
end
disp('Connecting to RSTD client');
ErrStatus = RtttNetClientAPI.RtttNetClient.Connect('127.0.0.1',2777);
if (ErrStatus ~= 0)
disp('Unable to connect to mmWaveStudio');
disp('Reopen port in mmWaveStudio. Type RSTD.NetClose() followed by RSTD.NetStart()');
return;
end
pause(1);
end
disp('Sending test message to RSTD');
Lua_String = 'WriteToLog("Running script from MATLAB\n", "green")';
ErrStatus = RtttNetClientAPI.RtttNetClient.SendCommand(Lua_String);
if (ErrStatus ~= 30000)
disp('mmWaveStudio Connection Failed');
end
disp('Test message success');
end
注意上述程序仅仅是让MATLAB
和mmwave studio
的客户端初始化、建立了通信连接,并未执行lua
文件烧录。下面,我们需要在Matlab
中定义一个发送参数配置程序
来告诉RtttNetClient
要烧录哪个lua
文件进行参数配置。
function RadarConfigure
% 功能:执行参数配置lua文件烧录
% By Xuliang
addpath(genpath('.\'))
RSTD_DLL_Path = 'C:\ti\mmwave_studio_02_01_01_00\mmWaveStudio\Clients\RtttNetClientController\RtttNetClientAPI.dll';
ErrStatus = Init_RSTD_Connection(RSTD_DLL_Path);
if (ErrStatus ~= 30000)
disp('Error inside Init_RSTD_Connection');
return;
end
strFilename = 'C:\\ti\\mmwave_studio_02_01_01_00\\mmWaveStudio\\Scripts\\DataCaptureDemo_1243.lua';
Lua_String = sprintf('dofile("%s")',strFilename);
ErrStatus = RtttNetClientAPI.RtttNetClient.SendCommand(Lua_String);
end
参数配置完成以后,自然是要进行采数据,那么如何采数据呢?我们需要在Matlab
中继续定义一个数据采集程序
来告诉RtttNetClient
要开始采集数据、采集数据的命名方法。按照传统TI
的采集数据方法,我们通常要采完数据后在文件夹中修改bin
名称,然后开始下一个数据的采集,这会令人觉得烦躁!那现在你只需要在以下程序中传入data_name
,就可以自动实现DCA1000
采集回传的数据放在哪个数据文件夹下,有助于提高实验效率。
function SendCaptureCMD(data_name)
% 功能:用于MATLAB发送指令给mmwave 控制DCA采集并回传数据
% By Xuliang
root_path = 'H:\MyDataset\DatasetFile\'; % 根路径名称
data_path = strcat(root_path,data_name);
mkdir(data_path); % 创建文件夹
%% 修改采集数据的脚本文件
str1 = strcat('adc_data_path="H:\\MyDataset\\DatasetFile\\',data_name,'\\adc_data.bin"'); % 设计bin文件目录
str = [str1,"ar1.CaptureCardConfig_StartRecord(adc_data_path, 1)","RSTD.Sleep(1000)","ar1.StartFrame()"];
fid = fopen('C:\ti\mmwave_studio_02_01_01_00\mmWaveStudio\Scripts\CaptureData1243.lua','w');
for i = 1:length(str)
fprintf(fid,'%s\n',str(i));
end
fclose(fid); % 关闭文件
%% 配置雷达数据采集
addpath(genpath('.\'))
% Initialize mmWaveStudio .NET connection
RSTD_DLL_Path = 'C:\ti\mmwave_studio_02_01_01_00\mmWaveStudio\Clients\RtttNetClientController\RtttNetClientAPI.dll';
ErrStatus = Init_RSTD_Connection(RSTD_DLL_Path);
if (ErrStatus ~= 30000)
disp('Error inside Init_RSTD_Connection');
return;
end
strFilename = 'C:\\ti\\mmwave_studio_02_01_01_00\\mmWaveStudio\\Scripts\\CaptureData1243.lua';
Lua_String = sprintf('dofile("%s")',strFilename);
ErrStatus = RtttNetClientAPI.RtttNetClient.SendCommand(Lua_String);
end
% 可参考的完整执行逻辑
% 可以做一个APP或GUI分块管理,笔者实现过,还是可以的。
clc;clear;close all;
% run('RadarConfigure.m'); % 第一次运行执行 后面需要注释掉
% 数据路径
root_path = 'H:\MyDataset\DatasetFile\'; % 根路径名称
data_name = 'TS2'; % 数据名称
data_path = strcat(root_path,data_name);
adc_file_name = strcat(data_path,'\adc_data_Raw_0.bin'); % 检测该文件夹下是否存在bin文件
SendCaptureCMD(data_name); % 发送采集数据的指令
其他信息
善于利用TI
官网寻找硬件配置解决的答案: https://e2echina.ti.com