无人驾驶(自动控制算法模块)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feixiaoxing/article/details/88958972

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

    对于计算机系的同学来说,关于自动驾驶这块最难以理解的部分就是自动控制算法这块。虽然在大学的时候,自己也选修过过程控制和运动控制,甚至也用matlab仿真过传递函数,用单片机实现过由传递函数转换过来的差分方程,但是那些都已经是过去式了。所以对于自动驾驶来说,关于控制这块建议大家多多参考apollo代码。

1、控制模块代码的位置

https://github.com/ApolloAuto/apollo/tree/master/modules/control

2、输入和输出内容

输入为局部路径、车辆状态、车辆位置和终端命令

输出为油门、刹车和转向

一般来说,路径、时间、地点都是决策和规划层设计好的,控制层只要完成这些目标就可以了

扫描二维码关注公众号,回复: 5917307 查看本文章

3、基本控制内容

横向控制

纵向控制

4、横向控制算法

LQR、MPC算法

5、纵向控制算法

PID、MPC算法

6、主要配置文件

https://github.com/ApolloAuto/apollo/blob/master/modules/control/conf/control_conf.pb.txt

7、和其他模块的协议

https://github.com/ApolloAuto/apollo/tree/master/modules/control/proto

最主要的控制命令输出,

// next id : 27
message ControlCommand {
  optional apollo.common.Header header = 1;
  // target throttle in percentage [0, 100]
  optional double throttle = 3;

  // target brake in percentage [0, 100]
  optional double brake = 4;

  // target non-directional steering rate, in percentage of full scale per
  // second [0, 100]
  optional double steering_rate = 6;

  // target steering angle, in percentage of full scale [-100, 100]
  optional double steering_target = 7;

  // parking brake engage. true: engaged
  optional bool parking_brake = 8;

  // target speed, in m/s
  optional double speed = 9;

  // target acceleration in m`s^-2
  optional double acceleration = 10;

  // model reset
  optional bool reset_model = 16 [deprecated = true];
  // engine on/off, true: engine on
  optional bool engine_on_off = 17;
  // completion percentage of trajectory planned in last cycle
  optional double trajectory_fraction = 18;
  optional apollo.canbus.Chassis.DrivingMode driving_mode = 19
      [deprecated = true];
  optional apollo.canbus.Chassis.GearPosition gear_location = 20;

  optional Debug debug = 22;
  optional apollo.common.VehicleSignal signal = 23;
  optional LatencyStats latency_stats = 24;
  optional PadMessage pad_msg = 25;
  optional apollo.common.EngageAdvice engage_advice = 26;
  optional bool is_in_safe_mode = 27 [default = false];

  // deprecated fields
  optional bool left_turn = 13 [deprecated = true];
  optional bool right_turn = 14 [deprecated = true];
  optional bool high_beam = 11 [deprecated = true];
  optional bool low_beam = 12 [deprecated = true];
  optional bool horn = 15 [deprecated = true];
  optional TurnSignal turnsignal = 21 [deprecated = true];
}

8、主要算法代码

https://github.com/ApolloAuto/apollo/tree/master/modules/control/controller

注意,函数入口都是ComputeControlCommand

9、模块入口代码

https://github.com/ApolloAuto/apollo/blob/master/modules/control/control_component.cc

ps:

    作为计算机系的同学来说,看懂PID问题不大,但是LQR和MPC还是难度不小的。建议大家可以边仿真,边阅读代码。代码逻辑本身不复杂,关键是理解函数调用流程和代码公式中每一个参数的意义。同时,车辆控制需要以车辆运动学和车辆动力学作为基础,这方面需要加强学习,前者偏向于几何分析,后者偏向于力学分析。

    除了LQR之外,一般还有一种基于几何的纯跟踪算法,大家也可以看一下,比如这篇博客https://blog.csdn.net/AdamShan/article/details/80555174。当然PID、LQR、MPC都是常用的控制算法,建议大家好好掌握。

    另外关于PID算法,有一篇非常详细的blog,建议大家可以好好关注一下。https://blog.csdn.net/u010312937/article/details/53363831。这篇文章不仅描述了基本的PID算法,还描述了如何对PID算法进行优化和改进,实在是非常难得。

    

猜你喜欢

转载自blog.csdn.net/feixiaoxing/article/details/88958972