硬件平台:ARS408毫米波雷达、can转485转换器、485转串口转换器
软件平台:Windows10、python3
本篇博客实现的功能:
一、通过两个转换器将毫米波雷达的原始数据传入电脑端的串口中
二、再将此数据经过python文件处理得出有效目标探测信息
一、硬件连接
本文中的雷达是利用can协议进行数据通讯,初次接触毫米波雷达,并不清楚如何进行can协议解析,故用曲线救国的方法,将can口转为串口进行数据接受和解析。
首先,毫米波雷达本身can口连接一个can转485转换器
其次,再用485转串口转换器连接到PC端
注:上述设备均可在淘宝购得。
二、软件编写
软件采用python语言。
首先解决打开串口、接收数据:
运用serial模块
转换为hex显示
import serial
import binascii
def byte_to_hexStr(byte):
return binascii.hexlify(byte).decode('utf-8')
def get_serial(): # 串口数据处理+接收
return byte_to_hexStr(ser.read())
ser = serial.Serial("COM3", 115200) # Open port with baud rate
print("running")
while True:
data = get_serial() # ser源读取数据
print(data)
解决数据解析:
依照此款毫米波提供的技术文档进行数据解析
文档中的内容如下:
![](https://img-blog.csdnimg.cn/img_convert/da854cfc6153a574cfd0ce7060709b91.png)
![](https://img-blog.csdnimg.cn/img_convert/b82b0aa958c24fb9f78b5ab2baa8a286.png)
![](https://img-blog.csdnimg.cn/img_convert/1d74707e473ab3439fceea462e39cf62.png)
代码如下:
def circular_shift_left(int_value, k, bit=8):
bit_string = '{:0%db}' % bit
bin_value = bit_string.format(int_value) # 8 bit binary
bin_value = bin_value[k:]
int_value = int(bin_value, 2)
#print("取低位:", bin_value)
return int_value
while True:
#雷达object报头“06 0b”,共9位
if get_serial() == "06":
for i in range(9):
list.insert(i, get_serial())
if list[0] == "0b":
print("有效数据", list[0:9])
#处理有效数据,转为目标信息
id = int(list[1], 16) # ID_wei = list[1]
x1 = int(list[2], 16) # X_Dist_1_wei = list[2]
x2 = int(list[3], 16) # X_Dist_2_wei = list[3]
y1 = int(list[3], 16) # Y_Dist_1_wei = list[3]
y2 = int(list[4], 16) # Y_Dist_2_wei = list[4]
xs1 = int(list[5], 16) # X_Speed_1_wei = list[5]
xs2 = int(list[6], 16) # X_Speed_2_wei = list[6]
ys1 = int(list[6], 16) # Y_Speed_1_wei = list[6]
ys2 = int(list[7], 16) # Y_Speed_2_wei = list[7]
dyndrop = int(list[7], 16) # DynDrop_wei = list[7]
rcs = int(list[8], 16) # RCS_wei = list[8]
X_Dist = (x1 << 5 | x2 >> 3) * 0.2 - 500
Y_Dist = (circular_shift_left(y1, 5, 8) << 8 | y2) * 0.2 - 204.6
X_Speed = (xs1 << 2 | xs2 >> 6) * 0.25 - 128.0
Y_Speed = (circular_shift_left(ys1, 2, 8) << 3 | ys2 >> 5) * 0.25 - 64.0
DynDrop = circular_shift_left(dyndrop, 5, 8)
RCS = rcs * 0.5 - 64.0
print('id:', id, 'X位移:', X_Dist, 'Y位移', Y_Dist, 'X速度:', X_Speed, 'Y速度:', Y_Speed, 'DD:', DynDrop, 'RCS:', RCS)
else:
pass