TOFSense 协议
该教程面向基于TOFSense原始数据做开发的开发者,如机器人、无人机、终端导航设备等。通过UART接口可获得TOF测距、距离状态指示、信号强度等信息,通信格式为十六进制。
1 UART概述
用户可以通过UART接口获取测距结果。默认情况下,模块会固定按照特定的频率向921600波特率下的串口以小端模式持续发送协议数据,具体数据不同型号的TOFSense会有部分差异,请参考各型号的TOFSense产品手册。数据以小端模式输出。
1.1 主动输出
TOFSense系列:
TOFSense-F系列:
TOFSense-M系列:
1.2 解析示例
通过UART获取的数据以十六进制存储,为了更直观的观测定位信息,需要转化为十进制,可以参考下面解析示例。
1.2.1 TOFSense系列、TOFSense-F系列
完整一帧十六进制数据: 57 00 ff 00 9e 8f 00 00 ad 08 00 00 03 00 06 41
id : 十六进制 0x00 转化为十进制 0 。
system_time : 十六进制 0x00008f9e 转换为十进制 36766,本地时间为从上电开始计算36766ms。
dis : 十六进制 0x0008ad 转换为十进制 2221 除以缩放因子1000,测距值为2.221m。
PS:如何转化?
uint8_t byte[] = {0x00,0x08,0xad};//代表十进制数值:2.221m
//uint8_t byte[] = {0xec,0xfb,0xff};//代表十进制数值:-1.044
int32_t temp = (int32_t)(byte[0] << 8 | byte[1] << 16 | byte[2] << 24) / 256;
float result = temp/1000.0f;
dis_status : 十六进制 0x00 转换为十进制 0,距离状态指示,该参数是模块给到用户用来参考当前测距值是否有效,不同型号的TOFSense具有不同的距离状态指示详见对应的Datasheet。
signal_strength : 十六进制 0x0003 转换为十进制 3,信号强度,取值范围0-65535,一般来说反应当前TOF
1.2.2 TOFSense-M/MS
而对于TOFSense-M系列,由于具有64个像素点所以其原始数据数量较大,一帧完整数据为400个字节
完整一帧十六进制数据: 57 01 ff 00 03 a0 00 00 40 e0 81 07 00 9f 00 f0 43 03 00 58 00 c0 c8 03 00 55 00 90 e2 00 00 44 00 d0 84 00 00 57 00 18 79 00 00 61 00 e8 80 00 00 7a 00 90 65 00 00 8e 00 d8 d0 01 00 27 00 e8 74 02 00 28 00 00 f4 01 00 2e 00 f8 a7 00 00 39 00 50 c3 00 00 41 00 30 75 00 00 5b 00 70 94 00 00 61 00 00 7d 00 00 9b 00 30 e0 03 00 19 00 c8 79 09 00 1a 00 28 cf 0d 00 3a 00 b0 b3 00 00 20 00 30 75 00 00 31 00 60 6d 00 00 40 00 e8 80 00 00 4b 00 d0 84 00 00 71 00 40 3c 10 00 1e 00 88 b3 0f 00 24 00 20 b9 03 00 12 00 e8 26 0f 00 34 00 f0 d2 00 00 2c 00 c8 af 00 00 30 00 58 98 00 00 3a 00 f8 a7 00 00 47 00 d8 ed 11 09 1c 00 60 84 11 00 1c 00 e0 c8 10 00 21 00 d0 a1 10 00 25 00 88 90 00 00 1c 00 e0 ab 00 00 24 00 18 79 00 00 41 00 08 cf 00 00 41 00 68 47 14 ff 0b 00 c8 b4 14 00 0e 00 20 d6 13 00 11 00 d8 e1 13 00 14 00 d0 84 00 00 1d 00 f0 6c 11 00 19 00 a0 8c 00 00 47 00 90 65 00 00 50 00 88 41 22 ff 12 00 e8 f6 16 00 07 00 80 31 17 ff 0b 00 70 10 16 00 0c 00 40 9c 00 00 20 00 f8 a7 00 00 32 00 80 bb 00 00 33 00 a0 8c 00 00 50 00 90 d6 02 ff 2c 00 b0 e1 22 ff 0b 00 40 19 01 ff 10 00 d8 d6 00 ff 11 00 28 a0 00 00 25 00 e8 80 00 00 2b 00 c8 af 00 00 25 00 90 65 00 00 3c 00 ff ff ff ff ff ff 7d
id : 十六进制 0x00 转化为十进制 0 。
system_time : 十六进制 0x0000a003 转换为十进制 40963,本地时间为从上电开始计算40963ms。
zone_map : 十六进制 0x40 转换为十进制 64,当前模式像素点数量。
- pixel0 :
- dis : 十六进制 0x0781e0 转换为十进制 492000 除以缩放因子1000,测距值为492mm
- dis_status : 十六进制 0x00 转换为十进制 0,距离状态指示
- signal_strength : 十六进制 0x009f 转换为十进制 159,信号强度
- pixel1 :
- dis : 十六进制 0x0343f0 转换为十进制 214000 除以缩放因子1000,测距值为214mm。
- dis_status : 十六进制 0x00 转换为十进制 0,距离状态指示
- signal_strength : 十六进制 0x0058 转换为十进制 88,信号强度 ... ...
- pixel63 :
- dis : 十六进制 0x006590 转换为十进制 26000 除以缩放因子1000,测距值为26mm。
- dis_status : 十六进制 0x00 转换为十进制 0,距离状态指示
- signal_strength : 十六进制 0x003c 转换为十进制 60,信号强度
1.3 查询输出
在查询模式下,模块不会主动输出数据,需要用户发送特定的查询帧,模块才会返回数据帧,查询帧数据格式如下图。
已id被设置为3、UART查询模式的模块为例,如果 想要获取该模块的数据则需要向该模块发送的查询指令应为 57 10 ff ff 03 ff ff 66。
对于所有型号的TOFSense在UART查询模式下的查询帧均为上述格式,只需要对于不同模块的ID进行替换以及更新校验和即可。
1.4 代码示例
2 CAN概述
用户可以通过CAN接口获取测距结果。默认情况下,模块会固定按照特定的频率向1M波特率下的CAN以小端模式持续发送协议数据,具体数据不同型号的TOFSense会有部分差异,请参考各型号的TOFSense产品手册。数据以小端模式输出。
仅TOFSense系列与TOFSense-M系列产品支持CAN通信。
2.1 主动输出
对于TOFSense/S型号一次传 输数据帧按照上述格式输出一帧数据,而TOFSense-M/MS因为其像素点的特殊性以及CAN总线传输特性,该系列会在一次通信过程中连续传输64/16(8*8/4*4模式)条数据
2.2 解析示例
通过CAN获取的数据以十六进制存储,为了更直观的观测定位信息,需要转化为十进制,可以参考下面解析示例。
2.2.1 TOFSense系列
完整一帧十六进制数据:
StdID:0x201+Data:ad 08 00 00 03 00 ff ff
id : 十六进制 0x201,减去固定0x200偏移,0x201-0x200 = 0x01 转换为十进制 1。
dis : 十六进制 0x0008ad 转换为十进制 2221 除以缩放因子1000,测距值为2.221m。 PS:距离如何转化?
uint8_t byte[] = {0x00,0x08,0xad};//代表十进制数值:2.221m
//uint8_t byte[] = {0xec,0xfb,0xff};//代表十进制数值:-1.044
int32_t temp = (int32_t)(byte[0] << 8 | byte[1] << 16 | byte[2] << 24) / 256;
float result = temp/1000.0f;
dis_status : 十六进制 0x00 转换为十进制 0,距离状态指示,该参数是模块给到用户用来参考当前测距值是否有效,不同型号的TOFSense具有不同的距离状态指示详见对应的Datasheet。
signal_strength : 十六进制 0x0003 转换为十进制 3,信号强度,取值范围0-65535,一般来说反应当前TOF
2.2.2 TOFSense-M系列
而对于TOFSense-M系列,由于具有64个像素点所以其原始数据数量较大,而CAN一次只能传输8个字节的数据,所以会连续发出64帧数据,通过帧尾的index区分每一帧数据。 以下是一次完整传输的原始十六进制数据:
StdID:0x201+Data:9D 08 00 00 19 00 00 00
StdID:0x201+Data:CC 08 00 00 19 00 01 00
StdID:0x201+Data:C8 08 00 00 1F 00 02 00
StdID:0x201+Data:C2 08 00 00 1A 00 03 00
StdID:0x201+Data:C0 08 00 00 1B 00 04 00
StdID:0x201+Data:BD 08 00 00 1A 00 05 00
StdID:0x201+Data:D5 08 00 00 11 00 06 00
StdID:0x201+Data:D4 08 00 00 1F 00 07 00
StdID:0x201+Data:A6 08 00 00 17 00 08 00
StdID:0x201+Data:D4 08 00 00 14 00 09 00
StdID:0x201+Data:AF 08 00 00 1C 00 0A 00
StdID:0x201+Data:A4 08 00 00 15 00 0B 00
StdID:0x201+Data:C4 08 00 00 17 00 0C 00
StdID:0x201+Data:EA 08 00 00 17 00 0D 00
StdID:0x201+Data:D1 08 00 00 1C 00 0E 00
StdID:0x201+Data:BD 08 00 00 14 00 0F 00
StdID:0x201+Data:B5 08 00 00 1B 00 10 00
StdID:0x201+Data:BF 08 00 00 1B 00 11 00
StdID:0x201+Data:CB 08 00 00 1E 00 12 00
StdID:0x201+Data:D9 08 00 00 1E 00 13 00
StdID:0x201+Data:E1 08 00 00 1B 00 14 00
StdID:0x201+Data:DB 08 00 00 1B 00 15 00
StdID:0x201+Data:C7 08 00 00 1E 00 16 00
StdID:0x201+Data:DA 08 00 00 16 00 17 00
StdID:0x201+Data:B4 08 00 00 1A 00 18 00
StdID:0x201+Data:CA 08 00 00 18 00 19 00
StdID:0x201+Data:DF 08 00 00 1E 00 1A 00
StdID:0x201+Data:DB 08 00 00 23 00 1B 00
StdID:0x201+Data:E4 08 00 00 1D 00 1C 00
StdID:0x201+Data:E4 08 00 00 1D 00 1D 00
StdID:0x201+Data:D8 08 00 00 16 00 1E 00
StdID:0x201+Data:F6 08 00 00 19 00 1F 00
StdID:0x201+Data:C2 08 00 00 18 00 20 00
StdID:0x201+Data:B7 08 00 00 1D 00 21 00
StdID:0x201+Data:E6 08 00 00 1A 00 22 00
StdID:0x201+Data:D9 08 00 00 24 00 23 00
StdID:0x201+Data:F0 08 00 00 21 00 24 00
StdID:0x201+Data:00 09 00 00 17 00 25 00
StdID:0x201+Data:E9 08 00 00 13 00 26 00
StdID:0x201+Data:DA 08 00 00 15 00 27 00
StdID:0x201+Data:B2 08 00 00 1D 00 28 00
StdID:0x201+Data:CA 08 00 00 1C 00 29 00
StdID:0x201+Data:C5 08 00 00 17 00 2A 00
StdID:0x201+Data:D6 08 00 00 1E 00 2B 00
StdID:0x201+Data:E7 08 00 00 1E 00 2C 00
StdID:0x201+Data:F6 08 00 00 15 00 2D 00
StdID:0x201+Data:17 09 00 00 15 00 2E 00
StdID:0x201+Data:FF 08 00 00 14 00 2F 00
StdID:0x201+Data:B4 08 00 00 19 00 30 00
StdID:0x201+Data:C0 08 00 00 1C 00 31 00
StdID:0x201+Data:C0 08 00 00 1C 00 32 00
StdID:0x201+Data:D1 08 00 00 1C 00 33 00
StdID:0x201+Data:DE 08 00 00 18 00 34 00
StdID:0x201+Data:DD 08 00 00 18 00 35 00
StdID:0x201+Data:EB 08 00 00 16 00 36 00
StdID:0x201+Data:CB 08 00 00 13 00 37 00
StdID:0x201+Data:B4 08 00 00 17 00 38 00
StdID:0x201+Data:B9 08 00 00 1C 00 39 00
StdID:0x201+Data:D3 08 00 00 21 00 3A 00
StdID:0x201+Data:E5 08 00 00 19 00 3B 00
StdID:0x201+Data:D9 08 00 00 18 00 3C 00
StdID:0x201+Data:D5 08 00 00 1C 00 3D 00
StdID:0x201+Data:E7 08 00 00 1A 00 3E 00
StdID:0x201+Data:09 09 00 00 19 00 3F 00
- pixel0 :
- dis : 十六进制 0x00089D 转换为十进制 2205 除以缩放因子1000,测距值为2.205m
- dis_status : 十六进制 0x00 转换为十进制 0,距离状态指示
- signal_strength : 十六进制 0x0019 转换为十进制 25,信号强度
- index : 十六进制 0x00 转换为十进制 0,代表此帧数据应为Pixel0的数据。
- pixel1 :
- dis : 十六进制 0x0008cc 转换为十进制 2252 除以缩放因子1000,测距值为2.252m。
- dis_status : 十六进制 0x00 转换为十进制 0,距离状态指示
- signal_strength : 十六进制 0x0019 转换为十进制 25,信号强度
- index : 十六进制 0x01 转换为十进制 1,代表此帧数据应为Pixel1的数据。 ... ...
- pixel63 :
- dis : 十六进制 0x000909 转换为十进制 2313 除以缩放因子1000,测距值为2.313m。
- dis_status : 十六进制 0x00 转换为十进制 0,距离状态指示
- signal_strength : 十六进制 0x0019 转换为十进制 25,信号强度
- index : 十六进制 0x3F 转换为十进制 63,代表此帧数据应为Pixel63的数据。
2.3 查询输出
在查询模式下,模块不会主动输出数据,需要用户发送特定的查询帧,模块才会返回数据帧,查询帧数据格式如下图。
以id被设置为3、UART查询模式的模块为例,如果想要获取该模块的数据则需要向该模块发送的查询指令应为
StdID:0x402+Data:ff ff ff 01 ff ff ff ff。
其中StdID固定为0x402,用户正常使用中只需要修改Data中的id即可。 TOFSense/-UART/S:
TOFSense-M/MS:
对于所有型号的TOFSense在UART查询模式下的查询帧均为上述格式,只需要对于不同模块的ID进行替换以及更新校验和即可。c语言发送函数示例(HAL库):
2.4 代码示例
3 IIC概述
对于TOFSense-F系列模块,用户可以通过NAssistant上位机修改模式后,使用IIC接口获取测距结果。数据以小端模式输出。
在IIC模式下需要用户主动访问对应寄存器才能获取数据。
3.1 寄存器表
获取数据流程
读取0x24寄存器的4字节数据转化为距离,建议同时读取0x28的寄存器中的距离状态指示以及信号强度结合使用。