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):

  1. 兼容性問題: 如果地面站或飛控沒有更新支持你定義的自定義消息,它們將無法識別或正確解析這些消息,可能導致通信失敗或數據丟失。

  2. 版本管理: 隨著自定義消息的迭代和修改,需要嚴格的版本控制,確保飛控和地面站使用相同版本的消息定義,避免因版本不匹配導致的通信錯誤。

  3. 消息 ID 沖突: 雖然 MAVLink 協議為自定義消息預留了 ID 范圍,但在多個不同的自定義擴展之間,仍有可能出現消息 ID 沖突,需要統一管理或使用獨立的方言(Dialect)文件。

  4. 地面站支持程度: QGC 需要修改其代碼才能完全支持自定義消息的發送、接收、顯示和控制界面。這通常需要修改 QGC 的源代碼并重新編譯,不像標準消息那樣開箱即用。

  5. 性能影響: 發送大量或頻率過高的自定義消息可能會占用通信帶寬和處理資源,影響飛控和地面站的其他功能。

解決方案 (Solutions):

  1. 兼容性問題:

    • 解決方案: 確保所有涉及自定義消息的設備(飛控、地面站、伴隨計算機等)都使用相同的自定義 MAVLink 方言(XML 定義文件)生成代碼,并在部署時同步更新。

  2. 版本管理:

    • 解決方案: 在自定義 MAVLink 方言文件中明確版本信息。在飛控和地面站代碼中加入版本檢查機制,如果檢測到版本不匹配,則給出警告或拒絕使用自定義消息。

    • 解決方案: 使用版本控制系統(如 Git)管理自定義方言文件,并為每個版本打標簽。

  3. 消息 ID 沖突:

    • 解決方案: 仔細規劃自定義消息的 ID 范圍,盡量使用 MAVLink 協議推薦的自定義范圍。如果與第三方自定義消息集成,嘗試合并方言文件或協調 ID 分配。

    • 解決方案: 為你的自定義消息創建一個獨立的 MAVLink 方言文件(XML),并在其中定義你的消息和枚舉類型。

  4. 地面站支持程度:

    • 解決方案: 修改 QGC 源代碼。這是最徹底的解決方案,需要根據自定義消息的內容和功能,在 QGC 中添加相應的解析邏輯、UI 元素(如新的儀表盤、控制面板)和發送邏輯。

    • 解決方案: 使用 QGC 的插件機制(如果可用)或外部工具/腳本。對于一些簡單的數據顯示,可以考慮開發 QGC 插件或使用伴隨計算機上的腳本來處理自定義消息,并通過 MAVLink 或其他方式與 QGC 集成。

  5. 性能影響:

    • 解決方案: 優化消息發送頻率。只在必要時發送自定義消息,并根據通信帶寬和處理能力限制發送頻率。

    • 解決方案: 優化消息內容。只包含必要的數據,避免發送冗余信息。

    • 解決方案: 考慮使用其他通信方式。對于大量、高頻的數據傳輸,如果條件允許,可以考慮使用其他更適合的通信方式(如 TCP/IP)通過伴隨計算機進行。

3. 實現的原理

實現自定義 MAVLink 消息與 QGC 通信的主要原理包括:

  1. 定義消息結構: 使用 MAVLink 官方提供的 XML 格式定義文件(稱為方言文件,Dialect File),在其中描述自定義消息的名稱、ID、包含的數據字段(類型、名稱、單位等)以及相關的枚舉類型。自定義消息的 ID 通常需要在 MAVLink 協議規定的自定義范圍內選擇,以避免與標準消息沖突。

  2. 生成代碼: 使用 MAVLink 官方提供的代碼生成工具(mavgenerate.py)讀取自定義方言 XML 文件,自動生成支持該自定義消息的各種編程語言(如 C++, Python)的 MAVLink 庫代碼。

  3. 飛控端實現:

    • 將生成的 MAVLink 庫代碼集成到飛控固件項目中。

    • 在飛控代碼中實現發送自定義消息的邏輯。這包括填充消息結構體的數據,然后調用 MAVLink 庫提供的函數將消息序列化并發送出去(通過串口、UDP 等)。

    • 實現接收和處理 QGC 發送的自定義消息的邏輯(如果需要)。

  4. 地面站端實現 (QGC):

    • 將包含自定義消息定義的方言 XML 文件添加到 QGC 的 MAVLink 方言目錄中。

    • (通常需要)修改 QGC 的源代碼:

      • 在 MAVLink 消息解析部分添加對自定義消息 ID 的識別和解析邏輯。

      • 根據自定義消息的內容,在 QGC 的用戶界面中添加相應的顯示元素(如新的儀表、圖表)或控制元素(如按鈕、滑塊)。

      • 實現 QGC 發送自定義消息給飛控的邏輯(如果需要)。

    • 重新編譯 QGC 源代碼。

  5. 通信: 飛控和 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 消息在許多特定的無人機應用中非常有用:

  1. 集成自定義傳感器: 當無人機搭載了非標準的傳感器(如氣體傳感器、輻射傳感器、高精度相機參數等)時,可以通過自定義消息將這些傳感器的原始數據或處理后的信息發送到地面站進行顯示、記錄或分析。

  2. 控制自定義負載: 如果無人機攜帶了需要地面站控制的定制設備(如投放裝置、機械臂、探照燈等),可以使用自定義消息發送控制指令。

  3. 傳輸特定狀態信息: 除了標準的飛行狀態,你可能想傳輸一些特定的系統狀態信息,例如自定義設備的故障代碼、工作模式、進度等。

  4. 實現專有功能: 對于商業或研究用途的無人機系統,自定義消息可以用于實現一些專有的、不適合公開的功能或數據傳輸。

  5. 地面站與伴隨計算機通信: 在帶有伴隨計算機的無人機系統中,自定義消息可以用于伴隨計算機與地面站之間的數據交換,例如伴隨計算機處理的圖像分析結果、路徑規劃信息等。

  6. 調試和診斷: 在開發和調試階段,可以使用自定義消息發送詳細的內部狀態、變量值等信息到地面站,方便開發者監控和診斷問題。

