Skip to content

Commit bfd740f

Browse files
feat(pid_longitudinal_controller)!: add acceleration feedback block (autowarefoundation#8325)
Signed-off-by: Yuki Takagi <yuki.takagi@tier4.jp>
1 parent 37b6765 commit bfd740f

File tree

8 files changed

+192
-119
lines changed

8 files changed

+192
-119
lines changed

control/autoware_pid_longitudinal_controller/config/autoware_pid_longitudinal_controller.param.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@
6161
emergency_acc: -5.0 # denotes acceleration
6262
emergency_jerk: -3.0
6363

64+
# acceleration feedback
65+
lpf_acc_error_gain: 0.98
66+
acc_feedback_gain: 0.0
67+
6468
# acceleration limit
6569
max_acc: 3.0
6670
min_acc: -5.0

control/autoware_pid_longitudinal_controller/include/autoware/pid_longitudinal_controller/debug_values.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ class DebugValues
5858
STOP_DIST = 28,
5959
FF_SCALE = 29,
6060
ACC_CMD_FF = 30,
61+
ERROR_ACC = 31,
62+
ERROR_ACC_FILTERED = 32,
63+
ACC_CMD_ACC_FB_APPLIED = 33,
64+
6165
SIZE // this is the number of enum elements
6266
};
6367

control/autoware_pid_longitudinal_controller/include/autoware/pid_longitudinal_controller/lowpass_filter.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ class LowpassFilter1d
6161
m_x = ret;
6262
return ret;
6363
}
64+
65+
void setGain(const double g) { m_gain = g; }
6466
};
6567
} // namespace autoware::motion::control::pid_longitudinal_controller
6668
#endif // AUTOWARE__PID_LONGITUDINAL_CONTROLLER__LOWPASS_FILTER_HPP_

control/autoware_pid_longitudinal_controller/include/autoware/pid_longitudinal_controller/pid_longitudinal_controller.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,10 @@ class PidLongitudinalController : public trajectory_follower::LongitudinalContro
195195
};
196196
EmergencyStateParams m_emergency_state_params;
197197

198+
// acc feedback
199+
double m_acc_feedback_gain;
200+
std::shared_ptr<LowpassFilter1d> m_lpf_acc_error{nullptr};
201+
198202
// acceleration limit
199203
double m_max_acc;
200204
double m_min_acc;

control/autoware_pid_longitudinal_controller/schema/autoware_pid_longitudinal_controller.schema.json

+10
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,16 @@
251251
"description": "target jerk in an EMERGENCY state [m/s^3]",
252252
"default": "-3.0"
253253
},
254+
"lpf_acc_error_gain": {
255+
"type": "number",
256+
"description": "gain of low-pass filter for acceleration",
257+
"default": "0.98"
258+
},
259+
"acc_feedback_gain": {
260+
"type": "number",
261+
"description": "acceleration feedback gain",
262+
"default": "0.0"
263+
},
254264
"max_acc": {
255265
"type": "number",
256266
"description": "max value of output acceleration [m/s^2]",

control/autoware_pid_longitudinal_controller/src/pid_longitudinal_controller.cpp

+33-1
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,13 @@ PidLongitudinalController::PidLongitudinalController(rclcpp::Node & node)
162162
p.jerk = node.declare_parameter<double>("emergency_jerk"); // [m/s^3]
163163
}
164164

165+
// parameters for acc feedback
166+
{
167+
const double lpf_acc_error_gain{node.declare_parameter<double>("lpf_acc_error_gain")};
168+
m_lpf_acc_error = std::make_shared<LowpassFilter1d>(0.0, lpf_acc_error_gain);
169+
m_acc_feedback_gain = node.declare_parameter<double>("acc_feedback_gain");
170+
}
171+
165172
// parameters for acceleration limit
166173
m_max_acc = node.declare_parameter<double>("max_acc"); // [m/s^2]
167174
m_min_acc = node.declare_parameter<double>("min_acc"); // [m/s^2]
@@ -289,6 +296,10 @@ rcl_interfaces::msg::SetParametersResult PidLongitudinalController::paramCallbac
289296
update_param("kd", kd);
290297
m_pid_vel.setGains(kp, ki, kd);
291298

299+
double lpf_vel_error_gain{node_parameters_->get_parameter("lpf_vel_error_gain").as_double()};
300+
update_param("lpf_vel_error_gain", lpf_vel_error_gain);
301+
m_lpf_vel_error->setGain(lpf_vel_error_gain);
302+
292303
double max_pid{node_parameters_->get_parameter("max_out").as_double()};
293304
double min_pid{node_parameters_->get_parameter("min_out").as_double()};
294305
double max_p{node_parameters_->get_parameter("max_p_effort").as_double()};
@@ -363,6 +374,12 @@ rcl_interfaces::msg::SetParametersResult PidLongitudinalController::paramCallbac
363374
update_param("emergency_jerk", p.jerk);
364375
}
365376

377+
// acceleration feedback
378+
update_param("acc_feedback_gain", m_acc_feedback_gain);
379+
double lpf_acc_error_gain{node_parameters_->get_parameter("lpf_acc_error_gain").as_double()};
380+
update_param("lpf_acc_error_gain", lpf_acc_error_gain);
381+
m_lpf_acc_error->setGain(lpf_acc_error_gain);
382+
366383
// acceleration limit
367384
update_param("min_acc", m_min_acc);
368385

@@ -751,6 +768,7 @@ void PidLongitudinalController::updateControlState(const ControlData & control_d
751768

752769
m_pid_vel.reset();
753770
m_lpf_vel_error->reset(0.0);
771+
m_lpf_acc_error->reset(0.0);
754772
return changeState(ControlState::DRIVE);
755773
}
756774

@@ -842,8 +860,22 @@ PidLongitudinalController::Motion PidLongitudinalController::calcCtrlCmd(
842860
// store acceleration without slope compensation
843861
m_prev_raw_ctrl_cmd = raw_ctrl_cmd;
844862

863+
// calc acc feedback
864+
const double acc_err = control_data.current_motion.acc - raw_ctrl_cmd.acc;
865+
m_debug_values.setValues(DebugValues::TYPE::ERROR_ACC, acc_err);
866+
m_lpf_acc_error->filter(acc_err);
867+
m_debug_values.setValues(DebugValues::TYPE::ERROR_ACC_FILTERED, m_lpf_acc_error->getValue());
868+
869+
const double acc_cmd = raw_ctrl_cmd.acc - m_lpf_acc_error->getValue() * m_acc_feedback_gain;
870+
m_debug_values.setValues(DebugValues::TYPE::ACC_CMD_ACC_FB_APPLIED, acc_cmd);
871+
RCLCPP_DEBUG(
872+
logger_,
873+
"[acc feedback]: raw_ctrl_cmd.acc: %1.3f, control_data.current_motion.acc: %1.3f, acc_cmd: "
874+
"%1.3f",
875+
raw_ctrl_cmd.acc, control_data.current_motion.acc, acc_cmd);
876+
845877
ctrl_cmd_as_pedal_pos.acc =
846-
applySlopeCompensation(raw_ctrl_cmd.acc, control_data.slope_angle, control_data.shift);
878+
applySlopeCompensation(acc_cmd, control_data.slope_angle, control_data.shift);
847879
m_debug_values.setValues(DebugValues::TYPE::ACC_CMD_SLOPE_APPLIED, ctrl_cmd_as_pedal_pos.acc);
848880
ctrl_cmd_as_pedal_pos.vel = raw_ctrl_cmd.vel;
849881
}

0 commit comments

Comments
 (0)