Effective C++ 笔记
Udacity自动驾驶入门课笔记
无人驾驶第一课:从 Apollo 起步
概览
硬件
- 线控驾驶车辆:可通过电子控制的基础车辆,而不仅仅用过实体方向盘、油门踏板、刹车踏板来控制。
- 控制器区域网络 (CAN) : 车辆的内部通信网络。计算机系统通过CAN卡连接汽车内部网络,发送加速、制动和转向信号。
- 全球定位系统 (GPS) : 通过绕地卫星接收信号,帮助我们确定所处位置信息。
- 惯性测量装置 (IMU, Inertial Measurement Unit) : 通过跟踪位置、速度、加速度和其他因素,测量车辆的运动和位置。
- 激光雷达 (LiDAR) : 由一组脉冲激光器组成,可360度扫描车辆周围,这些激光束的反射形成了可用于了解环境的点云。可用于检测障碍物和检测其他车辆的速度,分辨率低,但成本低且不受天气和照明条件影响。
- 摄像头捕获图像数据,可使用计算机视觉来了解周围环境,例如检测交通灯。
OpenCV Mat像素的遍历方法
OpenCV像素遍历常用的几种方法
以从 organized 的点云提取 RGB 信息为例
动态地址at
基于Mat对象的随机像素访问 API 实现,通过行列索引方式遍历每个像素值。这种方法速度较慢,不太适合用于像素遍历。
1 | void extract_1(const pcl::PointCloud<PointT>::Ptr cloud, cv::Mat &image) |
C++ 类构造函数
构造函数
类的构造函数是类的一种特殊的成员函数,用于创建类的新对象和初始化自定义类成员。
- 构造函数具有与类相同的名称,没有返回值,也不返回
void。 - 可以根据需要定义多个重载构造函数,以各种方式自定义初始化。
- 构造函数可用于为某些成员变量设置初始值。
- 通常构造函数具有公共可访问性,因此外部代码可以调用其创建类的对象,但也可以将构造函数声明为 protected 或 private 。
- 构造函数可以声明为
inline,explicit,friend或constexpr - 构造函数可以初始化已声明为
const,volatile或者const volatile的对象,该对象在构造完成后变为const - 如果没有自己声明,编译器将为一个类声明 (编译器版本的) 默认构造函数、复制构造函数、复制赋值操作符和析构函数。所有这些函数都是
public且inline的。
C++ push_back和emplace_back的区别
push_back()向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素)。而
emplace_back()在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
事实上,大多数情况下二者没有区别,只有在少数情况下 emplace_back() 效率更高。主要是 emplace_back() 支持 in-place construction 。
C++ 强制类型转换
C++ std::vector的内存分配机制
C++并发编程:std::future的使用
std::future 是C++11 的一个模板类,提供了一种用于访问异步操作结果的机制。可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段。
设想这样的情况,你希望一个线程进行工作A,同时你在做一些其他的工作,你希望在某个特定的时间获取那个工作A的结果。在c++11,这个可以轻松被 std::future 实现。而由于它是一个模板类,可以返回任何类型的结果。
C++并发编程:条件变量std::condition_variable的使用
std::condition_variable 是 C++11 多线程编程中的条件变量。
一般用法: 线程 A 等待某个条件并挂起,直到线程 B 设置了这个条件,并通知条件变量,然后线程 A 被唤醒。