一、下载WHU-TLS Tunnel数据集
数据集可通过benchmark-时空数据智能获取技术与应用教育部工程中心提交表单获得链接进行下载,我选取了需要的(K)WHU-TLS Tunnel数据集,大家可以按需下载。其数据格式为.las,相关的配置以及在上一篇有写过,这里就不赘述了。
二、数据集完整
(一)列出所有的.las文件
确认 WHU-TLS Tunnel 数据集是否完整,并且所有相关的 LAS 文件都可以被 libLAS 正确读取。在home下打开一个terminal运行下列命令:
find ~/catkin_ws/src/LIO-SAM/lio_sam_datasets/ -name '*.las'
下图所示, 表明.
las文件确实存在/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel目录下的两个子目录 RawPointCloud和 AlignedPointCloud中。
(二)检查libLAS安装
确认libLAS是否已安装,如已安装,它将返回版本号,我的显示的版本号是1.8.1
liblas-config --version
(三)逐一检查.las文件
对于find找到的文件,使用lasinfo命令来检查文件的头部信息
lasinfo -h /path/to/each/lasfile.las /path/to/each/lasfile为实际路径
由于我们需要检查的.las文件较多,使用一个shell循环来对每个文件执行lasinfo命令,使用shell循环的好处是避免手动输入每个文件路径,将下面的脚本在home目录的终端下打开运行
for lasfile in ~/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/*/*; do
if [[ -f "$lasfile" && $lasfile == *.las ]]; then
echo "Checking file: $lasfile"
lasinfo -h "$lasfile"
if [ $? -ne 0 ]; then
echo "Error reading file: $lasfile"
fi
fi
done
运行脚本以后出现以下错误,运行lasinfo时系统无法找到liblas.so.3共享库文件,原因是库文件没有放置在标准的系统库路径中,或者LD_LIBRARY_PATH环境变量没有包含该库文件的目录。
使用find命令搜索liblas.so.3文件的位置
find / -name "liblas.so.3" 2>/dev/null
查询到liblas.so.3文件有两个路径,位于/home/slam/catkin_ws/devel/libLAS-1.8.1/bin/Release和/usr/local/lib/目录下,经过尝试发现我们需要的是后者。接下来打开home终端,使用vim编辑器编辑.bashrc文件,在文档最后加上以下内容
经过学习可知,/home/slam/catkin_ws/devel/libLAS-1.8.1/bin/Release目录下的liblas.so.3文件是因为我们编译后产生的和,usr/local/lib/才是我们实际安装libLAS库的实际路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
修改了.bashrc文件以后,运行source ~/.bashrc使更改生效运行
find / -name "liblas.so.3"
出现:
此时虽然出现一些Permission denied错误,但是find命令已经找到liblas.so.3文件并更新了LD_LIBRARY_PATH环境变量,这里我使用了sudo find显示第一个路径的Permission denied,第二个路径的是正常的,表示我们的操作是正确的。
三、数据集格式转换
PDAL(Point Data Abstraction Library)是一个用于处理点云数据的库,可以读取和写入多种数据格式的点云文件,可以使用PDAL来转换.las文件到XYZI格式
(一)安装PDAL
检查默认仓库里是否存在需要的PDAL,若不存在需要添加PDAL的官方APT仓库,打开终端,使用apt search命令搜索PDAL
apt search pdal
使用上述命令后,系统列出相关的软件包 ,其中:
libpdal-base5:PDAL的基础库
libpdal-dev:PDAL的开发文件
libpdal-plugin-XXX:各种PDAL插件
libpdal-util5:PDAL的实用工具库
pdal:PDAL的主程序
pdal-doc:PDAL的文档
python-pdal:PDAL的Python2扩展
更新包列表,确保安装的是最新版本的软件包
sudo apt update
更新完毕以后开始安装PDAL,使用以下命令:
sudo apt install pdal
安装成功的部分截图如下
检查软件包状态:使用dpkg命令检查PDAL是否安装成功
pdal --version
安装成功则会显示PDAL的版本和状态:
(二) 使用PDAL进行数据转换(.las数据格式转换成XYZI格式)
使用which命令,可以返回PDAL可执行文件的路径
which pdal
再使用echo命令打印PATH环境变量的内容,判断PDAL是否存在于系统的PATH环境变量中
echo $PATH
查询出来PDAL并未包含在PATH环境变量中,使用以下命令将其添加到环境变量中
export PATH=/usr/bin:$PATH
重新使用echo命令查询显示PDAL命令已经存在于PATH中
接下来,让我们开始进行数据转换!
使用find命令搜索需要转换的.las文件路径
find . -name '*.las'
创建JSON格式的批处理pipeline文件,需要注意的是这里需要先创建一个子目录来存放JSON文件(尝试直接创建JSON文件出现无法写入或者写入无法保存的情况)
mkdir -p /catkin_ws/src/LIO-SAM/lio_sam_datasets/scripts
使用上述命令创建子目录失败,显示Permission denied——意味着当前用户账号没有足够权限,使用sudo命令运行成功,我们使用ls命令来列出目录内容来检查scripts目录是否创建成功
ls -l /catkin_ws/src/LIO-SAM/lio_sam_datasets
表示子目录创建成功,接下来创建JSON格式
sudo vim /catkin_ws/src/LIO-SAM/lio_sam_datasets/scripts/las_to_xyzi_pipeline.json
pipeline文件内容如下:
"pipelines": [
{
"name": "LAS to XYZI Conversion Pipeline",
"readers": {
"las": {
"filenames": [
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/2.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/5.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/4.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/3.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/6.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/1.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/7.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/4.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/1-reg.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/6-reg.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/7-reg.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/2-reg.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/5-reg.las",
"/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/3-reg.las"
]
}
},
"writers": {
"xyzi": {
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud"
}
}
}
]
}
用vim编辑器写入后保存退出。
检查JSON文件是否创建成功,使用ls命令进行检查
ls -l /catkin_ws/src/LIO-SAM/lio_sam_datasets/scripts
创建成功,输出中可以看到创建的JSON文件
查看文件内容是否写入成功,使用cat命令查看JSON文件的内容,确保包含了正确的PDAL pipeline定义
cat /catkin_ws/src/LIO-SAM/lio_sam_datasets/scripts/las_to_xyzi_pipeline.json
显示的JSON文件内容跟上述pipeline内容代码一致。
在命令行中输入以下命令:
pdal pipeline /catkin_ws/src/LIO-SAM/lio_sam_datasets/scripts/las_to_xyzi_pipeline.json
显示PDAL:Couldn't create writer stage of type 'writer.xyzi',表明PDAL找不到名为writer.xyzi
的写入器类型,修改JSON文件内容如下
{
"pipeline": [
{
"type": "readers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/2.las"
},
{
"type": "writers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/2-xyzi.las",
"storage": "xyz"
},
{
"type": "readers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/5.las"
},
{
"type": "writers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/5-xyzi.las",
"storage": "xyz"
},
{
"type": "readers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/4.las"
},
{
"type": "writers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/4-xyzi.las",
"storage": "xyz"
},
{
"type": "readers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/3.las"
},
{
"type": "writers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/3-xyzi.las",
"storage": "xyz"
},
{
"type": "readers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/6.las"
},
{
"type": "writers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/6-xyzi.las",
"storage": "xyz"
},
{
"type": "readers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/7-reg.las"
},
{
"type": "writers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/7-reg-xyzi.las",
"storage": "xyz"
},
{
"type": "readers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/2-reg.las"
},
{
"type": "writers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/2-reg-xyzi.las",
"storage": "xyz"
},
{
"type": "readers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/5-reg.las"
},
{
"type": "writers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/5-reg-xyzi.las",
"storage": "xyz"
},
{
"type": "readers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/3-reg.las"
},
{
"type": "writers.las",
"filename": "/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/3-reg-xyzi.las",
"storage": "xyz"
}
]
}
再次运行pdal pipeline命令,显示
原因可能是3-reg.las文件在指定的路径下并不存在,但是打开文件夹查看发现文件是存在的,使用ls命令显示找不到此文件,但使用find命令搜索该文件能够找到——可能是文件系统可能存在延迟写入的情况导致ls无法立即看到新创建或者最近修改的文件,而find文件不会受此影响
ls -l /catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/3-reg.las
find / -name "3-reg.las"
使用find命令命令查找到的3-reg.las文件如下所示,其中第一个是我们所需要的
再次运行pdal pipeline命令显示
表示在JSON文件中writers.las部分有一个不被期望的参数storage,将代码移除storage参数重新写入JSON文件并保存,移除storage参数后的代码如下所示:
{
"pipeline": [
{
"type": "readers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/2.las"
},
{
"type": "writers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/2-xyzi.las"
},
{
"type": "readers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/5.las"
},
{
"type": "writers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/5-xyzi.las"
},
{
"type": "readers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/4.las"
},
{
"type": "writers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/4-xyzi.las"
},
{
"type": "readers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/3.las"
},
{
"type": "writers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/3-xyzi.las"
},
{
"type": "readers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/RawPointCloud/6.las"
},
{
"type": "writers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/6-xyzi.las"
},
{
"type": "readers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/7-reg.las"
},
{
"type": "writers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/7-reg-xyzi.las"
},
{
"type": "readers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/2-reg.las"
},
{
"type": "writers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/2-reg-xyzi.las"
},
{
"type": "readers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/5-reg.las"
},
{
"type": "writers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/5-reg-xyzi.las"
},
{
"type": "readers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/AlignedPointCloud/3-reg.las"
},
{
"type": "writers.las",
"filename": "/home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/3-reg-xyzi.las"
}
]
}
再次运行pdal pipeline命令出现新的问题如下所示:
经查询,可能是权限不够/创建的目录不存在/使用绝对路径的问题,尝试创建目录:
mkdir -p /home/slam/catkin_ws/src/LIO-SAM/lio_sam_datasets/Tunnel/ConvertedPointCloud/
再次运行pdal pipeline命令没有报错,进入ConvertedPointCloud文件夹查看发现.las文件到XYZI的新文件已存在。至此,数据集的准备工作已经完成!