HandPlugin.hh
Go to the documentation of this file.
1 
10 #ifndef _HAND_PLUGIN_HH_
11 #define _HAND_PLUGIN_HH_
12 
13 // Gazebo
14 #include "gazebo/common/Plugin.hh"
15 #include <gazebo/msgs/msgs.hh>
16 #include <gazebo/physics/physics.hh>
17 #include <gazebo/transport/transport.hh>
18 
19 // Custom messages
20 #include "hand.pb.h"
21 
22 // Boost - for convenient string split
23 #include <boost/algorithm/string/classification.hpp>
24 #include <boost/algorithm/string/split.hpp>
25 
26 namespace HandPlugin {
27 
28  // Plugin parameters instanced in SDF
29 
31  #define PARAM_NAME "name"
32  #define PARAM_TARGET "target"
34  #define PARAM_MULTIPLIER "multiplier"
36  #define PARAM_JOINT_GROUP "actuatedJoint"
38  #define PARAM_MIMIC_JOINT "mimicJoint"
40  #define PARAM_VIRTUAL_JOINTS "virtualJoints"
42  #define PARAM_CONTROLLERS "controllers"
44  #define PARAM_CTRL_REAL "real"
46  #define PARAM_CTRL_VIRTUAL "virtual"
48  #define PARAM_CTRL_TYPE "type"
50  #define PARAM_GRAVITY "gravity"
52 
54  #define FORCE grasp::msgs::Target::FORCE
55  #define POSITION grasp::msgs::Target::POSITION
57  #define VELOCITY grasp::msgs::Target::VELOCITY
59 
60  // Plugin messages
61 
63  #define REQUEST_TOPIC "~/hand"
64  #define RESPONSE_TOPIC "~/hand/response"
66 }
67 
68 namespace gazebo {
69 
71  typedef grasp::msgs::Hand HandMsg;
73  typedef const boost::shared_ptr<const grasp::msgs::Hand>
75 
76  // Forward declaration of private joint group class
77  class JointGroup;
78 
79  // Forward declaration of private joint force pair class
80  class JointForcePair;
81 
82  // Forward declaration of private data class
83  class HandPluginPrivate;
84 
85  class HandPlugin : public ModelPlugin
86  {
87  // Private attributes
88 
90  private: std::unique_ptr<HandPluginPrivate> data_ptr;
92  private: physics::ModelPtr model;
94  private: physics::WorldPtr world;
96  private: event::ConnectionPtr update_connection;
98  private: event::ConnectionPtr reset_connection;
99 
101  private: std::vector<JointGroup> joint_groups;
103  private: std::vector<physics::JointPtr> virtual_joints;
104 
106  private: bool timer_active {false};
108  private: common::Time timeout;
109 
111  private: const common::Time routine_timestep {0.02};
113  private: bool routine_active {false};
115  private: common::Time routine_timeout;
117  private: std::vector<JointForcePair> joint_force_pairs;
118 
120  private: ignition::math::Pose3d init_pose {0,0,1,0,0,0};
122  private: bool recv_msg {false};
124  private: boost::shared_ptr<HandMsg const> msg_req;
125 
126  // Protected attributes
127 
128  // Public methods
129 
131  public: HandPlugin();
132 
134  public: virtual ~HandPlugin();
135 
139  public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
140 
142  public: void onUpdate();
143 
145  public: void onReset();
146 
149  public: void onRequest(HandMsgPtr & _msg);
150 
151  // Private methods
152 
154  private: bool loadMimicJoints(sdf::ElementPtr _sdf, JointGroup & joint);
155 
159  private: bool loadJointGroups(sdf::ElementPtr _sdf);
160 
164  private: bool loadVirtualJoints(sdf::ElementPtr _sdf);
165 
169  private: bool loadControllers(sdf::ElementPtr _sdf);
170 
172  private: void imobilise();
173 
175  private: void resetJoints();
176 
177  // Tools
178 
183  private: void setupTimer(
184  common::Time & timeout,
185  bool & trigger,
186  const common::Time & duration);
187 
188  // Requests
189 
197  private: void setPose(const ignition::math::Pose3d & pose);
198 
201  private: void updatePose(HandMsgPtr & _msg);
202 
205  private: void updateTimer(HandMsgPtr & _msg);
206 
208  private: void updateForces();
209 
210  // TODO
211  private: void setPIDController(
212  physics::JointControllerPtr controller,
213  int type,
214  physics::JointPtr joint,
215  double p, double i, double d,
216  double initial_value);
217 
223  private: void setPIDTarget(
224  int type,
225  physics::JointPtr joint,
226  double value,
227  bool force=false);
228 
231  private: void updatePIDTargets(HandMsgPtr & _msg);
232 
235  private: void checkReset(HandMsgPtr & _msg);
236 
238  private: void sendTimeout();
239 
241  private: void resetWorld();
242  };
243 }
244 
245 #endif
grasp::msgs::Hand HandMsg
Declaration for hand message type.
Definition: run_trials.hh:108
Definition: ContactSensorPlugin.cc:12
const boost::shared_ptr< const grasp::msgs::Hand > HandMsgPtr
Shared pointer declaration for hand message type.
Definition: run_trials.hh:111
const boost::shared_ptr< const grasp::msgs::Hand > HandMsgPtr
Shared pointer declaration for request message type.
Definition: HandPlugin.hh:74
boost::shared_ptr< HandMsg const > msg_req
Last received request message.
Definition: HandPlugin.hh:124
common::Time timeout
Next timeout.
Definition: HandPlugin.hh:108
void setPose(gazebo::transport::PublisherPtr pub, ignition::math::Pose3d pose, double timeout=-1)
Sets hand pose.
Class for joint and respective mimics data.
Definition: HandPlugin.cc:15
physics::ModelPtr model
Model to which the plugin is attached.
Definition: HandPlugin.hh:92
event::ConnectionPtr update_connection
Connection to world update event.
Definition: HandPlugin.hh:96
event::ConnectionPtr reset_connection
Connection to world reset event.
Definition: HandPlugin.hh:98
std::unique_ptr< HandPluginPrivate > data_ptr
Class with private attributes.
Definition: HandPlugin.hh:90
std::vector< JointForcePair > joint_force_pairs
Array of finger joints.
Definition: HandPlugin.hh:117
common::Time routine_timeout
Next routine timeout.
Definition: HandPlugin.hh:115
Definition: HandPlugin.hh:26
Class for joints under periodic force.
Definition: HandPlugin.cc:34
Class for private hand plugin data.
Definition: HandPlugin.cc:48
physics::WorldPtr world
World in which the model exists.
Definition: HandPlugin.hh:94
std::vector< JointGroup > joint_groups
Array of finger joints.
Definition: HandPlugin.hh:101
std::vector< physics::JointPtr > virtual_joints
Array of virtual x y z r p y joint pointers.
Definition: HandPlugin.hh:103