Hello Sandy, Thanks for the patch. The latest SVN version of Gazebo should be fixed.
-nate On Thu, Aug 28, 2008 at 12:59 PM, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > I think I may have found an issue with the Simulation Interface while using > Player 2.1.1 and Gazebo revision 6982. I was able to set the position of a > Pioneer2DX with both SetPose2d and SetPose3d but neither of the equivalent > get functions would operate correctly. The GetPose2d function resulted in a > error message being displayed in the gazebo terminal about an unknown request > type. GetPose3d simply crashed player and my test application. After > looking at the gazebo source, I managed to make a few changes to get the > functions to work correctly. I have included a patch of my changes. The > patch also includes the addition of a #include <string.h> to one file for an > unrelated reason. I am using GCC 4.3.1 so standard header files need to be > added to nearly every application to get them to compile. I have also > included my world file, player cfg file, and my minimal test application. > > Sandy > > Patch File: > Index: player/SimulationInterface.cc > =================================================================== > --- player/SimulationInterface.cc (revision 6982) > +++ player/SimulationInterface.cc (working copy) > @@ -162,7 +162,7 @@ > else if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ, > PLAYER_SIMULATION_REQ_GET_POSE2D, > this->device_addr)) > { > - gazebo::SimulationRequestData *gzReq = NULL; > + gazebo::SimulationRequestData * gzReq = NULL; > player_simulation_pose2d_req_t *req = > (player_simulation_pose2d_req_t*)(data); > > @@ -175,6 +175,7 @@ > strcpy((char*)gzReq->modelName, req->name); > this->iface->Unlock(); > + > } > else if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ, > PLAYER_SIMULATION_REQ_GET_PROPERTY, > @@ -250,8 +251,8 @@ > { > player_simulation_pose3d_req_t req; > > - strcpy(req.name, response->modelName); > - req.name_count = strlen(req.name); > + //strcpy(req.name, response->modelName); > + req.name_count = 0;//strlen(req.n ame); > > req.pose.px = response->modelPose.pos.x; > req.pose.py = response->modelPose.pos.y; > @@ -271,8 +272,8 @@ > { > player_simulation_pose2d_req_t req; > > - strcpy(req.name, response->modelName); > - req.name_count = strlen(req.name); > + //strcpy(req.name, response->modelName); > + req.name_count = 0;//strlen(req.name) + 1; > > req.pose.px = response->modelPose.pos.x; > &n bsp; req.pose.py = response->modelPose.pos.y; > Index: server/gui/StatusBar.cc > =================================================================== > --- server/gui/StatusBar.cc (revision 6982) > +++ server/gui/StatusBar.cc (working copy) > @@ -25,6 +25,7 @@ > */ > > #include <stdio.h> > +#include <string.h> > #include <FL/Fl_Value_Output.H> > #include <FL/Fl_Output.H> > #include <FL/Fl_Button.H> > Index: server/World.cc > =================================================================== > --- server/World.cc (revision 6982) > +++ server/World.cc (working copy) > @@ -517,8 +517,6 @@ > // Update the simulation interface > void World::UpdateSimulationIface() > { > - SimulationRequestData *response = NULL; > - > //TODO: Move this method to simulator? Hard because of the models > this->simIface->Lock(1); > < BR>@@ -528,7 +526,7 @@ > return; > } > > - response = this->simIface->data->responses; > + //response = this->simIface->data->responses; > > this->simIface->data->simTime = Simulator::Instance()->GetSimTime(); > this->simIface->data->pauseTime = Simulator::Instance()->GetPauseTime(); > @@ -549,6 +547,7 @@ > for (unsigned int i=0; i < requestCount; i++) > { > SimulationRequestData *req = &(this->simIface->data->requests[i]); > + SimulationRequestData *response = > &(this->simIface->data->responses[this->simIface->data->responseCount]); > > switch (req->type) > { > @@ -608,7 +607,7 @@ > response->mod elPose.pitch = rot.y; > response->modelPose.yaw = rot.z; > > - response++; > + //response++; > this->simIface->data->responseCount += 1; > } > else > @@ -641,14 +640,42 @@ > break; > } > > + case SimulationRequestData::GET_POSE2D: > + { > + Model *model = this->GetModelByName((char*)req->modelName); > + &nbs p; if (model) > + { > + Pose3d pose = model->GetPose(); > + Vector3 rot = pose.rot.GetAsEuler(); > + > + response->type = req->type; > + > + strcpy(response->modelName, req->modelName); > + response->modelPose.pos.x = pose.pos.x; > + response->modelPose.pos.y = pose.pos.y; > + response->modelPose.pos.z = pose.pos.z; > + > + response->modelPose.roll = rot.x; > + respons e->modelPose.pitch = rot.y; > + response->modelPose.yaw = rot.z; > + > + //response++; > + this->simIface->data->responseCount += 1; > + } > + else > + { > + gzerr(0) << "Invalid model name[" << req->modelName << "] in > simulation interface Get Pose 2d Request.\n"; > + } > + break; > + } > + > default: > gzerr(0) << "Unknown simulation iface request[" << req->type << "]\n"; > &nbs p; break; > } > - > - this->simIface->data->requestCount = 0; > } > > + this->simIface->data->requestCount = 0; > this->simIface->Unlock(); > } > > Test Application: > #include <stdio.h> > #include <libplayerc++/playerc++.h> > #include <assert.h> > int main(){ > PlayerCc::PlayerClient playerClient("localhost"); > PlayerCc::Position2dProxy position(&playerClient, 0); > PlayerCc::SimulationProxy simulation(&playerClient, 0); > #if(1) > double x, y, a; > while(1){ > playerClient.Read(); > printf("Enter new pose 2D (x, y, a):\n"); > scanf("%lf %lf %lf", &x, &y, &a); > simulation.SetPose2d((char*)"pioneer2dx_model1", x, y, a); > simulation.GetPose2d((char*)"pioneer2dx_model1", x, y, a); > printf("New position is (%lf, %lf, %lf)\n", x, y, a); > } > #else > double x, y, z, roll, pitch, yaw, time; > while(1){ > playerClient.Read(); > printf("Enter new pose 3D (x y z roll pitch yaw):\n"); > scanf("%lf %lf %lf %lf %lf %lf", &x, &y, &z, &roll, &pitch, &yaw); > simulation.SetPose3d((char*)"pioneer2dx_model1", x, y, z, roll, pitch, yaw); > simulation.GetPose3d((char*)"pioneer2dx_model1", x, y, z, roll, pitch, yaw, > time); > printf("New position is (%lf, %lf, %lf, %lf, %lf, %lf) at time: %lf\n", x, y, > z, roll, pitch, yaw, time); > } > #endif > } > World File: > <?xml version="1.0"?> > <gazebo:world > xmlns:xi="http://www.w3.org/2001/XInclude" > xmlns:gazebo="http://playerstage.sourceforge.net/gazebo/xmlschema/#gz" > xmlns:model="http://playerstage.sourceforge.net/gazebo/xmlschema/#model" > xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor" > xmlns:window="http://playerstage.sourceforge.net/gazebo/xmlschema/#window" > xmlns:param="http://playerstage.sourceforge.net/gazebo/xmlschema/#param" > xmlns:body="http://playerstage.sourceforge.net/gazebo/xmlschema/#body" > xmlns:geom="http://playerstage.sourceforge.net/gazebo/xmlschema/#geom" > xmlns:joint="http://playerstage.sourceforge.net/gazebo/xmlschema/#joint" > xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface" > xmlns:ui="http://playerstage.sourceforge.net/gazebo/xmlschema/#ui" > xmlns:rendering="http://playerstage.sourceforge.net/gazebo/xmlschema/#rendering" > xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller" > xmlns:physics="http://playerstage.sourceforge.net/gazebo/xmlschema/#physics" > > <verbosity>5</verbosity> > <physics:ode> > <stepTime>0.03</stepTime> > <gravity>0 0 -9.8</gravity> > <cfm>10e-5</cfm> > <erp>0.3</erp> > </physics:ode> > <rendering:gui> > <type>fltk</type> > <size>800 600</size> > <pos>0 0</pos> > <xyz>0 0 0</xyz> > <rpy>0 0 0</rpy> > </rendering:gui> > <rendering:ogre> > <ambient>0.5 0.5 0.5 1.0</ambient> > </rendering:ogre> > <!-- Ground Plane --> > <model:physical name="plane1_model"> > <xyz>0 0 0</xyz> > <rpy>0 0 0</rpy> > <static>true</static> > <body:plane name="plane1_body"> > <geom:plane name="plane1_geom"> > <normal>0 0 1</normal> > <size>2000 2000</size> > <segments>10 10</segments> > <uvTile>100 100</uvTile> > <material>Gazebo/Grey</material> > </geom:plane> > </body:plane> > </model:physical> > <!-- > Include the complete model described in the .model file > This assumes the root node is a <model:...> > --> > <!-- <include embedded="false"> > <xi:include href="pioneer2dx.model" /> > </include> > --> > <model:physical name="pioneer2dx_model1"> > <xyz>0 0 0.145</xyz> > <rpy>0.0 0.0 0.0</rpy> > <controller:differential_position2d name="controller1"> > <leftJoint>left_wheel_hinge</leftJoint> > <rightJoint>right_wheel_hinge</rightJoint> > <wheelSeparation>0.39</wheelSeparation> > <wheelDiameter>0.15</wheelDiameter> > <torque>5</torque> > <interface:position name="position_iface_0"/> > </controller:differential_position2d> > <include embedded="true"> > <xi:include href="models/pioneer2dx.model" /> > </include> > </model:physical> > <!-- White Directional light --> > <model:renderable name="directional_white"> > <light> > <type>directional</type> > <direction>0 -0.6 -0.4</direction> > <diffuseColor>1.0 1.0 1.0</diffuseColor> > <specularColor>0.2 0.2 0.2</specularColor> > <attenuation>1000 1.0 0.0 0</attenuation> > </light> > </model:renderable> > </gazebo:world> > > Player cfg file: > driver > ( > name "gazebo" > provides ["simulation:0"] > plugin "/home/freedmst/local/gazebo/lib/libgazeboplugin" > server_id "default" > ) > driver > ( > name "gazebo" > provides ["position2d:0"] > gz_id "position_iface_0" > ) > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Playerstage-gazebo mailing list > Playerstage-gazebo@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/playerstage-gazebo > ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Playerstage-gazebo mailing list Playerstage-gazebo@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-gazebo