全て データ構造 ファイル 関数 変数 型定義 列挙型 列挙型の値 マクロ定義
データ構造 | 型定義 | 列挙型 | 関数
include/c/urg_sensor.h

URG センサ制御 [詳細]

#include "urg_connection.h"

ソースコードを見る。

データ構造

struct  urg_t
 URG センサ管理 [詳細]

型定義

typedef urg_measurement_type_t(* urg_error_handler )(const char *status, void *urg)
 エラーハンドラ

列挙型

enum  urg_measurement_type_t {
  URG_DISTANCE, URG_DISTANCE_INTENSITY, URG_MULTIECHO, URG_MULTIECHO_INTENSITY,
  URG_STOP, URG_UNKNOWN
}
 計測タイプ [詳細]
enum  urg_range_data_byte_t { URG_COMMUNICATION_3_BYTE, URG_COMMUNICATION_2_BYTE }
 距離を何 byte で表現するかの指定 [詳細]
enum  { URG_SCAN_INFINITY = 0, URG_MAX_ECHO = 3 }

関数

int urg_open (urg_t *urg, urg_connection_type_t connection_type, const char *device_or_address, long baudrate_or_port)
 接続
void urg_close (urg_t *urg)
 切断
void urg_set_timeout_msec (urg_t *urg, int msec)
 タイムアウト時間の設定
int urg_start_time_stamp_mode (urg_t *urg)
 タイムスタンプモードの開始
long urg_time_stamp (urg_t *urg)
 タイムスタンプの取得
int urg_stop_time_stamp_mode (urg_t *urg)
 タイムスタンプモードの終了
int urg_start_measurement (urg_t *urg, urg_measurement_type_t type, int scan_times, int skip_scan)
 距離データの取得を開始
int urg_get_distance (urg_t *urg, long data[], long *time_stamp)
 距離データの取得
int urg_get_distance_intensity (urg_t *urg, long data[], unsigned short intensity[], long *time_stamp)
 距離と強度データの取得
int urg_get_multiecho (urg_t *urg, long data_multi[], long *time_stamp)
 距離データの取得 (マルチエコー版)
int urg_get_multiecho_intensity (urg_t *urg, long data_multi[], unsigned short intensity_multi[], long *time_stamp)
 距離と強度データの取得 (マルチエコー版)
int urg_stop_measurement (urg_t *urg)
 計測を中断し、レーザを消灯させます
int urg_set_scanning_parameter (urg_t *urg, int first_step, int last_step, int skip_step)
 計測範囲を設定します
int urg_set_communication_data_size (urg_t *urg, urg_range_data_byte_t data_byte)
 通信データのサイズ変更
int urg_laser_on (urg_t *urg)
 レーザを発光させる
int urg_laser_off (urg_t *urg)
 レーザを消灯する
int urg_reboot (urg_t *urg)
 センサを再起動する
void urg_sleep (urg_t *urg)
 センサを低消費電力の状態に遷移させる
void urg_wakeup (urg_t *urg)
 センサを低消費電力のモードから通常の状態に遷移させる
int urg_is_stable (urg_t *urg)
 センサが計測できる状態かを返す
const char * urg_sensor_product_type (urg_t *urg)
 センサ型式を文字列で返す
const char * urg_sensor_serial_id (urg_t *urg)
 センサのシリアル ID 文字列を返す
const char * urg_sensor_firmware_version (urg_t *urg)
 センサのバージョン文字列を返す
const char * urg_sensor_status (urg_t *urg)
 センサのステータス文字列を返す
const char * urg_sensor_state (urg_t *urg)
 センサの状態を返す
void urg_set_error_handler (urg_t *urg, urg_error_handler handler)
 計測用のエラーハンドラを登録する
long urg_scip_decode (const char data[], int size)
 SCIP 文字列のデコードを行う

説明

URG センサ制御

URG 用の基本的な関数を提供します。

