constexpr是C++11引入的关键字,用于在编译期确定变量、函数或对象的值,从而实现编译期常量计算。随着C++标准的发展,constexpr的用法和功能也不断增强。
1. C++11: constexpr的初步引入
1.1 constexpr变量
用constexpr修饰的变量必须在定义时初始化,且初始化值必须是编译期常量。
ROS 中使用 sensor_msgs::msg::PointCloud2 传输点云数据。开发中会需要对它和其他类型的点云数据进行转换,大部分由 pcl_conversions 提供。
ros msg -> pcl::PCLPointCloud2
1 | #include <pcl/PCLPointCloud2.h> |
第一次使用Open3D 0.18.0,发现pcd点云显示有问题
1 | import open3d as o3d |
1 | Jupyter environment detected. Enabling Open3D WebVisualizer. |
弹出来的窗口一片空白,也没有任何报错
sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
PCL 中有两种表示点云的数据结构,分别为 PointCloud<PointT> 和 PCLPointCloud2。官方注释中常称为 a pcl::PointCloud<T> object 以及 a PCLPointCloud2 binary data blob。
两者的最大区别是储存数据的方式:
PointCloud<PointT> 为模板类,其中指定了每个点的数据类型 PointT, 独立储存每个点的数据。这种存储方式使得数据非常清晰,可以很方便地对某一个点或是某个点的某一字段进行访问,但无法选择存储或删除某一字段。
1 | template <typename PointT> |
PCLPointCloud2 则没有指定点的数据类型,而是在 fields 里记录每个点中有哪些字段(比如 rgba , x , normal_x 等),并以 std::uint8_t 将它们按顺序连续存储。这种存储方式理论上更通用,能够存储各种类型的点云数据,而不仅是 PCL中定义好的常见格式;可以灵活地对数据进行直接处理,选择存储或删除某一字段;当然也使得数据变得不太直观。
1 | struct PCLPointCloud2{ |