From: Fred L. <ff...@ab...> - 2004-12-06 12:27:45
|
Luis Jesus Manso writes: > Hi Fred >=20 > >I"m not sure about that one. I think it is due to your "think-proc= ess-act" > >loop being too slow and not reading all the info sent to you by pla= yer. I > >used to have that too. Switching to explicit pull mode solved it: > > > >robot.SetDataMode(PLAYER_DATAMODE_PULL_ALL); > > > >and then: > > > >robot.RequestData(); > >robot.Read(); >=20 > I've just tried it. I've added=20 > clientproxy->SetDataMode(PLAYER_DATAMODE_PULL_ALL); after the connec= tion and=20 > launch a thread to refresh the robot state: >=20 > void *refresh(void *ptr) { > PlayerClient *robot; > robot =3D (PlayerClient *)ptr; >=20 > for(;;) { > usleep(100000); > robot->RequestData(); > robot->Read(); > } > } >=20 > The result is (from the client): >=20 > Unknown protocol > WARNING: player_read() errored > player_write(): write() errored.: Descriptor de fichero err=F3neo > player_write(): write() errored.: Descriptor de fichero err=F3neo > player_write(): write() errored.: Descriptor de fichero err=F3neo > Unknown protocol > WARNING: player_read() errored > player_write(): write() errored.: Descriptor de fichero err=F3neo > player_write(): write() errored.: Descriptor de fichero err=F3neo > player_write(): write() errored.: Descriptor de fichero err=F3neo > Unknown protocol > WARNING: player_read() errored I'm not sure why you want to run that in a thread and what errors mean = (not the Portuguese (?) but what they actually mean) but here's what I've go= t: ----------------------------- /* Connect to the Player server */ PlayerClient robot(robotHost.c_str(), playerPort); if(strlen(authKey)) { if(robot.Authenticate(authKey)) { puts("Authentication failed."); quit(1); } } SonarProxy sp(&robot, 0); PositionProxy pp(&robot, 0, 'a'); if (pp.GetAccess() =3D=3D 'e') { puts("Error getting position device access!"); quit(1); } if (pp.SelectVelocityControl(1) =3D=3D -1) { puts("Error while changing velocity control."); } sp.ChangeAccess('r'); if (sp.GetAccess() =3D=3D 'e') { puts("Error getting sonar device access!."); quit(1); } // maybe turn on the motors if (turnOnMotors && pp.SetMotorState(1)) quit(1); robot.SetDataMode(PLAYER_DATAMODE_PULL_ALL); if(robot.RequestData()) exit(1); if(robot.Read()) exit(1); ------------------ and that works. Basically, whenever you want to Read(), you first RequestData(). Hope this helps. Fred P.S. What version of player are you using? I use 1.5. |