作者:
Satofumi KAMIMURA
Id:
urg_sensor.h,v e5d1719877a2 2015/05/07 04:12:14 jun

列挙型

anonymous enum
列挙型の値:
URG_SCAN_INFINITY 

無限回のデータ取得

URG_MAX_ECHO 

マルチエコーの最大エコー数

計測タイプ

列挙型の値:
URG_DISTANCE 

距離

URG_DISTANCE_INTENSITY 

距離 + 強度

URG_MULTIECHO 

マルチエコーの距離

URG_MULTIECHO_INTENSITY 

マルチエコーの(距離 + 強度)

URG_STOP 

計測の停止

URG_UNKNOWN 

不明

距離を何 byte で表現するかの指定

列挙型の値:
URG_COMMUNICATION_3_BYTE 

距離を 3 byte で表現する

URG_COMMUNICATION_2_BYTE 

距離を 2 byte で表現する


関数

void urg_close ( urg_t urg)

切断

レーザを消灯し、URG との接続を切断します。

引数:
[in,out]urgURG センサ管理
  \see urg_open()
例:
calculate_xy.c, get_distance.c, get_distance_intensity.c, get_multiecho.c, get_multiecho_intensity.c, sensor_parameter.c, と sync_time_stamp.c.
int urg_get_distance ( urg_t urg,
long  data[],
long *  time_stamp 
)

距離データの取得

 センサから距離データを取得します。事前に urg_start_measurement() を #URG_DISTANCE 指定で呼び出しておく必要があります。

 \param[in,out] urg URG センサ管理
 \param[out] data 距離データ [mm]
 \param[out] time_stamp タイムスタンプ [msec]

 \retval >=0 受信したデータ個数
 \retval <0 エラー

 data には、センサから取得した距離データが格納されます。data はデータを格納するのサイズを確保しておく必要があります。data に格納されるデータ数は urg_max_data_size() で取得できます。

 time_stamp には、センサ内部のタイムスタンプが格納されます。time_stamp を取得したくない場合 NULL を指定して下さい。


 Example
      long *data = (long*)malloc(urg_max_data_size(&urg) * sizeof(data[0]));

      ...

      \~japanese
      // データのみ取得する
      \~english
      // Gets only measurement data
      urg_start_measurement(&urg, URG_DISTANCE, 1, 0);
      int n = urg_get_distance(&urg, data, NULL);

      ...

      \~japanese
      // データとタイムスタンプを取得する
      \~english
      // Gets measurement data and timestamp
      long time_stamp;
      urg_start_measurement(&urg, URG_DISTANCE, 1, 0);
      n = urg_get_distance(&urg, data, &time_stamp); 
  \see urg_start_measurement(), urg_max_data_size()
例:
calculate_xy.c, と get_distance.c.
int urg_get_distance_intensity ( urg_t urg,
long  data[],
unsigned short  intensity[],
long *  time_stamp 
)

距離と強度データの取得

 urg_get_distance() に加え、強度データの取得ができる関数です。事前に urg_start_measurement() を #URG_DISTANCE_INTENSITY 指定で呼び出しておく必要があります。

 \param[in,out] urg URG センサ管理
 \param[out] data 距離データ [mm]
 \param[out] intensity 強度データ
 \param[out] time_stamp タイムスタンプ [msec]

 \retval >=0 受信したデータ個数
 \retval <0 エラー

 強度データとは、距離計算に使った波形の反射強度であり、センサのシリーズ毎に特性が異なります。 強度データを使うことで、物体の反射率や環境の大まかな濃淡を推測できます。

 data, time_stamp については urg_get_distance() と同じです。

 intensity には、センサから取得した強度データが格納されます。intensity はデータを格納するのサイズを確保しておく必要があります。intensity に格納されるデータ数は urg_max_data_size() で取得できます。


 Example
      int data_size = urg_max_data_size(&urg);
      long *data = malloc(data_size * sizeof(long));
      long *intensity = malloc(data_size * sizeof(unsigned short));

      ...

      urg_start_measurement(&urg, URG_DISTANCE_INTENSITY, 1, 0);
      int n = urg_get_distance_intensity(&urg, data, intesnity, NULLL); 
  \see urg_start_measurement(), urg_max_data_size()
