【NextPilot日志移植】ULog
📚 ULog 日志系统详解
关键词:结构化日志、飞行数据记录、自描述格式、嵌入式系统、PX4、NextPilot
🧠 一、ULog 是什么?
ULog(Universal Log) 是 PX4/NextPilot 飞控系统中使用的结构化日志格式,用于记录飞行过程中的传感器数据、参数、状态信息、错误日志等。
✅ 主要用途:
- 飞行数据记录(如 IMU、GPS、电池状态)
- 参数变化记录(PID 调整、RC 映射等)
- 调试输出(如 PX4_INFO、PX4_WARN、PX4_ERR)
- 系统状态分析(如 CPU 负载、内存使用)
🧱 二、ULog 的核心特性
特性 | 描述 |
---|---|
结构化 | 每条日志都有固定格式,便于程序解析 |
自描述 | 日志文件本身包含数据结构定义,无需外部依赖 |
可扩展性强 | 支持多种消息类型,满足不同场景需求 |
高效性 | 使用缓冲机制减少频繁 I/O 操作 |
兼容性 | 支持版本控制,避免日志无法解析 |
跨平台 | 可在 PX4、ROS、Python、MATLAB 等平台解析 |
📦 三、ULog 文件结构
ULog 文件由多个**消息(Messages)**组成,每个消息都包含一个通用头部(ulog_message_header_s
),后续数据根据消息类型不同而变化。
✅ 1. 文件头(ulog_file_header_s
)
struct ulog_file_header_s {uint8_t magic[8]; // 文件魔数(标识文件类型)uint64_t timestamp; // 日志起始时间戳(单位:微秒)
};
- magic:固定值
0x16 0x2d 0x3a
,ASCII 字符为"LOGxxxxxx"
,用于识别文件类型。 - timestamp:记录日志的起始时间,用于时间戳对齐。
✅ 2. 通用消息头(ulog_message_header_s
)
struct ulog_message_header_s {uint16_t msg_size; // 消息体大小(不含头部)uint8_t msg_type; // 消息类型(如 'F'、'D'、'I'、'P' 等)
};
- msg_size:消息体的字节数。
- msg_type:消息类型,用于解析后续数据结构。
✅ 3. 消息类型(ULogMessageType
)
enum class ULogMessageType : uint8_t {FORMAT = 'F',DATA = 'D',INFO = 'I',INFO_MULTIPLE = 'M',PARAMETER = 'P',PARAMETER_DEFAULT = 'Q',ADD_LOGGED_MSG = 'A',REMOVE_LOGGED_MSG = 'R',SYNC = 'S',DROPOUT = 'O',LOGGING = 'L',LOGGING_TAGGED = 'C',FLAG_BITS = 'B',
};
常用消息类型说明:
类型 | 字符 | 含义 |
---|---|---|
'F' | FORMAT | 定义数据结构(如 sensor_combined:uint64_t timestamp;float x;float y; ) |
'D' | DATA | 记录实际数据(如传感器数值) |
'I' | INFO | 记录键值对信息(如 sys_toolchain_ver9.4.0 ) |
'P' | PARAMETER | 记录参数值(如 RC_MAP_THROTTLE=1100 ) |
'Q' | PARAMETER_DEFAULT | 记录默认参数值(用于对比是否被修改过) |
'A' | ADD_LOGGED_MSG | 订阅某个日志主题(如 sensor_combined ) |
'R' | REMOVE_LOGGED_MSG | 取消订阅某个日志主题 |
'S' | SYNC | 同步消息,用于日志文件的同步 |
'O' | DROPOUT | 记录数据丢失时间长度(如 duration=100ms ) |
'L' | LOGGING | 记录调试日志(如 PX4_INFO("Debug message") ) |
'B' | FLAG_BITS | 标记日志文件的兼容性标志 |
📝 四、ULog 数据结构详解
✅ 1. ulog_message_format_s
—— 数据格式定义
struct ulog_message_format_s {uint16_t msg_size; ///< size of message - ULOG_MSG_HEADER_LENuint8_t msg_type = static_cast<uint8_t>(ULogMessageType::FORMAT);char format[1500]; ///< 格式字符串,如 "sensor:uint64_t timestamp;float x;float y;"
};
- 作用:描述一个日志主题的数据结构。
- 示例:
表示sensor:uint64_t timestamp;float x;float y;float z;
sensor
主题包含时间戳和 x/y/z 浮点数值。
✅ 2. ulog_message_add_logged_s
—— 添加日志主题
struct ulog_message_add_logged_s {uint16_t msg_size; ///< size of message - ULOG_MSG_HEADER_LENuint8_t msg_type = static_cast<uint8_t>(ULogMessageType::ADD_LOGGED_MSG);uint8_t multi_id; ///< 多实例 ID(用于多传感器)uint16_t msg_id; ///< 消息 ID(用于关联数据)char message_name[255]; ///< uORB 主题名称(如 "sensor_combined")
};
- 作用:告诉解析器,接下来要记录的主题名称和 ID。
- 示例:
msg_id = 0x12 message_name = "sensor_combined"
✅ 3. ulog_message_data_s
—— 数据记录
struct ulog_message_data_s {uint16_t msg_size;uint8_t msg_type = static_cast<uint8_t>(ULogMessageType::DATA);uint16_t msg_id;
};
- 作用:记录实际数据(如传感器数值)。
- 数据结构:
msg_id
:关联到ADD_LOGGED_MSG
中的msg_id
- 后续数据:根据
FORMAT
定义的数据结构存储
✅ 4. ulog_message_info_s
和 ulog_message_info_multiple_s
—— 信息记录
struct ulog_message_info_s {uint16_t msg_size;uint8_t msg_type = static_cast<uint8_t>(ULogMessageType::INFO);uint8_t key_len; ///< 键长度char key_value_str[255]; ///< 键值对字符串
};
- 作用:记录元信息(如参数、系统信息、错误日志等)。
- 示例:
sys_toolchain_ver9.4.0 sensor_gyro_rate=200 Hz
✅ 5. ulog_message_parameter_s
和 ulog_message_parameter_default_s
—— 参数记录
struct ulog_message_parameter_s {uint16_t msg_size;uint8_t msg_type = static_cast<uint8_t>(ULogMessageType::PARAMETER);uint8_t key_len;char key_value_str[255]; ///< 键值对字符串
};
- 作用:记录系统参数(如 PID 参数、RC 映射等)。
- 区别:
'P'
:当前参数值。'Q'
:默认参数值(用于对比是否被修改过)。
✅ 6. ulog_message_dropout_s
—— 丢包信息
struct ulog_message_dropout_s {uint16_t msg_size = sizeof(uint16_t); ///< size of message - ULOG_MSG_HEADER_LENuint8_t msg_type = static_cast<uint8_t>(ULogMessageType::DROPOUT);uint16_t duration; ///< in ms
};
- 作用:记录数据丢失的时间长度。
- 使用场景:当系统无法实时记录所有数据时,插入此消息表示“这段数据可能丢失”。
✅ 7. ulog_message_logging_s
和 ulog_message_logging_tagged_s
—— 日志输出
struct ulog_message_logging_s {uint16_t msg_size;uint8_t msg_type = static_cast<uint8_t>(ULogMessageType::LOGGING);uint8_t log_level; ///< 日志级别(如 ERROR、WARN、INFO、DEBUG)uint64_t timestamp;char message[128]; ///< 日志内容
};
- 作用:记录调试信息(如
PX4_INFO("Debug message")
输出的内容)。 - 使用场景:用于调试飞行控制逻辑,定位问题。
✅ 8. ulog_message_flag_bits_s
—— 兼容性标志
struct ulog_message_flag_bits_s {uint16_t msg_size;uint8_t msg_type = static_cast<uint8_t>(ULogMessageType::FLAG_BITS);uint8_t compat_flags[8]; // 兼容性标志uint8_t incompat_flags[8]; // 不兼容标志uint64_t appended_offsets[3]; // 附加数据偏移
};
- 作用:用于标记日志文件的兼容性信息。
- 使用场景:新版本飞控写入的文件,旧版本工具可以读取并判断是否兼容。
🔄 五、ULog 的工作流程
✅ 1. 初始化日志文件
ulog_file_header_s header;
header.magic = "LOGxxxxxx"; // 文件魔数
header.timestamp = hrt_absolute_time(); // 当前时间戳
write(fd, &header, sizeof(header)); // 写入文件头
✅ 2. 定义数据结构(FORMAT 消息)
ulog_message_format_s format_msg;
format_msg.msg_type = 'F';
strcpy(format_msg.format, "sensor:uint64_t timestamp;float x;float y;float z;");
write(fd, &format_msg, sizeof(format_msg) + strlen(format_msg.format));
✅ 3. 订阅日志主题(ADD_LOGGED_MSG)
ulog_message_add_logged_s add_msg;
add_msg.msg_type = 'A';
add_msg.multi_id = 0;
strcpy(add_msg.message_name, "sensor_combined");
write(fd, &add_msg, sizeof(add_msg) + strlen(add_msg.message_name));
✅ 4. 写入数据(DATA 消息)
ulog_message_data_s data_msg;
data_msg.msg_type = 'D';
data_msg.msg_id = 0x12; // 对应 ADD_LOGGED_MSG 的 msg_id// 实际数据紧跟其后
sensor_combined_s data;
data.timestamp = hrt_absolute_time();
data.x = 1.2f;
data.y = 3.4f;
data.z = 5.6f;write(fd, &data_msg, sizeof(data_msg));
write(fd, &data, sizeof(data));
✅ 5. 记录日志信息(INFO / PARAMETER)
ulog_message_info_s info_msg;
info_msg.msg_type = 'I';
strcpy(info_msg.key_value_str, "sys_toolchain_ver9.4.0");write(fd, &info_msg, sizeof(info_msg) + strlen(info_msg.key_value_str));
✅ 6. 记录丢包信息(DROPOUT)
ulog_message_dropout_s dropout;
dropout.msg_type = 'O';
dropout.duration = 100; // 丢包时间长度(ms)write(fd, &dropout, sizeof(dropout));
✅ 7. 文件尾部标志(可选)
某些日志系统会写入一个 EOF
标志,表示日志结束。
📊 六、ULog 的典型应用场景
场景 | 使用的消息类型 |
---|---|
记录传感器数据 | 'D' (DATA) |
记录参数设置 | 'P' (PARAMETER) |
记录日志输出 | 'L' (LOGGING) |
描述数据结构 | 'F' (FORMAT) |
记录丢包信息 | 'O' (DROPOUT) |
标记文件兼容性 | 'B' (FLAG_BITS) |
🧩 七、ULog 的设计亮点
亮点 | 描述 |
---|---|
模块化设计 | 4个日志主题独立管理,便于扩展 |
异步写入 | 使用后台线程处理 I/O,不影响主线程性能 |
线程安全 | 使用 mutex + condition variable 保证线程安全 |
高性能优化 | 使用缓冲机制减少频繁写磁盘操作 |
加密支持 | 可选编译项,增强安全性 |
性能统计 | 使用 perf_counter 记录写入和 fsync 时间 |
🧠 八、ULog 的优势总结
优势 | 描述 |
---|---|
结构化存储 | 每条日志都有固定格式,便于解析 |
自描述性 | 每条数据都包含格式信息 |
兼容性设计 | 支持新旧版本兼容,避免日志无法解析 |
跨平台支持 | 可用 QGroundControl、Python、MATLAB 解析 |
加密功能 | 保护敏感飞行数据 |
调试友好 | 支持调试输出、参数变化记录 |
📌 九、ULog 文件示例(简化版)
[File Header] // 文件魔数和起始时间
[F] sensor:uint64_t timestamp;float x;float y;float z;
[A] msg_id=0x12, message_name=sensor_combined
[D] msg_id=0x12, data=0x12345678 0x00000000 0x40000000 0x40800000
[I] sys_toolchain_ver9.4.0
[P] RC_MAP_THROTTLE=1100
[O] duration=100ms
📈 十、ULog 的文件格式示意图
[File Header] // 文件魔数 + 时间戳
[FORMAT Messages] // 描述各个日志主题的结构
[ADD_LOGGED_MSG] // 定义哪些主题被记录
[DATA Messages] // 实际记录的数据(传感器、参数等)
[INFO / PARAMETER Messages] // 元信息和参数记录
[DROPOUT Messages] // 丢包信息
[FLAG_BITS Messages] // 兼容性标志
🧱 十一、ULog 的典型使用流程
// 初始化日志文件
Logger logger(LogWriter::BackendFile, 1024 * 1024);
logger.start_log_file(LogType::Full, "/mnt/microsd/log001.ulg");// 写入数据
logger.write_message(LogType::Full, data_ptr, data_size);// 停止日志
logger.stop_log_file(LogType::Full);
📌 十二、移植建议(从 PX4/NextPilot 到其他系统)
✅ 保留核心功能
LogWriterFile
:文件日志写入器ULogMessageType
:消息类型定义LogFileBuffer
:缓冲区管理write_message()
:日志写入接口
✅ 可选功能
- 加密支持(
PX4_CRYPTO
) - 性能统计(
perf_counter
) - 多线程支持(
pthread
)
相关文章:
【NextPilot日志移植】ULog
📚 ULog 日志系统详解 关键词:结构化日志、飞行数据记录、自描述格式、嵌入式系统、PX4、NextPilot 🧠 一、ULog 是什么? ULog(Universal Log) 是 PX4/NextPilot 飞控系统中使用的结构化日志格式ÿ…...
扩展:React 项目执行 yarn eject 后的 scripts 目录结构详解
扩展:React 项目执行 yarn eject 后的 scripts 目录结构详解 什么是 yarn eject?scripts 目录结构与说明各脚本说明说明 什么是 yarn eject? yarn eject 是 Create React App(简称 CRA)提供的一条命令,用于…...
Android11.0 framework第三方无源码APP读写断电后数据丢失问题解决
1.前言 在11.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…...
多样本整合Banksy空间聚类分析(Visium HD, Xenium, CosMx)
在空间数据分析中,传统的单细胞聚类算法,例如Seurat和Scanpy中的lovain和leiden等聚类算法,通常在处理空间数据时忽略了空间信息。然而,由于细胞状态受其周围细胞的影响,将转录组数据与细胞的空间信息结合起来进行聚类…...
【2025最新】Vm虚拟机中直接使用Ubuntu 免安装过程直接使用教程与下载
Ubuntu 是一个基于 Debian 的自由开源 Linux 操作系统,面向桌面、服务器和云计算平台广泛应用。 由英国公司 Canonical Ltd. 维护和发布,Ubuntu 强调易用性、安全性和稳定性,适合个人用户、开发者以及企业部署使用。 Ubuntu 默认使用 GNOME …...
【Leetcode】系列之206反转链表
反转链表 题目描述解决思路过程示例代码示例结果展示 总结 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 解决思路 next_node:临时存放当前指针指向下一个指针的变量;pre:存放空指针;curr࿱…...
图灵爬虫练习平台第十九题js逆向
题十九:法外狂徒 该题适合JS逆向学习的小伙伴练习,模拟国内某大型网站 数据加密设计,给大家练练手 还是先f12看看是什么加密,发现是 返回数据最后加密了 还是先堆栈分析一下,直接点进去 打上断点分析一下,…...
Ubuntu 22初始配置(root、ssh)
1.设置root密码 并启用root用户 sudo passwd root sudo passwd -u root 2.安装ssh apt install openssh-server systemctl enable --now ssh 3.支持root通过ssh登录 vim /etc/ssh/sshd_config 是sshd_config(服务端) 不是ssh_config(客户端) 最后增加一…...
css3响应式布局
css3响应式布局 响应式设计是现代网页开发的重要组成部分,它确保网页在不同的屏幕尺寸上都有良好的显示效果。 在CSS中,实现响应式布局是一种常用的技术,旨在使网页能够根据用户的设备和屏幕尺寸自动调整其布局和样式。这种技术对于确保网站…...
【DeepSeek问答记录】请结合实例,讲解一下pytorch的DataLoader的使用方法
PyTorch的DataLoader是数据加载的核心工具,可高效处理批量数据、并行加载和自动打乱。以下是一个结合实例的分步讲解: 1. 基础使用流程 import torch from torch.utils.data import Dataset, DataLoader# 自定义数据集类(必须实现__len__和…...
Codeforces Round 1024 (Div. 2)(A-D)
题面链接:Dashboard - Codeforces Round 1024 (Div. 2) - Codeforces A. Dinner Time 思路 一共n个数被分成n/p个区间,每个区间内的和是q,如果还有除构成区间外剩余的数那么就一定能构造,如果没有剩余就看所有区间的和是否等于…...
大语言模型强化学习双强:OpenRLHF与verl技术解析
引言 随着大语言模型(LLM)参数规模突破千亿级,如何高效完成基于人类反馈的强化学习(RLHF)训练成为行业焦点。OpenRLHF与verl作为开源社区两大标杆框架,分别以Ray分布式架构和HybridFlow混合控制器为核心&a…...
ARM Cortex-M3内核详解
目录 一、ARM Cortex-M3内核基本介绍 (一)基本介绍 (二)主要组成部分 (三)调试系统 二、ARM Cortex-M3内核的内核架构 三、ARM Cortex-M3内核的寄存器 四、ARM Cortex-M3内核的存储结构 五、ARM Co…...
关于高并发GIS数据处理的一点经验分享
1、背景介绍 笔者过去几年在参与某个大型央企的项目开发过程中,遇到了十分棘手的难题。其与我们平常接触的项目性质完全不同。在一般的项目中,客户一般只要求我们能够通过桌面软件对原始数据进行加工处理,将各类地理信息数据加工处理成地图/场景和工作空间,然后再将工作空…...
vue3+flask+sqlite前后端项目实战
基础环境安装 pycharm 下载地址: https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows vscode 下载地址 https://code.visualstudio.com/docs/?dvwin64user python 下载地址 https://www.python.org/downloads/windows/ Node.js(含npm…...
支付宝API-SKD-GO版
前言 支付宝api的sdk没有提供go版,这里自己封装了一个go版的sdk,有需要的朋友可以自取使用 支付宝 AliPay SDK for Go, 集成简单,功能完善,持续更新,支持公钥证书和普通公钥进行签名和验签。 安装 go get github.c…...
uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
由于"微信小程序"存在【样式隔离机制】,且默认设置为isolated(启用样式隔离),因此这里给出以下两种解决方案: 注意: 这2种方案父子组件<style>标签不能添加"scoped" 1.CSS变量穿透(推荐: 此方案不受样…...
AI时代还需要目视解译吗?——目视解译详解
在遥感技术迅猛发展的今天,尽管计算机自动解译算法层出不穷,目视解译仍然保持着其基础性和权威性的地位。作为遥感信息提取的"黄金标准",目视解译凭借人类认知系统的独特优势,在多个专业领域持续发挥着不可替代的作用。…...
苹果电脑笔记本macos Mac安装mixly 米思齐软件详细指南
一、下载安装包 二、安装 1、解压下载的文件,然后将解压后文件夹中的中文名称部分删掉只保留英文名称,例如:mixly2.0-mac 2、将mixly2.0-mac文件夹移动到当前用户的Documents路径下,注意路径中不要有中文。 3、进入mixly2.0-mac文…...
slackware系统详解
Slackware 是最古老的活跃维护的 Linux 发行版之一,由 Patrick Volkerding 于 1993 年创建。它以简洁性、稳定性和遵循 Unix 哲学为核心理念,适合追求高度控制和手动配置的用户。以下是 Slackware 的详细介绍: 1. 核心特点 简洁性 (Simplici…...
力扣210(拓扑排序)
210. 课程表 II - 力扣(LeetCode) 这是一道拓扑排序的模板题。简单来说,给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。如果有向图中有环就没有办法进行拓扑排序了。因此,拓扑排序也是图论中判断有向无环图…...
Promise/A+ 规范中文解读
一、简介 Promise/A 是一个开放、健全且通用的JavaScript Promise标准,由开发者制定并供开发者参考。其核心目标是定义then方法的行为,确保不同Promise实现的互操作性。规范聚焦于异步操作的最终结果交互机制,而非Promise的创建、解决或拒绝…...
多媒体预研
主要包含h265 av1 等各种 多媒体的具体应用 svac_plugin ZLMediaKit/ext-codec at master cyf88/ZLMediaKit D:\java\xiachu\otherzlm\ZLMediaKit> sip-client GB28181-Service/SipClient at master Washington-DC/GB28181-Service yolo Jackson-Tan/wvp_pro_yolo: 小…...
动态网站 LNMP
一、名词解释: LNMP: L : 代表 Linux 操作系统,为网站提供了可靠的运行环境N : 代表 Nginx,它是一款轻量级的高性能 Web 服务器,能够快速处理大量并 发连接,有效提升网站的访问速度和性能 M : 代表…...
【Leetcode刷题随笔】349. 两个数组的交集
1. 题目描述 给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。 示例1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2] 题目条件: 1 < nums1.length, nums2.length < 10…...
如何优雅的使用CMake中的FindPkgConfig模块
背景 如果你遇到下面的场景,那么FindPkgConfig模块可以用来解决我们引用上游库的问题。 上游库没有提供CMake的配置文件。CMake没有提供相应的查找模块,即Find<PackageName>.cmake的文件。上游库提供了pkg-config使用的.pc文件。 如果上面三个条…...
Docker Volumes
Docker Volumes 是 Docker 提供的一种机制,用于持久化存储容器数据。与容器的生命周期不同,Volumes 可以独立存在,即使容器被删除,数据仍然保留。以下是关于 Docker Volumes 的详细说明: 1. 为什么需要 Volumes&#…...
[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取当前用户主目录(即:~波浪符号目录)?
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...
day23 机器学习管道 Pipeline
在机器学习中,数据预处理、特征提取、模型训练和评估等步骤通常是按顺序执行的。为了更高效地管理和复用这些步骤,我们可以使用 Pipeline(管道)来构建一个完整的机器学习流水线。本文将详细介绍 Pipeline 的基础概念,并…...
The Graph:区块链数据索引的技术架构与创新实践
作为Web3生态的核心基础设施,The Graph通过去中心化索引协议重塑了链上数据访问的范式。其技术设计不仅解决了传统区块链数据查询的效率瓶颈,还通过经济模型与多链兼容性构建了一个开放的开发者生态。本文从技术角度解析其架构、机制及创新实践。 一、技…...
nginx配置sse流传输问题:直到所有内容返回后才往下传输
一、禁用缓冲(如实时流传输): location /stream {proxy_buffering off; } 二、开启分块传输 location /your-path {proxy_chunked_transfer_encoding on; # 显式启用分块传输(默认已启用) }...
使用Daemonset部署日志收集守护进程
1.DaemonSet简介: 在Kubernetes(简称k8s)中,DaemonSet是一种控制器,用于确保集群中的每个(或部分)节点运行一个指定的Pod副本。DaemonSet非常适合需要全局部署、节点级运行的服务,如…...
在Mac环境下搭建Docker环境的全攻略
在Mac环境下搭建Docker环境的全攻略 在现代软件开发中,Docker已经成为不可或缺的工具之一。它不仅简化了应用的部署和管理,还极大地提升了开发效率。然而,在某些公司环境中,桌面版的Docker可能会被禁用,这给开发工作带…...
Go 语言 slice(切片) 的使用
序言 在许多开发语言中,动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组,因为对于数组的大小大多数情况下我们是不能事先就确定好的,所以他不够灵活。动态数组通过提供自动扩容的机制,极大地提升了开发效率。这…...
C++ string比较、string随机访问、string字符插入、string数据删除
string的字符串进行比较,代码见下。 #include<iostream>using namespace std;int main() {// 1 comparestring s1 "aab";string t11 "aab";int r11 s1.compare(t11);cout << "1: " << r11 << endl;strin…...
web 自动化之 Unittest 应用:测试报告装饰器断言
文章目录 一、常见的第三方库结合 unittest 生产 html 格式测试报告1、HtmlTestRunner2、BeatifulReport 二、装饰器 unittest.skip 强制跳过&条件跳过三、unittest的常用断言方法 一、常见的第三方库结合 unittest 生产 html 格式测试报告 1、HtmlTestRunner 官网下载 …...
前端基础之《Vue(16)—Vue脚手架介绍》
一、脚手架环境 1、推荐windows10 Node vue/cli(webpack) 2、测试node安装成功 node -v npm -v 3、什么是脚手架 Vue CLI:CLI就是脚手架的意思 脚手架生成一套模板(入口文件、配置文件、目录结构) 4、常用的包管理器 npm:no…...
MySQL 事务(一)
文章目录 CURD不加控制,会有什么问题CURD满足什么属性,能解决上述问题?什么是事务为什么要有事务事务的版本支持了解事务的提交方式 事务常见操作方式研究并发场景事务的正常操作事务的非正常情况的案例结论事务操作的注意事项 CURD不加控制&…...
Dsp38335利用Bootloader实现在线升级的技术原理
1. Bootloader概述 Bootloader(引导加载程序)是嵌入式系统中负责在设备启动时加载和启动主程序的代码。它通常在系统的闪存或其他非易失性存储器中,并在系统上电时首先执行。Bootloader不仅完成启动操作,还能够提供后续的程序升级…...
【TVM 教程】microTVM PyTorch 教程
Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者:Mehrdad Hessar 该教程展示了如何使用 PyTorch 模型进行 microTVM 主机驱动的 AOT 编译。此教程可以在使用…...
利用D435i相机进行SLAM实现建图的关键环节-----Kalibr标定工具以及常见的问题调试
在SLAM系统中,相机标定是获取准确的空间信息和三维重建的关键步骤。对于Intel RealSense D435i这类双目相机,正确的内参和外参不仅能提高位姿估计精度,还能显著改善重建效果。本文将详细介绍如何使用Kalibr对D435i进行双目标定,并…...
old kali网站下载链接爬取-Kali linux 全部版本镜像下载--Index of /kali-images
Kali linux 全部版本镜像下载 目的 出于该网站不稳定原因,故爬取下载链接,以便网友下载老版本kali from bs4 import BeautifulSoup import requests from urllib.parse import urljoinbase_url "http://old.kali.org/kali-images/" visite…...
基于千眼狼高速摄像机与三色掩模的体三维粒子图像测速PIV技术
研究背景 航空航天、能源动力领域,测量三维瞬态流场的速度场信息对于理解流体力学行为、优化系统设计非常关键。 传统三维粒子图像测速技术如Tomo层析PIV,因依赖多相机阵列,存在系统体积、操作复杂,在封闭空间测量存在困难&#…...
Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用--程序启动界面
前期使用Tauri(2.5.1)Leptos(0.7.8)写了一个自用桌面小程序,详见:使用Tauri 2.3.1Leptos 0.7.8开发桌面小程序汇总_tauri 小程序-CSDN博客。 在此基础上,尝试给程序添加启动界面,效果如下图所示。 1. 添加启动画面设置 在src-ta…...
Gmsh划分网格|四点矩形
先看下面这段官方自带脚本 /*********************************************************************** Gmsh tutorial 1** Variables, elementary entities (points, curves, surfaces), physical* entities (points, curves, surfaces)********************************…...
I/O多路复用(select/poll/epoll)
通过一个进程来维护多个Socket,也就是I/O多路复用,是一种常见的并发编程技术,它允许单个线程或进程同时监视多个输入/输出(I/O)流(例如网络连接、文件描述符)。当任何一个I/O流准备好进行读写操…...
一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!
从事企业软件项目开发的同学们一定对 ER 图很熟悉,可以帮助用户快速厘清数据库结构,方便后续维护和优化。但是在日常工作中,面对复杂的数据结构,整理表设计文档对于每一位DBA来说都很头大,需要将设计细节转化为条理清晰…...
学习黑客 windows 设置与控制面板详解
Windows 设置与控制面板详解:双剑合璧的系统配置工具 ⚙️🔧 学习目标:理解Windows设置和控制面板的异同、掌握系统配置的安全最佳实践 1. 引言:双界面的系统配置世界 🌐 在Windows操作系统中,有两个强大的…...
pytorch模型画质增强简单实现
使用数据增强技术可以增加数据集中图像的多样性,从而提高模型的性能和泛化能力,主要的图像增强技术包括。 亮度,对比度调节 在开始图像大小的调整之前我们需要导入数据(图像以眼底图像为例)。 from PIL import Image f…...
C++中的std::allocator
C中的std::allocator 文章目录 C中的std::allocator1.std::allocator1.1C中的placement new 和operator new1.2一个custom allocator的实现1.3使用std::allocator_traits实现allocator 1.std::allocator C中的std::allocator默默工作在CSTL中的所有容器的内存分配上࿰…...