31 Logic *lg =
reinterpret_cast<Logic *
>(userarg);
39 explicit Logic(
unsigned int popsize)
40 : population_size(popsize), robots(new
Robot[population_size])
47 for (
unsigned int idx = 0; idx < population_size; idx++) {
49 std::stringstream name;
57 robots[idx].position = posmod;
62 reinterpret_cast<Stg::ModelRanger *
>(robots[idx].position->GetChild(
"ranger:0"));
65 robots[idx].ranger = rngmod;
77 const double vspeed = 0.4;
78 const double wgain = 1.0;
79 const double safe_dist = 0.1;
80 const double safe_angle = 0.3;
85 for (
unsigned int idx = 0; idx < population_size; idx++) {
89 double dx = 0, dy = 0;
92 typedef std::vector<Stg::ModelRanger::Sensor>::const_iterator sensor_iterator;
93 const std::vector<Stg::ModelRanger::Sensor> sensors = rgr->
GetSensors();
95 for (sensor_iterator sensor = sensors.begin(); sensor != sensors.end(); ++sensor) {
97 const double srange = (*sensor).ranges[0];
98 const double angle = (*sensor).pose.a;
100 dx += srange * std::cos(angle);
101 dy += srange * std::sin(angle);
111 const double resultant_angle = std::atan2(dy, dx);
114 const unsigned int forward_idx = sensors.size() / 2u - 1u;
116 const double forwardm_range = sensors[forward_idx - 1].ranges[0];
117 const double forward_range = sensors[forward_idx + 0].ranges[0];
118 const double forwardp_range = sensors[forward_idx + 1].ranges[0];
121 ((forwardm_range > safe_dist / 5.0) && (forward_range > safe_dist)
122 && (forwardp_range > safe_dist / 5.0) && (std::abs(resultant_angle) < safe_angle));
127 const double forward_speed = front_clear ? vspeed : 0.0;
129 const double side_speed = 0.0;
132 const double turn_speed = wgain * resultant_angle;
135 robots[idx].position->SetSpeed(forward_speed, side_speed, turn_speed);
148 puts(
"Usage: stest <worldfile> <number of robots>");
152 const int popsize = atoi(argv[2]);
163 Logic logic(popsize);
Stg::ModelPosition * position
unsigned int population_size
Logic(unsigned int popsize)
void Init(int *argc, char **argv[])
void AddUpdateCallback(world_callback_t cb, void *user)
const std::vector< Sensor > & GetSensors() const
virtual bool Load(const std::string &worldfile_path)
Stg::ModelRanger * ranger
int main(int argc, char *argv[])
void connect(Stg::World *world)
Model * GetModel(const std::string &name) const
static int Callback(Stg::World *world, void *userarg)