旧乡故客
发表于: 2020-1-8 22:28:52 | 显示全部楼层

德州仪器(TI)的XWR1642传感器是一个单封装的集成式毫米波雷达系统。该器件包含所有用于发送和接收76-81 GHz FMCW(频率调制连续波)信号的RF电路,并且带有TI C674x DSP和ARM Cortex-R4F,分别处理所有RF信号处理和应用代码。与其他雷达装置相比,该高频带具有许多优势。例如,毫米级精度和“透视”诸如塑料或衣服之类的物体或诸如雨或雾之类的元素干扰的能力。 TI提供了两种IC版本,分别是汽车版(AWR)或工业版(IWR),其中AWR版还具有一些其他汽车认证和一个额外的CAN接口。


本篇文章将在TI在其mmWave工具箱中提供的实验室基础上,演示开始使用AWR1642开发所需的步骤。目标应用程序是用于自主机器人的导航系统,尽管目前仅是模拟。来自汽车工具箱的TI短程雷达(SRR)实验室用作基本固件,因为它已经具有所有雷达配置和处理代码。


设置先决条件

在开始项目之前,需要进行很多设置和下载。由于本指南使用的是Automotive Toolbox中的项目,因此第一步将是下载该项目并从中获取文档。每个示例项目的所有先决条件都将包含在其中。

1.  在Code Composer中,选择View → Resource Explorer

2.  在Resource Explorer选项卡中,选择Software → mmWave Sensors

3.  双击Automotive Toolbox,然后选择最右边的“Install”按钮。

tirex.PNG


4.  Toolbox下载完成后,打开“Obstacle Detection”实验例程。

projects.PNG

5.  双击两个CCS项目(一个用于DSP,一个用于Cortex),然后单击右上角的Import to IDE按钮。

6.  默认情况下,Toolbox文件将安装到C:/TI/mmwave_automotive_toolbox_<version>。导航到那里,然后打开labs/lab0002_short_range_radar/docs/AutoSrr_usersguide.html。本手册介绍了项目及其构建的所有要求。

7.  本文不需要MATLAB Runtime,但是如果运行TI的GUI,则需要。请密切注意列出的版本,因为各种软件包的最新版本并不总是兼容的,尤其是mmWave SDK。下面提供了本文使用的重要软件包和版本。与CCS和mmWave SDK一起安装的其他软件包应该是正确的版本。

文件包
版本
mmWave Automotive Toolbox
2.5.0
mmWave SDK
2.0.0.04
SYS / BIOS
6.53.2.00
TI DSP编译器
8.1.3
TI ARM编译器
18.12.1.LTS

8.  右键单击项目,然后选择Properties → General,验证您的项目正在使用所有正确版本的软件包。第一个选项卡将显示编译器版本。单击Products选项卡查看正在使用的其他软件包。

versions.PNG

9.  此时,您应该能够通过右键单击并选择Rebuild Project来构建这两个项目。


调试设置

在实验室的《用户指南》中介绍了在AWR1642上使用调试所需的一些额外步骤,在此不再赘述。请参阅第4节(Execute the Lab),然后单击Expand for help with Debug mode按钮以启用通过Code Composer Studio进行编程和调试。


为避免出现问题,我在调试时使用以下方法复位设备:

1.  在“Debug”窗口中,右键单击“Group 1”,然后选择“Disconnect Target”。

2.  按下目标板上的复位按钮。这将重新运行调试程序。

3.  在“Debug”窗口中,右键单击“Group 1”,然后选择“Connect Target”。

4.  照常加载程序并进行调试。


解析示例代码

在两个示例项目中有很多代码可供筛选。包括大量的注释/文档,两个项目中的几个主要文件之间大约有1万行代码。本节将按处理器内核分组,对演示的核心功能提供一些最值得注意的部分的概述。另请参见srrdemo_16xx_mss / mss_main.c顶部的注释块,以获取有关项目的更完整描述。


尽管此示例使用了Short Range Radar实验例程,但mmWave Automotive和Industrial Toolbox包含的许多其他实验室例程采用类似的结构。以下某些信息可能适用于这些信息。


MSS(ARM)

在此演示中,ARM内核具有三个主要职责:从主机运行CLI进行配置,将雷达结果记录到串行端口,并运行稍后将添加的机器人导航应用程序。


命令行界面CLI

