md49_base_controller_class.h
Go to the documentation of this file.
1 #ifndef MD49_BASE_CONTROLLER_CLASS_H_
2 #define MD49_BASE_CONTROLLER_CLASS_H_
3 
4 #define TIMEOUT 1000
6 class BaseController
7 {
8 public:
9 
11 
16  {
17  // Topics to publish
18  md49_encoders_pub = n.advertise<md49_messages::md49_encoders>("md49_encoders",10);
19  md49_data_pub = n.advertise<md49_messages::md49_data>("md49_data",10);
20  // Topic to subscribe
21  sub_cmd_vel = n.subscribe("/cmd_vel", 1, &BaseController::cmd_vel_callback, this);
22  // Read initial parameters from parameter service
23  n.param<std::string>("serialport/name", serialport, "/dev/ttyS0"); // Get serialportname from ROS Parameter sevice, default is ttyS0 (pcDuinos GPIO UART)
24  n.param("serialport/bps", serialport_bps, 38400); // Get serialport bps from ROS Parameter sevice, default is 38400Bps
25  n.param("md49/mode", initial_md49_mode, 0); // Get MD49 Mode from ROS Parameter sevice, default is Mode=0
26  n.param("md49/acceleration", initial_md49_acceleration, 5); // Get MD49 Acceleration from ROS Parameter sevice, default is Acceleration=0
27  n.param("md49/regulator", initial_md49_regulator, true); // Get MD49 Regulator from ROS Parameter sevice, default is Regulator=ON
28  n.param("md49/timeout", initial_md49_timeout, true); // Get MD49 Timeout from ROS Parameter sevice, default is Timeout=ON
29  n.param("md49/speed_l", requested_speed_l, 128); // Get MD49 speed_l from ROS Parameter sevice, default is speed_l=128
30  n.param("md49/speed_r", requested_speed_r, 128); // Get MD49 speed_r from ROS Parameter sevice, default is speed_r=128
31  actual_speed_l=requested_speed_l;
32  actual_speed_r=requested_speed_r;
33  }
34 
39  void cmd_vel_callback(const geometry_msgs::Twist& vel_cmd){
40  // Drive For- or Backward:
41  if (vel_cmd.linear.x != 0){
42  requested_speed_l = 128+(635*vel_cmd.linear.x);
43  requested_speed_r = 128+(635*vel_cmd.linear.x);
44  }
45  // Drive stopped:
46  if (vel_cmd.linear.x==0 && vel_cmd.angular.z==0){
47  requested_speed_l = 128;
48  requested_speed_r = 128;
49  }
50  // Turn clock- or counterclockwise:
51  if (vel_cmd.angular.z != 0){
52  requested_speed_l = 128 - (127*vel_cmd.angular.z);
53  requested_speed_r = 128 + (127*vel_cmd.angular.z);
54  }
55 
56  ROS_INFO("base_controller: Received /cmd_vel message. Requested speed_l=%i, speed_r=%i",requested_speed_l,requested_speed_r);
57  }
58 
63  {
64  try{ device.open(serialport.c_str(), serialport_bps); }
65  catch(cereal::Exception& e)
66  {
67  ROS_FATAL("base_controller: Failed to open serialport %s!",serialport.c_str());
68  ROS_BREAK();
69  }
70  ROS_INFO("base_controller: Opened Serialport at %s with %i bps.",serialport.c_str(),serialport_bps);
71  }
76  {
77  get_encoders();
78  md49_encoders_pub.publish(md49_encoders);
79  }
80 
85  {
86  md49_data.speed_l=get_speed_l();
87  md49_data.speed_r=get_speed_r();
88  md49_data.volts=get_volts();
89  md49_data.current_l=get_current_l();
90  md49_data.current_r=get_current_r();
91  md49_data.acceleration=get_acceleration();
92  md49_data.mode=get_mode();
93  md49_data.error=get_error();
94  md49_data_pub.publish(md49_data);
95  }
96 
106  void init_md49(int speed_l, int speed_r, int mode, int acceleration, bool timeout, bool regulator)
107  {
108  set_speed(speed_l,speed_r);
109  set_mode(mode);
110  set_acceleration(acceleration);
111  if (timeout==true)
112  {
113  enable_timeout();
114  }
115  else if (timeout==false)
116  {
117  disable_timeout();
118  }
119  if (regulator==true)
120  {
121  enable_regulator();
122  }
123  else if (regulator==false)
124  {
125  disable_regulator();
126  }
127  }
133  void set_speed(int speed_l, int speed_r)
134  {
135  // set and send serial command for speed_l
136  const char md49_set_speed_l[]={0x00,0x31,speed_l};
137  device.write(md49_set_speed_l,3);
138  // set and send serial command for speed_r
139  const char md49_set_speed_r[]={0x00,0x32,speed_r};
140  device.write(md49_set_speed_r,3);
141 
142  }
147  void set_mode(int mode)
148  {
149  const char md49_set_mode[]={0x00,0x34,mode};
150  device.write(md49_set_mode,3);
151  ROS_INFO("base_controller: Set mode=%i on MD49", mode);
152  }
157  void set_acceleration(int acceleration)
158  {
159  const char md49_set_acceleration[]={0x00,0x33,acceleration};
160  device.write(md49_set_acceleration,3);
161  ROS_INFO("base_controller: Set acceleration=%i on MD49", acceleration);
162  }
166  void enable_timeout(void){
167  const char md49_enable_timeout[] = {0x00,0x39}; // put together command to enable md49 timeout
168  device.write(md49_enable_timeout,2);
169  md49_data.timeout=1;
170  ROS_INFO("base_controller: Enabled timeout on MD49");
171  }
175  void enable_regulator(void){
176  const char md49_enable_regulator[] = {0x00,0x37}; // put together command to enable md49 regulator
177  device.write(md49_enable_regulator,2);
178  md49_data.regulator=1;
179  ROS_INFO("base_controller: Enabled regulator on MD49");
180  }
184  void disable_timeout(void){
185  const char md49_disable_timeout[] = {0x00,0x38}; // put together command to enable md49 regulator
186  device.write(md49_disable_timeout,2);
187  md49_data.timeout=0;
188  ROS_INFO("base_controller: Disabled timeout on MD49");
189  }
193  void disable_regulator(void){
194  const char md49_disable_regulator[] = {0x00,0x36}; // put together command to enable md49 timeout
195  device.write(md49_disable_regulator,2);
196  md49_data.regulator=0;
197  ROS_INFO("base_controller: Disabled regulator on MD49");
198  }
204  const char md49_get_acceleration[] = {0x00,0x2A}; // put together command to read md49 set acceleration
205  device.write(md49_get_acceleration,2);
206  try{ device.read(reply, 1, TIMEOUT); } // get answer, acceleration
207  catch(cereal::TimeoutException& e){
208  ROS_ERROR("base_controller: Timeout reading MD49 acceleration!");
209  }
210  //ROS_INFO("base_controller: MD49 Acceleration= %i", reply[0]);
211  return reply[0];
212  }
217  int get_mode(){
218  const char md49_get_mode[] = {0x00,0x2B}; // put together command to read md49 set acceleration
219  device.write(md49_get_mode,2);
220  try{ device.read(reply, 1, TIMEOUT); } // get answer, acceleration
221  catch(cereal::TimeoutException& e){
222  ROS_ERROR("base_controller: Timeout reading MD49 Mode!");
223  }
224  //ROS_INFO("base_controller: MD49 Mode= %i", reply[0]);
225  return reply[0];
226  }
231  int get_speed_l(){
232  const char md49_get_speed_l[] = {0x00,0x21}; // put together command to read md49 set acceleration
233  device.write(md49_get_speed_l,2);
234  try{ device.read(reply, 1, TIMEOUT); } // get answer, acceleration
235  catch(cereal::TimeoutException& e){
236  ROS_ERROR("base_controller: Timeout reading MD49 speed_l!");
237  }
238  return reply[0];
239  //ROS_INFO("base_controller: MD49 speed_l= %i, speed_r= %i", speed_l,speed_r);
240  }
245  int get_speed_r(){
246  const char md49_get_speed_r[] = {0x00,0x22}; // put together command to read md49 set acceleration
247  device.write(md49_get_speed_r,2);
248  try{ device.read(reply, 1, TIMEOUT); } // get answer, acceleration
249  catch(cereal::TimeoutException& e){
250  ROS_ERROR("base_controller: Timeout reading MD49 speed_r!");
251  }
252  return reply[0];
253  //ROS_INFO("base_controller: MD49 speed_l= %i, speed_r= %i", speed_l,speed_r);
254  }
258  void get_encoders(void){
259  const char md49_get_encoders[] = {0x00,0x25}; // put together command to read md49 encoders
260  device.write(md49_get_encoders,2);
261  // ******************************************************
262  // * Get the reply, the last value is the timeout in ms *
263  // ******************************************************
264  try{ device.read(reply, 8, TIMEOUT); }
265  catch(cereal::TimeoutException& e){
266  ROS_ERROR("base_controller: Timeout reading MD49 encodervalues!");
267  }
268  // ***************************************************
269  // * Set all values of custom message /md49_encoders *
270  // ***************************************************
271  md49_encoders.encoder_l = reply[0] << 24; // put together first encoder value
272  md49_encoders.encoder_l |= (reply[1] << 16);
273  md49_encoders.encoder_l |= (reply[2] << 8);
274  md49_encoders.encoder_l |= (reply[3]);
275  md49_encoders.encoder_r = reply[4] << 24; // put together second encoder value
276  md49_encoders.encoder_r |= (reply[5] << 16);
277  md49_encoders.encoder_r |= (reply[6] << 8);
278  md49_encoders.encoder_r |= (reply[7]);
279  md49_encoders.encoderbyte1l=reply[0];
280  md49_encoders.encoderbyte2l=reply[1];
281  md49_encoders.encoderbyte3l=reply[2];
282  md49_encoders.encoderbyte4l=reply[3];
283  md49_encoders.encoderbyte1r=reply[4];
284  md49_encoders.encoderbyte2r=reply[5];
285  md49_encoders.encoderbyte3r=reply[6];
286  md49_encoders.encoderbyte4r=reply[7];
287  //ROS_INFO("Got this reply: %i,%i,%i,%i,%i,%i,%i,%i", reply[0], reply[1], reply[2],reply[3], reply[4], reply[5], reply[6], reply[7]);
288  }
293  int get_volts(){
294  const char md49_get_volts[] = {0x00,0x26}; // put together command to read md49 volts
295  device.write(md49_get_volts,2);
296  try{ device.read(reply, 1, TIMEOUT); } // get answer, volts
297  catch(cereal::TimeoutException& e){
298  ROS_ERROR("base_controller: Timeout reading MD49 volts!");
299  }
300  //ROS_INFO("Got this reply (volts): %i", reply[0]);
301  return reply[0];
302  }
308  const char md49_get_current_l[] = {0x00,0x27}; // put together command to read md49 current_l
309  device.write(md49_get_current_l,2);
310  try{ device.read(reply, 1, TIMEOUT); } // get answer, current_l
311  catch(cereal::TimeoutException& e){
312  ROS_ERROR("base_controller: Timeout reading MD49 current_l!");
313  }
314  //ROS_INFO("Got this reply (current_l): %i", reply[0]);
315  return reply[0];
316  }
322  const char md49_get_current_r[] = {0x00,0x28}; // put together command to read md49 current_r
323  device.write(md49_get_current_r,2);
324  try{ device.read(reply, 1, TIMEOUT); } // get answer, current_r
325  catch(cereal::TimeoutException& e){
326  ROS_ERROR("base_controller: Timeout reading MD49 current_r!");
327  }
328  //ROS_INFO("Got this reply (current_r): %i", reply[0]);
329  return reply[0];
330  }
335  int get_error(){
336  // ************************
337  const char md49_get_error[] = {0x00,0x2D}; // put together command to read md49 error
338  device.write(md49_get_error,2);
339  try{ device.read(reply, 1, TIMEOUT); } // get answer, error
340  catch(cereal::TimeoutException& e){
341  ROS_ERROR("base_controller: Timeout reading MD49 errorbyte!");
342  }
343  //ROS_INFO("Got this reply (error): %i", reply[0]);
344  return reply[0];
345  }
349  void reset_encoders(void){
350  const char md49_reset_encoders[] = {0x00,0x35}; // put together command to reset md49 encoders
351  device.write(md49_reset_encoders,2);
352  ROS_INFO("base_controller: Reset encoders on MD49");
353  }
354 
360  {
361  return requested_speed_l;
362  }
368  {
369  return requested_speed_r;
370  }
375  void set_requested_speed_l(int speed_l)
376  {
377  requested_speed_l=speed_l;
378  }
383  void set_requested_speed_r(int speed_r)
384  {
385  requested_speed_r=speed_r;
386  }
392  {
393  return actual_speed_l;
394  }
400  {
401  return actual_speed_r;
402  }
407  void set_actual_speed_l(int speed_l)
408  {
409  actual_speed_l=speed_l;
410  }
415  void set_actual_speed_r(int speed_r)
416  {
417  actual_speed_r=speed_r;
418  }
424  {
425  return initial_md49_mode;
426  }
431  {
432  return initial_md49_acceleration;
433  }
439  {
440  return initial_md49_timeout;
441  }
447  {
448  return initial_md49_regulator;
449  }
450 
451 private:
452 
454  char reply[8];
455  int requested_speed_l, requested_speed_r;
456  int actual_speed_l, actual_speed_r;
461  std::string serialport;
463  //ros::NodeHandle n;
465  md49_messages::md49_data md49_data;
466  md49_messages::md49_encoders md49_encoders;
469 }; //End of class BaseController
470 
471 #endif
void set_requested_speed_r(int speed_r)
set_requested_speed_r
int get_speed_l()
This function reads left drives speed from MD49.
int get_current_l()
This function reads left drives current from MD49.
#define ROS_FATAL(...)
void cmd_vel_callback(const geometry_msgs::Twist &vel_cmd)
This is the callback-function for topic /cmd_vel.
BaseController()
Constructor for class BaseController.
int get_initial_md49_timeout()
get_initial_md49_timeout
void disable_timeout(void)
This function disables Timeout on MD49.
int get_mode()
This function reads the mode that is set from MD49.
void disable_regulator(void)
This function disables regulator on MD49.
int get_actual_speed_r()
get_actual_speed_r
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
void reset_encoders(void)
This function resets encoders on MD49.
void publish_md49_data()
This function reads data and parameters from MD49 and publishes them as topic /md49_data.
void set_mode(int mode)
This function sets mode on MD49.
void publish_encoders()
This function reads encodervalues from MD49 and publishes them as topic /md49_encoders.
void enable_timeout(void)
This function enables timeout on MD49.
void init_md49(int speed_l, int speed_r, int mode, int acceleration, bool timeout, bool regulator)
This function sets parameters for MD49 as read from config file or as set as defaults.
int get_acceleration()
This function reads the acceleration that is set from MD49.
int get_initial_md49_mode()
get_initial_md49_mode
int get_actual_speed_l()
get_actual_speed_l
int get_speed_r()
This function reads right drives speed from MD49.
int get_current_r()
This function reads right drives current from MD49.
int get_requested_speed_l()
get_requested_speed_l
cereal::CerealPort device
void set_actual_speed_r(int speed_r)
set_actual_speed_r
int get_initial_md49_regulator()
get_initial_md49_regulator
int get_error()
This function reads error code from MD49.
void open_serialport()
This function opens serial port MD49 is connected to.
#define ROS_INFO(...)
int get_requested_speed_r()
get_requested_speed_r
bool param(const std::string &param_name, T &param_val, const T &default_val) const
md49_messages::md49_encoders md49_encoders
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
void set_requested_speed_l(int speed_l)
set_requested_speed_l
ros::Publisher md49_encoders_pub
void set_speed(int speed_l, int speed_r)
This function sets speed for left and right drive on MD49.
int get_initial_md49_acceleration()
get_initial_md49_acceleration
void set_actual_speed_l(int speed_l)
set_actual_speed_l
void enable_regulator(void)
This function enables regulator on MD49.
void set_acceleration(int acceleration)
This function sets acceleration on MD49.
md49_messages::md49_data md49_data
#define ROS_BREAK()
#define ROS_ERROR(...)
#define TIMEOUT
void get_encoders(void)
This function reads encodervalues from MD49.
int get_volts()
This function reads supply voltage from MD49.


md49_base_controller
Author(s): Fabian Prinzing
autogenerated on Mon Jun 10 2019 13:54:49