Skip to content

Commit db48dce

Browse files
committed
feat: add callbacks for low level pids on mcu #54
For MCU firmware - Add subscribers for left and right motor pid controllers using diffbot_msgs::PIDStamped custom message - Update debug logging message (different formatting) - Update PID controller interface (provide proportional_, integral_ and derivative_ values)
1 parent 60750e9 commit db48dce

File tree

3 files changed

+77
-17
lines changed

3 files changed

+77
-17
lines changed

diffbot_base/scripts/base_controller/lib/base_controller/base_controller.h

Lines changed: 70 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <diffbot_msgs/EncodersStamped.h>
1111
#include <diffbot_msgs/WheelsCmdStamped.h>
1212
#include <diffbot_msgs/AngularVelocities.h>
13+
#include <diffbot_msgs/PIDStamped.h>
1314
#include <std_msgs/Empty.h>
1415
#include <sensor_msgs/JointState.h>
1516

@@ -301,6 +302,24 @@ namespace diffbot {
301302
*/
302303
void resetEncodersCallback(const std_msgs::Empty& reset_msg);
303304

305+
/**
306+
* @brief Callback method to update the PID constants for the left motor.
307+
*
308+
* Publish to pid_left topic to update the PID constants of the left motor.
309+
*
310+
* @param pid_msg message containing the new PID constants
311+
*/
312+
void pidLeftCallback(const diffbot_msgs::PIDStamped& pid_msg);
313+
314+
/**
315+
* @brief Callback method to update the PID constants for the right motor.
316+
*
317+
* Publish to pid_right topic to update the PID constants of the right motor.
318+
*
319+
* @param pid_msg message containing the new PID constants
320+
*/
321+
void pidRightCallback(const diffbot_msgs::PIDStamped& pid_msg);
322+
304323
private:
305324
// Reference to global node handle from main.cpp
306325
ros::NodeHandle& nh_;
@@ -345,7 +364,8 @@ namespace diffbot {
345364
int motor_cmd_left_ = 0;
346365
int motor_cmd_right_ = 0;
347366

348-
367+
ros::Subscriber<diffbot_msgs::PIDStamped, BaseController<TMotorController, TMotorDriver>> sub_pid_left_;
368+
ros::Subscriber<diffbot_msgs::PIDStamped, BaseController<TMotorController, TMotorDriver>> sub_pid_right_;
349369
PID motor_pid_left_;
350370
PID motor_pid_right_;
351371

@@ -372,6 +392,8 @@ diffbot::BaseController<TMotorController, TMotorDriver>
372392
, sub_wheel_cmd_velocities_("wheel_cmd_velocities", &BC<TMotorController, TMotorDriver>::commandCallback, this)
373393
, last_update_time_(nh.now())
374394
, update_rate_(UPDATE_RATE_IMU, UPDATE_RATE_CONTROL, UPDATE_RATE_DEBUG)
395+
, sub_pid_left_("pid_left", &BC<TMotorController, TMotorDriver>::pidLeftCallback, this)
396+
, sub_pid_right_("pid_right", &BC<TMotorController, TMotorDriver>::pidRightCallback, this)
375397
, motor_pid_left_(PWM_MIN, PWM_MAX, K_P, K_I, K_D)
376398
, motor_pid_right_(PWM_MIN, PWM_MAX, K_P, K_I, K_D)
377399
{
@@ -461,6 +483,27 @@ void diffbot::BaseController<TMotorController, TMotorDriver>::resetEncodersCallb
461483
}
462484

463485

486+
template <typename TMotorController, typename TMotorDriver>
487+
void diffbot::BaseController<TMotorController, TMotorDriver>::pidLeftCallback(const diffbot_msgs::PIDStamped& pid_msg)
488+
{
489+
// Callback function to update the pid values of the left motor
490+
// This callback function receives diffbot_msgs::PID message object
491+
// where diffbot_msgs::PID kp, ki, kd for one pid controller is stored
492+
motor_pid_left_.updateConstants(pid_msg.pid.kp, pid_msg.pid.ki, pid_msg.pid.kd);
493+
motor_pid_left_.updateConstants(pid_msg.pid.kp, pid_msg.pid.ki, pid_msg.pid.kd);
494+
}
495+
496+
template <typename TMotorController, typename TMotorDriver>
497+
void diffbot::BaseController<TMotorController, TMotorDriver>::pidRightCallback(const diffbot_msgs::PIDStamped& pid_msg)
498+
{
499+
// Callback function to update the pid values of the left motor
500+
// This callback function receives diffbot_msgs::PID message object
501+
// where diffbot_msgs::PID kp, ki, kd for one pid controller is stored
502+
motor_pid_left_.updateConstants(pid_msg.pid.kp, pid_msg.pid.ki, pid_msg.pid.kd);
503+
motor_pid_left_.updateConstants(pid_msg.pid.kp, pid_msg.pid.ki, pid_msg.pid.kd);
504+
}
505+
506+
464507
template <typename TMotorController, typename TMotorDriver>
465508
void diffbot::BaseController<TMotorController, TMotorDriver>::read()
466509
{
@@ -518,16 +561,33 @@ void diffbot::BaseController<TMotorController, TMotorDriver>::eStop()
518561
template <typename TMotorController, typename TMotorDriver>
519562
void diffbot::BaseController<TMotorController, TMotorDriver>::printDebug()
520563
{
521-
String log_msg =
522-
String("\nRead:\n") +
523-
String("ticks_left_ \t ticks_right_ \t measured_ang_vel_left \t measured_ang_vel_right\n") +
524-
String(ticks_left_) + String("\t") + String(ticks_right_) + String("\t") +
525-
String(joint_state_left_.angular_velocity_) + String("\t") + String(joint_state_right_.angular_velocity_) +
564+
/*
565+
String log_msg =
566+
String("\nRead:\n") +
567+
String("ticks_left_ \t ticks_right_ \t measured_ang_vel_left \t measured_ang_vel_right\n") +
568+
String(ticks_left_) + String("\t") + String(ticks_right_) + String("\t") +
569+
String(joint_state_left_.angular_velocity_) + String("\t") + String(joint_state_right_.angular_velocity_) +
526570
String("\nWrite:\n") +
527-
String("motor_cmd_left_ \t motor_cmd_right_ \t pid_left_error \t pid_right_error\n") +
528-
String(motor_cmd_left_) + String("\t") + String(motor_cmd_right_) + String("\t") +
529-
//String("pid_left \t pid_right\n") +
530-
String(motor_pid_left_.error()) + String("\t") + String(motor_pid_right_.error());
571+
String("motor_cmd_left_ \t motor_cmd_right_ \t pid_left_error \t pid_right_error\n") +
572+
String(motor_cmd_left_) + String("\t") + String(motor_cmd_right_) + String("\t") +
573+
//String("pid_left \t pid_right\n") +
574+
String(motor_pid_left_.error()) + String("\t") + String(motor_pid_right_.error());
575+
*/
576+
577+
String log_msg =
578+
String("\nRead:\n") +
579+
String("ticks_left_: ") + String(ticks_left_) +
580+
String("\nticks_right_: ") + String(ticks_right_) +
581+
String("\nmeasured_ang_vel_left: ") + String(joint_state_left_.angular_velocity_) +
582+
String("\nmeasured_ang_vel_right: ") + String(joint_state_right_.angular_velocity_) +
583+
String("\nwheel_cmd_velocity_left_: ") + String(wheel_cmd_velocity_left_) +
584+
String("\nwheel_cmd_velocity_right_: ") + String(wheel_cmd_velocity_right_) +
585+
586+
String("\nWrite:\n") +
587+
String("motor_cmd_left_: ") + String(motor_cmd_left_) +
588+
String("\nmotor_cmd_right_: ") + String(motor_cmd_right_) +
589+
String("\npid_left_errors (p, i, d): ") + String(motor_pid_left_.proportional()) + String(" ") + String(motor_pid_left_.integral()) + String(" ") + String(motor_pid_left_.derivative()) +
590+
String("\npid_right_error (p, i, d): ") + String(motor_pid_right_.proportional()) + String(" ") + String(motor_pid_right_.integral()) + String(" ") + String(motor_pid_right_.derivative());
531591
nh_.loginfo(log_msg.c_str());
532592
}
533593

diffbot_base/scripts/base_controller/lib/pid/pid.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ double diffbot::PID::compute(float setpoint, float measured_value)
1717

1818
//setpoint is constrained between min and max to prevent pid from having too much error
1919
error = setpoint - measured_value;
20+
proportional_ = error;
2021
integral_ += error;
2122
derivative_ = error - prev_error_;
2223

@@ -25,7 +26,7 @@ double diffbot::PID::compute(float setpoint, float measured_value)
2526
integral_ = 0;
2627
}
2728

28-
pid = (kp_ * error) + (ki_ * integral_) + (kd_ * derivative_);
29+
pid = (kp_ * proportional_) + (ki_ * integral_) + (kd_ * derivative_);
2930
prev_error_ = error;
3031

3132
return constrain(pid, min_val_, max_val_);
@@ -36,9 +37,4 @@ void diffbot::PID::updateConstants(float kp, float ki, float kd)
3637
kp_ = kp;
3738
ki_ = ki;
3839
kd_ = kd;
39-
}
40-
41-
double diffbot::PID::error()
42-
{
43-
return prev_error_;
4440
}

diffbot_base/scripts/base_controller/lib/pid/pid.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@ namespace diffbot {
1010
double compute(float setpoint, float measured_value);
1111
void updateConstants(float kp, float ki, float kd);
1212

13-
double error();
13+
inline double proportional() { return proportional_; };
14+
inline double integral() { return integral_; };
15+
inline double derivative() { return derivative_; };
16+
inline double prev_error() { return prev_error_; };
1417

1518
private:
1619
float min_val_;
1720
float max_val_;
1821
float kp_;
1922
float ki_;
2023
float kd_;
24+
double proportional_;
2125
double integral_;
2226
double derivative_;
2327
double prev_error_;

0 commit comments

Comments
 (0)