DashboardのCSVログ形式
この章を読みやすいHTMLページで表示します。
「インターフェースとプロトコル」の「DashboardのCSVログ形式」の章を、HTMLページとして再現したものです。不明な点がありましたら、次を開いてください:この章だけの元のPDF(111〜126ページ)(左上にも固定表示)。目次:全章。
CSVログファイルの形式(DashboardバージョンV7.000以降)
DashboardバージョンV7.000以降のCSVログファイルでは、各イベントが1行の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座標、m |
6 | モバイルビーコンのY座標、m |
7 | モバイルビーコンのZ座標、m |
8 | フラグ: ビット0:1 – 座標は利用できません。X、Y、Zフィールドのデータは使用しないでください。 ビット1…6:予約 ビット7:– 1 – ジオフェンスゾーン外 |
9 | ヨー角とフラグ: ビット0…11:モバイルビーコンペアのヨー角、0.1度単位(0…3600) ビット12:1 – 座標はビーコンペアの中心を示します。0 – 座標は指定したモバイルビーコン(hedgehog)を示します |
10 | 時間シフト、ms。超音波の発信から、この行の位置が計算されるまでの経過時間 |
固定ビーコンの位置(41 18)
行のフィールド:
N | フィールドの説明 |
0 | タイムスタンプ(共通フィールド) |
1 | ユーザー名(共通フィールド) |
2 | 41 – 行の種類ID(Marvelmindプロトコルのストリーミング) |
3 | 18(0x0012)– 固定ビーコンの位置のデータコード |
4 | 固定ビーコンのアドレス |
5 | ビーコンのX座標、m |
6 | ビーコンのY座標、m |
7 | ビーコンのZ座標、m |
8 | 予約フィールド |
モバイルビーコンから固定ビーコンまでの生の距離(41 4)または(41 132)
行のフィールド:
N | フィールドの説明 |
0 | タイムスタンプ(共通フィールド) |
1 | ユーザー名(共通フィールド) |
2 | 41 – 行の種類ID(Marvelmindプロトコルのストリーミング) |
3 | 4(0x0004)– 生の距離のデータコード 132(0x0084)– 生の距離のデータコード(リアルタイムタイムスタンプ付きストリーミング) |
4 | モバイルビーコン(hedgehog)のアドレス |
5 | N – この行に含まれる距離の数 |
6 | N個の距離サブレコード(2*N個のフィールド)、下記参照 |
6+N*2+1 | 時間シフト、ms。超音波の発信から距離の測定までの経過時間 |
距離サブレコードのフィールド:
0 | 固定ビーコンのアドレス |
1 | 固定ビーコンまでの距離 |
IMUの生データ(41 3)または(41 131)
この行には次が必要です:MMSW0005 ライセンス。
行のフィールド:
N | フィールドの説明 |
0 | タイムスタンプ(共通フィールド) |
1 | ユーザー名(共通フィールド) |
2 | 41 – 行の種類ID(Marvelmindプロトコルのストリーミング) |
3 | 3(0x0003)– IMUの生データのデータコード 131(0x0083)– IMUの生データのデータコード(モバイルビーコンでリアルタイムタイムスタンプが有効な場合) |
4 | モバイルビーコン(hedgehog)のアドレス |
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 | モバイルビーコン(hedgehog)のアドレス |
5 | ビーコンのX座標(フュージョン)、m |
6 | ビーコンのY座標(フュージョン)、m |
7 | ビーコンのZ座標(フュージョン)、m |
8 | 回転クォータニオンのWフィールド |
9 | 回転クォータニオンのXフィールド |
10 | 回転クォータニオンのYフィールド |
11 | 回転クォータニオンのZフィールド |
12 | ビーコンの速度X(フュージョン)、mm/s |
13 | ビーコンの速度Y(フュージョン)、mm/s |
14 | ビーコンの速度Z(フュージョン)、mm/s |
15 | ビーコンの加速度X、mm/s2 |
16 | ビーコンの加速度Y、mm/s2 |
17 | ビーコンの加速度Z、mm/s2 |
テレメトリーデータ(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 ライセンス。
この行は、モバイルビーコンの設定のインターフェースセクションでペイロードデータのサイズが0以外に設定されており、ユーザーデバイスがモバイルビーコンのUSBまたはUARTからデータを送信した場合に記録されます。
また、一部のMarvelmindデバイスでもペイロードデータを利用できます。例:ロボット v100 と Boxie。
行のフィールド:
N | フィールドの説明 |
0 | タイムスタンプ(共通フィールド) |
1 | ユーザー名(共通フィールド) |
2 | 43 – 行の種類ID(ユーザーペイロード) |
3 | モバイルビーコンのアドレス |
4、5など | カンマ区切りのペイロードデータのバイト列(各フィールドは1バイト) |
Robot v100のペイロードテレメトリーデータ
行の全体的な形式は、次に準じます:ユーザーペイロードデータの形式。
データバイト(行の4番目のフィールド以降)は、以下に示す形式のデータレコードを構成します。
複数バイトの値は、下位バイトから順に格納されます(リトルエンディアン形式)。
Robot v100テレメトリーのレコードN3:
オフセット | サイズ(バイト) | 型 | 説明 | 値 |
0 | 2 | uint16_t | レコードID | 0x3003 |
2 | 2*12 | 12台のLIDARによる距離(LIDAR 1台あたり2バイト) 各LIDARのデータの形式は次のとおりです: ビット0…11 – LIDARによる距離、mm ビット12…15 – 距離測定のステータス ステータス = 0 – 距離は測定済み ステータス <> 0 – 距離は未測定 | ||
26 | 1 | uint8_t | LIDAR全体のステータス: ビット0:1 – LIDARの読み取りに成功 0 – LIDARの読み取りに失敗 ビット1…7 – 予約(0) | |
27 | 1 | uint8_t | ロボットの状態: 0:ロボットは正常停止中 1:ロボットはアラームにより停止中 2:ロボットは自律走行中 3:ロボットは充電中 | |
28 | 1 | uint8_t | RV – ロボットのバッテリー電圧。 V= (RV/10) + 20(V) | |
29 | 2 | int16_t | ロボットの電源電流、x10 mA 値が負の場合、ロボットのバッテリーはこの電流で充電中です。 | N |
31 | 1 | uint8_t | バッテリー残量、% | |
32 | 2 | uint16_t | ロボットの消費電力、W | |
34 | 2 | uint16_t | 左車輪の速度、mm/s | |
36 | 2 | uint16_t | 右車輪の速度、mm/s | |
37 | 1 | uint8_t | 左モーターの出力、% | |
38 | 1 | uint8_t | 右モーターの出力、% | |
39 | 2 | uint16_t | 目標速度、mm/s | |
41 | 2 | int16_t | ロボットのX座標、cm | |
43 | 1 | uint8_t | ステータスフラグ: ビット0…3 – 予約 ビット4:1 – 超音波トラッキングのエラー ビット5…7 – 予約 | |
44 | 2 | int16_t | ロボットのY座標、cm |
Robot v100テレメトリーのレコードN4:
オフセット | サイズ(バイト) | 型 | 説明 | 値 |
0 | 2 | uint16_t | レコードID | 0x3004 |
2 | 2*12 | 12台のLIDARによる距離(LIDAR 1台あたり2バイト) 各LIDARのデータの形式は次のとおりです: ビット0…11 – LIDARによる距離、mm ビット12…15 – 距離測定のステータス ステータス = 0 – 距離は測定済み ステータス <> 0 – 距離は未測定 | ||
26 | 1 | uint8_t | LIDAR全体のステータス: ビット0:1 – LIDARの読み取りに成功 0 – LIDARの読み取りに失敗 ビット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 | LIDARが検知した障害物の方向: 0 – なし 1 – 前方 2 – 左 3 – 右 | |
32 | 1 | uint8_t | LIDARによるアラームの最小距離、x2 cm | |
33 | 1 | uint8_t | アラームの原因となった、LIDARで現在測定された距離、x2 cm | |
34 | 3 | 予約済み | ||
36 | 2 | int16_t | ロボットのX位置、cm | |
38 | 2 | int16_t | ロボットのY位置、cm |
Robot Boxieのペイロードテレメトリーデータ
行の全体的な形式は、次に準じます:ユーザーペイロードデータの形式。
データバイト(行の4番目のフィールド以降)は、以下に示す形式のデータレコードを構成します。
複数バイトの値は、下位バイトから順に格納されます(リトルエンディアン形式)。
Robot BoxieテレメトリーのレコードN1:
オフセット | サイズ(バイト) | 型 | 説明 | 値 |
0 | 2 | uint16_t | レコードID | 0x3101 |
2 | 2*12 | 12台のLIDARによる距離(LIDAR 1台あたり2バイト) 各LIDARのデータの形式は次のとおりです: ビット0…11 – LIDARによる距離、mm ビット12…15 – 距離測定のステータス ステータス = 0 – 距離は測定済み ステータス <> 0 – 距離は未測定 | ||
26 | 1 | uint8_t | LIDAR全体のステータス: ビット0:1 – LIDARの読み取りに成功 0 – LIDARの読み取りに失敗 ビット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 | 左車輪の速度、mm/s | |
36 | 2 | uint16_t | 右車輪の速度、mm/s | |
37 | 2 | int16_t | 左モーターのオドメトリによる走行距離、cm | |
39 | 2 | int16_t | 右モーターのオドメトリによる走行距離、cm | |
41 | 2 | int16_t | ロボットのX座標、cm | |
43 | 1 | uint8_t | ステータスフラグ: ビット0…1 – 予約 ビット2:1 – 移動プログラムを実行中 ビット3:1 – 移動を一時停止中 ビット4:1 – 超音波トラッキングのエラー ビット5…7 – 予約 | |
44 | 2 | int16_t | ロボットのY座標、cm |
Robot 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座標、cm | |
10 | 2 | int16_t | EKFフィルターで計算したロボットのY座標、cm | |
12 | 2 | int16_t | 予約済み | |
13 | 1 | uint8_t | LIDAR全体のステータス: ビット0:1 – LIDARの読み取りに成功 0 – LIDARの読み取りに失敗 ビット1…7 – 予約(0) | |
14 | 1 | uint8_t | ロボットの状態: 0:ロボットは正常停止中 1:ロボットはアラームにより停止中 2:ロボットは自律走行中 3:ロボットは充電中 | |
15 | 1 | uint8_t | 現在の移動ステップのインデックス(最初のウェイポイントが0、2番目が1、以下同様) | |
16 | 1 | uint8_t | 現在のプログラムの移動ステップの総数 | |
17 | 1 | uint8_t | 移動フラグ: ビット0:1 –「Run forever」オプション ビット1…7 – 予約 | |
18 | 1 | uint8_t | 0 – LIDARによるアラームなし 1…12 – アラームの原因となったLIDARのインデックス | |
19 | 1 | uint8_t | LIDARによるアラームの最小距離、x2 cm | |
20 | 1 | uint8_t | アラームの原因となった、LIDARで現在測定された距離、x2 cm | |
21 | 2 | int16_t | ロボット上のペアードビーコンによる角度、度 | |
23 | 1 | uint8_t | ロボットの目標速度(ユーザー設定)、cm/s | |
24 | 2 | int16_t | ロボットのX座標、cm | |
26 | 2 | int16_t | ロボットのY座標、cm | |
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のReal-time Playerによる位置
この行には次が必要です:MMSW0005 ライセンス。
この行は、Real-time Playerが有効な場合に、モバイルビーコンについて記録されます。Real-time Playerは100 Hzの位置データを提供します。
行のフィールド:
N | フィールドの説明 |
0 | タイムスタンプ(共通フィールド) |
1 | ユーザー名(共通フィールド) |
2 | 44 – 行の種類ID(Real-time Playerによる位置) |
3 | モバイルビーコンのアドレス |
4 | 予約フィールド |
5 | モバイルビーコンのX座標、m |
6 | モバイルビーコンのY座標、m |
7 | モバイルビーコンのZ座標、m |
行の種類ID 55 – ビーコンの短縮テレメトリー
この行には、SSM(Super-Super-Modem)から受信したビーコンのテレメトリーが含まれます。
行のフィールド:
N | フィールドの説明 |
0 | タイムスタンプ(共通フィールド) |
1 | ユーザー名(共通フィールド) |
2 | 55 – 行の種類ID(短縮テレメトリー) |
3 | ビーコンのアドレス |
4 | ビーコンの電源電圧の下位バイト:V0 |
5 | ビーコンの電源電圧の上位バイト:V1 ビーコンの電源電圧はV= V0+V1*256 mVです |
6 | 2の補数形式のRSSI:R0 R0が128未満の場合、RSSI= R0 dBm R0 >= 128の場合、RSSI= R0-256 dBm |
7 | 予約済み |
8 | 予約済み |
以前のCSVログの形式(V7.000より前のDashboard、またはModem 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版は、次の2つのハードウェアプラットフォーム向けに提供されています:x86(Intel製またはAMD製のCPUを搭載したほとんどのノートPC)と 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」と入力して、サンプルを実行します