pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/physics/JointController.hh

167 lines
6.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.
*
*/
#ifndef _GAZEBO_JOINTCONTROLLER_HH_
#define _GAZEBO_JOINTCONTROLLER_HH_
#include <map>
#include <string>
#include <vector>
#include "gazebo/common/PID.hh"
#include "gazebo/common/Time.hh"
#include "gazebo/physics/PhysicsTypes.hh"
#include "gazebo/transport/TransportTypes.hh"
#include "gazebo/msgs/msgs.hh"
#include "gazebo/util/system.hh"
namespace gazebo
{
namespace physics
{
// Forward declare private data values.
class JointControllerPrivate;
/// \addtogroup gazebo_physics
/// \{
/// \class JointController JointController.hh physics/physics.hh
/// \brief A class for manipulating physics::Joint
class GZ_PHYSICS_VISIBLE JointController
{
/// \brief Constructor
/// \param[in] _model Model that uses this joint controller.
public: explicit JointController(ModelPtr _model);
/// \brief Destructor
public: virtual ~JointController();
/// \brief Add a joint to control.
/// \param[in] _joint Joint to control.
public: void AddJoint(JointPtr _joint);
/// \brief Remove a joint from control.
/// \param[in] _joint Joint to remove.
public: void RemoveJoint(Joint *_joint);
/// \brief Update the joint control.
public: void Update();
/// \brief Reset all commands
public: void Reset();
/// \brief Set the positions of a Joint by name.
/// \sa JointController::SetJointPosition(JointPtr, double)
public: void SetJointPosition(
const std::string &_name, double _position, int _index = 0);
/// \brief Set the positions of a set of Joint's.
/// \sa JointController::SetJointPosition(JointPtr, double)
public: void SetJointPositions(
const std::map<std::string, double> &_jointPositions);
/// \brief Get the last time the controller was updated.
/// \return Last time the controller was updated.
public: common::Time GetLastUpdateTime() const;
/// \brief Get all the joints.
/// \return A map<joint_name, joint_ptr> to all the joints that can
/// be controlled.
public: std::map<std::string, JointPtr> GetJoints() const;
/// \brief Set the position PID values for a joint.
/// \param[in] _jointName Scoped name of the joint.
/// \param[in] _pid New position PID controller.
public: void SetPositionPID(const std::string &_jointName,
const common::PID &_pid);
/// \brief Set the target position for the position PID controller.
/// \param[in] _jointName Scoped name of the joint.
/// \param[in] _target Position target.
/// \return False if the joint was not found.
public: bool SetPositionTarget(const std::string &_jointName,
double _target);
/// \brief Set the velocity PID values for a joint.
/// \param[in] _jointName Scoped name of the joint.
/// \param[in] _pid New velocity PID controller.
public: void SetVelocityPID(const std::string &_jointName,
const common::PID &_pid);
/// \brief Set the target velocity for the velocity PID controller.
/// \param[in] _jointName Scoped name of the joint.
/// \param[in] _target Velocity target.
/// \return False if the joint was not found.
public: bool SetVelocityTarget(const std::string &_jointName,
double _target);
/// \brief Get all the position PID controllers.
/// \return A map<joint_name, PID> for all the position PID
/// controllers.
public: std::map<std::string, common::PID> GetPositionPIDs() const;
/// \brief Get all the velocity PID controllers.
/// \return A map<joint_name, PID> for all the velocity PID
/// controllers.
public: std::map<std::string, common::PID> GetVelocityPIDs() const;
/// \brief Get all the applied forces.
/// \return A map<joint_name, force> that contains force values set by
/// the user of the JointController.
public: std::map<std::string, double> GetForces() const;
/// \brief Get all the position PID set points.
/// \return A map<joint_name, position> that contains position values
/// set by the user of the JointController.
public: std::map<std::string, double> GetPositions() const;
/// \brief Get all the velocity PID set points.
/// \return A map<joint_name, position> that contains velocity values
/// set by the user of the JointController.
public: std::map<std::string, double> GetVelocities() const;
/// \brief Callback when a joint command message is received.
/// \param[in] _msg The received message.
private: void OnJointCmd(ConstJointCmdPtr &_msg);
/// \brief Set the positions of a Joint by name
/// The position is specified in native units, which means,
/// if you are using metric system, it's meters for SliderJoint
/// and radians for HingeJoint, etc.
/// Implementation:
/// In order to change the position of a Joint inside a Model,
/// this call must recursively crawl through all the connected
/// children Link's in this Model, and update each Link Pose
/// affected by this Joint angle update.
/// Warning:
/// There is no constraint satisfaction being done here,
/// traversal through the kinematic graph has unexpected behavior
/// if you try to set the joint position of a link inside
/// a loop structure.
/// Warning:
/// \param[in] _joint Joint to set.
/// \param[in] _position Position of the joint.
public: void SetJointPosition(
JointPtr _joint, double _position, int _index = 0);
/// \brief Private data values.
private: JointControllerPrivate *dataPtr;
};
/// \}
}
}
#endif