gpio_encoder.cpp
Go to the documentation of this file.
1 
32 
33 #define PARAM_ENCODER_STRING "/encoder"
34 
35 GPIOEncoderConfigurator::GPIOEncoderConfigurator(const ros::NodeHandle &nh, roboteq::serial_controller *serial, std::vector<roboteq::Motor *> motor, string name, unsigned int number)
36  : nh_(nh)
37  , mSerial(serial)
38  ,_motor(motor)
39 {
40  // Find path param
41  mName = nh_.getNamespace() + name + PARAM_ENCODER_STRING + "/" + std::to_string(number);
42  // Roboteq motor number
43  mNumber = number;
44  // Set false on first run
45  setup_encoder = false;
46 }
47 
49 {
50  // Check if is required load paramers
51  if(load_from_board)
52  {
53  // Load encoder properties from roboteq
55  }
56 
57  // Initialize encoder dynamic reconfigure
58  ds_encoder = new dynamic_reconfigure::Server<roboteq_control::RoboteqEncoderConfig>(ros::NodeHandle(mName));
59  dynamic_reconfigure::Server<roboteq_control::RoboteqEncoderConfig>::CallbackType cb_encoder = boost::bind(&GPIOEncoderConfigurator::reconfigureCBEncoder, this, _1, _2);
60  ds_encoder->setCallback(cb_encoder);
61 
62  // Get PPR Encoder parameter
63  double ppr;
64  nh_.getParam(mName + "/PPR", ppr);
65  _reduction = ppr;
66  // Multiply for quadrature
67  _reduction *= 4;
68 }
69 
70 double GPIOEncoderConfigurator::getConversion(double reduction) {
71  // Check if exist ratio variable
72  if(nh_.hasParam(mName + "/position"))
73  {
74  int position;
75  nh_.getParam(mName + "/position", position);
76  // Read position if before (1) multiply with ratio
77  if(position) {
78  return _reduction * reduction;
79  }
80  }
81  return _reduction;
82 }
83 
85  try
86  {
87  // Get Encoder Usage - reference pag. 315
88  string str_emode = mSerial->getParam("EMOD", std::to_string(mNumber));
89  // Get PPR from roboteq board
90  int emod = boost::lexical_cast<unsigned int>(str_emode);
91  // 3 modes:
92  // 0 - Unsed
93  // 1 - Command
94  // 2 - Feedback
95  int command = (emod & 0b11);
96  int motors = (emod - command) >> 4;
97  int tmp1 = ((motors & 0b1) > 0);
98  int tmp2 = ((motors & 0b10) > 0);
99  // Register reduction
100  if(tmp1)
101  {
102  for (vector<roboteq::Motor*>::iterator it = _motor.begin() ; it != _motor.end(); ++it)
103  {
104  roboteq::Motor* motor = ((roboteq::Motor*)(*it));
105  if(motor->getNumber() == 1)
106  {
107  motor->registerSensor(this);
108  ROS_INFO_STREAM("Register encoder [" << mNumber << "] to: " << motor->getName());
109  break;
110  }
111  }
112  }
113  if(tmp2)
114  {
115  for (vector<roboteq::Motor*>::iterator it = _motor.begin() ; it != _motor.end(); ++it)
116  {
117  roboteq::Motor* motor = ((roboteq::Motor*)(*it));
118  if(motor->getNumber() == 2)
119  {
120  motor->registerSensor(this);
121  ROS_INFO_STREAM("Register encoder [" << mNumber << "] to: " << motor->getName());
122  break;
123  }
124  }
125  }
126  // Set parameter
127  nh_.setParam(mName + "/configuration", command);
128  nh_.setParam(mName + "/input_motor_one", tmp1);
129  nh_.setParam(mName + "/input_motor_two", tmp2);
130 
131  // Get Encoder PPR (Pulse/rev) [pag. 316]
132  string str_ppr = mSerial->getParam("EPPR", std::to_string(mNumber));
133  // Get PPR from roboteq board
134  int ppr = boost::lexical_cast<unsigned int>(str_ppr);
135  // Set parameter
136  nh_.setParam(mName + "/PPR", ppr);
137 
138  // Get Encoder ELL - Min limit [pag. 314]
139  string str_ell = mSerial->getParam("ELL", std::to_string(mNumber));
140  // Get PPR from roboteq board
141  int ell = boost::lexical_cast<unsigned int>(str_ell);
142  // Set parameter
143  nh_.setParam(mName + "/encoder_low_count_limit", ell);
144 
145  // Get Encoder EHL - Max limit [pag. 311]
146  string str_ehl = mSerial->getParam("EHL", std::to_string(mNumber));
147  // Get PPR from roboteq board
148  int ehl = boost::lexical_cast<unsigned int>(str_ehl);
149  // Set parameter
150  nh_.setParam(mName + "/encoder_high_count_limit", ehl);
151 
152  // Get Encoder EHOME - Home count [pag. 313]
153  string str_home = mSerial->getParam("EHOME", std::to_string(mNumber));
154  // Get PPR from roboteq board
155  int home = boost::lexical_cast<unsigned int>(str_home);
156  // Set parameter
157  nh_.setParam(mName + "/encoder_home_count", home);
158 
159 
160  } catch (std::bad_cast& e)
161  {
162  ROS_WARN_STREAM("Failure parsing feedback data. Dropping message." << e.what());
163  }
164 }
165 
166 void GPIOEncoderConfigurator::reconfigureCBEncoder(roboteq_control::RoboteqEncoderConfig &config, uint32_t level) {
167 
168  //The first time we're called, we just want to make sure we have the
169  //original configuration
170  if(!setup_encoder)
171  {
172  _last_encoder_config = config;
174  setup_encoder = true;
175  return;
176  }
177 
178  if(config.restore_defaults)
179  {
180  //if someone sets restore defaults on the parameter server, prevent looping
181  config.restore_defaults = false;
182  // Overload default configuration
183  config = default_encoder_config;
184  }
185 
186  if(config.load_roboteq)
187  {
188  ROS_INFO_STREAM("LOAD from Roboteq");
189  //if someone sets again the request on the parameter server, prevent looping
190  config.load_roboteq = false;
191  // Launch encoder load
193  // Skip other read
194  return;
195  }
196 
197  // Set Encoder Usage - reference pag. 315
198  if((_last_encoder_config.configuration != config.configuration) ||
199  (_last_encoder_config.input_motor_one != config.input_motor_one) ||
200  (_last_encoder_config.input_motor_two != config.input_motor_two))
201  {
202  int configuration = config.configuration + 16*config.input_motor_one + 32*config.input_motor_two;
203  // Update operative mode
204  mSerial->setParam("EMOD", std::to_string(mNumber) + " " + std::to_string(configuration));
205 
206  if(config.input_motor_one)
207  {
208  roboteq::Motor* motor = _motor.at(0);
209  motor->registerSensor(this);
210  ROS_INFO_STREAM("Register encoder [" << mNumber << "] to: " << motor->getName());
211  }
212  if(config.input_motor_two)
213  {
214  roboteq::Motor* motor = _motor.at(1);
215  motor->registerSensor(this);
216  ROS_INFO_STREAM("Register encoder [" << mNumber << "] to: " << motor->getName());
217  }
218  }
219  // Set Encoder PPR
220  if(_last_encoder_config.PPR != config.PPR)
221  {
222  // Update reduction value
223  _reduction = config.PPR;
224  // Update operative mode
225  mSerial->setParam("EPPR", std::to_string(mNumber) + " " + std::to_string(config.PPR));
226  }
227  // Set Encoder ELL - Min limit [pag. 314]
228  if(_last_encoder_config.encoder_low_count_limit != config.encoder_low_count_limit)
229  {
230  // Update operative mode
231  mSerial->setParam("ELL", std::to_string(mNumber) + " " + std::to_string(config.encoder_low_count_limit));
232  }
233  // Set Encoder EHL - Max limit [pag. 311]
234  if(_last_encoder_config.encoder_high_count_limit != config.encoder_high_count_limit)
235  {
236  // Update operative mode
237  mSerial->setParam("EHL", std::to_string(mNumber) + " " + std::to_string(config.encoder_high_count_limit));
238  }
239  // Set Encoder EHOME - Home count [pag. 313]
240  if(_last_encoder_config.encoder_home_count != config.encoder_home_count)
241  {
242  // Update operative mode
243  mSerial->setParam("EHOME", std::to_string(mNumber) + " " + std::to_string(config.encoder_home_count));
244  }
245 
246  // Update last configuration
247  _last_encoder_config = config;
248 
249 }
bool setParam(string msg, string params="")
bool setup_encoder
Setup variable.
Definition: gpio_encoder.h:67
string mName
Associate name space.
Definition: gpio_encoder.h:70
void getEncoderFromRoboteq()
getEncoderFromRoboteq Load Encoder parameters from Roboteq board
void initConfigurator(bool load_from_board)
initConfigurator Initialize all parameter and syncronize parameters between ros and roboteq board ...
std::vector< roboteq::Motor * > _motor
Definition: gpio_encoder.h:78
double getConversion(double reduction)
getConversion Get conversion from pulse value to real value
ros::NodeHandle nh_
Private namespace.
Definition: gpio_encoder.h:74
void reconfigureCBEncoder(roboteq_control::RoboteqEncoderConfig &config, uint32_t level)
reconfigureCBEncoder when the dynamic reconfigurator change some values start this method ...
string getName()
getName the name of the motor
Definition: motor.h:122
unsigned int mNumber
Number motor.
Definition: gpio_encoder.h:72
GPIOEncoderConfigurator(const ros::NodeHandle &nh, roboteq::serial_controller *serial, std::vector< roboteq::Motor * > motor, string name, unsigned int number)
GPIOEncoderConfigurator.
ROSLIB_DECL std::string command(const std::string &cmd)
const std::string & getNamespace() const
#define ROS_WARN_STREAM(args)
int getNumber()
getNumber The roboteq number
Definition: motor.h:114
string getParam(string msg, string params="")
void registerSensor(GPIOSensor *sensor)
registerSensor register the sensor
Definition: motor.h:129
#define PARAM_ENCODER_STRING
#define ROS_INFO_STREAM(args)
roboteq_control::RoboteqEncoderConfig _last_encoder_config
Definition: gpio_encoder.h:92
bool getParam(const std::string &key, std::string &s) const
dynamic_reconfigure::Server< roboteq_control::RoboteqEncoderConfig > * ds_encoder
Dynamic reconfigure encoder.
Definition: gpio_encoder.h:84
bool hasParam(const std::string &key) const
roboteq_control::RoboteqEncoderConfig default_encoder_config
Definition: gpio_encoder.h:92
void setParam(const std::string &key, const XmlRpc::XmlRpcValue &v) const
roboteq::serial_controller * mSerial
Serial port.
Definition: gpio_encoder.h:76


roboteq_control
Author(s): Raffaello Bonghi
autogenerated on Wed Jan 3 2018 03:48:23