std::enable_if
是 C++
中的一种 SFINAE
(Substitution Failure Is Not An Error)工具,用于在模板中启用或禁用某些函数或类的特化。它通常用于条件编译,允许我们根据模板参数的某些特性(如类型是否满足某些条件)来选择性地启用或禁用某些代码。
Open3D显示点云 一片空白
第一次使用Open3D 0.18.0,发现pcd点云显示有问题
1 | import open3d as o3d |
1 | Jupyter environment detected. Enabling Open3D WebVisualizer. |
弹出来的窗口一片空白,也没有任何报错
使用vscode在docker容器里调试python代码
linux 使用sed全局搜索关键字替换
流编辑器 Sed
sed
是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed
命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed
主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
PointCloud 和 PCLPointCloud2 的区别
PCL
中有两种表示点云的数据结构,分别为 PointCloud<PointT>
和 PCLPointCloud2
。官方注释中常称为 a pcl::PointCloud<T> object
以及 a PCLPointCloud2 binary data blob
。
两者的最大区别是储存数据的方式:
PointCloud<PointT>
为模板类,其中指定了每个点的数据类型PointT
, 独立储存每个点的数据。这种存储方式使得数据非常清晰,可以很方便地对某一个点或是某个点的某一字段进行访问,但无法选择存储或删除某一字段。1
2
3
4
5
6template <typename PointT>
class PointCloud {
public:
std::vector<PointT, Eigen::aligned_allocator<PointT>> points;
...
};
PCLPointCloud2
则没有指定点的数据类型,而是在fields
里记录每个点中有哪些字段(比如rgba
,x
,normal_x
等),并以std::uint8_t
将它们按顺序连续存储。这种存储方式理论上更通用,能够存储各种类型的点云数据,而不仅是PCL
中定义好的常见格式;可以灵活地对数据进行直接处理,选择存储或删除某一字段;当然也使得数据变得不太直观。1
2
3
4
5
6struct PCLPointCloud2{
std::vector<::pcl::PCLPointField> fields;
uindex_t point_step = 0;
std::vector<std::uint8_t> data;
...
};
使用PCL的滤波时遇到 double free or corruption
在调用 StatisticalOutlierRemoval
时遇到 double free or corruption
我在 PCL
源代码中加入了一些log,具体如下:
1 | 2: [INFO]1712543988.313661216: filter - CropBox |
linux 比较两个目录的区别
查看两个目录的结构
1 | $ tree test_a/ test_b/ |
1 | test_a/ |
使用 diff 逐行比较
1 | $ diff -aur test_a/ test_b/ |
1 | Only in test_b/: test_b.txt |
PCL-1.12.1点云显示segfaults的解决办法
使用 pcl-tools 1.12.1
显示点云后出现 segmentation fault
使用 libpcl-dev-1.12.1
显示点云后显示一大串关于 vtk
的警告且最后出现 sgmentation fault
1 | 2024-03-27 07:06:36.626 ( 1.903s) [ 1B11AC80]vtkOpenGLPolyDataMapper:328 WARN| vtkOpenGLPolyDataMapper::SetGeometryShaderCode was deprecated for VTK 9.0 and will be removed in a future version. Use vtkOpenGLShaderProperty::SetGeometryShaderCode instead. |
通过miniconda安装使用jupyter
安装 miniconda
从 https://docs.anaconda.com/free/miniconda/ 下载对应版本的安装脚本
1 | bash xx.sh |
根据提示安装完成后,重新打开terminal窗口
通过 miniconda
创建单独的环境且安装 jupyter
等需要的包
1 | conda env list |