例:
get_distance_intensity.c.
int urg_get_multiecho ( urg_t urg,
long  data_multi[],
long *  time_stamp 
)

距離データの取得 (マルチエコー版)

 マルチエコー版の距離データ取得関数です。事前に urg_start_measurement() を #URG_MULTIECHO 指定で呼び出しておく必要があります。

 \param[in,out] urg URG センサ管理
 \param[out] data_multi 距離データ [mm]
 \param[out] time_stamp タイムスタンプ [msec]

 \retval >=0 受信したデータ個数
 \retval <0 エラー

 マルチエコーとは複数の距離データです。 マルチエコーは、1つのレーザ発光において複数の距離データが得られたときに得られます。

 \image html multiecho_image.png マルチエコーのイメージ図

 time_stamp については urg_get_distance() と同じです。

 data_multi には、センサから取得した距離データが1つの step あたり最大で #URG_MAX_ECHO (3 つ)格納されます。マルチエコーが存在しない項目のデータ値は -1 が格納されています。
      data_multi[0] ... step n の距離データ (1 つめ)
      data_multi[1] ... step n の距離データ (2 つめ)
      data_multi[2] ... step n の距離データ (3 つめ)
      data_multi[3] ... step (n + 1) の 距離データ (1 つめ)
      data_multi[4] ... step (n + 1) の 距離データ (2 つめ)
      data_multi[5] ... step (n + 1) の 距離データ (3 つめ)
      ... 

格納順は、各 step において urg_get_distance() のときと同じ距離のデータが (3n + 0) の位置に格納され、それ以外のデータが (3n + 1), (3n + 2) の位置に降順に格納されます。
つまり data_multi[3n + 1] >= data_multi[3n + 2] になることは保証されますが data_multi[3n + 0] と data_multi[3n + 1] の関係は未定義です。(data_multi[3n + 1] == data_multi[3n + 2] が成り立つのはデータ値が -1 のとき。)

  Example
      long *data_multi = malloc(3 * urg_max_data_size(&urg) * sizeof(long));

      ...

      urg_start_measurement(&urg, URG_MULTIECHO, 1, 0);
      int n = urg_get_distance_intensity(&urg, data_multi, NULLL); 
  \see urg_start_measurement(), urg_max_data_size()
例:
get_multiecho.c.
int urg_get_multiecho_intensity ( urg_t urg,
long  data_multi[],
unsigned short  intensity_multi[],
long *  time_stamp 
)

距離と強度データの取得 (マルチエコー版)

 urg_get_multiecho() に加え、強度データの取得できる関数です。事前に urg_start_measurement() を #URG_MULTIECHO_INTENSITY 指定で呼び出しておく必要があります。

 \param[in,out] urg URG センサ管理
 \param[out] data_multi 距離データ [mm]
 \param[out] intensity_multi 強度データ
 \param[out] time_stamp タイムスタンプ [msec]

 \retval >=0 受信したデータ個数
 \retval <0 エラー

 data_multi, time_stamp については urg_get_multiecho() と同じです。

 intensity_multi のデータの並びは data_multi と対応したものになります。intensity_multi に格納されるデータ数は urg_max_data_size() で取得できます。


 Example
      int data_size = urg_max_data_size(&urg);
      long *data_multi = malloc(3 * data_size * sizeof(long));
      long *intensity_multi = malloc(3 * data_size * sizeof(unsigned short));

      ...

      urg_start_measurement(&urg, URG_DISTANCE_INTENSITY, 1, 0);
      int n = urg_get_multiecho_intensity(&urg, data_multi,
      intesnity_multi, NULLL); 
  \see urg_start_measurement(), urg_max_data_size()
例:
get_multiecho_intensity.c.
int urg_is_stable ( urg_t urg)

