大疆DJI Zenmuse L1点云导入contextcapture(iTwin capture)—轨迹文件Sbet转成符合contextcapture要求的trajectories file
- 前言
- 步骤
- 1. 在DJI Terra中导出las格式的点云,然后找到轨迹文件sbet.txt
- 2. 将所有的sbet.txt转成需要的文件样式
- 3. 把点云导入contextcapture(iTwin capture)
前言
点云和航片联合进行倾斜模型建模是笔者的探索方向。
本次实验,笔者使用的软硬件设备如下:
- 硬件:大疆M300 RTL+Zenmuse L1
- 软件:DJI Terra、iTwin capture
在使用L1执行航测任务时,必须开启RTK模式
步骤
1. 在DJI Terra中导出las格式的点云,然后找到轨迹文件sbet.txt
我们只需要前四列数据,时间、纬度、经度、高程
2. 将所有的sbet.txt转成需要的文件样式
在sbet.txt中,前四列原始数据为:SOW(second of week)格式的时、弧度的纬度和经度、高程(L1内部的RTK高)
需要转成:GPStime、度格式的经纬度、高程(无需转换)
转换代码(python):
'''
author: weiguo xie
email: xiewg@jxnu.edu.cn
2023-12-28
'''
import glob
import math
# 定义存储文件夹路径
folder_path = 'path/to/folder' # 定义存储文件夹路径
# file_paths = ['path/to/file1.txt', 'path/to/file2.txt', 'path/to/file3.txt'] # 也可以读取单独的文件
output_file_path = 'output.txt' # 定义输出文件路径
# 获取文件夹下所有的txt文件路径
file_paths = glob.glob(folder_path + '/*.txt')
# 定义转换函数
def radian_to_degree(radian):
return radian * (180 / math.pi)
# 打开输出文件进行写入
with open(output_file_path, 'w') as output_file:
# 遍历每个文件路径
for file_path in file_paths:
# 打开文件进行读取
with open(file_path, 'r') as file:
# 跳过第一行和第二行
next(file) # 跳过第一行
next(file) # 跳过第二行
# 逐行读取剩余的数据
for line in file:
# 分割行数据为列数据
data = line.split()
# 获取第一列的GPStime值
gpstime = float(data[0])
# 进行计算
calculated_gpstime = gpstime + 604800 * 2294
# 获取第二列和第三列的弧度数据
latitude_radian = float(data[1])
longitude_radian = float(data[2])
# 进行转换
latitude_degree = radian_to_degree(latitude_radian)
longitude_degree = radian_to_degree(longitude_radian)
# 获取第四列的数据
height = float(data[3])
# 将计算和转换结果写入输出文件,使用制表符作为分隔符
output_file.write(f"{calculated_gpstime}\t{latitude_degree}\t{longitude_degree}\t{height}\n")
转换结果:
3. 把点云导入contextcapture(iTwin capture)
在Block中,Point Clouds标签下,选择import mobile scans,因为无人机是移动的,所以必须选mobile
- 添加点云和轨迹文件trajectories
- 选择坐标
- 设置分隔符
- 设置数据列属性,然后import即可
- 查看导入结果
在3D view中,黄色是轨迹,蓝色点是航片位置(我事先添加了航片,这个不添加有可以),下方是刚刚添加的点云,不是基于航片生产的点云。