Ubuntu环境下XTF文件成像小程序
1. 介绍
最近花了比较多时间处理xtf格式的侧扫声呐数据,ubuntu下写了一个数据处理的软件。输入为xtf文件路径或xtf文件夹路径。对每个xtf文件有四个输出文件,包括基本信息文件(.json),航迹数据文件(.mat),左舷强度数据文件(.mat),右舷强度数据文件(.mat)。输出文件的信息均为xtf文件记录侧扫输出的原始数据信息。后续可行根据需求利用这些文件做进一步的处理,如斜距校正,灰度校正,几何校正等。另外写了几个python小脚本,主要功能是根据输出的文件绘制简易灰度图和航迹图。
该软件用于分析xtf格式的离线侧扫声纳数据文件。
我们的文件可以在每个xtf文件处理后获得:
-
基本信息(json格式)
-
带有时间戳的轨迹信息(mat格式)
-
左舷数据(mat格式)
-
右舷数据(mat格式)
同时,还有一些简单的python脚本用于进一步处理输出文件,如绘制轨迹图像、绘制侧扫图像等。这个软件在Linux上运行。
项目内doc文件夹下有简易使用手册可以查询,包括如何安装使用等,当然文章后续我也会做简要说明。此外doc下还有xtf格式的官方文档。在此默认已对侧扫工作原理及输出数据有一定了解。
2. 安装
- 依赖项
由于项目需要c++下输出.mat格式文件,因此依赖matio库(https://github.com/tbeu/matio),编译前需安装:
sudo apt-get install libmatio-dev
我们需要获取库的路径,并在CMakeLists中做相应修改。在终端查询:
dpkg -L libmatio-dev
其中libmatio.so路径就是项目需要链接的路径。由于不同的平台下系统目录略有不同,不做修改的话可能会导致编译失败。
此外,项目在处涉及json文件处理时使用了一个非常好用的轻量级c++的json库,RapidJSON,感兴趣的可以了解一下http://rapidjson.org/zh-cn/。
3. 编译
cd xtf_data_analyze
mkdir build
cd build
cmake ..
make
请注意,CMakeLists.txt中libmatio.so的路径必须是检查之前,否则该编译将失败。
执行程序可以在内部版本中找到
文件夹:singleFileProcess,multiFileProcess。
singleFileProcess用于单文件处理,以xtf文件的路径作为输入。
multiFileProcess用于多文件处理,以xtf文件夹的路径作为输入。
4. 测试
数据文件夹中有三个xtf文件用于测试。
单文件测试:
cd build
./singleFileProcess ../data/000_1236_info.xtf
我们可以在包含xtf文件的文件夹中获取输出文件。所以可以创建四个输出文件
在数据文件夹中找到
基本信息数据: 000_1236_info.json
带有时间戳数据的轨迹:000_1236_TRAJ.mat
左舷数据:000_1236_PIM.mat
右舷数据:000_1236_SIM.mat
多文件测试:
cd build
./multiFileProcess ../data/
我们可以将轨迹文件排列到一个文件夹中:
mkdir trajectory
cp *_TRAJ.mat ./trajectory
sudo rm -rf *_TRAJ.mat
5. 输出文件格式
简要介绍一下输出的几个文件内的数据,具体参考使用手册。
- 基本信息文件(xxx_info.json)
主要是fileheader和chaninfo的信息,其中有几个要注意一下:
TotalPingNumber:总ping数;
NavUnits:GPS格式,0表示UTM格式,3表示经纬度格式;
chan_x:通道x,如chan_0表示通道0;
BytesPerSample:此通道每个数据字节数,本项目只支持1字节和2字节;
大多能在xtf官方文档中能查询到。
- 航迹数据文件(xxx_TRAJ.mat)
直接上每列代表的数据:
[时间戳,侧扫经度,侧扫纬度,侧扫高度,左舷斜距,右舷斜距,左舷单线采样点数,右舷单线采样点数,侧扫速度,侧扫Pitch,侧扫Roll,侧扫Heading]
注意NavUnits为0时,经纬度为UTM格式的,需要根据需求转换。
- 强度矩阵数据文件
左舷(xxx_PIM.mat);
右舷(xxx_SIM.mat)。
注意BytesPerSample为1时,每个采样点强度信息范围为(0-255);BytesPerSample为2时,每个采样点强度信息范围为(0~65535)。
{
“BaseInfo”:
{
“FileName” : xxx;
“SonarName” : xxx,
“TotalPingNumber” : xxx,
“NavUnits” : xxx,
“NumberOfSonarChannels” : xxx,
“NumberOfBathymetryChannels” : xxx
},
“FirstPing”:
{
“Time” : xxx,
“Longitude” : xxx,
“Latitude” : xxx
},
“LastPing”:
{
“Time” : xxx,
“Longitude” : xxx,
“Latitude” : xxx
},
“chan_x”:
{
“TypeOfChannel” : xxx,
“SubChannelNumber” : xxx,
“CorrectionFlags” : xxx,
“BytesPerSample” : xxx,
“VoltScale” : xxx,
“Frequency” : xxx,
“HorizBeamAngle” : xxx,
“TiltAngle” : xxx,
“BeamWidth” : xxx
}
}
- 带有时间戳数据的轨迹文件:
在轨迹mat文件中,键是“trajïu matrix”,值是一个矩阵(TotalPingNumber x 12)。
每一行由ping数据组成,行与第一行按时间顺序排列
ping数据作为第一行。列参数如下:
[timestamp, longitude, latitude, altitude, slantRangePort, slantRangeStbd, numSamplesPort, numSamplesStbd, sensorSpeed, sensorPitch, sensorRoll, sensorHeading]
第5列和第6列数据是左舷和右舷的倾斜范围。
第7列和第8列数据是左舷和右舷的样本数。
利用se数据可以进行弹道成像、倾斜距离校正、几何校正等
- 左舷数据文件
在左舷mat文件中,键是“port_int ensity_matrix”,值是一个矩阵 TotalPingNumber x numSamplesPort。利用矩阵数据可以用射线标度或其它格式绘制侧扫图像的端口侧。
- 右舷数据文件
与左舷数据文件几乎相同,除了按键是“stbd_intensity_matrix”。
6. python脚本
几个简易小脚本,在DataProcess中:
draw_intensity_image.py:绘制简易灰度图(基本未校正);
draw_trajectory_image.py:绘制单个文件航迹图;
draw_multi_trajectory_image.py:绘制多个文件航迹图(注意需要同一测试地点的航迹文件)。
1. 绘制侧扫图像
我们可以用draw_intensity_image.py。需要左舷数据文件和右舷数据文件。示例如下:
python3 draw_intensity_image.py xxx_PIM.mat xxx_SIM.mat
2. 绘制轨迹图像
我们可以为单个文件绘制轨迹,下面是一个示例:
python3 draw_trajectory_image.py xxx_TRAJ.mat
或者,我们可以将一些轨迹数据文件整理到一个文件夹中,然后将文件夹路径作为
输入多个图形。所有的轨迹都在同一个图像的坐标系中。
示例如下:
python3 draw_multi_trajectory_image.py FOLDER_PATH
7. 效果
用项目中data文件夹下的测试数据得到的一些效果如下:






8. 说明
软件比较粗糙,只是主要对xtf文件原始数据做提取处理,若想获得理想的侧扫图像,需要利用提取得到的数据文件做后处理。此外软件只支持每个采样点数据大小为1字节或2字节。同时对于双频侧扫声呐采集的数据,由于软件只提取了0通道和1通道的信息,故输出的数据文件为低频信息,高频信息未做处理。
目前软件能满足个人的使用需求,若后续有更进一步的需求,可能会进一步开发。