センサが計測できる状態かを返す

戻り値:
1センサが計測できる状態にある
0センサが計測できる状態にない

起動直後でスキャナの回転が安定していない場合や、何らかのエラーで計測できない場合、この関数は 0 を返します。

int urg_open ( urg_t urg,
urg_connection_type_t  connection_type,
const char *  device_or_address,
long  baudrate_or_port 
)

接続

 指定したデバイスに接続し、距離を計測できるようにする。

 \param[in,out] urg URG センサ管理
 \param[in] connection_type 通信タイプ
 \param[in] device_or_address 接続デバイス名
 \param[in] baudrate_or_port 接続ボーレート [bps] / TCP/IP ポート

 \retval 0 正常
 \retval <0 エラー

 connection_type には、以下の項目が指定できます。

 - #URG_SERIAL
 - シリアル、USB 接続

 - #URG_ETHERNET
 - イーサーネット接続


 Example
      urg_t urg;

      if (urg_open(&urg, URG_SERIAL, "/dev/ttyACM0", 115200) < 0) {
      return 1;
      }

      ...

      urg_close(&urg); 
  \attention URG C ライブラリの他の関数を呼び出す前に、この関数を呼び出す必要があります。

  \see urg_close()
long urg_scip_decode ( const char  data[],
int  size 
)

SCIP 文字列のデコードを行う

引数:
[in]dataSCIP 文字列
[in]sizedata の byte サイズ
戻り値:
デコード後の数値
const char* urg_sensor_firmware_version ( urg_t urg)

センサのバージョン文字列を返す

センサのソフトウェア・バージョン文字列を返す。返される文字列はセンサ依存となる。

引数:
[in]urgURG センサ管理
戻り値:
バージョン文字列
例:
sensor_parameter.c.
const char* urg_sensor_product_type ( urg_t urg)

センサ型式を文字列で返す

センサの型式を文字列で返す。返される文字列はセンサ依存となる。

引数:
[in]urgURG センサ管理
戻り値:
センサ型式の文字列
例:
sensor_parameter.c.
const char* urg_sensor_serial_id ( urg_t urg)

センサのシリアル ID 文字列を返す

センサのシリアル ID 文字列を返す。返される文字列はセンサ依存となる。

引数:
[in]urgURG センサ管理
戻り値:
シリアル ID 文字列
例:
sensor_parameter.c.
const char* urg_sensor_state ( urg_t urg)

センサの状態を返す

センサのステータス文字列を返す。返される文字列はセンサ依存となる。

引数:
[in]urgURG センサ管理
戻り値:
状態を示す文字列
注意:
状態については SCIP の通信仕様書を参照のこと。
例:
sensor_parameter.c.
const char* urg_sensor_status ( urg_t urg)

センサのステータス文字列を返す

センサのステータス文字列を返す。返される文字列はセンサ依存となる。

引数:
[in]urgURG センサ管理
戻り値:
ステータス文字列
例:
sensor_parameter.c.

通信データのサイズ変更

距離データをセンサから受信の際のデータサイズを変更します。

引数:
[in,out]urgURG センサ管理
[in]data_byte距離値を表現するデータのバイト数
戻り値:
0成功
<0エラー

data_byte には

  • URG_COMMUNICATION_3_BYTE ... 距離を 3 byte で表現する
    • URG_COMMUNICATION_2_BYTE ... 距離を 2 byte で表現する

を指定できます。
初期状態では距離を 3 byte で表現するようになっています。この設定を 2 byte に設定することで、センサから受信するデータ数は 2/3 になります。ただし、取得できる距離の最大値が 4095 になるため、観測したい対象が 4 [m] 以内の範囲に存在する場合のみ利用して下さい。

void urg_set_error_handler ( urg_t urg,
urg_error_handler  handler 
)

計測用のエラーハンドラを登録する

エラーハンドラは Gx, Mx 系のコマンドの応答が "00" か "99" 以外のときに呼び出される。

