Revision: 7016
http://playerstage.svn.sourceforge.net/playerstage/?rev=7016&view=rev
Author: natepak
Date: 2008-09-09 22:04:34 +0000 (Tue, 09 Sep 2008)
Log Message:
-----------
Added contact sensor, bumper controller, and bumper interface
Modified Paths:
--------------
code/gazebo/trunk/SConstruct
code/gazebo/trunk/libgazebo/Iface.cc
code/gazebo/trunk/libgazebo/gazebo.h
code/gazebo/trunk/player/GazeboDriver.cc
code/gazebo/trunk/player/SConscript
code/gazebo/trunk/server/controllers/SConscript
code/gazebo/trunk/server/physics/ContactParams.hh
code/gazebo/trunk/server/physics/Geom.cc
code/gazebo/trunk/server/physics/ode/ODEPhysics.cc
code/gazebo/trunk/server/sensors/SConscript
Added Paths:
-----------
code/gazebo/trunk/player/BumperInterface.cc
code/gazebo/trunk/player/BumperInterface.hh
code/gazebo/trunk/server/controllers/bumper/
code/gazebo/trunk/server/controllers/bumper/SConscript
code/gazebo/trunk/server/controllers/bumper/generic/
code/gazebo/trunk/server/controllers/bumper/generic/Generic_Bumper.cc
code/gazebo/trunk/server/controllers/bumper/generic/Generic_Bumper.hh
code/gazebo/trunk/server/controllers/bumper/generic/SConscript
code/gazebo/trunk/server/sensors/contact/
code/gazebo/trunk/server/sensors/contact/ContactSensor.cc
code/gazebo/trunk/server/sensors/contact/ContactSensor.hh
code/gazebo/trunk/server/sensors/contact/SConscript
code/gazebo/trunk/worlds/bumper.world
Modified: code/gazebo/trunk/SConstruct
===================================================================
--- code/gazebo/trunk/SConstruct 2008-09-09 22:02:13 UTC (rev 7015)
+++ code/gazebo/trunk/SConstruct 2008-09-09 22:04:34 UTC (rev 7016)
@@ -45,6 +45,7 @@
'#server/sensors',
'#server/sensors/camera',
'#server/sensors/ray',
+ '#server/sensors/contact',
'#server/physics',
'#server/physics/ode',
'#server/controllers',
Modified: code/gazebo/trunk/libgazebo/Iface.cc
===================================================================
--- code/gazebo/trunk/libgazebo/Iface.cc 2008-09-09 22:02:13 UTC (rev
7015)
+++ code/gazebo/trunk/libgazebo/Iface.cc 2008-09-09 22:04:34 UTC (rev
7016)
@@ -58,6 +58,7 @@
GZ_REGISTER_IFACE("ptz", PTZIface);
GZ_REGISTER_IFACE("stereocamera", StereoCameraIface);
GZ_REGISTER_IFACE("opaque", OpaqueIface);
+GZ_REGISTER_IFACE("bumper", BumperIface);
//////////////////////////////////////////////////////////////////////////////
// Create an interface
Modified: code/gazebo/trunk/libgazebo/gazebo.h
===================================================================
--- code/gazebo/trunk/libgazebo/gazebo.h 2008-09-09 22:02:13 UTC (rev
7015)
+++ code/gazebo/trunk/libgazebo/gazebo.h 2008-09-09 22:04:34 UTC (rev
7016)
@@ -1411,9 +1411,66 @@
/** \} */
/// \}
+
/***************************************************************************/
/// \addtogroup libgazebo_iface
/// \{
+/** \defgroup bumper_iface Bumper
+
+ \brief Bumper interface
+
+The bumper interface allows a client to read data from a bumper/contact sensor
+\{
+*/
+
+#define GAZEBO_MAX_BUMPER_COUNT 128
+
+/// \brief Bumper data
+class BumperData
+{
+ public: GazeboData head;
+
+ /// State of the bumpers
+ public: uint8_t bumpers[GAZEBO_MAX_BUMPER_COUNT];
+
+ /// Bumper count
+ public: unsigned int bumper_count;
+};
+
+/// \brief Bumper interface
+class BumperIface : public Iface
+{
+ /// \brief Constructor
+ public: BumperIface():Iface("bumper",
sizeof(BumperIface)+sizeof(BumperData)) {}
+
+ /// \brief Destructor
+ public: virtual ~BumperIface() {this->data = NULL;}
+
+ /// \brief Create the server
+ public: virtual void Create(Server *server, std::string id)
+ {
+ Iface::Create(server,id);
+ this->data = (BumperData*)this->mMap;
+ }
+
+ /// \brief Open the iface
+ public: virtual void Open(Client *client, std::string id)
+ {
+ Iface::Open(client,id);
+ this->data = (BumperData*)this->mMap;
+ }
+
+ /// Pointer to the bumper data
+ public: BumperData *data;
+};
+
+/** \} */
+/// \}
+
+
+/***************************************************************************/
+/// \addtogroup libgazebo_iface
+/// \{
/** \defgroup opaque_iface opaque
\brief Interface for arbitrary data transfer
Added: code/gazebo/trunk/player/BumperInterface.cc
===================================================================
--- code/gazebo/trunk/player/BumperInterface.cc (rev 0)
+++ code/gazebo/trunk/player/BumperInterface.cc 2008-09-09 22:04:34 UTC (rev
7016)
@@ -0,0 +1,140 @@
+/*
+ * Gazebo - Outdoor Multi-Robot Simulator
+ * Copyright (C) 2003
+ * Nate Koenig & Andrew Howard
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+/* Desc: Bumper Interface for Player
+ * Author: Nate Koenig
+ * Date: 09 Sept. 2008
+ * CVS: $Id:$
+ */
+
+/**
[EMAIL PROTECTED] player
[EMAIL PROTECTED] Bumper Interface
+- PLAYER_BUMPER_DATA_STATE
+*/
+
+/* TODO
+- PLAYER_BUMPER_REQ_GET_GEOM
+*/
+
+#include <iostream>
+#include <math.h>
+
+#include "gazebo.h"
+#include "GazeboDriver.hh"
+#include "BumperInterface.hh"
+
+using namespace gazebo;
+
+///////////////////////////////////////////////////////////////////////////////
+// Constructor
+BumperInterface::BumperInterface(player_devaddr_t addr,
+ GazeboDriver *driver, ConfigFile *cf,
+ int section)
+ : GazeboInterface(addr, driver, cf, section)
+{
+ // Get the ID of the interface
+ this->gz_id = (char*) calloc(1024, sizeof(char));
+ strcat(this->gz_id, GazeboClient::prefixId);
+ strcat(this->gz_id, cf->ReadString(section, "gz_id", ""));
+
+ // Allocate a Position Interface
+ this->iface = new BumperIface();
+
+ this->datatime = -1;
+
+ this->data.bumpers_count = 1;
+ this->data.bumpers = new uint8_t[1];
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Destructor
+BumperInterface::~BumperInterface()
+{
+ // Release this interface
+ delete this->iface;
+
+ delete [] this->data.bumpers;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Handle all messages. This is called from GazeboDriver
+int BumperInterface::ProcessMessage(QueuePointer &respQueue,
+ player_msghdr_t *hdr, void *data)
+{
+ return -1;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Update this interface, publish new info. This is
+// called from GazeboDriver::Update
+void BumperInterface::Update()
+{
+ this->iface->Lock(1);
+
+ // Only Update when new data is present
+ if (this->iface->data->head.time > this->datatime)
+ {
+ this->datatime = this->iface->data->head.time;
+
+ if (this->data.bumpers_count < this->iface->data->bumper_count)
+ {
+ delete [] this->data.bumpers;
+ this->data.bumpers = new uint8_t[this->iface->data->bumper_count];
+ }
+
+ // Copy bumper data
+ this->data.bumpers_count = this->iface->data->bumper_count;
+ memcpy( this->data.bumpers, this->iface->data->bumpers,
+ sizeof(uint8_t) * this->data.bumpers_count );
+
+ this->driver->Publish( this->device_addr,
+ PLAYER_MSGTYPE_DATA,
+ PLAYER_BUMPER_DATA_STATE,
+ (void*)&data, sizeof(data), &this->datatime );
+ }
+
+ this->iface->Unlock();
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Open a SHM interface when a subscription is received. This is called from
+// GazeboDriver::Subscribe
+void BumperInterface::Subscribe()
+{
+ try
+ {
+ this->iface->Open( GazeboClient::client, this->gz_id);
+ }
+ catch (std::string e)
+ {
+ std::cerr << "Error subscribing to Gazebo Bumper Interface\n"
+ << e << "\n";
+ exit(0);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Close a SHM interface. This is called from GazeboDriver::Unsubscribe
+void BumperInterface::Unsubscribe()
+{
+ this->iface->Close();
+}
Added: code/gazebo/trunk/player/BumperInterface.hh
===================================================================
--- code/gazebo/trunk/player/BumperInterface.hh (rev 0)
+++ code/gazebo/trunk/player/BumperInterface.hh 2008-09-09 22:04:34 UTC (rev
7016)
@@ -0,0 +1,83 @@
+/*
+ * Gazebo - Outdoor Multi-Robot Simulator
+ * Copyright (C) 2003
+ * Nate Koenig & Andrew Howard
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+/* Desc: Bumper Interface for Player
+ * Author: Nate Koenig
+ * Date: 09 Sept. 2008
+ * SVN: $Id:$
+ */
+
+#ifndef BUMPERINTERFACE_HH
+#define BUMPERINTERFACE_HH
+
+#include "GazeboInterface.hh"
+
+namespace gazebo
+{
+ /// \addtogroup player_iface
+ /// \{
+ /// \defgroup gripper_player Bumper Interface
+ /// \brief Bumper Player interface
+ /// \{
+
+ class BumperIface;
+
+ /// \brief Bumper interface
+ class BumperInterface : public GazeboInterface
+ {
+ /// \brief Constructor
+ public: BumperInterface(player_devaddr_t addr, GazeboDriver *driver,
+ ConfigFile *cf, int section);
+
+ /// \brief Destructor
+ public: virtual ~BumperInterface();
+
+ /// \brief Handle all messages. This is called from GazeboDriver
+ public: virtual int ProcessMessage(QueuePointer &respQueue,
+ player_msghdr_t *hdr, void *data);
+
+ /// \brief Update this interface, publish new info.
+ public: virtual void Update();
+
+ /// \brief Open a SHM interface when a subscription is received.
+ /// This is called fromGazeboDriver::Subscribe
+ public: virtual void Subscribe();
+
+ /// \brief Close a SHM interface. This is called from
+ /// GazeboDriver::Unsubscribe
+ public: virtual void Unsubscribe();
+
+ private: BumperIface *iface;
+
+ /// \brief Gazebo id. This needs to match and ID in a Gazebo WorldFile
+ private: char *gz_id;
+
+ /// \brief Timestamp on last data update
+ private: double datatime;
+
+ private: player_bumper_data_t data;
+ };
+
+ /// \}
+ /// \}
+
+}
+
+#endif
Modified: code/gazebo/trunk/player/GazeboDriver.cc
===================================================================
--- code/gazebo/trunk/player/GazeboDriver.cc 2008-09-09 22:02:13 UTC (rev
7015)
+++ code/gazebo/trunk/player/GazeboDriver.cc 2008-09-09 22:04:34 UTC (rev
7016)
@@ -39,6 +39,7 @@
#include "ActarrayInterface.hh"
#include "OpaqueInterface.hh"
#include "PTZInterface.hh"
+#include "BumperInterface.hh"
#include "GripperInterface.hh"
/*
@@ -311,6 +312,12 @@
ifsrc = new GripperInterface( playerAddr, this, cf, section );
break;
+ case PLAYER_BUMPER_CODE:
+ if (!player_quiet_startup) printf(" a bumper interface.\n");
+ ifsrc = new BumperInterface( playerAddr, this, cf, section );
+ break;
+
+
/* case PLAYER_POWER_CODE:
if (!player_quiet_startup) printf(" a power interface.\n");
ifsrc = new PowerInterface( playerAddr, this, cf, section );
Modified: code/gazebo/trunk/player/SConscript
===================================================================
--- code/gazebo/trunk/player/SConscript 2008-09-09 22:02:13 UTC (rev 7015)
+++ code/gazebo/trunk/player/SConscript 2008-09-09 22:04:34 UTC (rev 7016)
@@ -16,7 +16,8 @@
'PTZInterface.cc',
'OpaqueInterface.cc',
'ActarrayInterface.cc',
- 'GripperInterface.cc'
+ 'GripperInterface.cc',
+ 'BumperInterface.cc'
]
# Position3dInterface.cc PowerInterface.cc SonarInterface.ccGpsInterface.cc ')
Modified: code/gazebo/trunk/server/controllers/SConscript
===================================================================
--- code/gazebo/trunk/server/controllers/SConscript 2008-09-09 22:02:13 UTC
(rev 7015)
+++ code/gazebo/trunk/server/controllers/SConscript 2008-09-09 22:04:34 UTC
(rev 7016)
@@ -1,7 +1,7 @@
#Import variable
Import('env sharedObjs headers')
-dirs = Split('position2d laser camera factory gripper actarray ptz opaque')
+dirs = Split('position2d laser camera factory gripper actarray ptz opaque
bumper')
if env['with_audio'] == 'yes':
dirs+=Split('audio')
Added: code/gazebo/trunk/server/controllers/bumper/SConscript
===================================================================
--- code/gazebo/trunk/server/controllers/bumper/SConscript
(rev 0)
+++ code/gazebo/trunk/server/controllers/bumper/SConscript 2008-09-09
22:04:34 UTC (rev 7016)
@@ -0,0 +1,7 @@
+#Import variable
+Import('env sharedObjs')
+
+dirs = Split('generic')
+
+for subdir in dirs :
+ SConscript('%s/SConscript' % subdir)
Added: code/gazebo/trunk/server/controllers/bumper/generic/Generic_Bumper.cc
===================================================================
--- code/gazebo/trunk/server/controllers/bumper/generic/Generic_Bumper.cc
(rev 0)
+++ code/gazebo/trunk/server/controllers/bumper/generic/Generic_Bumper.cc
2008-09-09 22:04:34 UTC (rev 7016)
@@ -0,0 +1,99 @@
+/*
+ * Gazebo - Outdoor Multi-Robot Simulator
+ * Copyright (C) 2003
+ * Nate Koenig & Andrew Howard
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+/*
+ * Desc: Bumper controller
+ * Author: Nate Koenig
+ * Date: 09 Setp. 2008
+ */
+
+#include "Global.hh"
+#include "XMLConfig.hh"
+#include "ContactSensor.hh"
+#include "World.hh"
+#include "gazebo.h"
+#include "GazeboError.hh"
+#include "ControllerFactory.hh"
+#include "Simulator.hh"
+#include "Generic_Bumper.hh"
+
+using namespace gazebo;
+
+GZ_REGISTER_STATIC_CONTROLLER("bumper", Generic_Bumper);
+
+////////////////////////////////////////////////////////////////////////////////
+// Constructor
+Generic_Bumper::Generic_Bumper(Entity *parent )
+ : Controller(parent)
+{
+ this->myParent = dynamic_cast<ContactSensor*>(this->parent);
+
+ if (!this->myParent)
+ gzthrow("Bumper controller requires a Contact Sensor as its parent");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Destructor
+Generic_Bumper::~Generic_Bumper()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Load the controller
+void Generic_Bumper::LoadChild(XMLConfigNode *node)
+{
+ this->myIface = dynamic_cast<BumperIface*>(this->ifaces[0]);
+
+ if (!this->myIface)
+ {
+ gzthrow("Generic_Bumper controller requires an BumperIface");
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Initialize the controller
+void Generic_Bumper::InitChild()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Update the controller
+void Generic_Bumper::UpdateChild()
+{
+ this->myIface->Lock(1);
+
+ this->myIface->data->bumper_count = this->myParent->GetContactCount();
+
+ for (unsigned int i=0; i < this->myParent->GetContactCount(); i++)
+ {
+ this->myIface->data->head.time = this->myParent->GetContactTime(i);
+ this->myIface->data->bumpers[i] = this->myParent->GetContactState(i);
+ }
+
+ this->myParent->ResetContactStates();
+
+ this->myIface->Unlock();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Finalize the controller
+void Generic_Bumper::FiniChild()
+{
+}
Added: code/gazebo/trunk/server/controllers/bumper/generic/Generic_Bumper.hh
===================================================================
--- code/gazebo/trunk/server/controllers/bumper/generic/Generic_Bumper.hh
(rev 0)
+++ code/gazebo/trunk/server/controllers/bumper/generic/Generic_Bumper.hh
2008-09-09 22:04:34 UTC (rev 7016)
@@ -0,0 +1,86 @@
+/*
+ * Gazebo - Outdoor Multi-Robot Simulator
+ * Copyright (C) 2003
+ * Nate Koenig & Andrew Howard
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+/*
+ * Desc: Bumper Controller
+ * Author: Nate Koenig
+ * Date: 09 Sept 2008
+ */
+#ifndef GENERICBUMPER_CONTROLLER_HH
+#define GENERICBUMPER_CONTROLLER_HH
+
+#include <sys/time.h>
+
+#include "Controller.hh"
+#include "Entity.hh"
+
+namespace gazebo
+{
+ class ContactSensor;
+
+ /// \addtogroup gazebo_controller
+ /// \{
+ /** \defgroup bumper bumper
+
+ \brief A controller that returns bump contacts
+
+ \{
+ */
+
+ /// \brief A Bumper controller
+ class Generic_Bumper : public Controller
+ {
+ /// Constructor
+ public: Generic_Bumper(Entity *parent );
+
+ /// Destructor
+ public: virtual ~Generic_Bumper();
+
+ /// Load the controller
+ /// \param node XML config node
+ /// \return 0 on success
+ protected: virtual void LoadChild(XMLConfigNode *node);
+
+ /// Init the controller
+ /// \return 0 on success
+ protected: virtual void InitChild();
+
+ /// Update the controller
+ /// \return 0 on success
+ protected: virtual void UpdateChild();
+
+ /// Finalize the controller
+ /// \return 0 on success
+ protected: virtual void FiniChild();
+
+ /// The parent Model
+ private: ContactSensor *myParent;
+
+ /// The Iface.
+ private: BumperIface *myIface;
+ };
+
+ /** \} */
+ /// \}
+
+}
+
+#endif
+
Added: code/gazebo/trunk/server/controllers/bumper/generic/SConscript
===================================================================
--- code/gazebo/trunk/server/controllers/bumper/generic/SConscript
(rev 0)
+++ code/gazebo/trunk/server/controllers/bumper/generic/SConscript
2008-09-09 22:04:34 UTC (rev 7016)
@@ -0,0 +1,6 @@
+#Import variable
+Import('env sharedObjs')
+
+sources = Split('Generic_Bumper.cc')
+
+sharedObjs.append(env.SharedObject(sources))
Modified: code/gazebo/trunk/server/physics/ContactParams.hh
===================================================================
--- code/gazebo/trunk/server/physics/ContactParams.hh 2008-09-09 22:02:13 UTC
(rev 7015)
+++ code/gazebo/trunk/server/physics/ContactParams.hh 2008-09-09 22:04:34 UTC
(rev 7016)
@@ -27,47 +27,60 @@
#ifndef CONTACTPARAMS_HH
#define CONTACTPARAMS_HH
+#include <boost/signal.hpp>
+#include <boost/bind.hpp>
+
namespace gazebo
{
+ class Geom;
+
class XMLConfigNode;
-/// \brief Contact params
-class ContactParams
-{
- /// Constructor
- public: ContactParams();
-
- /// \brief Load the contact params
- public: void Load(XMLConfigNode *node);
-
- /// Spring constant
- public: double kp;
-
- /// Damping constant
- public: double kd;
-
- /// 0..1, 0=no bounciness
- public: double bounce;
+ /// \brief Contact params
+ class ContactParams
+ {
+ /// Constructor
+ public: ContactParams();
- /// first coefficient of friction
- public: double mu1;
+ /// \brief Load the contact params
+ public: void Load(XMLConfigNode *node);
+
+ public: template< typename C>
+ void Callback( void (C::*func)(Geom *, Geom*), C *c )
+ {
+ contactSignal.connect( boost::bind( func, c, _1, _2 ) );
+ }
+
+ /// Spring constant
+ public: double kp;
+
+ /// Damping constant
+ public: double kd;
+
+ /// 0..1, 0=no bounciness
+ public: double bounce;
+
+ /// first coefficient of friction
+ public: double mu1;
+
+ /// second coefficient of friction
+ public: double mu2;
+
+ /// Force-dependent-slip direction 1
+ public: double slip1;
+
+ /// Force-dependent-slip direction 2
+ public: double slip2;
+
+ /// \brief bounce vel
+ public: double bounceVel;
+
+ /// \brief soft constraint force mixing
+ public: double softCfm;
+
+ public: boost::signal< void (Geom*, Geom*)> contactSignal;
+ };
+}
- /// second coefficient of friction
- public: double mu2;
-
- /// Force-dependent-slip direction 1
- public: double slip1;
-
- /// Force-dependent-slip direction 2
- public: double slip2;
-
- /// \brief bounce vel
- public: double bounceVel;
-
- /// \brief soft constraint force mixing
- public: double softCfm;
-};
-
-}
#endif
Modified: code/gazebo/trunk/server/physics/Geom.cc
===================================================================
--- code/gazebo/trunk/server/physics/Geom.cc 2008-09-09 22:02:13 UTC (rev
7015)
+++ code/gazebo/trunk/server/physics/Geom.cc 2008-09-09 22:04:34 UTC (rev
7016)
@@ -517,4 +517,3 @@
this->body->UpdateCoM();
}
-
Modified: code/gazebo/trunk/server/physics/ode/ODEPhysics.cc
===================================================================
--- code/gazebo/trunk/server/physics/ode/ODEPhysics.cc 2008-09-09 22:02:13 UTC
(rev 7015)
+++ code/gazebo/trunk/server/physics/ode/ODEPhysics.cc 2008-09-09 22:04:34 UTC
(rev 7016)
@@ -287,10 +287,13 @@
contact.surface.slip2 = MIN(geom1->contact->slip2,
geom2->contact->slip2);
+ dJointID c = dJointCreateContact (self->worldId,
+ self->contactGroup, &contact);
+ // Call the geom's contact callbacks
+ geom1->contact->contactSignal( geom1, geom2 );
+ geom2->contact->contactSignal( geom2, geom1 );
- dJointID c = dJointCreateContact (self->worldId,
- self->contactGroup, &contact);
dJointAttach (c,b1,b2);
}
}
Modified: code/gazebo/trunk/server/sensors/SConscript
===================================================================
--- code/gazebo/trunk/server/sensors/SConscript 2008-09-09 22:02:13 UTC (rev
7015)
+++ code/gazebo/trunk/server/sensors/SConscript 2008-09-09 22:04:34 UTC (rev
7016)
@@ -1,7 +1,7 @@
#Import variable
Import('env sharedObjs headers')
-dirs = Split('camera ray')
+dirs = Split('camera ray contact')
for subdir in dirs :
SConscript('%s/SConscript' % subdir)
@@ -14,5 +14,4 @@
'server/sensors/Sensor.hh'
] )
-#staticObjs.append( env.StaticObject(sources) )
sharedObjs.append( env.SharedObject(sources) )
Added: code/gazebo/trunk/server/sensors/contact/ContactSensor.cc
===================================================================
--- code/gazebo/trunk/server/sensors/contact/ContactSensor.cc
(rev 0)
+++ code/gazebo/trunk/server/sensors/contact/ContactSensor.cc 2008-09-09
22:04:34 UTC (rev 7016)
@@ -0,0 +1,212 @@
+/*
+ * Gazebo - Outdoor Multi-Robot Simulator
+ * Copyright (C) 2003
+ * Nate Koenig & Andrew Howard
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+/* Desc: Contact sensor
+ * Author: Nate Koenig
+ * Date: 09 Sept. 2008
+ * SVN: $Id:$
+*/
+
+#include <assert.h>
+#include <float.h>
+#include <sstream>
+
+#include "Global.hh"
+//#include "World.hh"
+//#include "Controller.hh"
+
+#include "GazeboError.hh"
+#include "XMLConfig.hh"
+#include "Simulator.hh"
+#include "SensorFactory.hh"
+#include "Geom.hh"
+#include "ContactParams.hh"
+#include "ContactSensor.hh"
+
+#include "Vector3.hh"
+
+using namespace gazebo;
+
+GZ_REGISTER_STATIC_SENSOR("contact", ContactSensor);
+
+//////////////////////////////////////////////////////////////////////////////
+// Constructor
+ContactSensor::ContactSensor(Body *body)
+ : Sensor(body)
+{
+ this->active = false;
+
+ this->typeName = "contact";
+
+ this->contactCount = 0;
+ this->contactStates = NULL;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Destructor
+ContactSensor::~ContactSensor()
+{
+ std::vector< ParamT<std::string> *>::iterator iter;
+
+ if (this->contactStates)
+ delete [] this->contactStates;
+
+ if (this->contactTimes)
+ delete [] this->contactTimes;
+
+ for (iter = this->geomNamesP.begin(); iter != this->geomNamesP.end(); iter++)
+ {
+ delete *iter;
+ }
+ this->geomNamesP.clear();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/// Get the contact time
+double ContactSensor::GetContactTime(unsigned int index) const
+{
+ if (index < this->contactCount)
+ return this->contactTimes[ index ];
+
+ return 0;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/// Return the number of contacts
+unsigned int ContactSensor::GetContactCount() const
+{
+ return this->contactCount;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/// Return the contact states
+uint8_t ContactSensor::GetContactState(unsigned int index) const
+{
+ if (index < this->contactCount)
+ return this->contactStates[index];
+
+ return 0;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/// Reset the contact states
+void ContactSensor::ResetContactStates()
+{
+ memset(this->contactStates, 0, sizeof(uint8_t) * this->contactCount);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/// Load the ray using parameter from an XMLConfig node
+void ContactSensor::LoadChild(XMLConfigNode *node)
+{
+ XMLConfigNode *geomNode = NULL;
+
+ if (this->body == NULL)
+ {
+ gzthrow("Null body in the contact sensor");
+ }
+
+ Param::Begin(&this->parameters);
+ geomNode = node->GetChild("geom");
+ while (geomNode)
+ {
+ ParamT<std::string> *geomName = new ParamT<std::string>("geom","",1);
+ geomName->SetValue( geomNode->GetValue() );
+ this->geomNamesP.push_back(geomName);
+ geomNode = geomNode->GetNext("geom");
+ }
+ Param::End();
+
+ this->contactCount = this->geomNamesP.size();
+ this->contactTimes = new double[ this->contactCount ];
+ this->contactStates = new uint8_t[ this->contactCount ];
+
+ memset(this->contactStates,0, sizeof(uint8_t) * this->contactCount);
+ memset(this->contactStates,0, sizeof(double) * this->contactCount);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/// Save the sensor info in XML format
+void ContactSensor::SaveChild(std::string &prefix, std::ostream &stream)
+{
+ std::vector< ParamT<std::string> *>::iterator iter;
+
+ for (iter = this->geomNamesP.begin(); iter != this->geomNamesP.end(); iter++)
+ {
+ stream << prefix << " " << *(iter) << "\n";
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Init the contact
+void ContactSensor::InitChild()
+{
+ std::vector< ParamT<std::string> *>::iterator iter;
+
+ for (iter = this->geomNamesP.begin(); iter != this->geomNamesP.end(); iter++)
+ {
+ // Get the geom from the body
+ Geom *geom = this->body->GetGeom( **(*iter) );
+
+ // Set the callback
+ if (geom)
+ {
+ geom->contact->Callback( &ContactSensor::ContactCallback, this );
+ }
+ else
+ {
+ gzthrow("Unable to find geom[" + **(*iter) + "]");
+ }
+ }
+
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Init the ray
+void ContactSensor::FiniChild()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Update the sensor information
+void ContactSensor::UpdateChild()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////
+/// Contact callback
+void ContactSensor::ContactCallback(Geom *g1, Geom *g2)
+{
+ std::vector< ParamT<std::string> *>::iterator iter;
+ int i = 0;
+
+
+ for (iter = this->geomNamesP.begin(); iter != this->geomNamesP.end();
+ iter++, i++)
+ {
+ if ( **(*iter) == g1->GetName() || **(*iter) == g2->GetName() )
+ {
+ this->contactStates[i] = 1;
+ this->contactTimes[i] = Simulator::Instance()->GetRealTime();
+ }
+ }
+
+}
Added: code/gazebo/trunk/server/sensors/contact/ContactSensor.hh
===================================================================
--- code/gazebo/trunk/server/sensors/contact/ContactSensor.hh
(rev 0)
+++ code/gazebo/trunk/server/sensors/contact/ContactSensor.hh 2008-09-09
22:04:34 UTC (rev 7016)
@@ -0,0 +1,104 @@
+/*
+ * Gazebo - Outdoor Multi-Robot Simulator
+ * Copyright (C) 2003
+ * Nate Koenig & Andrew Howard
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+/* Desc: Contact sensor
+ * Author: Nate Koenig
+ * Date: 09 Sept. 2008
+ * SVN: $Id:$
+*/
+
+#ifndef CONTACTSENSOR_HH
+#define CONTACTSENSOR_HH
+
+#include <vector>
+
+#include "Angle.hh"
+#include "Sensor.hh"
+#include "Body.hh"
+
+namespace gazebo
+{
+
+ class XMLConfigNode;
+ class ContactParams;
+
+ /// \addtogroup gazebo_sensor
+ /// \brief Contact sensor.
+ /// \{
+ /// \defgroup gazebo_ray Contact
+ /// \brief Contact sensor.
+ // \{
+
+ /// \brief Contact sensor.
+ ///
+ /// This sensor detects and reports contacts between objects
+ class ContactSensor: public Sensor
+ {
+ /// \brief Constructor
+ /// \param body The underlying collision test uses an ODE geom, so
+ /// ray sensors must be attached to a body.
+ public: ContactSensor(Body *body);
+
+ /// \brief Destructor
+ public: virtual ~ContactSensor();
+
+ /// \brief Return the number of contacts
+ public: unsigned int GetContactCount() const;
+
+ /// \brief Get a contact time
+ public: double GetContactTime(unsigned int index) const;
+
+ /// \brief Return a contact state
+ public: uint8_t GetContactState(unsigned int index) const;
+
+ /// \brief Reset the contact states
+ public: void ResetContactStates();
+
+ /// Load the contact sensor using parameter from an XMLConfig node
+ /// \param node The XMLConfig node
+ protected: virtual void LoadChild(XMLConfigNode *node);
+
+ /// \brief Save the sensor info in XML format
+ protected: virtual void SaveChild(std::string &prefix,std::ostream
&stream);
+
+ /// Initialize the sensor
+ protected: virtual void InitChild();
+
+ /// Update sensed values
+ protected: virtual void UpdateChild();
+
+ /// Finalize the sensor
+ protected: virtual void FiniChild();
+
+ /// \brief Contact callback
+ private: void ContactCallback(Geom *g1, Geom *g2);
+
+ /// Geom name parameter
+ private: std::vector< ParamT<std::string> *> geomNamesP;
+
+ private: uint8_t *contactStates;
+ private: double *contactTimes;
+ private: unsigned int contactCount;
+ };
+ /// \}
+ /// \}
+}
+
+#endif
Added: code/gazebo/trunk/server/sensors/contact/SConscript
===================================================================
--- code/gazebo/trunk/server/sensors/contact/SConscript
(rev 0)
+++ code/gazebo/trunk/server/sensors/contact/SConscript 2008-09-09 22:04:34 UTC
(rev 7016)
@@ -0,0 +1,6 @@
+#Import variable
+Import('env sharedObjs')
+
+sources = Split('ContactSensor.cc')
+
+sharedObjs.append(env.SharedObject(sources))
Added: code/gazebo/trunk/worlds/bumper.world
===================================================================
--- code/gazebo/trunk/worlds/bumper.world (rev 0)
+++ code/gazebo/trunk/worlds/bumper.world 2008-09-09 22:04:34 UTC (rev
7016)
@@ -0,0 +1,149 @@
+<?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.8</erp>
+ <maxUpdateRate>0</maxUpdateRate>
+ </physics:ode>
+
+ <rendering:gui>
+ <size>800 600</size>
+ <pos>100 100</pos>
+ <frames>
+ <row height="100%">
+ <camera width="100%">
+ <xyz>-1 0 4</xyz>
+ <rpy>0 34 0</rpy>
+ </camera>
+ </row>
+ </frames>
+ </rendering:gui>
+
+ <rendering:ogre>
+ <ambient>0.5 0.5 0.5 1.0</ambient>
+ <sky>
+ <material>Gazebo/CloudySky</material>
+ </sky>
+
+ <fog>
+ <color>1.0 1.0 1.0</color>
+ <linearStart>10</linearStart>
+ <linearEnd>100</linearEnd>
+ </fog>
+ </rendering:ogre>
+
+ <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>
+
+ <model:physical name="sphere1_model">
+ <xyz>2.15 -1.68 1.7</xyz>
+ <rpy>0.0 0.0 0.0</rpy>
+ <static>false</static>
+
+ <body:sphere name="sphere1_body">
+ <geom:sphere name="sphere1_geom">
+ <size>0.1</size>
+
+ <visual>
+ <scale>0.1 0.1 0.1</scale>
+ <mesh>unit_sphere</mesh>
+ <material>Gazebo/Rocky</material>
+ </visual>
+ </geom:sphere>
+
+ <sensor:contact name="contact_sensor">
+ <geom>sphere1_geom</geom>
+
+ <controller:bumper name="bumper_controller">
+ <interface:bumper name="bumper_iface" />
+ </controller:bumper>
+ </sensor:contact>
+
+ </body:sphere>
+ </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>
+
+ <model:physical name="laser">
+ <xyz>0.15 0 0.18</xyz>
+
+ <attach>
+ <parentBody>chassis_body</parentBody>
+ <myBody>laser_body</myBody>
+ </attach>
+
+ <include embedded="true">
+ <xi:include href="models/sicklms200.model" />
+ </include>
+ </model:physical>
+
+ <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>
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
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-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit