[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所需要的输入文件以及功能,还有各文件之间的关联。

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属性也没问题。
小注:我建议事先调整一下,否则在rotate参数设置时不太直观,可参考我的提问。树木坐标变换:为了制作看上去更为真实的森林样方,我们可以对树木模型的尺寸、倾角、位置等进行变换。
通过 scale调整模型的大小(DART可以分别调整三个轴的缩放比例,但HELIOS只能统一调整)通过 translate调整树木的三维位置。注意,当平台地表时,;当有地形时,需要根据地形进行调整通过 rotate调整树木的旋转。包含yaw,pitch,roll,这与通常的转角定义与范围是一致的。当需要直立树木时,则(注意这是在obj文件方向调整之后的设置)。当需要倾斜树木时,则。

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

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

如果确有需要设定其他型号的传感器,可以在xml文件中仿照已有参数自定义。
2.3. platform xml文件
第三步是设定平台:我们也不需要对平台进行额外设置,选择自己所采用的平台即可,比如地基平台就选择
tripod,无人机平台就选Quadrocopter,千万不要选错了,否则扫描结果就变了。

需要注意,这里已然设定的平台的高度为1.5 m了,因此在后面的survey文件中设定扫描器位置与高度时,需要减去这个1.5 m。比如如果想设置扫描器高度为1.7 m,则survey文件中。
(小注:目前HELIOS在平台高度设置这里有个小bug,解决方法任何情况下都设置onGround = false即可)
2.4. survey xml文件
第四步是设定测量文件:survey文件中需要指定场景、平台、扫描器,以及TLS的位置(或ULS的航点)与扫描configuration。
扫描范围与分辨率设置
headRotateStart_deg和headRotateStop_deg设置方位方向的扫描范围,取值范围0~360°scanAngle_deg设置天顶方向的扫描范围,取值0~90°,FOV = 2 * scanAngle_degpulseFreq_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文件的树结构形式(下图),自行设定。

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

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

一定要安装JAVA JDK才能运行哦,一些新电脑没有安装,请下载。
可视化模式
打开命令行窗口,修改至helios的目录下:
cd H:\linyuan_work\06_TLS station placement_UAV guide\helios\helios_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中查看模拟的点云,漂亮!

.xyz点云文件内的字段属性包含:x,y,z,intensity 强度值,ECHO_WIDTH 回波宽度,RN 回波次数,NR,FWF_ID 波形id,OBJ_ID objecte文件id,CLASS
X Y Z Intensity ECHO_WIDTH RN NOR FWF_ID OBJ_ID CLASS

小注:HELIOS的GitHub wiki 中对CLASS的描述似乎和OBJ_ID混淆了。
比如在cloudcompare以OBJ_ID为scalar field,进行色彩化,可对每棵树赋予不同色彩,进而可以分割出来。

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

更新(09/05/2020):恕我愚鲁和粗心,经靳双娜师妹提醒,HELIOS确实可以实现以上功能。不过要求输入的obj模型时把每一类预先区分出来。
[LiDAR数据模拟]系列(2) HELIOS的TLS点云模拟流程的更多相关文章
- [LiDAR数据模拟]系列(1) HELIOS模拟平台介绍
关键词:LiDAR 激光雷达 点云模拟 作者:李二 日期:06/05/2020 - 07/05/2020 写在前面:我前段时间的一个工作(地基激光雷达TLS的新型布站策略)需要用到模拟的TLS点云数据 ...
- Docker Data Center系列(一)- 快速搭建云原生架构的实践环境
本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...
- C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)
小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)T ...
- TI-Davinci开发系列之二使用CCS5.2TI Simulator模拟环境调试DSP程序
上接博文<TI-Davinci开发系列之一CCS5.2的安装及注意事项>. 如何没有实际的开发板或者仿真器,可以使用CCS自带的TISimulator来学习与熟悉CCS开发调试环境.下面是 ...
- LiDAR、LAS、LAS Dataset与点云
LiDAR Light Detection And Ranging,激光探测及测距,是一种光学遥感技术,使用激光对地球表面的密集采样,产生高精度X.Y.Z测量值. 激光雷达系统的主要硬件组成部分包括一 ...
- 死磕 java线程系列之线程池深入解析——普通任务执行流程
(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了Java中 ...
- 死磕 java线程系列之线程池深入解析——定时任务执行流程
(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:本文基于ScheduledThreadPoolExecutor定时线程池类. 简介 前面我们一起学习了普通 ...
随机推荐
- Codeup 25609 Problem I 习题5-10 分数序列求和
题目描述 有如下分数序列 2/1,3/2,5/3,8/5,13/8,21/13 - 求出次数列的前20项之和. 请将结果的数据类型定义为double类型. 输入 无 输出 小数点后保留6位小数,末尾输 ...
- 03-css3中的3D转换
一.CSS3-3D转换 1.3D 特点:近大远小,物体和面遮挡不可见 1.1三维坐标系 x 轴:水平向右 -- x 轴右边是正值,左边是负值 y 轴:垂直向下 -- y 轴下面是正值,上面是负值 z ...
- 你的网购价格监督利器——python+爬虫+微信机器人
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:风,又奈何 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
- Python程序设计实验报告二:顺序结构程序设计(验证性实验)
安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 崔攀 学号3190505136 成绩 日期 2020.3.22 指导老师 修宇 [实验 ...
- 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享
近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...
- Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId
一.使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿 ...
- [git] github上传项目(使用git)、删除项目、添加协作者
来源:http://www.cnblogs.com/sakurayeah/p/5800424.html (怕链接失败,所以直接就就复制过来啦,感谢作者) 一.注册github账号 github网址ht ...
- [数据库]Mysql蠕虫复制增加数据
将查询出来的数据插入到指定表中,例: 将查询user表数据添加到user表中,数据会成倍增加 insert into user(uname,pwd) select uname,pwd from use ...
- response没有实现跳转,而是提示浏览器下载文件
问题简述: web项目中,response没能实现重定向跳转网页,而是通知浏览器下载文件. 代码如下: response.getWriter().write("<h1 style='c ...
- MySQL 50题练习
表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id ...




