Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the wp-statistics domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /www/wwwroot/robotattractor/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the jetpack domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /www/wwwroot/robotattractor/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the updraftplus domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /www/wwwroot/robotattractor/wp-includes/functions.php on line 6114
Apollo自动驾驶项目中使用的编程概念 – 机器人家园

  百度开源的Apollo自动驾驶项目主要使用C++实现,下面总结其中使用了哪些编程或者C++概念,方便对自动驾驶有兴趣的同学提前学习,在分析代码时能更快深入。

1 设计模式

  Apollo使用了单例模式和工厂模式。
  单例模式的代表是提供高精地图接口的类HDMapUtil,它是个静态类,在整个项目中只初始化一次,在所有程序中都能访问。
  工厂模式的代表是加载规划子任务的类TaskFactory

2 多线程编程

  Apollo使用了多线程编程的概念,主要用在运行时间比较长或者运行时间不确定的情况。例如,行车规划模块中生成参考线的函数ReferenceLineProvider::GenerateThread,还有泊车规划模块中进行轨迹规划的函数OpenSpaceTrajectoryProvider::GenerateTrajectoryThread
  Apollo使用多线程的方式是对std::async进行封装然后调用,其中的坑初学者要小心。
此外,还要熟悉mutex如何加锁和atomic变量。

3 STL标准模板库

  Apollo大量使用STL标准模板库提供的数据类型,例如vector、list、pair、unordered_map、unordered_set等等,初学者可以多多练习,因为你会经常和它们打交道。
与之相关的还有泛型编程,其中使用了std::copystd::sortstd::back_inserter

4 lamda表达式

  lamda表达式能让程序更简洁,例如这个比较大小的函数:
auto xminmax = std::minmax_element(boundary_points.begin(), boundary_points.end(), [](const Vec2d &a, const Vec2d &b) { return a.x() < b.x(); });

5 智能指针

  Apollo中使用了很多智能指针。当然,读者应该首先学习原始指针和引用。

6 序列化

  Apollo诞生自ROS,ROS采用自己实现的序列化方法。青出于蓝而胜于蓝,Apollo采用了google提出的protobuf序列化工具实现不同模块间消息的传递。此外,protobuf也被用在配置定义和模块内部的数据传递上。当然,不管多么复杂的消息,经过protobuf序列化得到的始终一串字符串,所以用ROS也可以发送接收,只不过解析还是要用protobuf提供的接口。

7 时间

  Apollo虽然是在Linux上设计的,但是使用了与操作系统无关的std::chrono库实现计时等功能。

总结

  虽然C++是世界上最难的编程语言,但Apollo项目没有使用过于复杂难懂的C++编程技巧,大多数都是基本功,所以初学者不要害怕。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注