/*!
  \page scip_capture_page 「距離データの取得」

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

  - \ref scip_capture_gds_section ... 距離データの逐次取得
  - \ref scip_capture_mds_section ... 距離データの連続取得

  SCIP プロトコルでは、取得したいデータ範囲などをパラメータとしてコマンドに含めて URG に送信し、距離データを取得します。

  \image html capture_image.png 距離データの取得イメージ

  \n
  \section scip_capture_types_section "GD, GS, MD, MS" コマンドの違い
  距離取得を行うには、GD,GS, MD,MS の４種類があり、応答の仕方について、以下のような違いがあります。

  - GD/GS ... １回の距離データが返される
  - MD/MS ... 指定回数の距離データが返される

  つまり、距離データを必要なときのみ取得したい場合には GD/GS を使い、連続した距離データが必要な場合には、MD/MS を使います。

  \image html gd_md_sequence.png GD/GS と MD/MS の違い

  また、GD, GS (MD, MS) の違いは「１つ分の距離データが、何バイトで返されるか」です。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 コマンドの利用が適切です。

  \n
  \section scip_capture_parameter_section 距離取得のパラメータ指定
  距離取得コマンドで指定できるパラメータには、

  - 距離データの取得開始インデックス
  - 距離データの取得終了インデックス
  - 距離データの間引き数
  - スキャンを何周期に１回行うか (MD, MS コマンドのみ)
  - データ取得回数 (MD, MS コマンドのみ)

  があります。

  \image html gd_md_parameter.png 距離取得コマンドのパラメータ

  距離データの取得開始インデックス、取得終了インデックスに設定できる値は、URG の種類によって異なり、\ref scip_status_pp_section コマンドで取得が可能です。\n
  また、データ取得回数に 00 回を指定すると、\ref scip_mode_qt_section コマンドを発行するまで、無限回のデータが URG より送信されます。

  \n
  \section scip_capture_raw_section 取得データのエンコード

  実際の取得データを例に、エンコードを行う方法を示します。\n
  以下は、Classic-URG における距離データ取得コマンドと、それに対する応答です。

  送信データ
  \verbatim
GD0044072501 \endverbatim

  受信データ例
  \verbatim
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 \endverbatim

  まず、最初の３行は、エコーバック、エラーコード、タイムスタンプ、が返されます。

  \verbatim
GD0044072501
00P
0DKO> \endverbatim

  - 1 行目 GD0044072501 ... 送信コマンドのエコーバック
  - 2 行目 00P ... 正常を示すエラーコード(00) + チェックサム(P)
  - 3 行目 0DKO> ... タイムスタンプ(0DKO) + チェックサム(>)

  4 行目以降が、682 個 (725 - 25 + 1) の距離データです。

  URG から得られるタイムスタンプ、および距離データは、エンコードされたアスキー文字で構成されており、適切にデコードする必要があります。下記に示す関数が利用できます。

  \code
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;
} \endcode

  例えば、今回のタイムスタンプである "0DKO" をデコードする場合、

  \code
int timestamp = encode("0DKO", 4); \endcode

  のようにします。\n
  結果として、timestamp には、111903 が代入されます。(111,903 [msec])

  また、受信した距離データの１行については、距離データは 64 byte 目までであり、65 byte 目には、その行のチェックサムが配置されます。

\verbatim
00i00i00i00i00k00k00n01101101101101101101100o00m00o00o0130130140]
14012012014015017017017016017017016016015015015014014014014015010 \endverbatim

上記データのいくつかを距離データに変換すると、このようになります。

\verbatim
00i -> 57
00k -> 59
00n -> 62
011 -> 65
012 -> 66 \endverbatim

  今回のデータのように距離データが 3 byte データで表現されている場合、距離データが行末で分割される場合があるので、注意が必要です。

  また、距離データは、\ref scip_status_pp_section コマンドの AMIN よりも小さい値のときは、測定エラーを示します。\n
  測定エラーは、範囲外の測定や、光沢のある金属を測定した場合など、十分な強度の反射光が得られない場合などに発生します。

  \n
  \section scip_capture_quantity_section 受信データ量を少なくする方法

  MD/MS を用いた距離データ取得では、URG のスキャン周期毎に、毎回データが送信されます。Top-URG で全範囲のデータ取得を行った場合、25 [msec] 毎に 3 Kbyte 強のデータが送られてきます。\n

  この受信データを少なくするには、

  - 取得範囲を、必要な範囲に制限する -> 範囲を半分にすると、受信データも半分
  - "距離データの間引き数" を 2 にし、角度分解能を半分にする -> 受信データも半分
  - "スキャンを何周期に１回行うか" の設定を変更し、データの取得周期を下げる

  などが挙げられます。\n
  詳細は、SCIP 2.0 通信仕様書をご覧下さい。

  <hr>

  \section scip_capture_gds_section "GD", "GS"
  - １回の距離データを取得します。\n
  パラメータ詳細については、SCIP 2.0 通信仕様書をご覧下さい。
  \n \n
  - \see scip_20_gd.cpp, gd_scan.c

  \n
  \section scip_capture_mds_section "MD", "MS"
  - 連続した距離データを取得します。\n
  パラメータ詳細については、SCIP 2.0 通信仕様書をご覧下さい。
  \n \n
  - \see scip_20_md.cpp, md_scan.c

*/
