iT邦幫忙

0

Mavlink自定義dialect

  • 分享至 

  • xImage
  •  
  • 安裝Python
  • 從github上下載mavlink repository
git clone https://github.com/mavlink/mavlink.git --recursive
cd mavlink
  • 把自定義的dialect放入mavlink/message_definitions/v1.0資料夾內
  • 進入mavlink資料夾輸入以下command,打開mavlink產生器的UI介面:
    • 選擇輸入檔案和輸出檔案位置(注意:輸出檔案位置要加入檔案名稱,如mavlink/include/custom.py)
    • 選擇語言(python3, c, ...)
    • 選擇mavlink版本(mavlink2)
    • 點選generate
python3 -m mavgenerate
  • 解除安裝pymavlink
pip uninstall pymavlink
  • 安裝自訂的pymavlink
python3 -m pip install -r pymavlink/requirements.txt
  • 進入pymavlink資料夾,執行setup.py
python setup.py install --user
  • 測試
    • 可以用sender.py和receiver.py來測試
  • sender.py
import os
import sys

# 強制使用 MAVLink 2.0
os.environ['MAVLINK20'] = '1'

# 設定你的 Dialect 名稱 
os.environ['MAVLINK_DIALECT'] = 'hex'
import time
from pymavlink import mavutil

master = mavutil.mavlink_connection('udpout:127.0.0.1:14550', source_system=1)

def send_legacy_data(original_data):
    """
    original_data: bytes 格式,例如 b'\xaa\xbb\xcc'
    """
    data_len = len(original_data)
    if data_len > 254:
        raise ValueError("資料太長了,最大只能 254 bytes")

    # 3. 準備 Payload
    # 第一個 byte 是長度,後面接原始資料
    # Python 技巧:直接用相加的方式組成 list
    full_payload = [data_len] + list(original_data)
    
    # 補足到 255 bytes (為了讓 MAVLink 2.0 正確運作,剩下的補 0)
    full_payload = full_payload + [0] * (255 - len(full_payload))

    # 4. 發送訊息
    # 函式名稱通常是: [message_name_lower]_send
    master.mav.custom_legacy_wrapper_send(
        1,
        2,
        full_payload
    )
    print(f"已發送 {data_len} bytes 的原始資料")

# 測試發送
send_legacy_data(b'\x01\x02\x03\x04\x05')
  • receiver.py
    import os
import sys
# 強制使用 MAVLink 2.0
os.environ['MAVLINK20'] = '1'

# 設定你的 Dialect 名稱
os.environ['MAVLINK_DIALECT'] = 'hex'

from pymavlink import mavutil

# 建立監聽連線 (例如監聽 UDP 14550)
master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')

print("等待自定義封包...")

while True:
    # 接收封包
    msg = master.recv_match(type='CUSTOM_LEGACY_WRAPPER', blocking=True)
    
    if msg:
        # 1. 取得第一個 Byte (長度)
        inner_len = msg.payload[0]
        
        # 2. 根據長度還原原始資料
        # payload[1] 開始才是真正的 legacy packet
        original_data = bytes(msg.payload[1 : 1 + inner_len])
        
        print(f"收到封包!來自 SysID: {msg.get_srcSystem()}")
        print(f"原始長度標記: {inner_len}")
        print(f"原始資料內容 (HEX): {original_data.hex().upper()}")

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言