MimicPlugin.h
Go to the documentation of this file.
1 #include <string>
2 #include <vector>
3 
4 #include <boost/thread/mutex.hpp>
5 #include <boost/thread.hpp>
6 #include <boost/thread/condition.hpp>
7 
9 #include <gazebo/physics/physics.hh>
10 #include <gazebo/common/common.hh>
11 #include <gazebo/sensors/sensors.hh>
12 #include <gazebo/transport/transport.hh>
13 #if GAZEBO_MAJOR_VERSION < 8
14 #include <gazebo/math/gzmath.hh>
15 #endif
16 
17 namespace gazebo
18 {
19  namespace mimicplugin
20  {
21  struct PidParams {
22  public:
23  double p;
24  double i;
25  double d;
26  double i_max;
27  double i_min;
28  double cmd_max;
29  double cmd_min;
30  bool velocity;
31  PidParams () : p(100), i(0), d(0.1), i_max(0), i_min(0), cmd_max(1000), cmd_min(-1000), velocity (false) { }
32  PidParams (double _p, double _i, double _d,
33  double _imax, double _imin, double _cmax, double _cmin, bool _vel = false) :
34  p(_p), i(_i), d(_d), i_max(_imax), i_min(_imin), cmd_max(_cmax), cmd_min(_cmin), velocity(_vel)
35  { }
36  };
37 
39  public:
40  MimicJointUpdater(gazebo::physics::JointPtr source, gazebo::physics::JointPtr target,
41  double _offset, double _multiplier, const PidParams &_param) {
42  source_joint = source;
43  target_joint = target;
44  offset = _offset;
45  multiplier = _multiplier;
46  // pid setting
47  setPID(_param);
48  }
49 
50  void setPID(const PidParams &p)
51  {
52  velocity = p.velocity;
53  if (velocity) {
54  std::cerr << "use velocity feedback" << std::endl;
55  }
56  else {
57  std::cerr << "use force feedback" << std::endl;
58  }
59  setPID(p.p, p.i, p.d, p.i_max, p.i_min, p.cmd_max, p.cmd_min);
60  }
61  void setPID(double _p, double _i, double _d,
62  double _imax, double _imin, double _cmax, double _cmin)
63  {
64  std::cerr << "P: " << _p
65  << ", I: " << _i
66  << ", D: " << _d
67  << ", imax: " << _imax
68  << ", imin: " << _imin
69  << ", cmax: " << _cmax
70  << ", cmin: " << _cmin << std::endl;
71  pid.Init(_p, _i, _d, _imax, _imin, _cmax, _cmin);
72  }
73  void update (gazebo::common::Time &dt) {
74 #if GAZEBO_MAJOR_VERSION < 8
75  double t_current = target_joint->GetAngle(0).Radian();
76  double s_current = source_joint->GetAngle(0).Radian();
77 #else
78  double t_current = target_joint->Position(0);
79  double s_current = source_joint->Position(0);
80 #endif
81  double t_desired = (s_current - offset) * multiplier;
82 
83  double result = pid.Update(t_current - t_desired, dt);
84 #if 0
85  std::cerr << "t_cur: " << t_current
86  << ", s_cur: " << s_current
87  << ", t_tgt: " << t_desired
88  << ", err: " << t_current - t_desired
89  << ", r= " << result;
90 #endif
91  if (velocity) {
92  target_joint->SetVelocity(0, result); // velocity feedback
93  } else {
94  target_joint->SetForce(0, result);
95  }
96  }
97  private:
98  gazebo::physics::JointPtr source_joint;
99  gazebo::physics::JointPtr target_joint;
100  double offset;
101  double multiplier;
102  gazebo::common::PID pid;
103  bool velocity;
104  };
105 
106  class MimicPlugin : public ModelPlugin
107  {
108  public:
110  virtual ~MimicPlugin() {}
111 
112  //
113  void Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf);
114 
115  private:
116  void Update();
117 
118  void registerMimic(const std::string &src_joint,
119  const std::string &dst_joint,
120  double offset, double multiplier,
121  const PidParams &_p);
122 
123  physics::WorldPtr world;
124  physics::ModelPtr model;
125 
126  std::vector<MimicJointUpdater> mimic_joint_list;
127 
128  event::ConnectionPtr updateConnection;
129 
130  gazebo::common::Time prev_tm;
131  };
132  }
133 }
PidParams(double _p, double _i, double _d, double _imax, double _imin, double _cmax, double _cmin, bool _vel=false)
Definition: MimicPlugin.h:32
Gazebo.
event::ConnectionPtr updateConnection
Definition: MimicPlugin.h:128
gazebo::common::Time prev_tm
Definition: MimicPlugin.h:130
MimicJointUpdater(gazebo::physics::JointPtr source, gazebo::physics::JointPtr target, double _offset, double _multiplier, const PidParams &_param)
Definition: MimicPlugin.h:40
void setPID(double _p, double _i, double _d, double _imax, double _imin, double _cmax, double _cmin)
Definition: MimicPlugin.h:61
gazebo::physics::JointPtr target_joint
Definition: MimicPlugin.h:99
std::vector< MimicJointUpdater > mimic_joint_list
Definition: MimicPlugin.h:126
void update(gazebo::common::Time &dt)
Definition: MimicPlugin.h:73
void setPID(const PidParams &p)
Definition: MimicPlugin.h:50
gazebo::physics::JointPtr source_joint
Definition: MimicPlugin.h:98


seed_r7_gazebo
Author(s):
autogenerated on Sun Apr 18 2021 02:41:01