int urg_set_scanning_parameter ( urg_t urg,
int  first_step,
int  last_step,
int  skip_step 
)

計測範囲を設定します

  センサが計測する範囲を step 値で指定します。urg_get_distance() などの距離データ取得の関数で返されるデータ数は、ここで指定した範囲で制限されます。

  \param[in,out] urg URG センサ管理
  \param[in] first_step 計測の開始 step
  \param[in] last_step 計測の終了 step
  \param[in] skip_step 計測データをグルーピングする個数

  \retval 0 正常
  \retval <0 エラー

  センサの step は、センサ正面を 0 とし、センサ上部から見て反時計まわりの向きが正の値となる順に割り振られます。

  \image html sensor_angle_image.png センサと step の関係

  step の間隔と、最大値、最小値はセンサ依存です。step 値の最大値、最小値は urg_step_min_max() で取得できます。\n

  first_step, last_step でデータの計測範囲を指定します。計測範囲は [first_step, last_step] となります。

  skip_step は、計測データをグルーピングする個数を指定します。指定できる値は [0, 99] です。\n
  skip_step は、指定された数のデータを 1 つにまとめることで、センサから受信するデータ量を減らし、距離取得を行う関数の応答性を高めるときに使います。ただし、データをまとめるため、得られるデータの分解能は減ります。

  例えば以下のような距離データが得られる場合に
      100, 101, 102, 103, 104, 105, 106, 107, 108, 109

skip_step に 2 を指定すると、得られるデータは

      100, 102, 104, 106, 108

データは、まとめるデータのうち、一番小さな値のデータが用いられます。

Configure measurement parameters

  This function allows definining the scope (start and end steps) for measurement. The number of measurement data (steps) returned by urg_get_distance() and similar is defined here.

  \param[in,out] urg URG control structure
  \param[in] first_step start step number
  \param[in] last_step end step number
  \param[in] skip_step step grouping factor

  \retval 0 Successful
  \retval <0 Error

  Observing the sensor from the top, the step 0 corresponds to the very front of the sensor, steps at the left side (counter clockwise) of step 0 are positive numbers and those to the right side (clockwise) are negative numbers.

  \image html sensor_angle_image.png shows the relation between sensor and steps

  The spacing between steps, the minimum and maximum step numbers depend on the sensor. Use urg_step_min_max() to get the minimum and maximum step values.\n

  first_step and last_step define the data measurement scope ([first_step, last_step])。

  skip_step allows setting a step grouping factor, where valid values are [0, 99].\n
  With the skip_step parameter, several adjacent steps are grouped and combined into 1 single step, thus the amount of data transmitted from the sensor is reduced and so the response time of measurement data adquisition functions. Of course, grouping several steps into one means the measurement resolution is reduced.

  For example, for the following range data obtained in the sensor:
      100, 101, 102, 103, 104, 105, 106, 107, 108, 109

And setting skip_step to 2, the range data returned is:

      100, 102, 104, 106, 108

for each group, the smallest range value is returned.

Example

      urg_set_scanning_parameter(&urg, urg_deg2step(&urg, -45),
      urg_deg2step(&urg, +45), 1);
      urg_start_measurement(&urg, URG_DISTANCE, 0);
      int n = urg_get_distance(&urg, data, NULL);
      for (int i = 0; i < n; ++i) {
      printf("%d [mm], %d [deg]\n", data[i], urg_index2deg(&urg, i));
      } 
  \see urg_step_min_max(), urg_rad2step(), urg_deg2step()
例:
get_distance.c.
void urg_set_timeout_msec ( urg_t urg,
int  msec 
)

タイムアウト時間の設定

引数:
[in,out]urgURG センサ管理
[in]msecタイムアウトする時間 [msec]
注意:
urg_open() を呼び出すと timeout の設定値はデフォルト値に初期化されるため、この関数は urg_open() 後に呼び出すこと。
void urg_sleep ( urg_t urg)

センサを低消費電力の状態に遷移させる

