5 #ifndef DIFFBOT_BASE_CONTROLLER_H
6 #define DIFFBOT_BASE_CONTROLLER_H
14 #include <std_msgs/Empty.h>
15 #include <sensor_msgs/JointState.h>
76 template <
typename TMotorController,
typename TMotorDriver>
120 inline Period(
double imu_frequency,
double control_frequency,
double debug_frequency)
121 :
imu_(1.0 / imu_frequency)
123 ,
debug_(1.0 / debug_frequency) {};
140 double control_frequency,
141 double debug_frequency)
142 :
imu_(imu_frequency)
145 ,
period_(imu_frequency, control_frequency, debug_frequency) {};
154 inline int period(
double frequency) {
return 1 / frequency; };
379 template <
typename TMotorController,
typename TMotorDriver>
383 template <
typename TMotorController,
typename TMotorDriver>
389 , sub_reset_encoders_(
"reset", &
BC<TMotorController, TMotorDriver>::resetEncodersCallback, this)
390 , pub_encoders_(
"encoder_ticks", &encoder_msg_)
391 , pub_measured_joint_states_(
"measured_joint_states", &msg_measured_joint_states_)
392 , sub_wheel_cmd_velocities_(
"wheel_cmd_velocities", &
BC<TMotorController, TMotorDriver>::commandCallback, this)
393 , last_update_time_(
nh.now())
395 , sub_pid_left_(
"pid_left", &
BC<TMotorController, TMotorDriver>::pidLeftCallback, this)
396 , sub_pid_right_(
"pid_right", &
BC<TMotorController, TMotorDriver>::pidRightCallback, this)
405 template <
typename TMotorController,
typename TMotorDriver>
409 nh_.advertise(pub_encoders_);
416 msg_measured_joint_states_.position = (
float*)malloc(
sizeof(
float) * 2);
417 msg_measured_joint_states_.position_length = 2;
418 msg_measured_joint_states_.velocity = (
float*)malloc(
sizeof(
float) * 2);
419 msg_measured_joint_states_.velocity_length = 2;
420 nh_.advertise(pub_measured_joint_states_);
422 nh_.subscribe(sub_wheel_cmd_velocities_);
423 nh_.subscribe(sub_reset_encoders_);
425 nh_.subscribe(sub_pid_left_);
426 nh_.subscribe(sub_pid_right_);
428 while (!nh_.connected())
434 template <
typename TMotorController,
typename TMotorDriver>
437 nh_.loginfo(
"Get Parameters from Parameter Server");
438 nh_.getParam(
"/diffbot/encoder_resolution", &this->encoder_resolution_);
439 String log_msg = String(
"/diffbot/encoder_resolution: ") + String(encoder_resolution_);
440 nh_.loginfo(log_msg.c_str());
441 nh_.getParam(
"/diffbot/mobile_base_controller/wheel_radius", &wheel_radius_);
442 log_msg = String(
"/diffbot/mobile_base_controller/wheel_radius: ") + String(wheel_radius_);
443 nh_.loginfo(log_msg.c_str());
444 nh_.getParam(
"/diffbot/mobile_base_controller/linear/x/max_velocity", &max_linear_velocity_);
445 log_msg = String(
"/diffbot/mobile_base_controller/linear/x/max_velocity: ") + String(max_linear_velocity_);
446 nh_.loginfo(log_msg.c_str());
447 nh_.getParam(
"/diffbot/debug/base_controller", &debug_);
448 log_msg = String(
"/diffbot/debug/base_controller: ") + String(debug_);
449 nh_.loginfo(log_msg.c_str());
451 nh_.loginfo(
"Initialize DiffBot Wheel Encoders");
452 encoder_left_.resolution(encoder_resolution_);
453 encoder_right_.resolution(encoder_resolution_);
455 std_msgs::Empty reset;
456 this->resetEncodersCallback(reset);
459 max_angular_velocity_ = max_linear_velocity_ / wheel_radius_;
464 template <
typename TMotorController,
typename TMotorDriver>
475 lastUpdateTime().command_received = nh_.now();
479 template <
typename TMotorController,
typename TMotorDriver>
483 this->encoder_left_.write(0);
484 this->encoder_right_.write(0);
485 this->nh_.loginfo(
"Reset both wheel encoders to zero");
489 template <
typename TMotorController,
typename TMotorDriver>
495 motor_pid_left_.updateConstants(pid_msg.
pid.
kp, pid_msg.
pid.
ki, pid_msg.
pid.
kd);
496 motor_pid_left_.updateConstants(pid_msg.
pid.
kp, pid_msg.
pid.
ki, pid_msg.
pid.
kd);
499 template <
typename TMotorController,
typename TMotorDriver>
505 motor_pid_left_.updateConstants(pid_msg.
pid.
kp, pid_msg.
pid.
ki, pid_msg.
pid.
kd);
506 motor_pid_left_.updateConstants(pid_msg.
pid.
kp, pid_msg.
pid.
ki, pid_msg.
pid.
kd);
510 template <
typename TMotorController,
typename TMotorDriver>
513 joint_state_left_ = encoder_left_.jointState();
514 joint_state_right_ = encoder_right_.jointState();
516 msg_measured_joint_states_.position[0] = joint_state_left_.angular_position_;
517 msg_measured_joint_states_.position[1] = joint_state_right_.angular_position_;
519 msg_measured_joint_states_.velocity[0] = joint_state_left_.angular_velocity_;
520 msg_measured_joint_states_.velocity[1] = joint_state_right_.angular_velocity_;
521 pub_measured_joint_states_.publish(&msg_measured_joint_states_);
524 ticks_left_ = encoder_left_.read();
525 ticks_right_ = encoder_right_.read();
527 encoder_msg_.encoders.ticks[0] = ticks_left_;
528 encoder_msg_.encoders.ticks[1] = ticks_right_;
535 template <
typename TMotorController,
typename TMotorDriver>
550 motor_cmd_left_ = motor_pid_left_.compute(wheel_cmd_velocity_left_, joint_state_left_.angular_velocity_);
551 motor_cmd_right_ = motor_pid_right_.compute(wheel_cmd_velocity_right_, joint_state_right_.angular_velocity_);
553 p_motor_controller_left_->setSpeed(motor_cmd_left_);
554 p_motor_controller_right_->setSpeed(motor_cmd_right_);
557 template <
typename TMotorController,
typename TMotorDriver>
560 wheel_cmd_velocity_left_ = 0;
561 wheel_cmd_velocity_right_ = 0;
564 template <
typename TMotorController,
typename TMotorDriver>
581 String(
"\nRead:\n") +
582 String(
"ticks_left_: ") + String(ticks_left_) +
583 String(
"\nticks_right_: ") + String(ticks_right_) +
584 String(
"\nmeasured_ang_vel_left: ") + String(joint_state_left_.angular_velocity_) +
585 String(
"\nmeasured_ang_vel_right: ") + String(joint_state_right_.angular_velocity_) +
586 String(
"\nwheel_cmd_velocity_left_: ") + String(wheel_cmd_velocity_left_) +
587 String(
"\nwheel_cmd_velocity_right_: ") + String(wheel_cmd_velocity_right_) +
589 String(
"\nWrite:\n") +
590 String(
"motor_cmd_left_: ") + String(motor_cmd_left_) +
591 String(
"\nmotor_cmd_right_: ") + String(motor_cmd_right_) +
592 String(
"\npid_left_errors (p, i, d): ") + String(motor_pid_left_.proportional()) + String(
" ") + String(motor_pid_left_.integral()) + String(
" ") + String(motor_pid_left_.derivative()) +
593 String(
"\npid_right_error (p, i, d): ") + String(motor_pid_right_.proportional()) + String(
" ") + String(motor_pid_right_.integral()) + String(
" ") + String(motor_pid_right_.derivative());
594 nh_.loginfo(log_msg.c_str());
598 #endif // DIFFBOT_BASE_CONTROLLER_H