Rd-03D串口协议

帧头部帧内数据帧尾部
AA FF 03 00目标 1 信息 目标 2 信息 目标 3 信息55 CC

其中单个目标具体包含的信息:

目标 x 坐标目标 y 坐标目标速度像素距离值
signed int16 类型;最高位 1 对应正坐标,0 对应负坐标;其余 15 位代表 x 坐标绝对值,单位 mmsigned int16 类型;最高位 1 对应正坐标,0 对应负坐标;其余 15 位代表 y 坐标绝对值,单位 mmsigned int16 类型;最高位 1 对应正向速度,0 对应负向速度;其余 15 位代表速度绝对值,单位cm/sUint16 类型;单个像素距离值,单位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+Ox86
256 = 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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值