/**
		 * @brief get configuration parameter
		 * @param [in]  src  : configuration parameter declaration
		 * @param [out] dest : configuration parameter
		 */
		inline
		int proc_conf_get(gnd::conf::configuration *src, proc_configuration* dest) {
			gnd_assert(!src, -1, "invalid null pointer");
			gnd_assert(!dest, -1, "invalid null pointer");

			gnd::conf::get_parameter(src, &dest->bmp_map);
			gnd::conf::get_parameter(src, &dest->raw_map);
			gnd::conf::get_parameter(src, &dest->sokuikiraw_name);
			gnd::conf::get_parameter(src, &dest->sokuikiraw_id);
			gnd::conf::get_parameter(src, &dest->sokuikifs_name);
			gnd::conf::get_parameter(src, &dest->sokuikifs_id);
			gnd::conf::get_parameter(src, &dest->particle_name);
			gnd::conf::get_parameter(src, &dest->particle_id);
			gnd::conf::get_parameter(src, &dest->odometry_name);
			gnd::conf::get_parameter(src, &dest->odometry_id);
			gnd::conf::get_parameter(src, &dest->eval_name);
			gnd::conf::get_parameter(src, &dest->eval_id);
			gnd::conf::get_parameter(src, &dest->cycle);
			gnd::conf::get_parameter(src, &dest->sleeping_time);
			gnd::conf::get_parameter(src, &dest->sleeping_dist);
			gnd::conf::get_parameter(src, &dest->cull);
			gnd::conf::get_parameter(src, &dest->blur);
			gnd::conf::get_parameter(src, &dest->scan_range);
			gnd::conf::get_parameter(src, &dest->matching_false);
			gnd::conf::get_parameter(src, &dest->false_positive);

			if( gnd::conf::get_parameter(src, &dest->sleeping_orient) >= 0 ){
				// convert unit of angle(deg2rad)
				dest->sleeping_orient.value = gnd_deg2rad(dest->sleeping_orient.value);
			}
			return 0;
		}
		/**
		 * @brief set configuration parameter declaration
		 * @param [out] dest : configuration parameter declaration
		 * @param [in]  src  : configuration parameter
		 */
		inline
		int proc_conf_set(gnd::conf::configuration *dest, proc_configuration* src) {
			gnd_assert(!src, -1, "invalid null pointer");
			gnd_assert(!dest, -1, "invalid null pointer");

			gnd::conf::set_parameter(dest, &src->bmp_map);
			gnd::conf::set_parameter(dest, &src->raw_map);
			gnd::conf::set_parameter(dest, &src->sokuikiraw_name);
			gnd::conf::set_parameter(dest, &src->sokuikiraw_id);
			gnd::conf::set_parameter(dest, &src->odometry_name);
			gnd::conf::set_parameter(dest, &src->odometry_id);
			gnd::conf::set_parameter(dest, &src->particle_name);
			gnd::conf::set_parameter(dest, &src->particle_id);
			gnd::conf::set_parameter(dest, &src->eval_name);
			gnd::conf::set_parameter(dest, &src->eval_id);
			gnd::conf::set_parameter(dest, &src->cycle);
			gnd::conf::set_parameter(dest, &src->sleeping_time);

			gnd::conf::set_parameter(dest, &src->sleeping_dist);
			// convert unit of angle (rad2deg)
			src->sleeping_orient.value = gnd_rad2deg(src->sleeping_orient.value);

			gnd::conf::set_parameter(dest, &src->sleeping_orient);
			// reconvert unit of angle (rad2deg)
			src->sleeping_orient.value = gnd_deg2rad(src->sleeping_orient.value);

			gnd::conf::set_parameter(dest, &src->cull);
			gnd::conf::set_parameter(dest, &src->blur);
			gnd::conf::set_parameter(dest, &src->scan_range);
			gnd::conf::set_parameter(dest, &src->mfailure);
			return 0;
		}
	namespace peval {

		static const char proc_name[] = "opsm-particle-evaluator";

		// bmp-map
		static const gnd::conf::parameter_array<char, 512> ConfIni_BMPMap = {
				"bmp-map",
				"",		// file path
                                "load map with bmp map directory"
		};

		// raw-map
		static const gnd::conf::parameter_array<char, 512> ConfIni_RawMap = {
				"cnt-map-dir",
				"",		// map file directory
				"load map with counting map"
		};

		// sokuiki-raw-name
		static const gnd::conf::parameter_array<char, 512> ConfIni_SokuikiRawName = {
				"sokuiki-raw-ssm-name",
				SSM_NAME_SCAN_POINT_2D,		// ssm name
				"sokuiki raw data ssm name"
		};

		// sokuiki-raw-id
		static const gnd::conf::parameter<int> ConfIni_SokuikiRawID = {
				"sokuiki-raw-ssm-id",
				0,		// id
				"sokuiki raw data ssm id"
		};


		// sokuiki-raw-name
		static const gnd::conf::parameter_array<char, 512> ConfIni_SokuikiFSName = {
				"sokuiki-fs-ssm-name",
				"",		// ssm name
				"sokuiki fs data ssm name. if sokuiki-raw-ssm-name and id are not defined, read sokuiki fs data from ssm"
		};

		// sokuiki-raw-id
		static const gnd::conf::parameter<int> ConfIni_SokuikiFSID = {
				"sokuiki-fs-ssm-id",
				-1,		// id
				"sokuiki fs data ssm id. if sokuiki-raw-ssm-name and id are not defined, read sokuiki fs data from ssm"
		};

		// odometry-raw-name
		static const gnd::conf::parameter_array<char, 512> ConfIni_OdometryName = {
				"odometry-ssm-name",
				SNAME_ODOMETRY,		// map file directory
				"odometry data ssm name (for sleeping mode)"
		};

		// odometry-raw-id
		static const gnd::conf::parameter<int> ConfIni_OdometryID = {
				"odometry-ssm-id",
				-1,		// map file directory
				"odometry data ssm id (for sleeping mode)"
		};


		// particle-name
		static const gnd::conf::parameter_array<char, 512> ConfIni_ParticleName = {
				"particles-ssm-name",
				SNAME_PARTICLES,		// ssm name
				"particles data ssm name"
		};

		// particle-id
		static const gnd::conf::parameter<int> ConfIni_ParticleID = {
				"particle-ssm-id",
				0,		// ssm id
				"particles data ssm id"
		};


		// particle-name
		static const gnd::conf::parameter_array<char, 512> ConfIni_ParticleEvalName = {
				"particle-eval-ssm-name",
				SNAME_PARTICLES_EVALUATION,		// ssm name
				"particles evaluation data ssm name"
		};

		// particle-id
		static const gnd::conf::parameter<int> ConfIni_ParticleEvalID = {
				"particle-eval-ssm-id",
				0,		// ssm id
				"particles evaluation data ssm id"
		};


		// cycle
		static const gnd::conf::parameter<double> ConfIni_Cycle = {
				"cycle",
				0.083333,	// [s]
				"evaluation cycle"
		};

		// rest-cycle
		static const gnd::conf::parameter<double> ConfIni_SleepingTime = {
				"sleep-time",
				0.0,	// sec
				"if robot did not move, evaluation stop for this time"
		};
		// rest-threshold-distance
		static const gnd::conf::parameter<double> ConfIni_SleepingDist = {
				"sleep-threshold-distance",
				0.01,	// [m]
				"if robot did not move more than this distance, evaluation stop"
		};
		// rest-threshold-orientation
		static const gnd::conf::parameter<double> ConfIni_SleepingOrient = {
				"sleep-threshold-orientation",
				gnd_deg2rad(5),	// [rad]
				"if robot did not move more than this angle, evaluation stop"
		};


		// cull
		static const gnd::conf::parameter<double> ConfIni_Cull = {
				"cull",
				0.1,	// [m]
				"input data culling parameter"
		};

		// blur
		static const gnd::conf::parameter<double> ConfIni_Blur = {
				"blur",
				0.05,			// [m]
		};

		// matching failure
		static const gnd::conf::parameter<double> ConfIni_ScanRangeDist = {
				"scan-range-dist",
				0,			// [m]
		};

		// matching failure
		static const gnd::conf::parameter<double> ConfIni_MatchingFailureRate = {
				"matching-failure-rate",
				0.2,
		};

		// matching failure
		static const gnd::conf::parameter<double> ConfIni_MatchingFalsePositive = {
				"matching-false-positive",
				0.05,
		};

	} // <--- namespace opsm