通過自定義 MAVLink 消息,可以極大地擴展無人機系統的功能和應用范圍,實現更靈活、更專業的無人機解決方案。但這需要對 MAVLink 協議有深入理解,并具備相應的軟件開發能力(包括飛控端和地面站端)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82342.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI視頻智能分析網關打造社區/工廠/校園/倉庫智慧消防實現精準化安全管控

一、背景 隨著社區、商業場所對消防安全要求日益提升&#xff0c;傳統消防系統已難以滿足智能化、精細化管理需求。智能分析網關融合物聯網與人工智能技術&#xff0c;具備強大的數據處理與分析能力&#xff0c;可全面升級消防系統。將其融入消防系統各層級&#xff0c;搭建智…

深度學習基礎--目標檢測常見算法簡介(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO)

博主簡介&#xff1a;努力學習的22級本科生一枚 &#x1f31f;?&#xff1b;探索AI算法&#xff0c;C&#xff0c;go語言的世界&#xff1b;在迷茫中尋找光芒?&#x1f338;? 博客主頁&#xff1a;羊小豬~~-CSDN博客 內容簡介&#xff1a;常見目標檢測算法簡介?&#x1f…

傳輸層協議UDP和TCP

傳輸層協議UDP和TCP 1、UDP2、TCP2.1、TCP協議段格式2.2、確認應答(ACK)機制2.3、超時重傳機制2.4、連接管理機制2.5、理解CLOSE_WAIT狀態2.6、理解TIME_WAIT狀態2.7、流量控制2.8、滑動窗口2.9、擁塞控制2.10、延遲應答2.11、捎帶應答2.12、面向字節流2.13、粘包問題2.14、TCP…

PMIC電源管理模塊的PCB設計

目錄 PMU模塊簡介 PMU的PCB設計 PMU模塊簡介 PMIC&#xff08;電源管理集成電路&#xff09;是現代電子設備的核心模塊&#xff0c;負責高效協調多路電源的轉換、分配與監控。它通過集成DC-DC降壓/升壓、LDO線性穩壓、電池充電管理、功耗狀態切換等功能&#xff0c;替代傳統分…

Ubuntu 配置網絡接口端點(靜態 IP 地址)詳細教程

在 Ubuntu 系統中&#xff0c;配置網絡接口端點通常指的是為您的有線或無線網卡設置一個固定的 IP 地址、子網掩碼、網關以及 DNS 服務器。這對于服務器或者需要穩定網絡標識的設備來說非常重要。 使用 Netplan (Ubuntu 17.10 及更高版本的默認方式)使用 ifupdown (通過 /etc/…

淺聊大模型-有條件的文本生成

大家好我是木木&#xff0c;自從2022年11月30日OpenAI發布ChatGPT后&#xff0c;大模型迅速火熱起來&#xff0c;人工智能作為當下最火的行業之一&#xff0c;2025年春節期間DeepSeek R1模型大火。LLM中有很多的技術&#xff0c;今天我們聊聊大模型-有條件的文本生成。 什么是…

華為銀河麒麟 V10(ARM)系統軟件部署全攻略:Redis、RabbitMQ、MySQL 等集群搭建指南

一、Redis 集群部署&#xff08;主從 哨兵模式&#xff09; 1. 環境準備 系統&#xff1a;華為銀河麒麟 V10&#xff08;ARM64&#xff09;節點&#xff1a;3 臺服務器&#xff08;1 主 2 從 3 哨兵&#xff09; 2. 安裝包下載 bash # 華為鏡像站 wget https://update.c…

Mysql數據庫進階

一、Mysql組織架構 連接層 1.驗證用戶的身份,用戶名密碼是否匹配 2.提供兩種連接方式(TCP/IP連接、socket連接) 3.連接層提供了一個與sql層交互的線程 SQL層 1.接收連接層傳過來的SQL語句 2.驗證執行的SQL語法 3.驗證SQL的語義(DDL,DML,DQL,DCL) 4.解析器:解析SQL語句,生…

