## 无人驾驶（自动控制算法模块）--参考apollo

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

1、控制模块代码的位置

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

2、输入和输出内容

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 {
// 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 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

9、模块入口代码

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

ps：

作为计算机系的同学来说，看懂PID问题不大，但是LQR和MPC还是难度不小的。建议大家可以边仿真，边阅读代码。代码逻辑本身不复杂，关键是理解函数调用流程 和 代码公式中每一个参数的意义

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

---------------------