1 #include <libplayerc++/playerc++.h> 8 #define VSPEED 0.4 // meters per second 9 #define WGAIN 1.0 // turn speed gain 10 #define SAFE_DIST 0.3 // meters 11 #define SAFE_ANGLE 0.4 // radians 20 using namespace PlayerCc;
26 robot.SetDataMode(PLAYER_DATAMODE_PULL);
27 robot.SetReplaceRule(
true);
29 Position2dProxy **ppp =
new Position2dProxy *[
gPop];
30 SonarProxy **spp =
new SonarProxy *[
gPop];
31 Graphics2dProxy **gpp =
new Graphics2dProxy *[
gPop];
33 for (uint i = 0; i <
gPop; i++) {
34 ppp[i] =
new Position2dProxy(&robot, i);
37 spp[i] =
new SonarProxy(&robot, i);
40 gpp[i] =
new Graphics2dProxy(&robot, i);
43 spp[i]->RequestGeom();
51 for (uint i = 0; i <
gPop; i++)
52 if (spp[i]->IsFresh())
57 double dx = 0, dy = 0;
59 int num_ranges = spp[i]->GetCount();
60 for (
int s = 0;
s < num_ranges;
s++) {
61 player_pose3d_t spose = spp[i]->GetPose(
s);
62 double srange = spp[i]->GetScan(
s);
64 dx += srange * cos(spose.pyaw);
65 dy += srange * sin(spose.pyaw);
68 double resultant_angle = atan2(dy, dx);
71 double forward_speed = 0.0;
72 double side_speed = 0.0;
73 double turn_speed =
WGAIN * resultant_angle;
75 int forward = num_ranges / 2 - 1;
77 if ((spp[i]->GetScan(forward - 1) >
SAFE_DIST) && (spp[i]->GetScan(forward) >
SAFE_DIST)
78 && (spp[i]->GetScan(forward + 1) >
SAFE_DIST)
84 ppp[i]->SetSpeed(forward_speed, side_speed, turn_speed);
88 if (forward_speed > 0)
89 gpp[i]->Color(0, 255, 0, 0);
91 gpp[i]->Color(0, 255, 255, 0);
93 player_point_2d_t pts[2];
100 gpp[i]->DrawPolyline(pts, 2);
103 }
catch (PlayerCc::PlayerError &e) {
104 std::cerr << e << std::endl;
int parse_args(int argc, char **argv)
uint gPort(PlayerCc::PLAYER_PORTNUM)
std::string gHostname(PlayerCc::PLAYER_HOSTNAME)
int main(int argc, char **argv)