CLI初始化在mss_srr_cli.c文件的SRR_MSS_CLIInit()中定义。此处定义的大多数命令用于将配置设置传递给DSP。


如果要对应用程序使用任何自定义命令,则可以在此处添加它们。每个条目都需要一个命令字符串,一个帮助字符串和一个处理函数。以下是此应用程序的示例条目,该条目更新导航代码的目的地。

  1. cli.c - Example Snippet
复制代码

记录结果

将雷达结果写入UART发生在mss_main.c中的MmwDemo_mboxReadTask()中。此函数检查两个处理器之间在内存中共享的邮箱。如果消息中包含对象检测结果,则将它们直接通过UART发送。这些数据包的格式在实验室用户指南中进行了说明,因此在此不再赘述。我们将在本教程的后面部分中使用这些数据包。


运行导航算法

因为最后一步的MmwDemo_mboxReadTask()函数是ARM从DSP获取雷达数据的位置,所以它也是添加任何使用雷达数据的应用程序代码的好地方。检测到的对象数据位于结构的message.body元素中。

  1. mss_main.c - Snippet
复制代码

DSS(C674x)

您可能已经猜到了,DSP的工作是做数学运算。 dss_data_path.c包含大多数雷达处理代码。 MmwDemo_interFrameProcessing是主要处理函数,包含第二个雷达FFT以及CFAR,跟踪和其他过程。


回到dss_main.c文件中,MmwDemo_dssDataPathProcessEvents()是主事件处理程序,并调用数据路径函数进行处理。 MmwDemo_dssSendProcessOutputToMSS()是将所有雷达结果复制到共享邮箱的函数。结果消息将触发上面MmwDemo_mboxReadTask()函数中显示的MMWDEMO_DSS2MSS_DETOBJ_READY情况。


由于DSP已设置好本教程所需的对象检测处理,因此无需添加或修改其他任何内容。


导航

现在,障碍物检测由TI的固件处理,现在该对数据进行一些有用的操作了。在本文中,目标是找到假设的机器人绕过障碍物的最短路径。 Dijkstra的算法将用于执行搜索。


首先,需要定义机器人的几个特性。

●    TI的默认SRR雷达配置可在120度视野下提供约80m的最大检测距离。但是,这远远超出了此应用程序的要求,因此将使用20m USRR(超短距离雷达)设置。

●    假设机器人使用1m的网格进行导航。机器人的实际尺寸可以更小,但是1m可以留出更多的间隙(步长为1可使事情变得容易)。

●    网格空间之间允许正交和对角线移动。

     ●    允许向前和向后移动,但从技术上讲,雷达只能“看到”向前。


使用此信息,我们可以开始构建导航代码。它由3层组成:图形,地图和界面层。如果从上方下载了项目源文件,则这些文件将已经包含在项目中的导航目录下。


图层

图形级别是导航应用程序的最低级别。图由节点和节点之间的连接组成。在本文中,因为允许机器人移动到任何相邻的网格空间,所以每个节点都连接到其所有邻居。例如,一个3x3的图形如下所示:

graph_diagram.png

在此级别上,图形不了解坐标。它所知道的就是有一个节点数组以及它们如何相互连接。


地图层

地图层建立在图形层的顶部,并将诸如(-1,3)之类的现实世界坐标映射到基础图形节点上。图节点除连接外不包含其他信息,而地图层中的节点在该位置包含x,y坐标和障碍物状态。外部地图结构还包含当前目的地和为此计算的最后一条最短路径。


因此,从上方在地图层的3x3示例将类似于下图,其中红色节点被阻塞,绿色节点被清除。

map_diagram.png

如果机器人想从(0,0)到(0,2)行驶并看到(0,1)被阻塞,则Dijkstra的算法将运行并导致(0,0)→(1,1)→( 0,2)。


接口层

接口层是TI检测代码与地图层交互的地方。此处的功能用于更新地图节点的障碍物状态,将计算出的路径添加到UART数据包,以及使用CLI更新地图的目的地。


navigationInit()函数是对地图和图形结构进行初始化的地方。雷达的最大检测距离设置为大约20m,但是本教程的假设机器人不需要看到那么远。因此,导航坐标范围在x轴上设置为-10到10,在y轴上设置为-1到10。原点应始终设置为(0,-1),因为机器人将始终从雷达原点正后方的任何空间开始移动。


