全て データ構造 ファイル 関数 変数 型定義 列挙型 列挙型の値 ページ
データ構造 | 型定義 | 列挙型 | 関数
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 540bc11f70c8 2011/05/08 23:04:49 satofumi

型定義

typedef urg_measurement_type_t(* urg_error_handler)(const char *status, void *urg)

エラーハンドラ

列挙型

計測タイプ

列挙型の値
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 で表現する

anonymous enum
列挙型の値
URG_SCAN_INFINITY 

無限回のデータ取得,

URG_MAX_ECHO 

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

関数

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

接続

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

引数
[in,out]urgURG センサ管理
[in]connection_type通信タイプ
[in]device_or_address接続デバイス名 / IP アドレス
[in]baudrate_or_port接続ボーレート [bps] / TCP/IP ポート
戻り値
0正常
<0エラー

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

Example

urg_t urg;
if (urg_open(&urg, URG_SERIAL, "/dev/ttyACM0", 115200) < 0) {
return 1;
}
...
urg_close(&urg);
注意
URG C ライブラリの他の関数を呼び出す前に、この関数を呼び出す必要があります。
参照
urg_close()
void urg_close ( urg_t urg)

切断

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

引数
[in,out]urgURG センサ管理
参照
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.
void urg_set_timeout_msec ( urg_t urg,
int  msec 
)

タイムアウト時間の設定

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

タイムスタンプの取得

引数
[in,out]urgURG センサ管理
戻り値
>=0タイムスタンプ [msec]
<0エラー

Example

before_ticks = get_pc_msec_function();
time_stamp = urg_time_stamp(&urg);
after_ticks = get_pc_msec_function();
// handle Timestamp
...
urg_stop_time_stamp_mode(&urg);
例:
sync_time_stamp.c.
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() で取得できます。

引数
[in,out]urgURG センサ管理
[in]typeデータ・タイプ
[in]scan_timesデータの取得回数
[in]skip_scanデータの取得間隔
戻り値
0正常
<0エラー

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

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

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

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);
// handle receive data
...
}
参照
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_get_distance ( urg_t urg,
long  data[],
long *  time_stamp 
)

距離データの取得

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

引数
[in,out]urgURG センサ管理
[out]data距離データ [mm]
[out]time_stampタイムスタンプ [msec]
戻り値
>=0受信したデータ個数
<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]));
...
// Retrieve Distance data
urg_start_measurement(&urg, URG_DISTANCE, 1, 0);
int n = urg_get_distance(&urg, data, NULL);
...
// Retrieve Distance data and Tiemstamp
long time_stamp;
n = urg_get_distance(&urg, data, &time_stamp);
参照
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 指定で呼び出しておく必要があります。

引数
[in,out]urgURG センサ管理
[out]data距離データ [mm]
[out]intensity強度データ
[out]time_stampタイムスタンプ [msec]
戻り値
>=0受信したデータ個数
<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);
参照
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 指定で呼び出しておく必要があります。

引数
[in,out]urgURG センサ管理
[out]data_multi距離データ [mm]
[out]time_stampタイムスタンプ [msec]
戻り値
>=0受信したデータ個数
<0エラー

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

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 つめ)
... 

データは昇順に格納されます。

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);
参照
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 指定で呼び出しておく必要があります。

引数
[in,out]urgURG センサ管理
[out]data_multi距離データ [mm]
[out]intensity_multi強度データ
[out]time_stampタイムスタンプ [msec]
戻り値
>=0受信したデータ個数
<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);
参照
urg_start_measurement(), urg_max_data_size()
例:
get_multiecho_intensity.c.
int urg_stop_measurement ( urg_t urg)

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

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

引数
[in,out]urgURG センサ管理
戻り値
0正常
<0エラー

Example

for (int i = 0; i < 10; ++i) {
urg_get_distance(&urg, data, NULL);
}
参照
urg_start_measurement()
int urg_set_scanning_parameter ( urg_t urg,
int  first_step,
int  last_step,
int  skip_step 
)

計測範囲を設定します

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

引数
[in,out]urgURG センサ管理
[in]first_step計測の開始 step
[in]last_step計測の終了 step
[in]skip_step計測データをグルーピングする個数
戻り値
0正常
<0エラー

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

sensor_angle_image.png
センサと step の関係

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

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

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

例えば以下のような距離データが得られる場合に

100, 101, 102, 103, 104, 105, 106, 107, 108, 109

skip_step に 2 を指定すると、得られるデータは以下のようになります。

100, 102, 104, 106, 108

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

Example

urg_deg2step(&urg, +45), 1);
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));
}
参照
urg_step_min_max(), urg_rad2step(), urg_deg2step()
例:
get_distance.c.
int urg_set_communication_data_size ( urg_t urg,
urg_range_data_byte_t  data_byte 
)

通信データのサイズ変更

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

引数
[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_sleep ( urg_t urg)

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

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

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

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

参照
urg_wakeup()
void urg_wakeup ( urg_t urg)

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

参照
urg_sleep()
int urg_is_stable ( urg_t urg)

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

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

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

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_firmware_version ( urg_t urg)

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

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

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

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

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

引数
[in]urgURG センサ管理
戻り値
ステータス文字列
例:
sensor_parameter.c.
const char* urg_sensor_state ( urg_t urg)

センサの状態を返す

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

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

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

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

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

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

引数
[in]dataSCIP 文字列
[in]dataの byte サイズ
戻り値
デコード後の数値