百度Apollo 中纵向控制源码解析

严正声明:本文系作者yue597215286原创,未经允许,严禁转载!


    上篇博文中,我们主要介绍了control模块的入口和车辆横向控制的介绍,有兴趣的可以参考链接Apollo control 模块源码解析

    此篇博文,我们主要介绍下Apollo内部的纵向控制代码和原理解析:

    话不多少,首先我们需要看的源代码为modules/control/controller/lon_controller.h和lon_controller.cc 在Apollo control 模块源码解析中我们得知,controller的先后顺序是 Init()函数和ComputeControlCommand()函数。即在modules/control/control.cc中Control::Init()

  // set controller 
  if (!controller_agent_.Init(&control_conf_).ok()) {
    std::string error_msg = "Control init controller failed! Stopping...";
    buffer.ERROR(error_msg);
    return Status(ErrorCode::CONTROL_INIT_ERROR, error_msg);
  }
Status Control::ProduceControlCommand(ControlCommand *control_command) {
...
Status status_compute = controller_agent_.ComputeControlCommand(
        &localization_, &chassis_, &trajectory_, control_command);
...
}

    让我们从lon_controller.cc 的Init()函数一窥究竟:

Status LonController::Init(const ControlConf *control_conf) {
  control_conf_ = control_conf;
  if (control_conf_ == nullptr) {
    controller_initialized_ = false;
    AERROR << "get_longitudinal_param() nullptr";
    return Status(ErrorCode::CONTROL_INIT_ERROR,
                  "Failed to load LonController conf");
  }
  const LonControllerConf &lon_controller_conf =
      control_conf_->lon_controller_conf();

  station_pid_controller_.Init(lon_controller_conf.station_pid_conf());
  speed_pid_controller_.Init(lon_controller_conf.low_speed_pid_conf());

  SetDigitalFilterPitchAngle(lon_controller_conf);

  LoadControlCalibrationTable(lon_controller_conf);
  controller_initialized_ = true;

  return Status::OK();
}

在这里面,主要对conf文件的导入和两个PID控制器(station_pid_controller_和speed_pid_controller_)的初始化,还有对根据conf文件数字滤波器和标定表进行设置。PID的控制,是目前Apollo作用于纵向速度控制的主要方式,Apollo的PID控制器逻辑相对简单些,具体的代码存放在modules/control/common/pid_controller.cc中,可以查看相关的代码,下面我用一张简图将内部PID的逻辑描述下:


  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值