0%

让自己习惯C++

1. 视C++为一个语言联邦

C++是从四个次语言组成的联邦政府,每个次语言都有自己的规则。

  • C:C++的基础
  • Object-Oriented C++:面向对象设计,类/封装/继承/多态/virtual函数等
  • Template C++:范型编程/模版元编程
  • STL:容器/迭代器/算法/函数对象
阅读全文 »

无人驾驶第一课:从 Apollo 起步

udacity课程链接

概览

硬件

  • 线控驾驶车辆:可通过电子控制的基础车辆,而不仅仅用过实体方向盘、油门踏板、刹车踏板来控制。
  • 控制器区域网络 (CAN) : 车辆的内部通信网络。计算机系统通过CAN卡连接汽车内部网络,发送加速、制动和转向信号。
  • 全球定位系统 (GPS) : 通过绕地卫星接收信号,帮助我们确定所处位置信息。
  • 惯性测量装置 (IMU, Inertial Measurement Unit) : 通过跟踪位置、速度、加速度和其他因素,测量车辆的运动和位置。
  • 激光雷达 (LiDAR) : 由一组脉冲激光器组成,可360度扫描车辆周围,这些激光束的反射形成了可用于了解环境的点云。可用于检测障碍物和检测其他车辆的速度,分辨率低,但成本低且不受天气和照明条件影响。
  • 摄像头捕获图像数据,可使用计算机视觉来了解周围环境,例如检测交通灯。
阅读全文 »

OpenCV像素遍历常用的几种方法

以从 organized 的点云提取 RGB 信息为例

动态地址at

基于Mat对象的随机像素访问 API 实现,通过行列索引方式遍历每个像素值。这种方法速度较慢,不太适合用于像素遍历。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void extract_1(const pcl::PointCloud<PointT>::Ptr cloud, cv::Mat &image)
{
auto &cloud_height = cloud->height;
auto &cloud_width = cloud->width;

image = cv::Mat(cv::Size(cloud_width, cloud_height), CV_8UC3);

#pragma omp parallel for
for (size_t row = 0; row < cloud_height; row++)
{
for (size_t col = 0; col < cloud_width; col++)
{
auto index = row * cloud_width + col;
const auto &pt = cloud->points[index];

image.at<cv::Vec3b>(row, col)[0] = pt.b;
image.at<cv::Vec3b>(row, col)[1] = pt.g;
image.at<cv::Vec3b>(row, col)[2] = pt.r;
}
}
}
阅读全文 »

构造函数

类的构造函数是类的一种特殊的成员函数,用于创建类的新对象和初始化自定义类成员。

  • 构造函数具有与类相同的名称,没有返回值,也不返回 void
  • 可以根据需要定义多个重载构造函数,以各种方式自定义初始化。
  • 构造函数可用于为某些成员变量设置初始值。
  • 通常构造函数具有公共可访问性,因此外部代码可以调用其创建类的对象,但也可以将构造函数声明为 protectedprivate
  • 构造函数可以声明为 inline, explicit, friendconstexpr
  • 构造函数可以初始化已声明为 const, volatile 或者const volatile 的对象,该对象在构造完成后变为 const
  • 如果没有自己声明,编译器将为一个类声明 (编译器版本的) 默认构造函数、复制构造函数、复制赋值操作符和析构函数。所有这些函数都是 publicinline 的。
阅读全文 »

push_back()向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素)。

emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。

事实上,大多数情况下二者没有区别,只有在少数情况下 emplace_back() 效率更高。主要是 emplace_back() 支持 in-place construction

阅读全文 »

相比于C风格的强制类型转换,C++新增了关键字 static_castdynamic_castconst_castreinterpret_cast ,用于强制类型转换。

新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。

1. static_cast

用于非多态类型转换 (静态转换),任何标准转换都可以用它,但是不能用于两个不相关的类型转换。与C旧式转型基本相同。

阅读全文 »

template < class T, class Alloc = allocator<T> > class vector;

std::vector 简介

std::vector 是C++标准库里封装好的动态大小数组的顺序容器,能够存放各种类型的对象。

与数组 array 一样, vector内存空间的地址是连续的。这意味着可以通过下标索引的方式获取到对应的元素,所以访问其元素的效率非常高,从其末端添加或删除元素的效率也相对较高。而对于涉及在非结束位置插入或删除元素的操作,它们的性能比其他操作差,效率较低。

阅读全文 »

std::future 是C++11 的一个模板类,提供了一种用于访问异步操作结果的机制。可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段。

设想这样的情况,你希望一个线程进行工作A,同时你在做一些其他的工作,你希望在某个特定的时间获取那个工作A的结果。在c++11,这个可以轻松被 std::future 实现。而由于它是一个模板类,可以返回任何类型的结果。

阅读全文 »