updateMapFromRadar()将来自雷达的障碍物数据加载到地图中。该函数接收指向驻留在邮箱消息中的检测结果的指针,但是实际数据仍在DSP的内存中。由于指向此数据的指针是由DSP创建的,因此MSS必须先转换地址,然后才能访问任何数据。


appendPathTLV()用于将路径计算结果注入DSP创建的帧中。这使得TI现有串行帧结构的扩展几乎没有中断。与最后一步中的地址转换一样,这里还有另一个“陷阱”。


可视化

在没有物理机器人的情况下,将使用图表来可视化机器人将遵循的路径。 TI使用MATLAB实现了他们的GUI,并提供了脚本的编译版本。如果您没有MATLAB许可证,则修改起来并不容易。因此,本文将使用免费且易于访问的Python来实现类似的结果。可视化结果的示例如下所示。

plot2.0.png


框架结构

在Python程序的最底层,我们镜像了嵌入式设备用来将二进制数据转换成更易于阅读的形式的结构。 frame.py定义了Frame类,该类代表来自雷达的一个完整数据包。类构造函数的输入是从串行端口接收的整个字节字符串。然后使用struct.unpack将字符串解析为标头的各种参数以及每个包含的TLV(类型长度值)数据向量,以将序列化的C结构转换为结构元素的Python元组。


AWR1642的串行帧采用Little Endian格式,需要进行相应转换。


串行接口

下一个级别是使用PySerial实现的实际串行接口。该接口打开雷达板的控制和数据串行端口,并将数据读入队列。每个COM端口都有自己的Tx和Rx队列以及自己的线程,以便它们可以独立于程序的其余部分运行。


接口使用frames.py中提供的数据,检查帧“魔术字”的开始。当检测到新帧时,将读取由帧类型指定的字节数,直到接收到总数据包长度为止。该接口读取数据包的总长度,并将结果帧放入接收队列,以供主应用程序处理。


绘图

使用Matplotlib绘制检测到的点和路径结果。其中有障碍物的区域标记为红色,而路径上的区域标记为绿色。每个区域均为1m正方形,因为地图的分辨率先前已定义为1m。带框的区域使您更容易看到地图节点(0,0)对应于介于0和1之间的真实世界正方形区域。


Matplotlib的动画API用于定期更新和绘制对绘图的任何更改。最终,来自雷达和机器人的数据在进行绘制之前会进行一些最终格式化。


主要用途

主应用程序将所有内容连接在一起。它的工作是从串行接口获取数据,将其转换为Frame实例,然后将Frame的数据发送到绘图中。为了确保所有内容一起运行,主应用程序创建了一个单独的线程来处理雷达帧的读取和处理。该线程还将每15秒更新一次导航到新随机位置的目的地。它还创建用于在所有线程之间传递数据的队列。最后,它创建在主线程中运行的绘图。该演示将一直运行,直到关闭绘图窗口。


运行演示程序

1.  从上面的资源部分下载项目源文件。

2.  从上面完成前提条件和调试步骤。

3.  在Code Composer Studio中,右键单击srrdemo_16xx_mss,然后选择 Import → Import... → General → File System

4.  在步骤1中从下载的源文件中导入所有内容。

import.PNG

5.  询问时覆盖现有的TI源文件。

6.  选择两个项目,单击鼠标右键,然后选择“重建项目”以进行清理和构建。

build.png

7.  使用实验室用户手册中的调试说明对板进行编程,或者使用最后一步中生成的.bin文件和Uniflash对板进行编程。一旦编程,该板将等待配置。

8.  安装所需的Python软件包。最好在虚拟环境中。

  1. pip install
复制代码

9.  运行可视化器,请将开发板连接到PC并指定其创建的串行端口。仅当尚未启动AWR1642时,才需要--reconfig标志。如果只停止并重新运行Python脚本,则无需重新配置该板。

  1. Run Demo
复制代码

结论

本文通过在TI示例的基础上构建机器人导航应用程序,逐步指导了开始使用德州仪器(TI)的XWR1642 mmWave传感器套件进行开发的步骤。尽管这是一个非常简单的路径规划实施,但它应该为那些希望将mmWave雷达纳入其自身项目的人们提供一个起点。下一步的行动是将其集成到实际的机器人中,并改善路径结果的粒度,而不是单纯的1m平方方法。

跳转到指定楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 15 | 回复: 22



手机版|

GMT+8, 2024-4-27 08:48 , Processed in 0.040125 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表