Webots 使い方まとめ

11. フィールドパラメータの取得

supervisorは、worldに存在するNodeのFieldパラメータにアクセスすることができる。 これによってロボットの位置等を簡単に知ることができる。

.1 アクセスするノードのDEF定義

各ノードのフィールドにアクセスする場合、そのノードを特定しなくてはならない。 同じ種類のロボットや物体を複数設置している場合、その内のどの個体のフィールドにアクセスするか明確にする必要がある。 特定方法はいくつかあるが、最も使用者が扱いやすいDEFキーワードを使う。
Scene Tree から e-puck を選択し、DEFキーワードとして"ROBOT1"(任意)を指定する。


.2 関数

supervisor.hで定義されている wb_supervisor_start_movie() を使用する。

#include<webots/supervisor.h>
WbNodeRef wb_supervisor_node_get_from_def( const char *def );
WbFieldRef wb_supervisor_node_get_field( WbNodeRef node, const char *field_name );
const double *wb_supervisor_field_get_sf_vec3f( WbFieldRef field );

wb_supervisor_node_get_from_def()は引数*defに指定されているDEFキーワード で定義されているノードを探し、WbNodeRef形式で返す。(WbNodeRefはプログラム内でノードを扱うためのハンドラ)

wb_supervisor_node_get_field()は第一引数のnodeで指定されているノードのフィールドの中から、 第二引数*field_nameで指定されているフィールド名を探し、WbFieldRef形式で返す。
(WbFieldRefはプログラム内でフィールドを扱うためのハンドラ)

最後にwb_supervisor_field_get_sf_vec3f()は引数fieldに指定されているフィールドから、 3次元ベクトルのパラメータを取得する。 この関数はフィールドのパラメータの形式に対応させないといけないため、 その他の形式に対応した関数をこの節の最後に記載する。

.3 使用例

次のサンプルは、"ROBOT1"とDEF定義したロボットの座標フィールドtransaltionのパラメータを取得し、標準出力する。

#include <webots/robot.h>
#include <webots/supervisor.h>
int main(int argc,char *argv[]) {
	WbNodeRef node; //ノードハンドラの定義
	WbFieldRef field; //フィールドハンドラの定義
	const double *Translation; //座標入力用変数の定義
	wb_robot_init(); //ロボットの初期化
	//ノードの取得
	node = wb_supervisor_node_get_from_def("ROBOT1");
	//フィールドの取得
	field = wb_supervisor_node_get_field(node,"translation");
	while(wb_robot_step(32)!=-1)
	{
		//一秒待つ
		wb_robot_step(1000);
		//座標の取得
		Translation = wb_supervisor_field_get_sf_vec3f(field);
		printf("translation = %f %f %f \n\n"
		,Translation[0],Translation[1],Translation[2]);
	}
	wb_robot_cleanup();
	return 0;
}

まずwb_supervisor_node_get_from_def()で"ROBOT1"とDEF定義したノードを取得する。 次にwb_supervisor_node_get_field()で"ROBOT1"のフィールドである"transration"フィールドを取得する。 そして、1秒ごとにwb_supervisor_field_get_sf_vec3f()を用いて"transration"のパラメータを取得している。

.4 その他パラメータ形式に対応した関数

この節で使用したwb_supervisor_field_get_sf_vec3f()は3 次元ベクトルパラメータの取得(座標等)のみに対応している。 よって他の種類のパラメータ(回転角度等)を取得するためには以下の関数を使用する必要がある。

#include <webots/supervisor.h>
bool wb_supervisor_field_get_sf_bool (WbFieldRef field);
int wb_supervisor_field_get_sf_int32 (WbFieldRef field);
double wb_supervisor_field_get_sf_float (WbFieldRef field);
const double *wb_supervisor_field_get_sf_vec2f (WbFieldRef sf field);
const double *wbvsupervisor_field_ge_sf_vec3f (WbFieldRef field);
const double *wb_supervisor_field_get_sf_rotation (WbFieldRef field);
const double *wb_supervisor_field_get_sf_color (WbFieldRef field);
const char *wb_supervisor_field_get_sf_string (WbFieldRef field);
WbNodeRef wb_supervisor_field_getvsf_node (WbFieldRef field);

HOME > Webots 使い方まとめ > 11. フィールドパラメータの取得