URG から距離データ取得を行うコマンドの説明です。
SCIP プロトコルでは、取得したいデータ範囲などをパラメータとしてコマンドに含めて URG に送信し、距離データを取得します。
距離取得を行うには、GD,GS, MD,MS の4種類があり、応答の仕方について、以下のような違いがあります。
つまり、距離データを必要なときのみ取得したい場合には GD/GS を使い、連続した距離データが必要な場合には、MD/MS を使います。
また、GD, GS (MD, MS) の違いは「1つ分の距離データが、何バイトで返されるか」です。GD, MD コマンドは、距離データを 3 byte で表現し、GS, MS コマンドは、距離データを 2 byte で表現します。
4095 [mm] 以下の距離データしか必要ないのであれば、データ転送量を減らすためにも、GS, MS コマンドの利用が適切です。
距離取得コマンドで指定できるパラメータには、
があります。
例) 距離データが 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 個になります。
例) Classic-URG (最大のデータ送信間隔 100[msec]) の場合 "0" を指定 100[msec] 毎にデータが返されます。 "1" を指定 200[msec] 毎にデータが返されます。 ... "9" を指定 1000[msec] 毎にデータが返されます。
実際の取得データを例に、エンコードを行う方法を示します。
以下は、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>
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 = encode("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 強のデータが送られてきます。
この受信データを少なくするには、
などが挙げられます。
詳細は、SCIP 2.0 通信仕様書をご覧下さい。
1.7.5.1-20111119