低消費電力のモードでは、スキャナの回転が停止し計測も中断されます。

  • 低消費電力のモード
    • レーザが消灯して計測が中断される。
    • スキャナの回転が停止する。

低消費電力のモードから抜けるためには urg_wakeup() 関数を呼び出して下さい。

  \see urg_wakeup()
int urg_start_measurement ( urg_t urg,
urg_measurement_type_t  type,
int  scan_times,
int  skip_scan 
)

距離データの取得を開始

 距離データの取得を開始します。実際のデータは urg_get_distance(), urg_get_distance_intensity(), urg_get_multiecho(), urg_get_multiecho_intensity() で取得できます。

 \param[in,out] urg URG センサ管理
 \param[in] type データ・タイプ
 \param[in] scan_times データの取得回数
 \param[in] skip_scan データの取得間隔

 \retval 0 正常
 \retval <0 エラー

 type には取得するデータの種類を指定します。

 - #URG_DISTANCE ... 距離データ
 - #URG_DISTANCE_INTENSITY ... 距離データと強度データ
 - #URG_MULTIECHO ... マルチエコー版の距離データ
 - #URG_MULTIECHO_INTENSITY ... マルチエコー版の(距離データと強度データ)

 scan_times は何回のデータを取得するかを 0 以上の数で指定します。ただし、0 または #URG_SCAN_INFINITY を指定した場合は、無限回のデータを取得します。\n
 開始した計測を中断するには urg_stop_measurement() を使います。

 skip_scan はミラーの回転数のうち、1回のスキャン後に何回スキャンしないかを指定します。skip_scan に指定できる範囲は [0, 9] です。

 \image html skip_scan_image.png 何回に1回だけ計測するか

 たとえば、ミラーの1回転が 100 [msec] のセンサで skip_scan に 1 を指定した場合、データの取得間隔は 200 [msec] になります。


 Example
      enum { CAPTURE_TIMES = 10 };
      urg_start_measurement(&urg, URG_DISTANCE, CAPTURE_TIMES, 0);

      for (i = 0; i < CAPTURE_TIMES; ++i) {
      int n = urg_get_distance(&urg, data, &time_stamp);

      \~japanese
      // 受信したデータの利用
      \~english
      // Processing of obtained data
      \~
      ...
      } 
  \see urg_get_distance(), urg_get_distance_intensity(), urg_get_multiecho(), urg_get_multiecho_intensity(), urg_stop_measurement()
例:
calculate_xy.c, get_distance.c, get_distance_intensity.c, get_multiecho.c, と get_multiecho_intensity.c.
int urg_stop_measurement ( urg_t urg)

計測を中断し、レーザを消灯させます

 \ref urg_start_measurement() の計測を中断します。

 \param[in,out] urg URG センサ管理

 \retval 0 正常
 \retval <0 エラー


 Example
      urg_start_measurement(&urg, URG_DISTANCE, URG_SCAN_INFINITY, 0);
      for (int i = 0; i < 10; ++i) {
      urg_get_distance(&urg, data, NULL);
      }
      urg_stop_measurement(&urg); 
  \see urg_start_measurement()
long urg_time_stamp ( urg_t urg)

タイムスタンプの取得

 \param[in,out] urg URG センサ管理

 \retval >=0 タイムスタンプ [msec]
 \retval <0 エラー


 Example
      urg_start_time_stamp_mode(&urg);

      before_ticks = get_pc_msec_function();
      time_stamp = urg_time_stamp(&urg);
      after_ticks = get_pc_msec_function();

      \~japanese
      // タイムスタンプについての計算
      \~english
      // Processing of timestamp data
      \~
      ...

      urg_stop_time_stamp_mode(&urg); 
  詳しくは \ref sync_time_stamp.c を参照して下さい。
例:
sync_time_stamp.c.
void urg_wakeup ( urg_t urg)

センサを低消費電力のモードから通常の状態に遷移させる

参照:
urg_sleep()