pxmlw6n2f/Gazebo_Distributed_MPI/gazebo/physics/Inertial.hh

295 lines
10 KiB
C++
Raw Normal View History

2019-04-18 10:27:54 +08:00
/*
* 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.
*
*/
#ifndef GAZEBO_PHYSICS_INERTIAL_HH_
#define GAZEBO_PHYSICS_INERTIAL_HH_
#ifdef _WIN32
// Ensure that Winsock2.h is included before Windows.h, which can get
// pulled in by anybody (e.g., Boost).
#include <Winsock2.h>
#endif
#include <string>
#include <ignition/math/Inertial.hh>
#include <sdf/sdf.hh>
#include "gazebo/math/Pose.hh"
#include "gazebo/msgs/msgs.hh"
#include "gazebo/math/Quaternion.hh"
#include "gazebo/math/Vector3.hh"
#include "gazebo/math/Matrix3.hh"
#include "gazebo/util/system.hh"
namespace gazebo
{
namespace physics
{
/// \addtogroup gazebo_physics
/// \{
/// \class Inertial Inertial.hh physics/physics.hh
/// \brief A class for inertial information about a link
class GZ_PHYSICS_VISIBLE Inertial
{
/// \brief Default Constructor
public: Inertial();
/// \brief Constructor.
/// \param[in] _mass Mass value in kg if using metric.
public: explicit Inertial(double _mass);
/// \brief Constructor from ignition::math::Inertial.
/// \param[in] _inertial Ignition inertial object to copy.
public: Inertial(const ignition::math::Inertiald &_inertial);
/// \brief Copy constructor.
/// \param[in] _inertial Inertial element to copy
public: Inertial(const Inertial &_inertial);
/// \brief Destructor.
public: virtual ~Inertial();
/// \brief Load from SDF values.
/// \param[in] _sdf SDF value to load from.
public: void Load(sdf::ElementPtr _sdf);
/// \brief update the parameters using new sdf values.
/// \param[in] _sdf Update values from.
public: void UpdateParameters(sdf::ElementPtr _sdf);
/// \brief Reset all the mass properties.
public: void Reset();
/// \brief Return copy of Inertial in ignition format.
public: ignition::math::Inertiald Ign() const;
/// \brief Set the mass.
public: void SetMass(double m);
/// \brief Get the mass
public: double GetMass() const;
/// \brief Set the mass matrix.
/// \param[in] _ixx X second moment of inertia (MOI) about x axis.
/// \param[in] _iyy Y second moment of inertia about y axis.
/// \param[in] _izz Z second moment of inertia about z axis.
/// \param[in] _ixy XY inertia.
/// \param[in] _ixz XZ inertia.
/// \param[in] _iyz YZ inertia.
public: void SetInertiaMatrix(double _ixx, double _iyy, double _izz,
double _ixy, double _ixz, double iyz);
/// \brief Set the center of gravity.
/// \param[in] _cx X position.
/// \param[in] _cy Y position.
/// \param[in] _cz Z position.
public: void SetCoG(double _cx, double _cy, double _cz);
/// \brief Set the center of gravity.
/// \param[in] _center Center of the gravity.
public: void SetCoG(const math::Vector3 &_center);
/// \brief Set the center of gravity and rotation offset of inertial
/// coordinate frame relative to Link frame.
/// \param[in] _cx Center offset in x-direction in Link frame
/// \param[in] _cy Center offset in y-direction in Link frame
/// \param[in] _cz Center offset in z-direction in Link frame
/// \param[in] _rx Roll angle offset of inertial coordinate frame.
/// \param[in] _ry Pitch angle offset of inertial coordinate frame.
/// \param[in] _rz Yaw angle offset of inertial coordinate frame.
public: void SetCoG(double _cx, double _cy, double _cz,
double _rx, double _ry, double _rz);
/// \brief Set the center of gravity.
/// \param[in] _c Transform to center of gravity.
public: void SetCoG(const math::Pose &_c);
/// \brief Get the center of gravity.
/// \return The center of gravity.
public: inline const math::Vector3 &GetCoG() const
{
return this->cog.pos;
}
/// \brief Get the pose about which the mass and inertia matrix is
/// specified in the Link frame.
/// \return The inertial pose.
public: inline const math::Pose GetPose() const
{
return math::Pose(this->cog);
}
/// \brief Get the principal moments of inertia (Ixx, Iyy, Izz).
/// \return The principal moments.
public: math::Vector3 GetPrincipalMoments() const;
/// \brief Get the products of inertia (Ixy, Ixz, Iyz).
/// \return The products of inertia.
public: math::Vector3 GetProductsofInertia() const;
/// \brief Get IXX
/// \return IXX value
public: double GetIXX() const;
/// \brief Get IYY
/// \return IYY value
public: double GetIYY() const;
/// \brief Get IZZ
/// \return IZZ value
public: double GetIZZ() const;
/// \brief Get IXY
/// \return IXY value
public: double GetIXY() const;
/// \brief Get IXZ
/// \return IXZ value
public: double GetIXZ() const;
/// \brief Get IXZ
/// \return IYZ value
public: double GetIYZ() const;
/// \brief Set IXX
/// \param[in] _v IXX value
public: void SetIXX(double _v);
/// \brief Set IYY
/// \param[in] _v IYY value
public: void SetIYY(double _v);
/// \brief Set IZZ
/// \param[in] _v IZZ value
public: void SetIZZ(double _v);
/// \brief Set IXY
/// \param[in] _v IXY value
public: void SetIXY(double _v);
/// \brief Set IXZ
/// \param[in] _v IXZ value
public: void SetIXZ(double _v);
/// \brief Set IYZ
/// \param[in] _v IXX value
public: void SetIYZ(double _v);
/// \brief Rotate this mass.
/// \param[in] _rot Rotation amount.
public: void Rotate(const math::Quaternion &_rot);
/// \brief Equal operator.
/// \param[in] _inertial Inertial to copy.
/// \return Reference to this object.
public: Inertial &operator=(const Inertial &_inertial);
/// \brief Equal operator.
/// \param[in] _inertial Ignition inertial to copy.
/// \return Reference to this object.
public: Inertial &operator=(const ignition::math::Inertiald &_inertial);
/// \brief Addition operator.
/// Assuming both CG and Moment of Inertia (MOI) are defined
/// in the same reference Link frame.
/// New CG is computed from masses and perspective offsets,
/// and both MOI contributions relocated to the new cog.
/// \param[in] _inertial Inertial to add.
/// \return The result of the addition.
public: Inertial operator+(const Inertial &_inertial) const;
/// \brief Addition equal operator.
/// \param[in] _inertial Inertial to add.
/// \return Reference to this object.
public: const Inertial &operator+=(const Inertial &_inertial);
/// \brief Update parameters from a message
/// \param[in] _msg Message to read
public: void ProcessMsg(const msgs::Inertial &_msg);
/// \brief Get the equivalent inertia from a point in local Link frame
/// If you specify GetMOI(this->GetPose()), you should get
/// back the Moment of Inertia (MOI) exactly as specified in the SDF.
/// If _pose is different from pose of the Inertial block, then
/// the MOI is rotated accordingly, and contributions from changes
/// in MOI location location due to point mass is added to the final MOI.
/// \param[in] _pose location in Link local frame
/// \return equivalent inertia at _pose
public: math::Matrix3 GetMOI(const math::Pose &_pose)
const;
/// \brief Get equivalent Inertia values with the Link frame offset,
/// while holding the Pose of CoG constant in the world frame.
/// \param[in] _frameOffset amount to offset the Link frame by, this
/// is a transform defined in the Link frame.
/// \return Inertial parameters with the shifted frame.
public: Inertial GetInertial(const math::Pose &_frameOffset) const;
/// \brief Output operator.
/// \param[in] _out Output stream.
/// \param[in] _inertial Inertial object to output.
public: friend std::ostream &operator<<(std::ostream &_out,
const gazebo::physics::Inertial &_inertial)
{
_out << "Mass[" << _inertial.mass << "] CoG["
<< _inertial.cog << "]\n";
_out << "IXX[" << _inertial.principals.x << "] "
<< "IYY[" << _inertial.principals.y << "] "
<< "IZZ[" << _inertial.principals.z << "]\n";
_out << "IXY[" << _inertial.products.x << "] "
<< "IXZ[" << _inertial.products.y << "] "
<< "IYZ[" << _inertial.products.z << "]\n";
return _out;
}
/// \brief returns Moments of Inertia as a Matrix3
/// \return Moments of Inertia as a Matrix3
public: math::Matrix3 GetMOI() const;
/// \brief Sets Moments of Inertia (MOI) from a Matrix3
/// \param[in] Moments of Inertia as a Matrix3
public: void SetMOI(const math::Matrix3 &_moi);
/// \brief Mass the object. Default is 1.0.
private: double mass;
/// \brief Center of gravity in the Link frame.
/// Default is (0.0 0.0 0.0 0.0 0.0 0.0)
private: math::Pose cog;
/// \brief Principal moments of inertia. Default is (1.0 1.0 1.0)
/// These Moments of Inertia are specified in the local Inertial frame.
private: math::Vector3 principals;
/// \brief Product moments of inertia. Default is (0.0 0.0 0.0)
/// These MOI off-diagonals are specified in the local Inertial frame.
/// Where products.x is Ixy, products.y is Ixz and products.z is Iyz.
private: math::Vector3 products;
/// \brief Our SDF values.
private: sdf::ElementPtr sdf;
/// \brief An SDF pointer that allows us to only read the inertial.sdf
/// file once, which in turns limits disk reads.
private: static sdf::ElementPtr sdfInertial;
};
/// \}
}
}
#endif