系統思考:短期困境與長期收益

最近在項目中&#xff0c;一直有學員會提到一個議題&#xff0c;如何平衡當前困境和長期收益&#xff1f; 我的思考是在商業和人生的路上&#xff0c;我們常常聽到“魚和熊掌不可兼得”的說法&#xff0c;似乎短期利益和長期目標注定是對立的。但事實上&#xff0c;魚與熊掌是…

Spring Web MVC快速入門

什么是Spring Web MVC Spring Web MVC 是基于 Servlet API 構建的原始 Web 框架&#xff0c;從?開始就包含在 Spring 框架中。它的正式名稱“Spring Web MVC”來?其源模塊的名稱(Spring-webmvc)&#xff0c;但它通常被稱為"Spring MVC". View(視圖) 指在應?程序…

DeepSeek基于注意力模型的可控圖像生成

DeepSeek大模型高性能核心技術與多模態融合開發 - 商品搜索 - 京東 圖像的加噪與模型訓練 在擴散模型的訓練過程中&#xff0c;首先需要對輸入的信號進行加噪處理&#xff0c;經典的加噪過程是在圖像進行向量化處理后在其中添加正態分布&#xff0c;而正態分布的值也是與時間…

第十六屆藍橋杯B組第二題

當時在考場的時候這一道題目 無論我是使用JAVA的大數&#xff08;BIGTHGER&#xff09;還是賽后 使用PY 都是沒有運行出來 今天也是突發奇想在B站上面搜一搜 看了才知道這也是需要一定的數學思維 通過轉換 設X來把運算式精簡化 避免運行超時 下面則是代碼 public class lanba…

HT71663同步升壓2.7V-13V輸入10A聚能芯半導體禾潤一級代理

在便攜式設備飛速發展的今天&#xff0c;電源轉換效率與產品尺寸始終是行業難以平衡的難題。但現在&#xff0c;HT71663 高功率全集成升壓轉換器強勢登場&#xff0c;一舉打破僵局&#xff0c;為便攜式系統帶來顛覆性的高效小尺寸解決方案&#xff01;? HT71663 的卓越性能&am…

Unity:輸入系統(Input System)與持續檢測鍵盤按鍵(Input.GetKey)

目錄 Unity 的兩套輸入系統&#xff1a; &#x1f50d; Input.GetKey 詳解 &#x1f3af; 對比&#xff1a;常用的輸入檢測方法 技術底層原理&#xff08;簡化版&#xff09; 示例&#xff1a;角色移動 為什么會被“新輸入系統”替代&#xff1f; Unity 的兩套輸入系統&…

港大今年開源了哪些SLAM算法?

過去的5個月&#xff0c;香港大學 MaRS 實驗室陸續開源了四套面向無人機的在線 SLAM 框架&#xff1a;**FAST-LIVO2 、Point-LIO&#xff08;grid-map 分支&#xff09; 、Voxel-SLAM 、Swarm-LIO2 **。這四套框架覆蓋了單機三傳感器融合、高帶寬高速機動、長時間多級地圖優化以…

【質量管理】TRIZ因果鏈分析:解碼質量問題的“多米諾效應“

為什么要使用因果鏈分析 沒有發現問題并不等于沒有問題。愛因斯坦曾說&#xff0c;如果我只有一個小時的時間來拯救世界&#xff0c;我將花45分鐘時間分析問題&#xff0c;10分鐘的時間來檢查問題&#xff0c;最后5分鐘的時間來解決問題。可見問題分析的重要性。 在質量管理實踐…

線程中常用的方法

知識點詳細說明 Java線程的核心方法集中在Thread類和Object類中,以下是新增整合后的常用方法分類解析: 1. 線程生命周期控制 方法作用注意事項start()啟動新線程,JVM調用run()方法多次調用會拋出IllegalThreadStateException(線程狀態不可逆)。run()線程的任務邏輯直接調…

c++:迭代器(Iterator)

目錄 &#x1f6aa;什么是迭代器&#xff1f; &#x1f527; 迭代器的本質 為什么不用普通數組或下標&#xff1f; STL容器的迭代器并不是共用一個類型&#xff01; 迭代器的類型&#xff08;Iterator Categories&#xff09; &#x1f4e6; 常見容器的迭代器類型 ? 迭…

【文件系統—散列結構文件】

文章目錄 一、實驗目的實驗內容設計思路 三、實驗代碼實現四、總結 一、實驗目的 理解linux文件系統的內部技術&#xff0c;掌握linux與文件有關的系統調用命令&#xff0c;并在此基礎上建立面向隨機檢索的散列結構文件&#xff1b;## 二、實驗內容與設計思想 實驗內容 1.設…

力扣26——刪除有序數組中的重復項

目錄 1.題目描述&#xff1a; 2.算法分析&#xff1a; 3.代碼展示&#xff1a; 1.題目描述&#xff1a; 給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使每個元素 只出現一次 &#xff0c;返回刪除后數組的新長度。元素的 相對…