18 const char *
USAGE =
"USAGE: stage [options] <worldfile1> [worldfile2 ... worldfileN]\n" 19 "Available [options] are:\n" 20 " --clock : print simulation time peridically on standard output\n" 21 " -c : equivalent to --clock\n" 22 " --gui : run without a GUI\n" 23 " -g : equivalent to --gui\n" 24 " --help : print this message\n" 25 " --args \"str\" : define an argument string to be passed to all controllers\n" 26 " -a \"str\" : equivalent to --args \"str\"\n" 27 " --host \"str\" : set the http server host name (default: \"localhost\")\n" 28 " --port num : set the http sever port number (default: 8000)\n" 29 " --verbose : provide lots of informative output\n" 30 " -v : equivalent to --verbose\n" 31 " -? : equivalent to --help\n";
34 static struct option
longopts[] = { {
"gui", optional_argument, NULL,
'g' },
35 {
"clock", optional_argument, NULL,
'c' },
36 {
"help", optional_argument, NULL,
'h' },
37 {
"args", required_argument, NULL,
'a' },
38 {
"verbose", no_argument, NULL,
'v' },
39 {
"port", required_argument, NULL,
'p' },
40 {
"host", required_argument, NULL,
'h' },
41 {
"rootdir", required_argument, NULL,
'r' },
42 { NULL, 0, NULL, 0 } };
47 return static_cast<uint64_t
>(stgtime);
61 bzero(pva,
sizeof(av_pva_t));
109 Stg::Size(g->extent[0], g->extent[1], g->extent[2])));
122 bzero(g,
sizeof(av_geom_t));
127 g->
pose[0] = ext.pose.
x;
128 g->pose[1] = ext.pose.y;
129 g->pose[2] = ext.pose.a;
130 g->extent[0] = ext.size.x;
131 g->extent[1] = ext.size.y;
132 g->extent[2] = ext.size.z;
148 static av_ranger_data_t rd;
149 bzero(&rd,
sizeof(rd));
150 bzero(data,
sizeof(av_msg_t));
153 data->interface = AV_INTERFACE_RANGER;
154 data->data = (
const void *)&rd;
158 const std::vector<Stg::ModelRanger::Sensor> &sensors = r->
GetSensors();
160 rd.transducer_count = sensors.size();
162 assert(rd.transducer_count <= AV_RANGER_TRANSDUCERS_MAX);
164 rd.time = data->time;
173 puts(
"ranger set does nothing");
182 static av_ranger_t rgr;
183 bzero(&rgr,
sizeof(rgr));
186 data->interface = AV_INTERFACE_RANGER;
187 data->data = (
const void *)&rgr;
189 rgr.time = data->time;
193 const std::vector<Stg::ModelRanger::Sensor> &sensors = r->
GetSensors();
195 rgr.transducer_count = sensors.size();
197 assert(rgr.transducer_count <= AV_RANGER_TRANSDUCERS_MAX);
199 for (
unsigned int c = 0; c < rgr.transducer_count; c++) {
201 rgr.transducers[c].fov[0].min = -sensors[c].fov / 2.0;
202 rgr.transducers[c].fov[0].max = sensors[c].fov / 2.0;
205 rgr.transducers[c].fov[1].min = 0.0;
206 rgr.transducers[c].fov[1].max = 0.0;
209 rgr.transducers[c].fov[2].min = sensors[c].range.min;
210 rgr.transducers[c].fov[2].min = sensors[c].range.max;
213 rgr.transducers[c].geom.pose[0] = sensors[c].pose.x;
214 rgr.transducers[c].geom.pose[1] = sensors[c].pose.y;
215 rgr.transducers[c].geom.pose[2] = sensors[c].pose.z;
216 rgr.transducers[c].geom.pose[3] = 0.0;
217 rgr.transducers[c].geom.pose[4] = 0.0;
218 rgr.transducers[c].geom.pose[5] = sensors[c].pose.a;
221 rgr.transducers[c].geom.extent[0] = sensors[c].size.x;
222 rgr.transducers[c].geom.extent[1] = sensors[c].size.y;
223 rgr.transducers[c].geom.extent[2] = sensors[c].size.z;
225 av_ranger_transducer_data_t &t = rgr.transducers[c];
228 t.pose[0] = s.
pose.
x;
229 t.pose[1] = s.
pose.
y;
230 t.pose[2] = s.
pose.
z;
233 t.pose[5] = s.
pose.
a;
235 const std::vector<Stg::meters_t> &ranges = s.
ranges;
236 const std::vector<double> &intensities = s.
intensities;
238 assert(ranges.size() == intensities.size());
240 t.sample_count = ranges.size();
242 const double fov_max = s.
fov / 2.0;
243 const double fov_min = -fov_max;
244 const double delta = (fov_max - fov_min) / (
double)t.sample_count;
246 for (
unsigned int r = 0; r < t.sample_count; r++) {
247 t.samples[r][AV_SAMPLE_BEARING] = fov_min + r * delta;
248 t.samples[r][AV_SAMPLE_AZIMUTH] = 0.0;
249 t.samples[r][AV_SAMPLE_RANGE] = ranges[r];
250 t.samples[r][AV_SAMPLE_INTENSITY] = intensities[r];
267 static av_fiducial_data_t fd;
268 bzero(&fd,
sizeof(fd));
269 bzero(data,
sizeof(av_msg_t));
272 data->interface = AV_INTERFACE_FIDUCIAL;
273 data->data = (
const void *)&fd;
277 const std::vector<Stg::ModelFiducial::Fiducial> &sf = fm->
GetFiducials();
279 fd.fiducial_count = sf.size();
281 printf(
"FIDUCIALS %u\n", fd.fiducial_count);
283 for (
size_t i = 0; i < fd.fiducial_count; i++) {
284 fd.fiducials[i].pose[0] = sf[i].bearing;
285 fd.fiducials[i].pose[1] = 0.0;
286 fd.fiducials[i].pose[2] = sf[i].range;
288 fd.fiducials[i].geom.pose[0] = 0.0;
289 fd.fiducials[i].geom.pose[1] = 0.0;
290 fd.fiducials[i].geom.pose[2] = 0.0;
291 fd.fiducials[i].geom.pose[3] = 0.0;
292 fd.fiducials[i].geom.pose[4] = 0.0;
293 fd.fiducials[i].geom.pose[5] = sf[i].geom.a;
295 fd.fiducials[i].geom.extent[0] = sf[i].geom.x;
296 fd.fiducials[i].geom.extent[1] = sf[i].geom.y;
297 fd.fiducials[i].geom.extent[2] = sf[i].geom.z;
307 puts(
"fiducial setcfg does nothing");
316 static av_fiducial_cfg_t cfg;
317 bzero(&cfg,
sizeof(cfg));
320 msg->interface = AV_INTERFACE_FIDUCIAL;
321 msg->data = (
const void *)&cfg;
328 cfg.
fov[0].min = -fid->
fov / 2.0;
329 cfg.fov[0].max = fid->
fov / 2.0;
349 Reg(
const std::string &prototype, av_interface_t interface, av_prop_get_t getter,
350 av_prop_set_t setter)
351 : prototype(prototype), interface(interface), getter(getter), setter(setter)
361 if (mod->
TokenStr() ==
"_ground_model")
364 static std::map<std::string, Reg> type_table;
366 if (type_table.size() == 0)
368 type_table[
"model"] =
Reg(
"generic", AV_INTERFACE_GENERIC, NULL, NULL);
370 type_table[
"position"] =
Reg(
"position2d", AV_INTERFACE_GENERIC, NULL, NULL);
374 type_table[
"fiducial"] =
Reg(
"fiducial", AV_INTERFACE_FIDUCIA, FiducualGet, FiducualSet);
377 printf(
"[AvonStage] registering %s\n", mod->
Token());
381 const std::map<std::string, proto_iface_pair_t>::iterator it =
384 if (it != type_table.end())
387 const char *parent_name = parent ? parent->
Token() : NULL;
389 av_register_object(mod->
Token(), parent_name, it->prototype.c_str(), it->interface, it->getter,
390 it->setter,
dynamic_cast<void *
>(mod));
395 printf(
"Avonstage error: model type \"%s\" not found.\n", mod->
GetModelType().c_str());
404 printf(
"%s %s ", PROJECT, VERSION);
406 int ch = 0, optindex = 0;
408 bool showclock =
false;
410 std::string host =
"localhost";
411 std::string rootdir =
".";
412 unsigned short port = AV_DEFAULT_PORT;
415 while ((ch = getopt_long(argc, argv,
"cvrgh?p?",
longopts, &optindex)) != -1) {
418 printf(
"option %s given\n",
longopts[optindex].name);
425 printf(
"[Clock enabled]");
429 printf(
"[GUI disabled]");
433 case 'p': port = atoi(optarg);
break;
435 host = std::string(optarg);
441 case 'r': rootdir = std::string(optarg);
break;
451 printf(
"unhandled option %c\n", ch);
457 const char *worldfilename = argv[optind];
459 if (worldfilename == NULL) {
460 puts(
"[AvonStage] no worldfile specified on command line. Quit.\n");
466 printf(
"[AvonStage] host %s:%u world %s\n", host.c_str(), port, worldfilename);
472 av_init(host.c_str(), port, rootdir.c_str(),
verbose,
"AvonStage", version);
480 world->
Load(worldfilename);
481 world->ShowClock(showclock);
484 av_install_clock_callbacks((av_clock_get_t)
GetTimeWorld, world);
504 puts(
"\n[AvonStage: done]");
radians_t fov
field of view
meters_t max_range_anon
maximum detection range
int RangerGet(Stg::Model *mod, av_msg_t *data)
int GetModelGeom(Stg::Model *mod, av_geom_t *g)
std::vector< Fiducial > & GetFiducials()
fiducial detector?
void SetPose(const Pose &pose)
int RegisterModel(Stg::Model *mod, void *dummy)
void Init(int *argc, char **argv[])
bool HasSubscribers() const
int SetModelPVA(Stg::Model *mod, av_pva_t *p)
Reg(const std::string &prototype, av_interface_t interface, av_prop_get_t getter, av_prop_set_t setter)
const std::vector< Sensor > & GetSensors() const
meters_t z
location in 3 axes
std::pair< std::string, av_interface_t > proto_iface_pair_t
uint64_t GetTime(Stg::Model *mod)
const std::string & TokenStr() const
uint64_t GetTimeWorld(Stg::World *world)
int FiducialData(Stg::Model *mod, av_msg_t *data)
int SetModelGeom(Stg::Model *mod, av_geom_t *g)
usec_t SimTimeNow(void) const
int main(int argc, char *argv[])
int RangerData(Stg::Model *mod, av_msg_t *data)
int GetModelPVA(Stg::Model *mod, av_pva_t *pva)
const std::string & GetModelType() const
virtual bool Load(const std::string &worldfile_path)
int RangerSet(Stg::Model *mod, av_msg_t *data)
int FiducialGet(Stg::Model *mod, av_msg_t *msg)
static struct option longopts[]
void SetGeom(const Geom &src)
radians_t a
rotation about the z axis.
meters_t min_range
minimum detection range
std::vector< meters_t > ranges
std::vector< double > intensities
static std::string ctrlargs
int FiducialSet(Stg::Model *mod, av_msg_t *data)
const char * Token() const
const char * AVONSTAGE_VERSION