ulogo 是 PX4 ULog 的 Go 解析库,目标是复刻 PX4/pyulog 的核心库能力和常用 CLI,让 Go 项目可以直接读取、分析和导出 .ulg 飞行日志。
这是项目初始化版本,已经具备可运行的 V0 骨架:
ulogo.Read从io.Reader解析 ULog,ulogo.ReadFile/ulogo.Load作为文件路径便利入口。- 支持 Info、Parameter、Logging、Dropout、Format、Data message。
- 支持嵌套 topic 格式展平为 Go
Dataset。 - 支持 appended ULog 分段读取。
- 支持 PX4 events 日志内嵌 metadata 的离线解码。
- 提供
ulog_info、ulog_messages、ulog_params、ulog2csv四个 CLI。 - 完整保留 pyulog 上游
test/目录,并用真实 pyulog 生成的 oracle 做解析内容级兼容性测试。
go install github.com/05sec/ulogo/cmd/ulog_info@latest
go install github.com/05sec/ulogo/cmd/ulog_messages@latest
go install github.com/05sec/ulogo/cmd/ulog_params@latest
go install github.com/05sec/ulogo/cmd/ulog2csv@latest本地开发时可以直接运行:
go run ./cmd/ulog_info -v testdata/pyulog/sample.ulg
go run ./cmd/ulog_messages testdata/pyulog/sample.ulg
go run ./cmd/ulog2csv -m sensor_combined -o /tmp testdata/pyulog/sample.ulgpackage main
import (
"fmt"
"log"
"os"
"github.com/05sec/ulogo"
)
func main() {
file, err := os.Open("flight.ulg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
ulog, err := ulogo.Read(file)
if err != nil {
log.Fatal(err)
}
if sysName, ok := ulog.Info["sys_name"].StringValue(); ok {
fmt.Println("system:", sysName)
}
if dataset, ok := ulog.Dataset("sensor_combined", 0); ok {
fmt.Println("sensor_combined rows:", len(dataset.Rows))
}
}Read 接受任意 io.Reader。当输入同时实现 io.ReadSeeker 时会直接解析;
否则会先在内存中缓存后解析,因此可以支持网络、压缩包、对象存储下载流等不落盘输入。
go test ./...
go vet ./...
sh scripts/check_root_coverage.sh解析正确性测试读取 testdata/pyulog/oracle_summary.json。该文件由真实
PX4/pyulog 生成,比较的是解析内容:参数、info、dropout、topic schema、
dataset 行数、首尾 timestamp 和逐字段字节哈希;CLI 展示格式另由 golden
output 测试覆盖。
scripts/check_root_coverage.sh 默认要求根包覆盖率不低于 80%。可以通过
ROOT_COVERAGE_THRESHOLD=85 sh scripts/check_root_coverage.sh 调整门槛。
本仓库使用 GPL-3.0。testdata/pyulog 中的样例文件来自 PX4/pyulog,保留其 BSD-3-Clause 许可证说明。