zoukankan      html  css  js  c++  java
  • [LiDAR数据模拟]系列(2) HELIOS的TLS点云模拟流程

    关键词:地基激光雷达 点云模拟 XML文件 作者:李二 日期:07/05/2020 - 08/05/2020

    我目前仅仅使用了TLS模式进行模拟,所以先讲一下TLS的模拟经验。
    ALS和MLS的模拟,以后肯定也会做一下
    

    1. 明确模拟数据需求

    在正式模拟自己的数据之前,一定要明确好自己的模拟数据需求,毕竟一次TLS的模拟耗时挺长的(在尽可能贴近野外测量参数设置条件下)。

    比如我这里要做森林样方的TLS点云模拟,目的是评估不同的布站模式 scan design的数据获取质量以及对树木参数计算的影响,因此需求尽可能逼近野外TLS测量时的扫描器参数设置、森林样方树木情况。

    针对森林样方场景:根据一些现有的实测森林样方树木位置、胸径、树高等信息,通过某些树木三维模型构建软件(例如 OnyxTree)来建立树木OBJ模型文件。

    • 为求逼近野外样方,可制作多个不同大小和树种的树木模型。
    • 一种稍微讨巧的方法是,对一棵树进行缩放变换(在输入文件中设置),以得到不同胸径树高的模型。

    针对扫描器参数:根据所需scanner系统,在HELIOS的库中选择(比如下面的例子)或者自定义扫描器(参照所想模拟的扫描器的配置specification即可),这些一般不用关心。需要重点关心的是一些具体的扫描参数设置configuration

    • TLS的位置
    • 天顶扫描范围zenith和方位扫描范围azimuth
    • 扫描角度分辨率或者角度步长 angular resolution

    2. 规划输入文件

    令HELIOS模拟,则必须告诉其用户定义的场景是什么样的,激光扫描器是什么样的,搭载在什么平台上,在哪里扫描以及扫描范围与分辨率等。

    HELIOS是通过XML文件的形式进行输入数据管理的。下图则展示了HELIOS所需要的输入文件以及功能,还有各文件之间的关联。

    HELIOS的XML输入文件以及之间的关联
    HELIOS的XML输入文件以及之间的关联

    2.1. scene xml文件

    第一步是设定场景:我们以森林样方为例,HELIOS的场景XML文件可以设定地形以及地表每棵树的obj文件以及坐标变换(旋转平移缩放):

    地形设置:平地条件下,可以采用默认的groundplane.obj而无需修改。有地形条件下,可以采用地形的obj文件(<filter type="objloader">)或者GeoTIFF文件(如上一期所述,会自动转换为三角面片,<filter type="geotiffloader(作者未给出例子,需要确认,mark一下))。HELIOS也支持对地形进行缩放(xml文件中filter元素下的scale属性) 地形设置-平坦地表

    树木模型设置:我们需要指定样方中每一棵树的obj模型文件路径,这与地形设置时是类似的。需要注意的是:obj模型的轴方向与我们常见的并不相同,需要事先用cloudcompare调整好方向。不过也可以不事先调整,设置pitch属性也没问题。 用cloudcompare调整obj文件的方位 小注:我建议事先调整一下,否则在rotate参数设置时不太直观,可参考我的提问

    树木坐标变换:为了制作看上去更为真实的森林样方,我们可以对树木模型的尺寸、倾角、位置等进行变换。

    • 通过scale调整模型的大小(DART可以分别调整三个轴的缩放比例,但HELIOS只能统一调整)
    • 通过translate调整树木的三维位置。注意,当平台地表时,;当有地形时,需要根据地形进行调整
    • 通过rotate调整树木的旋转。包含yaw, pitch, roll,这与通常的转角定义与范围是一致的。当需要直立树木时,则(注意这是在obj文件方向调整之后的设置)。当需要倾斜树木时,则树木设置
    树木坐标变换后看起来更为真实
    树木坐标变换后看起来更为真实

    具体的设置方式可以根据xml文件的树结构形式,自行设定。这里我提供了一个MATLAB脚本文件,可以自动化批量设置。

    场景xml文件的树结构
    场景xml文件的树结构

    2.2. scanner xml文件

    第二步是设定扫描器: 扫描器的xml文件一般不需要我们额外设置,直接指定一个扫描器即可,如Riegl VZ-400。HELIOS提供了脉冲式和相位式两种类型激光扫描器可供选择。注意,不要修改库中已有的参数。

    Riegl VZ-400 地基LIDAR的部分参数
    Riegl VZ-400 地基LIDAR的部分参数

    如果确有需要设定其他型号的传感器,可以在xml文件中仿照已有参数自定义。

    2.3. platform xml文件

    第三步是设定平台:我们也不需要对平台进行额外设置,选择自己所采用的平台即可,比如地基平台就选择tripod,无人机平台就选Quadrocopter,千万不要选错了,否则扫描结果就变了。

    TLS的三脚架平台属性,注意z坐标
    TLS的三脚架平台属性,注意z坐标

    需要注意,这里已然设定的平台的高度为1.5 m了,因此在后面的survey文件中设定扫描器位置与高度时,需要减去这个1.5 m。比如如果想设置扫描器高度为1.7 m,则survey文件中

    (小注:目前HELIOS在平台高度设置这里有个小bug,解决方法任何情况下都设置onGround = false即可)

    2.4. survey xml文件

    第四步是设定测量文件:survey文件中需要指定场景、平台、扫描器,以及TLS的位置(或ULS的航点)与扫描configuration。

    扫描范围与分辨率设置

    • headRotateStart_degheadRotateStop_deg设置方位方向的扫描范围,取值范围0~360°
    • scanAngle_deg设置天顶方向的扫描范围,取值0~90°,FOV = 2 * scanAngle_deg
    • pulseFreq_hz设置脉冲频率,需要参考真实扫描器的参数,不要随意修改
    • scanFreq_hz设置扫描线频率,取值范围参考canners_tls.xml文件,扫描分辨率主要通过该参数进行调整 扫描参数示意图
    • 扫描分辨率计算公式
    • 方位分辨率=headRotatePerSec_deg / scanFreq_hz。例如:2º/s / 50Hz = 0.04º
    • 天顶分辨率=2 x scanAngle_deg x scanFreq_hz / pulseFreq_hz。例如:2 x 40º x 50Hz / 100000Hz = 0.04º
    • 小注:如想修改分辨率,在扫描范围保持不变的情况下,修改scanFreq_hz

    具体的设置方式可以根据xml文件的树结构形式(下图),自行设定。

    survey xml文件的树结构
    survey xml文件的树结构

    这里我提供了一个MATLAB脚本文件,可以自动化批量设置survey xml文件。

    自动化生成scene.xml和survey.xml的MATLAB脚本
    自动化生成scene.xml和survey.xml的MATLAB脚本

    3. 执行模拟

    在开始模拟之前,首先要确保输入文件路径设置正确。HELIOS推荐将survey.xml,scene.xml,*.obj等文件分开存储。

    输入文件路径确保正确
    输入文件路径确保正确

    一定要安装JAVA JDK才能运行哦,一些新电脑没有安装,请下载

    可视化模式

    打开命令行窗口,修改至helios的目录下:

    cd H:linyuan_work6_TLS station placement_UAV guidehelioshelios_precompiled
    

    执行代码:

    java -jar helios.jar data/surveys/survey_tls_forest_plot.xml 
    

    建议先在可视化模式下打开一次,确保场景与模拟参数设置正确,然后再用批量模式,毕竟批量模式稍微快一点。

    可视化窗口下有一点是需要注意的,无法通过鼠标拖动实现平移功能,因为HELIOS始终设定扫描器在窗口的中心,如果想平移可见场景部分,则可以通过移动扫描器位置来实现。

    批量模式

    执行代码:

    java -jar helios.jar data/surveys/survey_tls_forest_plot.xml headless
    

    4. 模拟结果查看

    模拟结果分为.xyz点云文件和.xyzfullwave.txt波形文件。TLS情况下,波形文件一般不需要,可以删除。

    在cloudcompare中查看模拟的点云,漂亮!

    模拟的四个TLS扫描站点云的合并
    模拟的四个TLS扫描站点云的合并

    .xyz点云文件内的字段属性包含:x,y,z,intensity 强度值ECHO_WIDTH 回波宽度RN 回波次数,NR,FWF_ID 波形idOBJ_ID objecte文件idCLASS

    X Y Z Intensity ECHO_WIDTH RN NOR FWF_ID OBJ_ID CLASS
    
    点云文件中各字段属性值示例
    点云文件中各字段属性值示例

    小注:HELIOS的GitHub wiki 中对CLASS的描述似乎和OBJ_ID混淆了。

    比如在cloudcompare以OBJ_IDscalar field,进行色彩化,可对每棵树赋予不同色彩,进而可以分割出来。

    每棵树显示为不同的颜色
    每棵树显示为不同的颜色

    5. 后记

    我在考虑现在的模拟软件,是否可以输出点的类别属性呢?可能也不会太难实现,比如可以将一棵树分成枝干obj文件和叶片obj文件,二者同时输入模拟软件中,在ray casting时顺便记录三角面片的属性,这样岂不是就可以实现了。

    将单木分为主干、枝干、叶片三个子obj文件输入,以在模拟点云中获取各自obj_id并进行分类
    将单木分为主干、枝干、叶片三个子obj文件输入,以在模拟点云中获取各自obj_id并进行分类

    更新(09/05/2020):恕我愚鲁和粗心,经靳双娜师妹提醒,HELIOS确实可以实现以上功能。不过要求输入的obj模型时把每一类预先区分出来。

  • 相关阅读:
    正则表达式
    JavaIO详解
    Java集合类详解
    Java虚拟机原理图解
    关于Java中按值传递和按引用传递的问题详解
    图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)
    The 70th problem,UVa10396 Vampire Numbers
    二叉树的实现(Java语言描述)
    编程之路
    AngularJS 开发中常犯的10个错误
  • 原文地址:https://www.cnblogs.com/ludwig1860/p/12849887.html
Copyright © 2011-2022 走看看