Dashboard CSV日志格式
本章的整洁、易读HTML版本。
本页以HTML形式完整呈现《接口与协议》中的“Dashboard CSV日志格式”一章。如有不清楚之处,请打开 本章原始PDF(第111-126页)(中文) (左上角也有固定链接)。总览: 全部章节.
CSV日志文件格式(Dashboard V7.000及以上版本)
在Dashboard V7.000及以上版本的CSV日志文件中,每个事件记录为一行CSV,不同事件对应不同的行格式。同时,所有类型的行开头部分相同。
以下为CSV日志文件中的几行示例:
T2021_11_04__173001_581,user,41,17,14,4.675,2.714,0.250,2,975,100
T2021_11_04__173001_581,user,41,17,15,4.665,2.708,0.250,2,975,114
T2021_11_04__173001_581,user,41,17,26,4.073,1.987,0.250,2,3462,128
T2021_11_04__173001_581,user,41,17,27,4.075,1.987,0.250,2,3462,141
T2021_11_04__173001_581,user,41,17,28,3.588,1.979,0.250,2,3496,155
T2021_11_04__173001_581,user,41,17,29,3.592,1.978,0.250,2,3496,169
T2021_11_04__173001_701,user,43,15,nl
T2021_11_04__173001_728,user,43,27,nl
T2021_11_04__173001_756,user,43,29,nl
行的公共部分包括前3个字段:
“T2021_11_04__173001_581” – 该行数据的时间戳:2021.11.04,17:30:01.581;
“user” – 用户名(预留)。今后的Dashboard版本将支持用户登录;
“41” – 行类型ID。不同行类型的后续字段格式不同。
数据字段中有一些通用特殊代码:
“nl” – 无许可证。填写此字段需要相应的许可证;
“na” – 不适用。此字段无相关数据。例如,如果移动信标未能成功定位,X、Y、Z坐标字段将为“na”。
以下各节介绍不同类型的行。
行类型ID 01 – 地图文件链接
当地图文件被自动保存或用户按下“Save map”按钮时,记录此行。
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 01 – 行类型ID(地图文件链接) |
3 | 当时保存的地图文件名 |
行类型ID 41 – Marvelmind协议流记录
当“Interfaces”部分的调制解调器协议设置为“Marvelmind”时,记录此行。
Marvelmind协议 包含不同类型的记录,分别对应日志文件中的不同行,详见以下各小节。
移动信标位置(41 17)或(41 129)
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 41 – 行类型ID(Marvelmind协议流) |
3 | 17 (0x0011) – 移动信标位置的数据代码 129 (0x0081) – 移动信标位置的数据代码(带实时时间戳流) |
4 | 移动信标地址 |
5 | 移动信标X坐标,米 |
6 | 移动信标Y坐标,米 |
7 | 移动信标Z坐标,米 |
8 | 标志: 位0:1 – 坐标不可用,不应使用X、Y、Z字段的数据。 位1…6:保留 位7:1 – 超出地理围栏区域 |
9 | 偏航角及标志: 位0…11:移动信标对的偏航角,单位0.1度(0…3600) 位12:1 – 坐标为信标对的中心;0 – 坐标为指定移动信标的位置 |
10 | 时间偏移,毫秒。从超声波发射到计算出本行位置所经过的时间 |
固定信标位置(41 18)
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 41 – 行类型ID(Marvelmind协议流) |
3 | 18 (0x0012) – 固定信标位置的数据代码 |
4 | 固定信标地址 |
5 | 信标X坐标,米 |
6 | 信标Y坐标,米 |
7 | 信标Z坐标,米 |
8 | 保留字段 |
移动信标到固定信标的原始距离(41 4)或(41 132)
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 41 – 行类型ID(Marvelmind协议流) |
3 | 4 (0x0004) – 原始距离的数据代码 132 (0x0084) – 原始距离的数据代码(带实时时间戳流) |
4 | 移动信标地址 |
5 | N – 该行中的距离数量 |
6 | N条距离子记录(2*N个字段),见下文 |
6+N*2+1 | 时间偏移,毫秒。从超声波发射到完成距离测量所经过的时间 |
距离子记录字段:
0 | 固定信标地址 |
1 | 到固定信标的距离 |
原始IMU数据(41 3)或(41 131)
此行需要 MMSW0005 许可证。
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 41 – 行类型ID(Marvelmind协议流) |
3 | 3 (0x0003) – 原始IMU数据的数据代码 131 (0x0083) – 原始IMU数据的数据代码(移动信标已启用实时时间戳) |
4 | 移动信标地址 |
5 | 加速度计,X轴,1 mg/LSB |
6 | 加速度计,Y轴,1 mg/LSB |
7 | 加速度计,Z轴,1 mg/LSB |
8 | 陀螺仪,X轴,0.0175 dps/LSB |
9 | 陀螺仪,Y轴,0.0175 dps/LSB |
10 | 陀螺仪,Z轴,0.0175 dps/LSB |
11 | 磁罗盘,X轴,1100 LSB/Gauss |
12 | 磁罗盘,Y轴,1100 LSB/Gauss |
13 | 磁罗盘,Z轴,980 LSB/Gauss |
IMU融合数据(41 5)或(41 133)
此行需要 MMSW0005 许可证。
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 41 – 行类型ID(Marvelmind协议流) |
3 | 5 (0x0005) – IMU融合数据的数据代码 133 (0x0085) – IMU融合数据的数据代码(移动信标已启用实时时间戳) |
4 | 移动信标地址 |
5 | 信标X坐标(融合),米 |
6 | 信标Y坐标(融合),米 |
7 | 信标Z坐标(融合),米 |
8 | 旋转四元数的W分量 |
9 | 旋转四元数的X分量 |
10 | 旋转四元数的Y分量 |
11 | 旋转四元数的Z分量 |
12 | 信标X方向速度(融合),毫米/秒 |
13 | 信标Y方向速度(融合),毫米/秒 |
14 | 信标Z方向速度(融合),毫米/秒 |
15 | 信标X方向加速度,毫米/秒2 |
16 | 信标Y方向加速度,毫米/秒2 |
17 | 信标Z方向加速度,毫米/秒2 |
遥测数据(41 6)
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 41 – 行类型ID(Marvelmind协议流) |
3 | 6 (0x0006) – 遥测数据的数据代码 |
4 | 信标地址 |
5 | 供电电压,V |
6 | RSSI, dBm |
质量及扩展位置数据(41 7)
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 41 – 行类型ID(Marvelmind协议流) |
3 | 7 (0x0007) – 质量及扩展位置数据的数据代码 |
4 | 移动信标地址 |
5 | 定位质量,% |
6 | 地理围栏区域编号(此字段需要 MMSW0005 许可证) |
行类型ID 42 – NMEA0183流记录
此行需要 MMSW0005 许可证。
当“Interfaces”部分的调制解调器协议设置为“NMEA0183”时,记录此行。
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 42 – 行类型ID(NMEA0183协议流) |
3 | 移动信标地址 |
4、5等 | 字段序列,遵循 NMEA0183 格式(NMEA0183记录同样采用逗号分隔值格式) |
行类型ID 43 – 经移动信标传输的用户有效载荷数据
此行需要 MMSW0005 许可证。
如果移动信标在设置的“Interfaces”部分启用了非零的有效载荷数据大小,且用户设备通过移动信标的USB或UART传输任何数据,则记录此行。
此外,部分Marvelmind设备(例如机器人)也提供有效载荷数据 v100 和 Boxie.
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 43 – 行类型ID(用户有效载荷) |
3 | 移动信标地址 |
4、5等 | 以逗号分隔的有效载荷数据字节序列(每个字段1字节) |
Robot v100的有效载荷遥测数据
该行的总体格式遵循 用户有效载荷数据格式.
数据字节(从该行第四个字段开始)构成数据记录,格式如下所述。
多字节数值从低字节开始存放(小端格式)。
Robot v100遥测记录N3:
偏移量 | 大小(字节) | 类型 | 说明 | 值 |
0 | 2 | uint16_t | 记录ID | 0x3003 |
2 | 2*12 | 12个激光雷达测得的距离(每个激光雷达2字节) 每个激光雷达数据的格式如下: 位0…11 – 激光雷达测得的距离,毫米 位12…15 – 测距状态 状态 = 0 – 已测得距离 状态 <> 0 – 未测得距离 | ||
26 | 1 | uint8_t | 激光雷达总体状态: 位0:1 – 激光雷达读取成功 0 – 激光雷达读取失败 位1…7 – 保留(0) | |
27 | 1 | uint8_t | 机器人状态: 0:机器人正常停止 1:机器人因报警停止 2:机器人正在自主移动 3:机器人正在充电 | |
28 | 1 | uint8_t | RV – 机器人电池电压。 V= (RV/10) + 20 伏 | |
29 | 2 | int16_t | 机器人供电电流,x10 mA 如果数值为负,表示机器人电池正以该电流充电。 | N |
31 | 1 | uint8_t | 剩余电池容量,% | |
32 | 2 | uint16_t | 机器人供电功率,瓦 | |
34 | 2 | uint16_t | 左轮速度,毫米/秒 | |
36 | 2 | uint16_t | 右轮速度,毫米/秒 | |
37 | 1 | uint8_t | 左电机功率,% | |
38 | 1 | uint8_t | 右电机功率,% | |
39 | 2 | uint16_t | 期望速度,毫米/秒 | |
41 | 2 | int16_t | 机器人X坐标,厘米 | |
43 | 1 | uint8_t | 状态标志: 位0…3 – 保留 位4:1 – 超声波跟踪错误 位5…7 – 保留 | |
44 | 2 | int16_t | 机器人Y坐标,厘米 |
Robot v100遥测记录N4:
偏移量 | 大小(字节) | 类型 | 说明 | 值 |
0 | 2 | uint16_t | 记录ID | 0x3004 |
2 | 2*12 | 12个激光雷达测得的距离(每个激光雷达2字节) 每个激光雷达数据的格式如下: 位0…11 – 激光雷达测得的距离,毫米 位12…15 – 测距状态 状态 = 0 – 已测得距离 状态 <> 0 – 未测得距离 | ||
26 | 1 | uint8_t | 激光雷达总体状态: 位0:1 – 激光雷达读取成功 0 – 激光雷达读取失败 位1…7 – 保留(0) | |
27 | 1 | uint8_t | 机器人状态: 0:机器人正常停止 1:机器人因报警停止 2:机器人正在自主移动 3:机器人正在充电 | |
28 | 1 | uint8_t | 运动程序中当前条目的索引 | |
29 | 1 | uint8_t | 运动程序中的条目总数 | |
30 | 1 | uint8_t | 保留 | |
31 | 1 | uint8_t | 激光雷达检测到的障碍物方向: 0 – 无 1 – 前方 2 – 左侧 3 – 右侧 | |
32 | 1 | uint8_t | 激光雷达最小报警距离,x2 厘米 | |
33 | 1 | uint8_t | 触发报警的当前激光雷达测量距离,x2 厘米 | |
34 | 3 | 保留 | ||
36 | 2 | int16_t | 机器人X位置,厘米 | |
38 | 2 | int16_t | 机器人Y位置,厘米 |
Boxie 机器人的有效载荷遥测数据
该行的总体格式遵循 用户有效载荷数据格式.
数据字节(从该行第四个字段开始)构成数据记录,格式如下所述。
多字节数值从低字节开始存放(小端格式)。
Boxie 机器人遥测记录N1:
偏移量 | 大小(字节) | 类型 | 说明 | 值 |
0 | 2 | uint16_t | 记录ID | 0x3101 |
2 | 2*12 | 12个激光雷达测得的距离(每个激光雷达2字节) 每个激光雷达数据的格式如下: 位0…11 – 激光雷达测得的距离,毫米 位12…15 – 测距状态 状态 = 0 – 已测得距离 状态 <> 0 – 未测得距离 | ||
26 | 1 | uint8_t | 激光雷达总体状态: 位0:1 – 激光雷达读取成功 0 – 激光雷达读取失败 位1…7 – 保留(0) | |
27 | 1 | uint8_t | 机器人状态: 0:机器人正常停止 1:机器人因报警停止 2:机器人正在自主移动 3:机器人正在充电 | |
28 | 1 | uint8_t | RV – 机器人电池电压,x100 mV。 例如,数值118表示11.8 V | |
29 | 2 | int16_t | 机器人供电电流,x10 mA 例如,数值123表示1.230 A | |
31 | 1 | uint8_t | 保留 | |
32 | 1 | uint8_t | 左电机功率,% | |
33 | 1 | uint8_t | 右电机功率,% | |
34 | 2 | uint16_t | 左轮速度,毫米/秒 | |
36 | 2 | uint16_t | 右轮速度,毫米/秒 | |
37 | 2 | int16_t | 左电机里程计测得的行驶距离,厘米 | |
39 | 2 | int16_t | 右电机里程计测得的行驶距离,厘米 | |
41 | 2 | int16_t | 机器人X坐标,厘米 | |
43 | 1 | uint8_t | 状态标志: 位0…1 – 保留 位2:1 – 运动程序正在执行 位2:1 – 运动已暂停 位4:1 – 超声波跟踪错误 位5…7 – 保留 | |
44 | 2 | int16_t | 机器人Y坐标,厘米 |
Boxie 机器人遥测记录N3:
偏移量 | 大小(字节) | 类型 | 说明 | 值 |
0 | 2 | uint16_t | 记录ID | 0x3103 |
2 | 2 | int16_t | 角度控制PID调节器的当前“P”值 | |
4 | 2 | int16_t | 角度控制PID调节器的当前“I”值 | |
6 | 2 | int16_t | 角度控制PID调节器的当前“D”值 | |
8 | 2 | int16_t | 经EKF滤波计算的机器人X坐标,厘米 | |
10 | 2 | int16_t | 经EKF滤波计算的机器人Y坐标,厘米 | |
12 | 2 | int16_t | 保留 | |
13 | 1 | uint8_t | 激光雷达总体状态: 位0:1 – 激光雷达读取成功 0 – 激光雷达读取失败 位1…7 – 保留(0) | |
14 | 1 | uint8_t | 机器人状态: 0:机器人正常停止 1:机器人因报警停止 2:机器人正在自主移动 3:机器人正在充电 | |
15 | 1 | uint8_t | 当前运动步骤的索引(第一个航点为0,第二个为1,依此类推) | |
16 | 1 | uint8_t | 当前程序中的运动步骤总数 | |
17 | 1 | uint8_t | 运动标志: 位0:1 – “Run forever”(持续运行)选项 位1…7 – 保留 | |
18 | 1 | uint8_t | 0 – 激光雷达无报警 1…12 – 触发报警的激光雷达索引 | |
19 | 1 | uint8_t | 激光雷达最小报警距离,x2 厘米 | |
20 | 1 | uint8_t | 触发报警的当前激光雷达测量距离,x2 厘米 | |
21 | 2 | int16_t | 由机器人上成对信标测得的角度,度 | |
23 | 1 | uint8_t | 机器人期望速度(用户设置),厘米/秒 | |
24 | 2 | int16_t | 机器人X坐标,厘米 | |
26 | 2 | int16_t | 机器人Y坐标,厘米 | |
28 | 2 | int16_t | 保留 | |
30 | 2 | int16_t | 保留 | |
32 | 2 | int16_t | 期望方向与机器人当前朝向之间的偏差角,度 | |
34 | 1 | uint8_t | 保留 | |
35 | 2 | int16_t | 融合后的机器人朝向角,度 | |
36 | 5 | 5字节 | 保留 |
行类型ID 44 – Dashboard实时播放器位置
此行需要 MMSW0005 许可证。
若启用了实时播放器,则为移动信标记录此行。实时播放器提供100 Hz的位置数据。
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 44 – 行类型ID(实时播放器位置) |
3 | 移动信标地址 |
4 | 保留字段 |
5 | 移动信标X坐标,米 |
6 | 移动信标Y坐标,米 |
7 | 移动信标Z坐标,米 |
行类型ID 55 – 信标简短遥测
此行包含从SSM(Super Super-Modem)接收的信标遥测数据。
行字段:
N | 字段说明 |
0 | 时间戳(公共字段) |
1 | 用户名(公共字段) |
2 | 55 – 行类型ID(简短遥测) |
3 | 信标地址 |
4 | 信标供电电压低字节:V0 |
5 | 信标供电电压高字节:V1 信标供电电压 V= V0+V1*256 mV |
6 | RSSI(二进制补码):R0 若R0小于128,则RSSI= R0 dBm 若R0 >= 128,则RSSI= R0-256 dBm |
7 | 保留 |
8 | 保留 |
旧版CSV日志格式(V7.000之前的Dashboard或调制解调器HW v4.9)

