URG から距離データ取得を行うコマンドの説明です。
"GD", "GS" ... 距離データの逐次取得
"MD", "MS" ... 距離データの連続取得
SCIP プロトコルでは、取得したいデータ範囲などをパラメータとしてコマンドに含めて URG に送信し、距離データを取得します。
距離データの取得イメージ
距離取得を行うには、GD,GS, MD,MS の4種類があり、応答の仕方について、以下のような違いがあります。
GD/GS ... 1回の距離データが返される
MD/MS ... 指定回数の距離データが返される
つまり、距離データを必要なときのみ取得したい場合には GD/GS を使い、連続した距離データが必要な場合には、MD/MS を使います。
GD/GS と MD/MS の違い
また、GD, GS (MD, MS) の違いは「1つ分の距離データが、何バイトで返されるか」です。GD, MD コマンドは、距離データを 3 byte で表現し、GS, MS コマンドは、距離データを 2 byte で表現します。
GD, MD コマンド ... 距離データを 3 byte で表現 (最大 262,144 (mm))
GS, MS コマンド ... 距離データを 2 byte で表現 (最大 4,095 (mm))
4095 (mm) 以下の距離データしか必要ないのであれば、データ転送量を減らすためにも、GS, MS コマンドの利用が適切です。
距離取得コマンドで指定できるパラメータには、
距離データの取得開始インデックス
距離データの取得終了インデックス
距離データをまとめる取得データ数
スキャンを何周期に1回行うか (MD, MS コマンドのみ)
データ取得回数 (MD, MS コマンドのみ)
があります。
距離取得コマンドのパラメータ
取得範囲の指定
距離データの取得開始インデックス、取得終了インデックスに設定できる値は、URG の種類によって異なり、"PP" コマンドで取得が可能です。
Classic-URG のデータ取得範囲
距離データをまとめる取得データ数
URG から送られるデータを "00"〜"99" で間引くことができます。
返される値は、間引かれるデータの中で、最も小さい値です。
例) 距離データが 30, 31, 32, 33, 32, 31, ... で計 n 個が返される場合
まとめる取得データ数に "00", "01" を指定
30, 31, 32, 33, 32, 31, ... が返されます。
距離データ数は n 個です。
まとめる取得データ数に "02" を指定
30, 32, 31, ... が返されます。
距離データ数は n/2 個になります。
まとめる取得データ数に "03" を指定
30, 31, ... が返されます。
距離データ数は n/3 個になります。
スキャンを何周期に1回行うか (MD, MS コマンドのみ)
データの測定タイミングを "0"〜"9" の値で指定できます。データの測定タイミングは、"PP" で確認できます。
例) Classic-URG (最大のデータ送信間隔 100(msec)) の場合
"0" を指定
100(msec) 毎にデータが返されます。
"1" を指定
200(msec) 毎にデータが返されます。
...
"9" を指定
1000(msec) 毎にデータが返されます。
データ取得回数 (MD, MS コマンドのみ)
"01"〜"99" までの値で取得回数を指定します。
"00" を指定すると "QT" コマンドを発行するまで、URG からデータが送信され続けます。
実際の取得データを例に、デコードを行う方法を示します。
以下は、Classic-URG における距離データ取得コマンドと、それに対する応答です。
送信データ
GD0044072501
受信データ例
GD0044072501
00P
0DKO>
00i00i00i00i00k00k00n01101101101101101101100o00m00o00o0130130140]
14012012014015017017017016017017016016015015015014014014014015010
501801<01<01?01D01D01D01F01F01L01O01R01T01V01W01X01X01X01Z01Z01Ze
01\01b01j02;02`09H09H09Z09Z09_0:90:90:@0:@0:@0:;0:@0:;0:;0:90:90]
9Z08X08408408408608608608408408408408908908908908808608308008008V
007m07m07j07h07h07h07d06E04D04>04=04=04>04C04H04H04I04J04K04U04Ue
04X04X04X04W04W04W04W04[04]04_04`04`04h04l04l04n05005005305;05>0N
5D05F05J05M05Q05T05W05[05]05^05`05f05f05m05n065065065068065065060
906:06:06;06<06>06A06L06L06N06S06T06d07S07[09D0hH0hH0hH0gO0fk0fDV
0eg0eU0e@0db0db0db0000000000000000000000000a40`N0_o0_`0_G0_=0^a0^
^I0^<0]h0]W0]@0]00\X0\L0[l0[f0[S0[?0[00Zi0ZJ0ZC0Z70Z70Z70Z90Z90Z2
90Z40Z00XR0XR0XR0XR0XR0XO0XD0W]0VT0VT0VM0V;0Um0Uc0U]0UQ0UJ0UC0U9Y
0Te0Tc0T^0TK0T=0T70T60Sm0Sf0Sf0SR0SO0SD0S?0S70Rn0Rh0Rh0Rd0R]0RK0Y
RD0RD0R70R60R20Qo0Qb0Q^0Q\0QV0QL0QI0QH0QC0Q50Q40Q30Po0Pk0Pi0Pg0PD
a0P[0PR0PR0PQ0PI0PI0PG0PB0PB0P@0P?0P:0P90P00P00Oh0Od0Oc0Oc0O`0O_[
0O]0O]0OZ0OZ0OZ0OZ0OZ0O[0O[0Og0PO0PO0PO0PL0PL0PI0P90P90O_0OP0OP0k
OP0Od0P50P50P>0PG0PG0PC0PC0PC0Oa0OH0OH0OH0OJ0OK0OL0OK0OK0OL0OP0O1
Q0OQ0OQ0OR0OR0OT0OT0OU0OZ0OZ0O[0O[0O\0O]0Oc0Oc0Oc0Od0On0On0Oo0OoY
0P40P40P80P=0PC0PE0PE0PE0PN0PN0PP0PX0P`0Pb0Pg0Ph0Pm0Q90Q90Q90Q?0?
QC0QF0QI0QM0Q[0Qa0Qc0Qi0R20R20R=0RA0RG0RO0RR0RX0R]0Rj0S10S20S90ST
@0SJ0SP0SS0Sa0Sk0T80T:0T>0TI0TN0T]0Ta0Tl0U40U;0UN0UR0UV0Ul0V20V?5
0VC0VQ0Va0W30W50WH0Xg0Xn0Xn0Xm0Xm0Xm0Xm0Z30Z<0Zb0Zb0Zb0ZW0ZW0ZW0E
ZX0[20[50[S0[a0\;0\G0\V0\c0]=0]T0]a0^00^E0^[0^k0_J0_Y0`30`E0`Y0`2
g0aE0aW0al0bK0b\0c10cH0ck0d;0dS0dg0eF0ek0fE0f_0g?0g]0h;0iV0j`0jaW
0jc0lY0l]0la0le0m>0mn0n[0oQ10110i11512W0000070000000000000000000L
000000071?d1?d1Af1Af1B800000000000000000000000000000000000000000j
00000000000000000000000000000000000000000000000000000000000000000
00000000000000005@05905905905805304m04N03P03F03@02n03202i02b02Y0U
2:02101h01h01h01d01m01n01o02002002001i01d01d01d01l01l01l01l01l01m
l01o01o01o01o02102102102101k01k01k01k01k01h01_01S01Q01P01P01P01PW
01O01Q01O01N01N01N01N01M01M01G01I01H01G01H01H01G01E01A01>01=01=0J
1=01:0180170170160170180180180190190190190170140140140140140139
まず、最初の3行は、エコーバック、エラーコード、タイムスタンプ、が返されます。
GD0044072501
00P
0DKO>
1 行目 GD0044072501 ... 送信コマンドのエコーバック
2 行目 00P ... 正常を示すエラーコード(00) + チェックサム(P)
3 行目 0DKO> ... タイムスタンプ(0DKO) + チェックサム(>)
4 行目以降が、682 個 (725 - 44 + 1) の距離データです。
URG から得られるタイムスタンプ、および距離データは、エンコードされたアスキー文字で構成されており、適切にデコードする必要があります。下記に示す関数が利用できます。
int decode(const char code[], int byte)
{
int value = 0;
int i;
for (i = 0; i < byte; ++i) {
value <<= 6;
value &= ~0x3f;
value |= code[i] - 0x30;
}
return value;
}
例えば、今回のタイムスタンプである "0DKO" をデコードする場合、
int timestamp = decode("0DKO", 4);
のようにします。
結果として、timestamp には、83679 が代入されます。(83,679 (msec))
また、受信した距離データの1行については、距離データは 64 byte 目までであり、65 byte 目には、その行のチェックサムが配置されます。
00i00i00i00i00k00k00n01101101101101101101100o00m00o00o0130130140]
14012012014015017017017016017017016016015015015014014014014015010
上記データのいくつかを距離データに変換すると、このようになります。
00i -> 57
00k -> 59
00n -> 62
011 -> 65
012 -> 66
今回のデータのように距離データが 3 byte データで表現されている場合、距離データが行末で分割される場合があるので、注意が必要です。
また、距離データは、"PP" コマンドの AMIN よりも小さい値のときは、測定エラーを示します。
測定エラーは、範囲外の測定や、光沢のある金属を測定した場合など、十分な強度の反射光が得られない場合などに発生します。
MD/MS を用いた距離データ取得では、URG のスキャン周期毎に、毎回データが送信されます。Top-URG で全範囲のデータ取得を行った場合、25 (msec) 毎に 3 Kbyte 強のデータが送られてきます。
この受信データを少なくするには、
取得範囲を、必要な範囲に制限する -> 範囲を半分にすると、受信データも半分
"まとめる取得データ数" を 2 にし、角度分解能を半分にする -> 受信データも半分
"スキャンを何周期に1回行うか" の設定を変更し、データの取得周期を下げる
などが挙げられます。
詳細は、SCIP 2.0 通信仕様書をご覧下さい。
1回の距離データを取得します。
パラメータ詳細については、SCIP 2.0 通信仕様書をご覧下さい。
連続した距離データを取得します。
パラメータ詳細については、SCIP 2.0 通信仕様書をご覧下さい。