PX4开始之旅(二)通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信
核心知识点:通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信
1. 通俗易懂的解释
想象一下,MAVLink 就像是无人机(飞控)和地面站(QGroundControl)之间约定好的一种“语言”。这种语言有很多标准的“词汇”和“句子”,比如用来报告无人机位置、速度、电池电量,或者发送起飞、降落指令等等。
但是,有时候你可能想让无人机做一些特别的事情,或者发送一些标准 MAVLink 语言里没有的信息。比如,你的无人机上装了一个很特别的传感器,你想把这个传感器的数据显示在 QGC 上;或者你想通过 QGC 控制一个自定义的机械臂。这时候,标准的 MAVLink 语言就不够用了。
“自定义 MAVLink 消息”就像是在这种标准“语言”里创造一些新的“词汇”和“句子”。你和 QGC 需要提前约定好这些新词汇的意思和用法。这样,当无人机发送这些新的“句子”时,QGC 就能“听懂”并做出相应的处理(比如显示数据、控制设备)。反过来,QGC 也可以使用这些新“词汇”发送指令给无人机。
现实例子:
你和你的朋友约定了一种暗号。标准的交流方式是普通话,但你们为了某个特定目的,约定用“香蕉”代表“一切正常”,“苹果”代表“需要帮助”。这样,当你说“香蕉”时,你的朋友就知道你一切安好,即使在嘈杂的环境中也能快速沟通。自定义 MAVLink 消息就是无人机和地面站之间的这种“暗号”或“扩展词汇”。
2. 抽象理解
共性 (Abstract Understanding):
自定义 MAVLink 消息是通信协议扩展的一种具体应用。在许多协议设计中,为了满足特定或未来的需求,都会预留扩展机制。MAVLink 协议作为一个开放标准的无人机通信协议,提供了定义自定义消息的能力,允许用户在不修改核心协议的情况下,增加新的数据类型和命令。
其抽象本质是在现有协议框架内,利用预留的或可扩展的字段、消息 ID 范围等,定义具有特定含义的数据结构和消息类型。这使得通信双方能够在理解标准协议的基础上,额外交换定制化的信息。
对于自定义 MAVLink 消息,核心是在飞控端和地面站端同步定义和实现新的消息结构及其处理逻辑。
潜在问题 (Potential Issues):
-
兼容性问题: 如果地面站或飞控没有更新支持你定义的自定义消息,它们将无法识别或正确解析这些消息,可能导致通信失败或数据丢失。
-
版本管理: 随着自定义消息的迭代和修改,需要严格的版本控制,确保飞控和地面站使用相同版本的消息定义,避免因版本不匹配导致的通信错误。
-
消息 ID 冲突: 虽然 MAVLink 协议为自定义消息预留了 ID 范围,但在多个不同的自定义扩展之间,仍有可能出现消息 ID 冲突,需要统一管理或使用独立的方言(Dialect)文件。
-
地面站支持程度: QGC 需要修改其代码才能完全支持自定义消息的发送、接收、显示和控制界面。这通常需要修改 QGC 的源代码并重新编译,不像标准消息那样开箱即用。
-
性能影响: 发送大量或频率过高的自定义消息可能会占用通信带宽和处理资源,影响飞控和地面站的其他功能。
解决方案 (Solutions):
-
兼容性问题:
-
解决方案: 确保所有涉及自定义消息的设备(飞控、地面站、伴随计算机等)都使用相同的自定义 MAVLink 方言(XML 定义文件)生成代码,并在部署时同步更新。
-
-
版本管理:
-
解决方案: 在自定义 MAVLink 方言文件中明确版本信息。在飞控和地面站代码中加入版本检查机制,如果检测到版本不匹配,则给出警告或拒绝使用自定义消息。
-
解决方案: 使用版本控制系统(如 Git)管理自定义方言文件,并为每个版本打标签。
-
-
消息 ID 冲突:
-
解决方案: 仔细规划自定义消息的 ID 范围,尽量使用 MAVLink 协议推荐的自定义范围。如果与第三方自定义消息集成,尝试合并方言文件或协调 ID 分配。
-
解决方案: 为你的自定义消息创建一个独立的 MAVLink 方言文件(XML),并在其中定义你的消息和枚举类型。
-
-
地面站支持程度:
-
解决方案: 修改 QGC 源代码。这是最彻底的解决方案,需要根据自定义消息的内容和功能,在 QGC 中添加相应的解析逻辑、UI 元素(如新的仪表盘、控制面板)和发送逻辑。
-
解决方案: 使用 QGC 的插件机制(如果可用)或外部工具/脚本。对于一些简单的数据显示,可以考虑开发 QGC 插件或使用伴随计算机上的脚本来处理自定义消息,并通过 MAVLink 或其他方式与 QGC 集成。
-
-
性能影响:
-
解决方案: 优化消息发送频率。只在必要时发送自定义消息,并根据通信带宽和处理能力限制发送频率。
-
解决方案: 优化消息内容。只包含必要的数据,避免发送冗余信息。
-
解决方案: 考虑使用其他通信方式。对于大量、高频的数据传输,如果条件允许,可以考虑使用其他更适合的通信方式(如 TCP/IP)通过伴随计算机进行。
-
3. 实现的原理
实现自定义 MAVLink 消息与 QGC 通信的主要原理包括:
-
定义消息结构: 使用 MAVLink 官方提供的 XML 格式定义文件(称为方言文件,Dialect File),在其中描述自定义消息的名称、ID、包含的数据字段(类型、名称、单位等)以及相关的枚举类型。自定义消息的 ID 通常需要在 MAVLink 协议规定的自定义范围内选择,以避免与标准消息冲突。
-
生成代码: 使用 MAVLink 官方提供的代码生成工具(
mavgenerate.py
)读取自定义方言 XML 文件,自动生成支持该自定义消息的各种编程语言(如 C++, Python)的 MAVLink 库代码。 -
飞控端实现:
-
将生成的 MAVLink 库代码集成到飞控固件项目中。
-
在飞控代码中实现发送自定义消息的逻辑。这包括填充消息结构体的数据,然后调用 MAVLink 库提供的函数将消息序列化并发送出去(通过串口、UDP 等)。
-
实现接收和处理 QGC 发送的自定义消息的逻辑(如果需要)。
-
-
地面站端实现 (QGC):
-
将包含自定义消息定义的方言 XML 文件添加到 QGC 的 MAVLink 方言目录中。
-
(通常需要)修改 QGC 的源代码:
-
在 MAVLink 消息解析部分添加对自定义消息 ID 的识别和解析逻辑。
-
根据自定义消息的内容,在 QGC 的用户界面中添加相应的显示元素(如新的仪表、图表)或控制元素(如按钮、滑块)。
-
实现 QGC 发送自定义消息给飞控的逻辑(如果需要)。
-
-
重新编译 QGC 源代码。
-
-
通信: 飞控和 QGC 通过物理连接(如数传电台、USB)或网络连接(如 UDP)进行通信,交换标准和自定义 MAVLink 消息。
整个过程的关键在于飞控和 QGC 都使用基于同一个自定义方言 XML 文件生成的 MAVLink 库代码,从而确保双方对自定义消息的格式和含义有相同的理解。
4. 实现代码 (示例)
由于在 QGC 中实现自定义消息需要修改和编译 QGC 源代码,这里提供一个简化的 Python 示例,演示如何定义一个简单的自定义 MAVLink 消息,并使用 pymavlink
库进行发送和接收。这个示例不涉及 QGC 的具体修改,但展示了自定义消息定义和基本通信的流程。
步骤 1: 定义自定义 MAVLink 消息 (custom_messages.xml)
创建一个 XML 文件,例如 custom_messages.xml
:
<?xml version="1.0"?>
<mavlink><messages><message id="15000" name="MY_CUSTOM_DATA"><description>自定义传感器数据示例</description><field type="uint64_t" name="timestamp_us">时间戳 (微秒)</field><field type="float" name="temperature">温度 (摄氏度)</field><field type="uint8_t" name="status">状态码</field><field type="char[10]" name="name">传感器名称</field></message></messages>
</mavlink>
-
message id="15000"
: 自定义消息 ID,需要在 MAVLink 规定的自定义范围内(通常是 15000-19999)。 -
name="MY_CUSTOM_DATA"
: 消息名称。 -
field
: 定义消息包含的数据字段,包括类型、名称、描述等。
步骤 2: 使用 mavgenerate.py
生成 Python 代码
下载 MAVLink 库(如果还没有):git clone https://github.com/mavlink/mavlink.git
。
进入 MAVLink 库的 pymavlink
目录,运行代码生成工具。假设 custom_messages.xml
文件也在当前目录:
python mavgenerate.py --lang=Python --wire-protocol=2.0 custom_messages.xml
这会在当前目录或指定目录生成一个名为 mavutil.py
的文件以及一个包含生成代码的子目录(例如 mavlink_dialect_name
)。
步骤 3: Python 发送和接收示例
创建一个 Python 脚本,使用生成的库代码发送和接收自定义消息。
import time
import sys
import os# 添加生成的 mavlink 库路径
# 假设生成的库在当前脚本的子目录 'mavlink_custom' 中
# 你需要根据实际生成的路径进行修改
mavlink_dir = os.path.join(os.path.dirname(__file__), 'mavlink_custom')
if mavlink_dir not in sys.path:sys.path.append(mavlink_dir)# 导入生成的 mavlink 方言模块
# 模块名称取决于你的 XML 文件名和生成时的设置
# 假设生成了一个名为 'custom_messages' 的方言
from mavlink_custom import custom_messages as mavutil# --- 发送端示例 ---
def send_custom_message(mav):"""发送自定义 MY_CUSTOM_DATA 消息"""timestamp = int(time.time() * 1e6) # 微秒时间戳temperature = 25.5status = 1name = "SensorA"# 创建自定义消息# 注意:字段顺序和类型必须与 XML 定义一致msg = mavutil.MAVLink_my_custom_data_message(timestamp,temperature,status,name.encode('ascii') # 字符串需要编码为字节)# 发送消息mav.send(msg)print(f"发送自定义消息: {msg}")# --- 接收端示例 ---
def receive_messages(mav):"""接收并处理 MAVLink 消息"""print("开始接收消息...")while True:# 接收下一条消息,超时时间 1 秒msg = mav.recv_match(blocking=True, timeout=1.0)if msg is not None:print(f"收到消息: {msg.get_type()}")# 检查是否是我们的自定义消息if msg.get_type() == 'MY_CUSTOM_DATA':print(" 收到自定义 MY_CUSTOM_DATA 消息:")print(f" 时间戳: {msg.timestamp_us} us")print(f" 温度: {msg.temperature} °C")print(f" 状态: {msg.status}")print(f" 名称: {msg.name.decode('ascii').strip()}") # 解码字节为字符串并去除空白# --- 主程序 ---
if __name__ == "__main__":# 模拟一个简单的 MAVLink 连接 (例如 UDP)# 在实际应用中,这里会连接到飞控或 QGC 的 MAVLink 端口# 例如: mavutil.mavlink_connection('udpin:0.0.0.0:14550')# 或者连接到串口: mavutil.mavlink_connection('/dev/ttyACM0', baud=57600)# 为了演示,我们创建一个内存中的模拟连接# 在实际应用中,你需要根据你的连接方式修改这里from pymavlink import mavutil as standard_mavutil # 导入标准的 mavutilmaster = standard_mavutil.mavlink_connection('tcp:127.0.0.1:5760', baud=57600) # 模拟一个 TCP 连接# 等待第一个心跳包,确认连接建立# master.wait_heartbeat()# print("心跳包收到,连接建立")# 简单的发送和接收演示# 在实际应用中,发送和接收通常在不同的线程或事件循环中进行# 发送示例print("\n--- 发送自定义消息 ---")# 在实际应用中,你需要使用上面生成的 mavutil 模块来创建和发送消息# 这里的 master 对象是标准的 pymavlink 连接,需要确保它能处理自定义消息# 如果使用上面生成的 custom_messages 模块,创建消息的方式如下:# msg_to_send = mavutil.MAVLink_my_custom_data_message(...)# master.mav.send(msg_to_send)# 注意:直接使用 standard_mavutil 发送自定义消息需要确保标准库也包含了该定义# 更标准的做法是使用生成的 mavutil 模块来创建消息对象,然后通过连接对象发送# 这里为了简化示例,假设 master 对象可以发送任何 MAVLink 消息对象# 在真实的自定义消息开发中,你会使用生成的 mavutil 对象来创建消息# 例如:# from mavlink_custom import custom_messages as my_mavutil# msg_to_send = my_mavutil.MAVLink_my_custom_data_message(...)# master.mav.send(msg_to_send)# 模拟发送一条自定义消息 (使用标准库模拟,实际应使用生成的库)# 需要手动构造消息字节流,或者确保标准库已包含自定义消息定义# 这是一个简化的概念演示,实际发送需要使用生成的库函数print("请注意:这里的发送部分是概念演示,实际应使用生成的 MAVLink 库创建消息对象并发送。")# send_custom_message(master.mav) # 假设 master.mav 可以处理自定义消息对象# 接收示例print("\n--- 接收消息 ---")# 在实际应用中,你需要使用上面生成的 mavutil 模块来解析消息# 这里的 master 对象是标准的 pymavlink 连接,它会尝试解析所有收到的消息# 如果收到了自定义消息,并且标准库或加载的方言包含了其定义,就可以通过 get_type() 识别receive_messages(master) # 开始接收消息 (需要有消息发送过来)
重要说明:
-
上面的 Python 代码示例是一个概念演示。在实际应用中,你需要确保
mavgenerate.py
生成的代码路径正确添加到sys.path
中,并且导入的是你生成的自定义方言模块。 -
将自定义消息集成到 QGC 需要修改 QGC 的 C++ 源代码,这比修改 Python 脚本复杂得多,涉及到 Qt 框架、QGC 的 MAVLink 处理架构以及 UI 开发。你需要找到 QGC 中处理 MAVLink 消息的部分,添加对自定义消息的解析和处理逻辑,并在界面上添加相应的控件来显示或控制数据。
-
为了让 QGC 识别你的自定义消息,你需要将
custom_messages.xml
文件放置在 QGC 源代码的 MAVLink 方言目录中,并在编译 QGC 时确保它被包含进去。
5. 实际应用和场景
自定义 MAVLink 消息在许多特定的无人机应用中非常有用:
-
集成自定义传感器: 当无人机搭载了非标准的传感器(如气体传感器、辐射传感器、高精度相机参数等)时,可以通过自定义消息将这些传感器的原始数据或处理后的信息发送到地面站进行显示、记录或分析。
-
控制自定义负载: 如果无人机携带了需要地面站控制的定制设备(如投放装置、机械臂、探照灯等),可以使用自定义消息发送控制指令。
-
传输特定状态信息: 除了标准的飞行状态,你可能想传输一些特定的系统状态信息,例如自定义设备的故障代码、工作模式、进度等。
-
实现专有功能: 对于商业或研究用途的无人机系统,自定义消息可以用于实现一些专有的、不适合公开的功能或数据传输。
-
地面站与伴随计算机通信: 在带有伴随计算机的无人机系统中,自定义消息可以用于伴随计算机与地面站之间的数据交换,例如伴随计算机处理的图像分析结果、路径规划信息等。
-
调试和诊断: 在开发和调试阶段,可以使用自定义消息发送详细的内部状态、变量值等信息到地面站,方便开发者监控和诊断问题。
通过自定义 MAVLink 消息,可以极大地扩展无人机系统的功能和应用范围,实现更灵活、更专业的无人机解决方案。但这需要对 MAVLink 协议有深入理解,并具备相应的软件开发能力(包括飞控端和地面站端)。
相关文章:
PX4开始之旅(二)通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信
核心知识点:通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信 1. 通俗易懂的解释 想象一下,MAVLink 就像是无人机(飞控)和地面站(QGroundControl)之间约定好的一种“语言”。这种语言有很多标准的“…...
Docker组件详解:核心技术与架构分析
Docker详解:核心技术与架构分析 Docker作为一种容器化技术,已经彻底改变了软件的开发、交付和部署方式。要充分理解和利用Docker的强大功能,我们需要深入了解其核心组件以及它们如何协同工作。本文将详细介绍Docker的主要组件、架构设计以及…...
uni-app,小程序中的addPhoneContact,保存联系人到手机通讯录
文章目录 方法详解简介 基本语法参数说明基础用法使用示例平台差异说明注意事项最佳实践 方法详解 简介 addPhoneContact是uni-app框架提供的一个实用API,用于向系统通讯录添加联系人信息。这个方法在需要将应用内的联系人信息快速保存到用户设备通讯录的场景下非…...
uniapp小程序轮播图高度自适应优化详解
在微信小程序开发过程中,轮播图组件(swiper)是常用的UI元素,但在实际应用中经常遇到高度不匹配导致的空白问题。本文详细记录了一次轮播图高度优化的完整过程,特别是针对固定宽高比图片的精确适配方案。 问题背景 在开发"零工市场&quo…...
赛季7靶场 - Environment
本系列仅说明靶场的攻击思路,不会给出任何的详细代码执行步骤,因为个人觉得找到合适的工具以实现攻击思路的能力也非常重要。 1.Nmap扫描发现80和22端口 2.访问80端口,使用katana查看js代码,快速发现laravel框架。 【*】希望知道…...
JVM——即时编译
分层编译模式:动态平衡启动速度与执行效率 分层编译是现代JVM(如HotSpot、GraalVM)实现高性能的核心策略之一,其核心思想是根据代码的执行热度动态选择不同的编译层次,实现启动速度与运行效率的最佳平衡。以HotSpot虚…...
武汉火影数字|数字科技馆打造:开启科技探索新大门
足不出户,就能畅游科技的奇幻世界,你相信吗?数字科技馆就能帮你实现!在这个数字化的时代,数字科技馆如同一颗璀璨的新星,照亮了我们探索科学的道路。 那么,数字科技馆究竟是什么呢? …...
升级 Azure Kubernetes 服务群集的关键注意事项
升级 Azure Kubernetes 服务 (AKS) 集群不仅是为了保持最新状态,更是为了保护您的工作负载、提升性能并降低运营风险。但如果操作不当,可能会导致停机、工作负载中断,甚至访问问题。 在本指南中,我们将介绍: 生产环境…...
数据类型详解(布尔值、整型、浮点型、字符串等)-《Go语言实战指南》
Go语言是一门静态强类型语言,所有变量在编译时必须明确其数据类型。本章将详细介绍Go的基础数据类型,帮助你理解并正确使用它们。 一、数据类型分类总览 Go 的基础数据类型可以分为以下几类: 类型分类代表类型示例布尔类型booltrue, false整…...
单片机-STM32部分:9-1、触控检测芯片
飞书文档https://x509p6c8to.feishu.cn/wiki/ILBsw4EaQiWaUukWrxEcO4XZnXc 传统物理按键 原理 玻璃盖板下通过一个触摸PAD连接到触摸芯片中,触摸PAD可以用PCB铜箔、金属片、平顶圆柱弹簧、导电棉、导电油墨、导电橡胶、导电玻璃的ITO层等。 当有人体手指靠近触摸按…...
从 JMS 到 ActiveMQ:API 设计与扩展机制分析(二)
(三)消息结构与 API 操作 JMS 消息结构:JMS 消息主要由消息头(Header)、属性(Properties)和消息体(Body)三部分组成。消息头包含了许多预定义的字段,用于标识…...
CSS display: none
在 CSS 中,display: none; 是一个用于控制元素显示与隐藏的属性值,其核心作用是完全从文档流中移除元素,使元素在页面中不占据任何空间,也不会被渲染。以下是详细解释: 核心作用 隐藏元素:使元素在页面中…...
vison transformer vit 论文阅读
An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词:用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…...
dropout层
从你提供的图片来看,里面讨论了 Dropout 层,让我为你解释一下它的工作原理和作用。 Dropout 层是什么? Dropout 是一种常用的正则化技术,用于避免神经网络的 过拟合(overfitting)。过拟合是指模型在训练数…...
openssl中BIO的使用
BIO是OpenSSL的一个重要的结构和概念,是对数据IO与传递处理的一种类型抽象和功能封装,这里所说的数据IO与传递的“介质”包括:内存、文件、日志、标准设备、网络socket等,“处理”包括简单、加/解密、摘要、ssl协议下的读/写等的数…...
电动汽车充电设施可调能力聚合评估与预测
电动汽车充电设施可调能力聚合评估与预测 项目概述 本项目基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》(鲍志远,胡泽春),实现了电动汽车充电设施可调能力的聚合评估与预测方法。 主要文件 real_data_model.m: 使用真实数据实现LSTM线…...
Git clone时出现SSL certificate problem unable to get local issuer certificate
正确解决方法 git config --global http.sslVerify false错误解决方法:(主要是看错了嘿嘿,但是如果是 OpenSSL SSL_read: Connection was reset, errno 10054 Failed to connect to github.com port 443: Timed out 原…...
requests库
模拟请求获取网页源代码 如下 import requestsr requests.get(https://spa1.scrape.center/page/1) print(r.text) 源码如下 GET请求 示例网站为 https://httpbin.org import requests r requests.get(https://httpbin.org/) print(r.text) 所显示的结果如下 {"a…...
基于springboot的海洋环保知识分享系统的设计与实现
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言࿰…...
安科瑞ADL3000-E-A/KC三相交流电能表CE认证导轨表
1 概述 ADL3000-E-A 是一款为供电系统、工矿企业以及公用事业单位设计的智能电表,用于计算耗电量并管理用电需求。它具备高精度、体积小以及安装简便的特点。它将所有电气参数的测量与综合电能计量及管理功能集成在一起,可提供过去 12 个月的各类数据&a…...
红黑树算法笔记
文章目录 红黑树 (Red-Black Tree) 学习笔记0. 节点结构与哨兵节点1. 什么是红黑树?2. 红黑树的五个核心性质3. 为什么需要红黑树?4. 红黑树的基本操作a. 查找 (Search)b. 插入 (Insert)c. 删除 (Delete) 5. 维护平衡的关键操作a. 变色 (Recoloring)b. 旋…...
【Axios】解决Axios下载二进制文件返回空对象的问题
【Axios】解决Axios下载二进制文件返回空对象的问题 问题背景 在一个基于Vue 3的项目中,我们使用Axios下载Excel文件,但遇到了一个奇怪的问题:文件能成功下载下来,但打开时显示内容为[object Object]无法使用。 当我们执行下载代码: const response = await downloadT…...
2.MySQL数据库操作
一.MySQL数据库介绍 数据库目前标准指令集是SQL,即结构化查询语言。SQL语言主要由以下几部分组成 DDL(数据定义语言):用来建立数据库、数据库对象和定义字段,如create、alter、drop。 DML(数据操纵语言&…...
01.three官方示例+编辑器+AI快速学习webgl_animation_keyframes
实例:examples/webgl_animation_keyframes.html 在这里插入图片描述 重点关注: AnimationMixer:管理模型的所有动画AnimationClip:表示一个完整的动画ClipAction:控制动画的播放状态(播放、暂停、速度等&am…...
在 Spring Boot 中实现动态线程池的全面指南
动态线程池是一种线程池管理方案,允许在运行时根据业务需求动态调整线程池参数(如核心线程数、最大线程数、队列容量等),以优化资源利用率和系统性能。在 Spring Boot 中,动态线程池可以通过 Java 的 ThreadPoolExecut…...
餐饮行业新风口:上门厨师服务系统的技术实现路径
上门做饭正在成为下一个万亿级风口!当外卖平台被预制菜攻陷,当年轻人对着料理包无可奈何,一个全新的餐饮模式正在悄然崛起。 我们的市场调研显示,83%的消费者无法分辨外卖是否使用预制菜,76%的年轻人愿意为透明烹饪过程…...
odoo-049 Pycharm 中 git stash 后有pyc 文件,如何删除pyc文件
文章目录 问题描述解决思路正确的去除 git 跟踪 pyc文件的做法 问题描述 查看本地 stash 列表 stash 后有很多 pyc 文件都被 git 追踪了,这样不合理,而且等 unstash 的时候就会有问题 解决思路 尝试方法: 递归地删除指定文件夹及其子目录中…...
线程同步机制
synchronized 实现线程同步的关键字,用来防止多个线程同时访问某个代码块或方法,避免并发冲突和数据不一致。通过持有一把唯一的对象锁,谁拿到了谁就能执行,谁没拿到只能等待锁释放。 1. 修饰实例方法(锁当前实例&…...
YOLO目标检测算法
文章目录 前言一、目标检测算法简介1、传统目标检测算法(1)R-CNN算法简介(2)Fast R-CNN算法简介(3)Faster R-CNN算法简介 2、目标检测中的算法设计范式(1)one-stage(2&am…...
【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门
比赛传送门: 本场比赛开始时题面存在一些问题,私密马赛! A.池化【入门教育赛】 根据题目所给公式计算即可。 #include "bits/stdc.h"signed main() {int t; std::cin >> t;while (t --) {int l, k, s, p; std::cin >&…...
《让歌声跨越山海:Flutter借助Agora SDK实现高质量连麦合唱》
对于Flutter开发者而言,借助Agora SDK实现这一功能,不仅能为用户带来前所未有的社交体验,更是在激烈的市场竞争中脱颖而出的关键。 Agora SDK作为实时通信领域的佼佼者,拥有一系列令人瞩目的特性,使其成为实现高质量连…...
1.3.2 linux音频PulseAudio详细介绍
PulseAudio 是一个在 Linux 及其他类 Unix 操作系统中广泛使用的声音服务器(Sound Server),它为不同的音频应用程序提供了一种中间层,以方便管理和控制音频流。下面将详细介绍 PulseAudio 的相关内容,包括其基本概念、…...
8.1.Kubernetes进阶
目录 一、Kubernetes核心原理深度解析 架构设计精髓 • 控制平面组件(API Server、etcd、Controller Manager、Scheduler)协作流程 • 数据平面(kubelet、容器运行时、CNI/CSI插件)核心工作机制 API对象与声明式模型 • CRD&…...
electron 结合 react(cra创建的) 创建桌面应用和打包桌面应用
我说一下 react 结合 electron 如果打包和使用,以及其中可能会遇到的问题,这里只做简单功能的演示 我们先通过 cra 创建一个 react 项目,然后安装相关依赖,之后启动 npx create-react-app react_electron cd react_electron np…...
C++23 views::chunk_by (P2443R1) 详解
文章目录 引言C23 范围库概述范围视图(Range Views)范围算法(Range Algorithms)范围适配器(Range Adapters) std::views::chunk_by 介绍基本概念特性使用场景 示例代码简单示例自定义谓词示例 总结 引言 在…...
MySQL核心内容【持续更新中】
MySQL核心内容 文章目录 MySQL核心内容1.MySQL核心内容目录2.MySQL知识面扩展3.MySQL安装4.MySQL配置目录介绍Mysql配置远程ip连接 5.MySQL基础1.MySQL数据类型1.数值类型2.字符串类型3.日期和时间类型4.enum和set 2.MySQL运算符1.算数运算符2.逻辑运算符3.比较运算符 3.MySQL完…...
【高级IO】多路转接之单线程Reactor
这里写目录标题 一.Epoll的两种工作模式二.单线程Reactor1.Connection模块2.Reactor服务器模块2.1初始化Init2.2启动循环服务器Loop2.3事件派发Dispatcher2.4连接管理器Accepter2.5事件管理器Receiver2.6发送管理器Sender 3.上层业务模块定制协议业务处理 代码 一.Epoll的两种工…...
基于设备指纹识别的反爬虫技术:给设备办 “身份证”
传统的封禁 IP、验证码等反爬虫手段已逐渐失效,基于设备指纹识别的反爬虫技术应运而生,成为守护数据安全的新防线。它如同给每个设备办一张独一无二的 “身份证”,精准区分正常用户与爬虫工具。 一、基础参数采集:构建设备指纹的…...
公开模型一切,优于DeepSeek-R1,英伟达开源Llama-Nemotron家族
在大模型飞速发展的今天,推理能力作为衡量模型智能的关键指标,更是各家 AI 企业竞相追逐的焦点。 但近年来,推理效率已成为模型部署和性能的关键限制因素。 基于此,英伟达推出了 Llama-Nemotron 系列模型(基于 Meta …...
CI/CD面试题及答案
一、CI/CD 基础概念 1. 什么是 CI/CD?CI 和 CD 的区别是什么? 答案: CI(持续集成):开发人员提交代码后,自动构建并运行测试,确保代码集成无冲突。CD(持续交付 / 部署&am…...
解决 Ubuntu DNS 无法解析问题(适用于虚拟机 长期使用)
解决 Ubuntu DNS 无法解析问题 在使用 Ubuntu 虚拟机(尤其是在国内)时,经常会遇到这样的错误: Temporary failure resolving cn.archive.ubuntu.com但是此时又能成功 ping 通 IP,这说明网络是正常的,问题…...
如何通过C# 获取Excel单元格的数据类型
在处理 Excel 文件时,了解单元格的数据类型有助于我们正确地解析和处理数据。Free Spire.XLS 是一款功能强大且免费的.NET 组件,支持高效地操作 Excel 文件,包括读取单元格类型。本文将详细介绍如何使用 Free Spire.XLS 来获取 Excel 单元格的…...
Spring Boot初级教程:从零搭建企业级Java应用
一、Spring Boot是什么?为什么学它? 定义:Spring Boot是Spring框架的轻量级快速开发工具,基于“约定优于配置”原则,简化Spring应用的搭建与部署。核心优势: 零配置起步:内置Tomcat/Jetty,无需手动部署Web服务器。自动装配:自动扫描依赖、注入Bean,减少XML/注解冗余代…...
IBM BAW(原BPM升级版)使用教程第六讲
一、事件:Undercover Agent 在 IBM Business Automation Workflow (BAW) 中,Undercover Agent (UCA) 是一个非常独特和强大的概念,旨在实现跨流程或系统的事件处理和触发机制。Undercover Agent 主要用于 事件驱动的流程自动化,它…...
[250509] x-cmd 发布 v0.5.11 beta:x ping 优化、AI 模型新增支持和语言变量调整
目录 X-CMD 发布 v0.5.11 beta📃Changelog🧩 ping🧩 openai🧩 gemini🧩 asdf🧩 mac✅ 升级指南 X-CMD 发布 v0.5.11 beta 📃Changelog 🧩 ping 调整 x ping 默认参数为 bing.com&a…...
Web前端VSCode如何解决打开html页面中文乱码的问题(方法2)
Web前端—VSCode如何解决打开html页面中文乱码的问题(方法2) 1.打开VScode后,依次点击 文件 >> 首选项 >> 设置 2.打开设置后,依次点击 文本编辑器 >> 文件(或在搜索框直接搜索“files.autoGuessEnc…...
打造专属AI好友:小智AI聊天机器人详解
打造专属AI好友:小智AI聊天机器人详解 在当下的科技热潮中,AI正迅速改变着我们的生活,成为了科技领域的新宠。而今,借助开源项目的力量,你可以亲手打造一个智能小助手——小智AI聊天机器人。它不仅是一个技术探索的窗…...
Spring,SpringMVC,SpringBoot,SpringCloud的区别
Spring Spring 是一个基础框架,为 Java 应用提供了 IoC(控制反转)和 AOP(面向切面编程)功能。其主要特点如下: IoC 容器:借助依赖注入,降低了组件间的耦合度。AOP 支持:…...
从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架
对于选择python作为测试脚本开发的同学来说,pytest和python unittest是必需了解的两个框架。那么他们有什么区别?我们该怎么选?让我们一起来了解一下吧! 我们从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架…...
无人机电池储存与操作指南
一、正确储存方式 1. 储存电量 保持电池在 40%-60% 电量(单片电压约3.8V-3.85V)存放,避免满电或空电长期储存。 满电存放会加速电解液分解,导致鼓包;**空电**存放可能引发过放(电压低于3.0V/片会永久…...