Marvelmind API
Marvelmind API库供Marvelmind Dashboard软件使用,并为用户软件提供接口。API以MS Windows动态链接库(DLL)和Linux共享库(x86和ARM平台)的形式提供。API通过USB(虚拟串口)连接调制解调器,并实现了 与调制解调器的通信协议.
除API库外,软件包还包含C语言示例软件,该示例曾用于测试API,并包含所有API函数的调用。
该示例可作为开发用户软件的基础,也可用于将API库接口(文件“marvelmind_api.c”)移植到其他编程语言。
已测试设备:
- MS Windows 10;CPU:Intel Core i5
- Ubuntu 20.04;CPU:Intel Core i5
- Raspbian(2018-11-13-raspbian-stretch-full);平台:Raspberry Pi 3 Model B+
Windows安装
- 下载Marvelmind API软件包。将Dashboard API和示例软件复制到程序将要使用的目录。由于Windows版示例附带预编译的可执行文件,您可以直接运行API软件包中“windows”目录下的“mm_api_example.exe”。
Linux安装
- 下载Marvelmind API软件包。将Dashboard API复制到程序将要使用的目录。注意,Linux版本针对两种硬件平台提供: x86 (大多数基于Intel或AMD CPU的笔记本电脑)和 arm (例如Raspberry Pi等单板计算机)
- 将库文件 libdashapi.so (与您的平台对应)复制到目录 /usr/local/lib ,方法是执行命令 sudo cp libdashapi.so /usr/local/lib ,终端需在包含 libdashapi.so的目录中打开。之后执行 sudo ldconfig (在终端中执行)。
- 可能需要为您的用户授予串口访问权限,方法是将其加入 dialout 组:
- 在终端中执行: sudo adduser $USER dialout
- 在目录 /etc/udev/rules.d 中添加文件“99-tty.rules”,内容如下:
#Marvelmind serial port rules
KERNEL==”ttyACM0”,GROUP=”dialout”,MODE=”666”
- 编译示例软件:在软件包自带的“source”目录中打开终端,执行“make all”
- 在终端中输入“./mm_api_example”运行示例