This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] IWR1843:如何使用 GUI 输出等 Python 生成距离多普勒热图 (TLV 类型 5)

Guru**** 2399305 points
Other Parts Discussed in Thread: IWR1843

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1534964/iwr1843-how-to-generate-range-doppler-heatmap-tlv-type-5-in-python-like-gui-output

部件号:IWR1843

工具/软件:

您好:

我正在使用 IWR1843 并尝试生成 距离多普勒热图 消息流 Python 、类似于 TI 毫米波演示可视化工具 GUI 中所示的图形。

我已经解析 TLV 5 型数据并对其进行了可视化、但结果与 GUI 的热图在外观或振幅分布方面不匹配。 请查看下面的图像、这是由我的代码生成的结果。

我想问以下问题:

  1. 什么是 正确的程序 如何将 TLV 5 型数据转换为 GUI 等效的距离 — 多普勒热图?

  2. TI 是否提供任何技术 官方或示例 Python 代码 完全复制 GUI 输出(例如窗口化,FFT 阶跃,缩放)?

  3. 中的正确设置是什么 CFG 文件 输出该数据的方式与 GUI 相同?

我的 Python 代码(TLV 类型 5 解析):

def read_header(Data_port):
    read_buffer = Data_port.read(Data_port.in_waiting)
    byte_vec = np.frombuffer(read_buffer, dtype='uint8')
    byte_count = len(byte_vec)

    header_parameters = {}
    header_parameters["header_start_index"] = -1

    if byte_count > 40:
        for index in range(byte_count):
            if check_magic_word(byte_vec[index:index+8:1]):
                header_parameters["header_start_index"] = index
                break
    
    
    if header_parameters["header_start_index"] != -1:
        index = header_parameters["header_start_index"]
        header_parameters["magic_word"] = byte_vec[index:index+8:1]
        header_parameters["version"] = format(get_uint32(byte_vec[index+8:index+12:1]), 'x')
        header_parameters["total_packet_length"] = get_uint32(byte_vec[index+12:index+16:1])
        header_parameters["platform"] = format(get_uint32(byte_vec[index+16:index+20:1]), 'x')
        header_parameters["frame_number"] = get_uint32(byte_vec[index+20:index+24:1])
        header_parameters["time_in_cpu_cycles"] = get_uint32(byte_vec[index+24:index+28:1])
        header_parameters["num_detected_obj"] = get_uint32(byte_vec[index+28:index+32:1])
        header_parameters["num_TLVs"] = get_uint32(byte_vec[index+32:index+36:1])
        header_parameters["sub_frame_number"] = get_uint32(byte_vec[index+36:index+40:1])
        header_OK = True
    else:
        header_OK = False

    return header_OK, header_parameters, byte_vec


def read_data(Data_port):
    header_OK, header_parameters, byte_vec = read_header(Data_port)

    if header_OK and header_parameters["num_detected_obj"] > 0:
        tlv_start_index = header_parameters["header_start_index"] + 40

        tlv_len_1 = get_uint32(byte_vec[tlv_start_index + 4:tlv_start_index + 8])
        tlv_start_index += 8 + tlv_len_1

        tlv_len_2 = get_uint32(byte_vec[tlv_start_index + 4:tlv_start_index + 8])
        tlv_start_index += 8 + tlv_len_2

        tlv_type = get_uint32(byte_vec[tlv_start_index : tlv_start_index + 4])
        tlv_len  = get_uint32(byte_vec[tlv_start_index + 4 : tlv_start_index + 8])

        print("The no.3 TLV") 
        print("    type %d" % (tlv_type))
        print("    len %d bytes" % (tlv_len))

        if tlv_type == 5:
            start = tlv_start_index
            end = tlv_start_index + tlv_len

            if (end > len(byte_vec)):
                print("This frame cannot read all TLV type 5.")
                return

            heatmap_payload = byte_vec[start:end]

            expected_len = 256 * 32 * 2  

            if len(heatmap_payload) != expected_len:
                print(f"Length of data no full. {len(heatmap_payload)} ≠ {expected_len} return")
                return

            range_doppler_int16 = np.frombuffer(heatmap_payload.tobytes(), dtype='<i2')

            if range_doppler_int16.size != 256 * 32:
                print(f"Length of data no full. {range_doppler_int16.size} ≠ 256 * 32 return")
                return

            rangeDoppler = np.reshape(range_doppler_int16, (256, 32), order='F')
            rangeDoppler = np.append(rangeDoppler[128:], rangeDoppler[:128], axis=0)

            rangeArray = np.arange(32) * 0.042
            dopplerArray = np.arange(-128, 128) * 0.04

            plt.figure(figsize=(8, 6))
            plt.contourf(rangeArray, dopplerArray, rangeDoppler, levels=50, cmap='jet')
            plt.xlabel("Range (m)")
            plt.ylabel("Velocity (m/s)")
            plt.title("Range-Doppler Heatmap")
            plt.colorbar(label="Amplitude")
            plt.savefig("range_doppler_heatma2.png", dpi=300)
            plt.close()

