235 lines
8.3 KiB
C++
235 lines
8.3 KiB
C++
|
/*
|
||
|
* Copyright (C) 2012 Open Source Robotics Foundation
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*
|
||
|
*/
|
||
|
/* Desc: Collision class
|
||
|
* Author: Nate Koenig
|
||
|
* Date: 13 Feb 2006
|
||
|
*/
|
||
|
|
||
|
#ifndef _COLLISION_HH_
|
||
|
#define _COLLISION_HH_
|
||
|
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
|
||
|
#include "gazebo/common/Event.hh"
|
||
|
#include "gazebo/common/CommonTypes.hh"
|
||
|
|
||
|
#include "gazebo/physics/PhysicsTypes.hh"
|
||
|
#include "gazebo/physics/CollisionState.hh"
|
||
|
#include "gazebo/physics/Entity.hh"
|
||
|
#include "gazebo/util/system.hh"
|
||
|
|
||
|
namespace gazebo
|
||
|
{
|
||
|
namespace physics
|
||
|
{
|
||
|
/// \addtogroup gazebo_physics
|
||
|
/// \{
|
||
|
|
||
|
/// \brief Base class for all collision entities
|
||
|
class GZ_PHYSICS_VISIBLE Collision : public Entity
|
||
|
{
|
||
|
/// \brief Constructor.
|
||
|
/// \param[in] _link Link that contains this collision object.
|
||
|
public: explicit Collision(LinkPtr _link);
|
||
|
|
||
|
/// \brief Destructor.
|
||
|
public: virtual ~Collision();
|
||
|
|
||
|
/// \brief Finalize the collision.
|
||
|
public: virtual void Fini();
|
||
|
|
||
|
/// \brief Load the collision.
|
||
|
/// \param[in] _sdf SDF to load from.
|
||
|
public: virtual void Load(sdf::ElementPtr _sdf);
|
||
|
|
||
|
/// \brief Initialize the collision.
|
||
|
public: virtual void Init();
|
||
|
|
||
|
/// \brief Update the parameters using new sdf values.
|
||
|
/// \param[in] _sdf SDF values to update from.
|
||
|
public: virtual void UpdateParameters(sdf::ElementPtr _sdf);
|
||
|
|
||
|
/// \brief Set the encapsulated collsion object.
|
||
|
/// Has a side effect of changing the collision bit masks
|
||
|
/// \param[in] _placeable True to make the object movable.
|
||
|
public: void SetCollision(bool _placeable);
|
||
|
|
||
|
/// \brief Set if this object is moveable
|
||
|
/// \param[in] _placeable True to make the object movable.
|
||
|
public: void SetPlaceable(const bool _placeable);
|
||
|
|
||
|
/// \brief Return whether this collision is movable.
|
||
|
/// Example on an immovable object is a ray.
|
||
|
/// \return True if the object is immovable.
|
||
|
public: bool IsPlaceable() const;
|
||
|
|
||
|
/// \brief Set the category bits, used during collision detection.
|
||
|
/// \param[in] _bits The bits to set.
|
||
|
public: virtual void SetCategoryBits(unsigned int _bits) = 0;
|
||
|
|
||
|
/// \brief Set the collide bits, used during collision detection.
|
||
|
/// \param[in] _bits The bits to set.
|
||
|
public: virtual void SetCollideBits(unsigned int _bits) = 0;
|
||
|
|
||
|
/// \brief Set the laser retro reflectiveness.
|
||
|
/// \param[in] _retro The laser retro value.
|
||
|
public: void SetLaserRetro(float _retro);
|
||
|
|
||
|
/// \brief Get the laser retro reflectiveness
|
||
|
/// \return The laser retro value.
|
||
|
public: float GetLaserRetro() const;
|
||
|
|
||
|
/// \brief Get the link this collision belongs to.
|
||
|
/// \return The parent Link.
|
||
|
public: LinkPtr GetLink() const;
|
||
|
|
||
|
/// \brief Get the model this collision belongs to.
|
||
|
/// \return The parent model.
|
||
|
public: ModelPtr GetModel() const;
|
||
|
|
||
|
/// \brief Get the bounding box for this collision.
|
||
|
/// \return The bounding box.
|
||
|
public: virtual math::Box GetBoundingBox() const = 0;
|
||
|
|
||
|
/// \brief Get the shape type.
|
||
|
/// \return The shape type.
|
||
|
/// \sa EntityType
|
||
|
public: unsigned int GetShapeType() const;
|
||
|
|
||
|
/// \brief Set the shape for this collision.
|
||
|
/// \param[in] _shape The shape for this collision object.
|
||
|
public: void SetShape(ShapePtr _shape);
|
||
|
|
||
|
/// \brief Get the collision shape.
|
||
|
/// \return The collision shape.
|
||
|
public: ShapePtr GetShape() const;
|
||
|
|
||
|
/// \brief Set the scale of the collision.
|
||
|
/// \param[in] _scale Scale to set the collision to.
|
||
|
public: void SetScale(const math::Vector3 &_scale);
|
||
|
|
||
|
/// \brief Get the linear velocity of the collision.
|
||
|
/// \return The linear velocity relative to the parent model.
|
||
|
public: virtual math::Vector3 GetRelativeLinearVel() const;
|
||
|
|
||
|
/// \brief Get the linear velocity of the collision in the world
|
||
|
/// frame.
|
||
|
/// \return The linear velocity of the collision in the world frame.
|
||
|
public: virtual math::Vector3 GetWorldLinearVel() const;
|
||
|
|
||
|
/// \brief Get the angular velocity of the collision.
|
||
|
/// \return The angular velocity of the collision.
|
||
|
public: virtual math::Vector3 GetRelativeAngularVel() const;
|
||
|
|
||
|
/// \brief Get the angular velocity of the collision in the world frame.
|
||
|
/// \return The angular velocity of the collision in the world frame.
|
||
|
public: virtual math::Vector3 GetWorldAngularVel() const;
|
||
|
|
||
|
/// \brief Get the linear acceleration of the collision.
|
||
|
/// \return The linear acceleration of the collision.
|
||
|
public: virtual math::Vector3 GetRelativeLinearAccel() const;
|
||
|
|
||
|
/// \brief Get the linear acceleration of the collision in the world
|
||
|
/// frame.
|
||
|
/// \return The linear acceleration of the collision in the world frame.
|
||
|
public: virtual math::Vector3 GetWorldLinearAccel() const;
|
||
|
|
||
|
/// \brief Get the angular acceleration of the collision.
|
||
|
/// \return The angular acceleration of the collision.
|
||
|
public: virtual math::Vector3 GetRelativeAngularAccel() const;
|
||
|
|
||
|
/// \brief Get the angular acceleration of the collision in the
|
||
|
/// world frame.
|
||
|
/// \return The angular acceleration of the collision in the world frame.
|
||
|
public: virtual math::Vector3 GetWorldAngularAccel() const;
|
||
|
|
||
|
/// \brief Get the collision state.
|
||
|
/// \return The collision state.
|
||
|
public: CollisionState GetState();
|
||
|
|
||
|
/// \brief Set the current collision state.
|
||
|
/// \param[in] The collision state.
|
||
|
public: void SetState(const CollisionState &_state);
|
||
|
|
||
|
/// \brief Fill a collision message.
|
||
|
/// \param[out] _msg The message to fill with this collision's data.
|
||
|
public: void FillMsg(msgs::Collision &_msg);
|
||
|
|
||
|
/// \brief Update parameters from a message.
|
||
|
/// \param[in] _msg Message to update from.
|
||
|
public: void ProcessMsg(const msgs::Collision &_msg);
|
||
|
|
||
|
/// \brief Get the surface parameters.
|
||
|
/// \return The surface parameters.
|
||
|
public: inline SurfaceParamsPtr GetSurface() const
|
||
|
{return this->surface;}
|
||
|
|
||
|
/// \brief Number of contacts allowed for this collision.
|
||
|
/// This overrides global value (in PhysicsEngine) if specified.
|
||
|
/// \param[in] _maxContacts max num contacts allowed for this collision.
|
||
|
public: virtual void SetMaxContacts(unsigned int _maxContacts);
|
||
|
|
||
|
/// \brief returns number of contacts allowed for this collision.
|
||
|
/// This overrides global value (in PhysicsEngine) if specified.
|
||
|
/// \return max num contacts allowed for this collision.
|
||
|
public: virtual unsigned int GetMaxContacts();
|
||
|
|
||
|
/// \brief Indicate that the world pose should be recalculated.
|
||
|
/// The recalculation will be done when Collision::GetWorldPose is
|
||
|
/// called.
|
||
|
public: void SetWorldPoseDirty();
|
||
|
|
||
|
// Documentation inherited.
|
||
|
public: virtual const math::Pose &GetWorldPose() const;
|
||
|
|
||
|
/// \brief Helper function used to create a collision visual message.
|
||
|
/// \return Visual message for a collision.
|
||
|
private: msgs::Visual CreateCollisionVisual();
|
||
|
|
||
|
/// \brief The link this collision belongs to
|
||
|
protected: LinkPtr link;
|
||
|
|
||
|
/// \brief Flag for placeable.
|
||
|
protected: bool placeable;
|
||
|
|
||
|
/// \brief Pointer to physics::Shape.
|
||
|
protected: ShapePtr shape;
|
||
|
|
||
|
/// \brief The surface parameters.
|
||
|
protected: SurfaceParamsPtr surface;
|
||
|
|
||
|
/// \brief The laser retro value.
|
||
|
private: float laserRetro = 0.0;
|
||
|
|
||
|
/// \brief Stores collision state information.
|
||
|
private: CollisionState state;
|
||
|
|
||
|
/// \brief Number of contact points allowed for this collision.
|
||
|
private: unsigned int maxContacts;
|
||
|
|
||
|
/// \brief Unique id for collision visual.
|
||
|
private: uint32_t collisionVisualId;
|
||
|
|
||
|
/// \brief True if the world pose should be recalculated.
|
||
|
private: mutable bool worldPoseDirty;
|
||
|
};
|
||
|
/// \}
|
||
|
}
|
||
|
}
|
||
|
#endif
|