scip_capture_jp

トップへ戻る
English | Japanese

SCIP 距離データ取得コマンドの解説

URG から距離データ取得を行うコマンドの説明です。

"GD", "GS" ... 距離データの逐次取得
"MD", "MS" ... 距離データの連続取得
SCIP プロトコルでは、取得したいデータ範囲などをパラメータとしてコマンドに含めて URG に送信し、距離データを取得します。


距離データの取得イメージ

"GD, GS, MD, MS" コマンドの違い

距離取得を行うには、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 通信仕様書をご覧下さい。

"GD", "GS"

1回の距離データを取得します。
パラメータ詳細については、SCIP 2.0 通信仕様書をご覧下さい。

"MD", "MS"

連続した距離データを取得します。
パラメータ詳細については、SCIP 2.0 通信仕様書をご覧下さい。


Related

Wiki: scip_capture_en
Wiki: top_jp