CFG 设置:

sensorStop
flushCfg
dfeDataOutputMode 1
channelCfg 15 7 0
adcCfg 2 1
adcbufCfg -1 0 1 1 1
lowPower 0 0
profileCfg 0 77 7 3 39 0 0 100 1 256 7200 0 0 30
chirpCfg 0 0 0 0 0 0 0 1
chirpCfg 1 1 0 0 0 0 0 4
chirpCfg 2 2 0 0 0 0 0 2
frameCfg 0 2 32 0 100 1 0
guiMonitor -1 1 0 0 0 1 0
cfarCfg -1 0 2 8 4 3 0 15.0 0
cfarCfg -1 1 0 4 2 3 1 15.0 0
multiObjBeamForming -1 1 0.5
calibDcRangeSig -1 0 -5 8 256
clutterRemoval -1 0
compRangeBiasAndRxChanPhase 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
measureRangeBiasAndRxChanPhase 0 1. 0.2
aoaFovCfg -1 -90 90 -90 90
cfarFovCfg -1 0 0.25 4.65
cfarFovCfg -1 1 -7.06 7.06
extendedMaxVelocity -1 0
CQRxSatMonitor 0 3 11 121 0
CQSigImgMonitor 0 127 8
analogMonitor 0 0
lvdsStreamCfg -1 0 0 0
calibData 0 0 0
sensorStart

输出与 GUI:

感谢您的支持。 如果您有任何指导或官方资源来使我的输出与 GUI 结果保持一致、我将不胜感激。

此致、
Xiao

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Xiao。

    什么是 正确的程序 将 TLV 5 型数据转换为 GUI 等效的距离多普勒热图?

    如果您提到演示可视化工具代码如何解析它、您可以复制解析结构并以相同的方式在 python 中绘制。  此外、您可以参考应用可视化工具源代码、了解如何解析 UART 流以及如何从 UART 流中提取热图数据。

    TI 是否提供任何内容 官方或示例 Python 代码 完全复制 GUI 输出(例如窗口化,FFT 阶跃,缩放)?

    目前、我们没有任何 python 源代码来复制在演示可视化工具上完成的距离多普勒热图绘图。

    中的正确设置是什么 CFG 文件 以与 GUI 相同的方式输出此数据的

    只要通过可视化工具传递的配置与尝试使用 python 解析器时传递 cfg 的方式相同、并且环境完全相同、那么如果解析和正确处理数据、则输出应该相同。  在绘图之前、我要检查可视化工具是否在提取热图数据(如缩放)后执行任何额外的处理、这些数据可能会产生不同的输出。

    此致、

    Santosh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Santosh:

    非常感谢您的答复和指导。

    我找到了演示可视化工具内用于处理 TLV 5 型数据的相关代码。 我怀疑我的问题可能在于我如何rangeDoppler从原始数据重建矩阵。

    下面是我处理热图有效载荷的 Python 代码部分:

    range_doppler_int16 = np.frombuffer(heatmap_payload.tobytes(), dtype='<i2')
    rangeDoppler = np.reshape(range_doppler_int16, (256, 32), order='F')
    

    我将尝试通过引用演示可视化工具中使用的逻辑来调整我的解析和可视化、尤其是在绘图之前如何转换和缩放字节流。

    如果我仍然遇到任何问题、我希望我能再次联系以获得进一步的建议。

    再次感谢您的支持。

    此致、
    Xiao

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    太棒了!  如果您有任何新问题、请随时打开新主题!

    此致、

    Santosh