目标
雷达在获取数据时(包括xyz和intensity四个信息),需要动态的将这些数据写入las文件中。
遇到的问题
VScode编译报错
首先上安装依赖库后遇到的编译问题,顺序安装好boost,liblas后,点击Vscode的运行按钮,运行代码,它会报错“Undefined reference:“”xxx””,这其实是动态链接库的问题。可以看看这个老哥最后一段话
但他讲的也不是很清楚,首先,我们要找到我们Liblas的动态链接库的位置,如截图所示。我们需要使用的是“liblas.so"系列家族的动态链接库。
那怎么用呢?
答案是 利用“-l”指令手动g++命令指定
g++ writeLas.cpp -o writeLas -llas
分析一下这段代码,writeLas.cpp代表我们目标c++文件, writeLas代表编译后生成的执行文件。
而 -llas 其实由 两部分 组成一个是“-l”命令,它是去找动态库的命令,另一个是“las” 它代表我们的链接库名称(但是去掉了lib和.so以及后面的内容,这样做的原因我也不清楚),反正只保留文件名称的“las”即可。这两部分内容组成了“-llas”(两者之间没空格!)
- 编译之后再运行,终端输入
./writeLas
这个时候你会看到“undefined”的错误没了,但是另一个输出还存在
The use of BOOST_*_ENDIAN and BOOST_BYTE_ORDER is deprecated.
Please include <boost/predef/other/endian.h> and use
BOOST_ENDIAN_*_BYTE instead
不要管他!! 我一开始以为这也什么报错 其实你抽丝剥茧的去看提到的文件,它归根结底只是一个提示而已,不影响程序运行
写入las的问题
能够顺利编译运行,就要聚焦代码了,之前编译运行,会发现lasView等软件识别不了我生成的las文件。
在Ubuntu上,运行命令
lasinfo /你的las文件地址/你的las文件.las
查看生成的las文件的信息会看到有两个不同寻常之处。
xyz最值范围不对
根据我的代码,我的最大最小值,不是**{2983,-541,83}这一组。并且,也没道理我的最大值和最小值都是他们吧?
这暗示我们,可能写入数据的时候,for循环的位置不对,最后检查一下,确实如此,for循环应该放在 header定义和设置的外面,特别是liblas::Writer writer(ofs,header)** 一定得在for循环外面,不得重复定义(这其实也是一个后面动态写入的一个隐患)
header point Count 和 actual Point Count数目不对
按道理,两者应该相等的。并且,如果你要LasView打开las数据的话,它也会提示“waring end-of-file after xx of xx points”
原因都在于设置点云数量的代码的问题
要么是你没写这个代码,要么是你这个代码位置不对(应该放在for循环之外),要么就是你的number写错了,应该是10个点,你却写了个2。
header.SetPointRecordsCount(10); //设置点数