From: Solly B. <so...@cs...> - 2006-03-14 02:42:37
|
Hi Geoffrey, Toby, Thanks for the suggestions. I've tried using SetMotorEnable but I get a NACK from player: "playerc error : got NACK from request". Not sure whether the vfh driver supports SetMotorEnable... I guess it should, in which case I'm not sure what's going on. Interestingly, if you try SetSpeed(1,0) it works exactly as expected... robot sets off on its merry way. That's *without* changing any of the code in Position2dProxy. As Geoffrey pointed out the SetSpeed member function also sends a 0 for the motor state: void Position2dProxy::SetSpeed(double aXSpeed, double aYSpeed, double aYawSpeed) { scoped_lock_t lock(mPc->mMutex); playerc_position2d_set_cmd_vel(mDevice,aXSpeed,aYSpeed,aYawSpeed,0); } but this actually works. I've just tried editing the code in Position2dProxy::GoTo and setting the 0 parameter to a 1 as Geoffrey suggested. This time the robot moves (some sort of message is getting through!) but it doesn't behave as expected. eg. GoTo(5,0,0) => robot does nothing eg. GoTo(0,5,0) => robot rotates in a circle continuously Very odd, but perhaps I'm missing something. Solly Geoffrey Biggs wrote: > Looking at the Position2dProxy code, it looks like it should be sending > 1 for the state in both Goto() and SetSpeed(). Try changing the 0 in > Goto() to a 1 and see if that works. > > Geoff > > Solly Brown wrote: > >> Hi all, >> >> Does the GoTo command work in the position2d proxy under player 2.0? >> >> I've set up the vfh driver to provide a position2d interface, and I >> know the cfg file is correct since I'm able to successfully use vfh >> through the playerv utility. >> >> However, I haven't been able to get vfh to work in my own code. There >> are no error messages -- it just doesn't appear to do anything. That >> led me to suspect that the motors weren't enabled, and looking at the >> source code I found this function call in the position2d proxy: >> >> void >> Position2dProxy::GoTo(double aX, double aY, double aYaw) >> { >> scoped_lock_t lock(mPc->mMutex); >> playerc_position2d_set_cmd_pose(mDevice,aX,aY,aYaw,0); >> } >> >> The last parameter in playerc_position2d_set_cmd_pose is 0, and this >> appears to correspond to the motor state being set to disabled. >> Checking the playerv code I find the opposite call: >> >> playerc_position2d_set_cmd_pose(self->proxy, self->goal_px, >> self->goal_py, self->goal_pa, 1); >> >> ie. the last parameter is 1 not a 0. So it seems that the motors in >> the position2d proxy GoTo command are switched off, whereas the >> playerv utility sets them to enabled... which perhaps explains why one >> works and the other one doesn't? >> >> So what's going on here? How do I use the GoTo/vfh in my own code? >> Below is the simplest example of my own code that I expected to work >> but did nothing. >> >> Thanks for your help... >> >> Solly >> >> ------------------------------------- >> #include <iostream> >> #include <libplayerc++/playerc++.h> >> >> int >> main(int argc, char *argv[]) >> { >> using namespace PlayerCc; >> >> PlayerClient robot("localhost"); >> Position2dProxy pp(&robot,1); //vfh position2d proxy >> >> pp.GoTo( 5, 0, 0); >> >> } >> >> --------------------------------------- >> Here's my .cfg file (I'm using gazebo) >> >> driver >> ( >> name "gazebo" >> provides ["simulation:0"] >> plugin "libgazeboplugin" >> server_id "default" >> ) >> >> driver >> ( >> name "gazebo" >> provides ["position2d:0"] >> gz_id "robot1" >> ) >> >> driver >> ( >> name "gazebo" >> provides ["laser:0"] >> gz_id "laser1" >> ) >> >> driver >> ( >> name "vfh" >> provides ["position2d:1"] >> requires ["position2d:0" "laser:0"] >> safety_dist 0.10 >> distance_epsilon 0.3 >> angle_epsilon 5 >> ) >> >> driver >> ( >> name "gazebo" >> provides ["camera:0"] >> gz_id "camera1" >> save 1 >> ) >> >> driver >> ( >> name "gazebo" >> provides ["power:0"] >> gz_id "robot1" >> ) >> > > > > > |