ライブラリの使い方をサンプルを用いて説明します。
センサとの接続と距離データの取得
センサから距離データを取得する基本的な手順は
- センサに対して接続を行う。
- シリアルポート名を指定して接続する。(シリアル、USB 接続のとき)
- IP アドレスを指定して接続する。(Ethernet 接続のとき)
- センサから距離データを取得する。
- 計測を開始する。
- 計測された距離データを受信する。
となります。
上記の処理をプログラムで記述したものを、以下に示します。
#include <stdlib.h>
int main(void)
{
int ret;
long *length_data;
int length_data_size;
const char connect_device[] = "COM1";
const long connect_baudrate = 115200;
if (ret < 0) {
return 1;
}
if (ret < 0) {
return 1;
}
if (length_data_size <= 0) {
return 1;
}
return 0;
}
プログラム中に出てくる urg_t 構造体は urg_open() 関数を呼び出したときに初期化され、センサパラメータの取得や以降のデータ送受信を管理しています。
このプログラムを実行すると length_data 領域に length_data_size 個のデータが格納されます。
取得した距離データを順に表示するには、以下のように記述します。
for (i = 0; i < length_data; ++i) {
printf("%ld, ", length_data[i]);
}
printf("\n");
また、センサとの接続をイーサーネットで行う場合 urg_open() の記述を以下のように変更します。
const char connect_address[] = "192.168.0.10";
const long connect_port = 10940;
if (ret < 0) {
連続して距離データを取得する
scan_times 回の距離データを取得するプログラムは、以下のように記述できます。
const int scan_times = 123;
int length_data_size;
int i;
if (ret < 0) {
return 1;
}
大抵の場合 urg_start_measurement() と urg_get_distance() のペアを繰り返して呼び出すよりも、取得回数を指定して1度 urg_start_measurement() を呼び出しておき urg_get_distance() で繰り返しデータを取得する方が効率よくデータを取得できます。
計測のパラメータ設定
計測の範囲、ステップ数の間引き設定、スキャンの間引き設定を行うことができます。計測の範囲を狭くしたり、間引きを行うことで受信データ量を減らすことができ、ライブラリ動作の負荷が減少します。
skip_step = 0;
scan_times = 123;
skip_scan = 0;
距離データを取得したときのタイムスタンプを取得する
計測がいつのタイミングで行われたかは urg_get_distance() 関数で取得できます。
urg_get_distance() を用いて取得したタイムスタンプを表示するプログラムは、以下のように記述できます。
const int scan_times = 123;
int length_data_size;
long timestamp;
int i;
if (ret < 0) {
return 1;
}
通常はセンサの計測周期で計測が行われますが、ライブラリを処理する PC の負荷が高い場合は計測データのタイムスタンプ間隔が、センサの計測周期よりも長くなる場合があります。この場合、計測するステップ数を間引くなどの変更で対処できることがあります。
距離データを X-Y 座標系に変換する
計測した距離データを X-Y 座標に変換するには urg_index2rad() を用いてその距離がどの方向にあるかを計算します。
for (i = 0; i < length_data_size; ++i) {
double radian;
long length;
long x;
long y;
length = length_data[i];
x = (long)(length * cos(radian));
y = (long)(length * sin(radian));
printf("(%ld, %ld), ", x, y);
}
printf("\n");
urg_index2rad() は、センサ正面が 0 [deg] としたときのステップの向きをラジアン単位で返します。
センサと urg_index2rad() の関係