帧头部 | 帧内数据 | 帧尾部 |
---|---|---|
AA FF 03 00 | 目标 1 信息 目标 2 信息 目标 3 信息 | 55 CC |
其中单个目标具体包含的信息:
目标 x 坐标 | 目标 y 坐标 | 目标速度 | 像素距离值 |
---|---|---|---|
signed int16 类型;最高位 1 对应正坐标,0 对应负坐标;其余 15 位代表 x 坐标绝对值,单位 mm | signed int16 类型;最高位 1 对应正坐标,0 对应负坐标;其余 15 位代表 y 坐标绝对值,单位 mm | signed int16 类型;最高位 1 对应正向速度,0 对应负向速度;其余 15 位代表速度绝对值,单位cm/s | Uint16 类型;单个像素距离值,单位mm。 |
数据示例:AAFF0300 OE03 B186 1000 6801 00 00 00 00 00 00 00 00 00 00000000 00 00 00 55 CC
该组数据表示雷达跟踪到了一个目标即目标 1(示例中蓝色字段),目标2 和目标3(分别对应示例中的红色和黑色字段)不存在,故其相应数据段为Ox00。模组将目标1 的数据转换为相关信息的过程展示如下:
目标 1x 坐标:OxOE+Ox03256= 782
0-782= -782 mm;
目标 1y 坐标:OxB1+Ox86256 = 34481
34481-2^15= 1713 mm;
目标 1 速度:0x10 + OxO0 * 256= 16
0-16=-16 cm/s;
目标 1 距离分辨率:Ox68+Ox01*256= 360 mm。
前3个数字,就是前6个字节,都是2字节符号数,但不是正常的符号数,无法直接作为int16用,很不合理,需要特殊处理。而且浪费了-0
这么一个有效数字。
这里提供一个转换函数为:
int16_t parseData(uint8_t *data, int index) {
# 移除符号位,合并为一个数字
int16_t x = (((uint8_t)(data[index] << 1)) << 7) | data[index + 1];
// 加上符号位,首位为1是正数,首位为0是负数
if (data[index] >> 7 == 0) {
x = -x;
}
// printf(" %d , %02X, %02X", x, x, -x);
return x;
}
距离计算,勾股定理:
float dd = powf(powf(x, 2) + powf(y, 2), 0.5f);